diff --git a/Anul 3/Semestrul 2/Calcul numeric/Lab1.m b/Anul 3/Semestrul 2/Calcul numeric/Lab1.m new file mode 100644 index 0000000..9cb8c7c --- /dev/null +++ b/Anul 3/Semestrul 2/Calcul numeric/Lab1.m @@ -0,0 +1,106 @@ +A = [1,2;3,4] +det(A) +inv(A)*A +A*A +A.*A +A^2 +A.^2 + +v=1:10 +V=1:-0.1:0 + +v.^2 + +transpose(v) # or v' + +A(1,:) + +A(:,2) + + +#L1_NC.pdf + +#1.a +x=-4:0.1:7.2; +p = x.^5-5*x.^4-16*x.^3+16*x.^2-17.*x+21; + +#plot(x,p) + +#1.b +x=-2.5; +p = [1,-5,-16,+16,-17,21]; +polyval(p,x) +#1.c +roots(p) + +polyval(p,7) + +#2 +x = 0:0.1*pi:2*pi; + +f = sin(x); +g = sin(2*x); +h = sin(3*x); + + +#subplot(3,1,1) +#plot(x,f) +#subplot(3,1,2) + +#plot(x,g) +#subplot(3,1,3) + +#plot(x,h) +clf #clear plot +t= 0:0.1*pi:10*pi + +R=3.8; +r=1; + +x = (R+r)*cos(t) - r*cos((R/r+1)*t); +y = (R+r)*sin(t) - r*sin((R/r+1)*t); + +plot(x,y) + +[x, y] = meshgrid(-2:0.1:2, 0.5:0.1:4.5); + +f = sin(e.^x).*cos(log(y)); +clf +#mesh(x, y, f); + + +#xlabel('X-axis'); +#ylabel('Y-axis'); +#zlabel('Z-axis'); +#title('3D Surface Plot using mesh'); +#colormap('jet'); +#colorbar; +#grid on; + + +figure; +plot3(x, y, f); +xlabel('X-axis'); +ylabel('Y-axis'); +zlabel('Z-axis'); +title('3D Line Plot using plot3'); +grid on; + + + +function result = funct(n) + if n == 0 + result = 1+1; + else + result = 1 + 1/ funct(n - 1); + end +end +% Increase the recursion limit to 5000 +#max_recursion_depth(2025); + +funct(2) +funct(10) +funct(100) +funct(2025) + + diff --git a/Anul 3/Semestrul 2/Calcul numeric/Lab10.m b/Anul 3/Semestrul 2/Calcul numeric/Lab10.m new file mode 100644 index 0000000..4bcdcd3 --- /dev/null +++ b/Anul 3/Semestrul 2/Calcul numeric/Lab10.m @@ -0,0 +1,9 @@ + +f=@(x)1./x; + +R = rectangle_int(f,1,2,100) + +R = trapz_int(f,1,2,100) + +R = homer_int(f,1,2,100) + diff --git a/Anul 3/Semestrul 2/Calcul numeric/Lab11.m b/Anul 3/Semestrul 2/Calcul numeric/Lab11.m new file mode 100644 index 0000000..1e042ba --- /dev/null +++ b/Anul 3/Semestrul 2/Calcul numeric/Lab11.m @@ -0,0 +1,25 @@ + + +#f=@(x)((2./sqrt(pi)).*(e.^(-x.^2))); + +#for b=0.1:0.1:1 +# I = adquad(f,0,b,0.1,4) +# I2 = integral(f,0,b) +#end + + +f=@(x)(sin(x.^(1/3))); +g=@(x)(sin(x).*3.*(x.^2)); + +x = [2,4,8,16,32,64,128,256]; +trueI = integral(f,0,1) +for n = x + n + I1=homer_int(f,0,1,n) + fprintf('%.*f \n', 10, abs(trueI-I1)) + I2=homer_int(g,0,1,n) + fprintf('%.*f \n', 10, abs(trueI-I2)) +end + + + diff --git a/Anul 3/Semestrul 2/Calcul numeric/Lab2.m b/Anul 3/Semestrul 2/Calcul numeric/Lab2.m new file mode 100644 index 0000000..7a9335e --- /dev/null +++ b/Anul 3/Semestrul 2/Calcul numeric/Lab2.m @@ -0,0 +1,80 @@ +#pkg load symbolic; + +#1.a +syms x; + +f=exp(x) + +t1=taylor(f,x,0,'order',1); +t2=taylor(f,x,0,'order',2); +t3=taylor(f,x,0,'order',3); +t4=taylor(f,x,0,'order',4); +t10 = taylor(f,x,0,'order',10); + +#ezplot(t1) +hold on +ezplot(t2) +hold on +ezplot(t3) +hold on +ezplot(t4) +xlim([-3,3]) + +#1.b +vpa(exp(1),7) + +vpa(subs(t10,x,1),7) + +#2.a + +syms x; +f=sin(x) + +t3=taylor(f,x,0,'order',3); +t5=taylor(f,x,0,'order',5); +hold off +ezplot(f) +hold on +ezplot(t3) +hold on +ezplot(t5) +xlim([-pi,pi]) +ylim([-2,2]) + +#2.b +t10=taylor(f,x,0,'order',10); + +vpa(sin(pi/5),5) +vpa(subs(t10,x,sym(pi)/5),5) + +vpa(sin(10*pi/3),5) +vpa(subs(t10,x,10*sym(pi)/3),5) #it's not precise enought, increase n for Taylor series or move x0=0 to x0= 10pi/3 + + +#3.a + +syms x; +f=log(1+x); +t2= taylor(f,x,0,'order',2); +t5= taylor(f,x,0,'order',5); + +hold off +ezplot(f) +hold on +ezplot(t2) +hold on +ezplot(t5) + +xlim([-0.9,1]) +ylim([-1,1]) +t= taylor(f,x,0,'order',10); +vpa(log(2),5) +vpa(subs(t,x,1),5) + +syms x; +g=log(1-x); +t2 = taylor(g,x,0,'order',10) + +t-t2 + +vpa(subs(t,x,sym(0.999,'f')) - subs(g,x,sym(0.999,'f')),5) diff --git a/Anul 3/Semestrul 2/Calcul numeric/Lab3.m b/Anul 3/Semestrul 2/Calcul numeric/Lab3.m new file mode 100644 index 0000000..b9ee3d9 --- /dev/null +++ b/Anul 3/Semestrul 2/Calcul numeric/Lab3.m @@ -0,0 +1,30 @@ +x = [0 1 2]; +f = 1./(1+x); + +t=divdiff(x,f); + + +x = [0, 1, 2]; +f = 1./(1+x); +df = (-1)./((1+x).^2); + +[z,t]=divdiff2(x,f,df) + + + +x=linspace(1,2,11); +f=1./(1+x); +df = (-1)./((1+x).^2); +t=divdiff(x,f) +[z,t]=divdiff2(x,f,df) + +x = [-2, -1, 0, 1, 2, 3, 4]; +f = [-5, 1, 1, 1,7 ,25, 60]; + +t=divdiff(x,f) + +x = [-2, -1, 0, 1, 2, 3, 4]; +f = [-5, 1, 1, 1,7 ,25, 60]; + +t=forwarddiff(f) +t=backdiff(f) diff --git a/Anul 3/Semestrul 2/Calcul numeric/Lab4.m b/Anul 3/Semestrul 2/Calcul numeric/Lab4.m new file mode 100644 index 0000000..92813c3 --- /dev/null +++ b/Anul 3/Semestrul 2/Calcul numeric/Lab4.m @@ -0,0 +1,26 @@ +#U= [2,4,2;0,-1,1;0,0,-1]; +#b = [8;0;-1]; + + + + +#x = backsub(U,b); + +A= [2 1 -1 -2; 4 4 1 3; -6 -1 10 10; -2 1 8 4]; +b = [2;4;-5;1]; + +x = gauss(A,b); + + + +n=5 + +A=5*eye(n) -diag(ones(1,n-1),1)- diag(ones(1,n-1),-1) + +b = [4,3* ones(1,n-2),4]' + +[L,U,P]= lu(A); + +y = forwsub(L,P*b) +x = backsub(U, y) + diff --git a/Anul 3/Semestrul 2/Calcul numeric/Lab5.m b/Anul 3/Semestrul 2/Calcul numeric/Lab5.m new file mode 100644 index 0000000..fd920d2 --- /dev/null +++ b/Anul 3/Semestrul 2/Calcul numeric/Lab5.m @@ -0,0 +1,42 @@ +n=7; + +A=5*eye(n) -diag(ones(1,n-1),1)- diag(ones(1,n-1),-1); + +b = [4,3* ones(1,n-2),4]'; + + +x0 = zeros(size(b)); + +[x, nit] = jacobi(A,b, x0,10^(-5), 1000); + +[x, nit] = gaussseidel(A,b, x0,10^(-5), 1000); + +A = [10 7 8 7; 7 5 6 5; 8 6 10 9; 7 5 9 10]; +b=[32;23;33;31]; + +x = A^-1*b +trueB = b; +trueX = x; +trueA = A; + +A = [10 7 8 7; 7 5 6 5; 8 6 10 9; 7 5 9 10]; + + + +b=[32.1;22.9;33.1;30.9]; + +x = A^-1*b +norm(trueX-x,inf)/norm(trueX,inf) +norm(trueB-b,inf)/norm(trueB,inf) +cond(A) + +A = [10 7 8.1 7.2; 7.8 5.04 6 5; 8 5.98 9.89 9; 6.99 4.99 9 9.98]; +b=[32;23;33;31]; +x = A^-1*b + +cond(A) + +norm(trueX-x,inf)/norm(trueX,inf) +norm(trueA-A,inf)/norm(trueA,inf) + + diff --git a/Anul 3/Semestrul 2/Calcul numeric/Lab6.m b/Anul 3/Semestrul 2/Calcul numeric/Lab6.m new file mode 100644 index 0000000..14bf4cf --- /dev/null +++ b/Anul 3/Semestrul 2/Calcul numeric/Lab6.m @@ -0,0 +1,39 @@ +#1.b + + +nodes = linspace(-2,4,10); +f=@(x)(x+1)./(3*x.^2+2*x+1); + +plot(nodes, f(nodes),'o'); +hold on + + +x=linspace(-2,4,500); + + +plot(x,f(x)); +hold on + +lnf=lagrange_classic(nodes,f(nodes),x); + +plot(x,lnf) + +plot(x,abs(f(x)-lnf),'x') + + +nodes = [81,100,121]; + +f_nodes = [9,10,11]; + +sqrt(118); +lnf = lagrange_classic(nodes,f_nodes, [118]); + + +nodes = [1980,1990,2000,2010,2020]; +f_nodes = [4451,5287,6090,6970,7821]; + +lnf = lagrange_barycentric(nodes, f_nodes, [2005,2015]) + +abs([6474,7405] - lnf) + + diff --git a/Anul 3/Semestrul 2/Calcul numeric/Lab7.m b/Anul 3/Semestrul 2/Calcul numeric/Lab7.m new file mode 100644 index 0000000..b2d4940 --- /dev/null +++ b/Anul 3/Semestrul 2/Calcul numeric/Lab7.m @@ -0,0 +1,32 @@ + +#truex = linspace(0,1,20); +#x0=[0,1/3,1/2,1] +#f=@(x)cos(pi*x); + +#plot(x0, f(x0),'o'); +#hold on + +#plot(truex, f(truex),'blue'); + + +#lnf = newton(x0,f(x0),truex) + +#plot(truex, lnf, 'r'); + +#lnf = newton(x0,f(x0),1/5) + +#truex = linspace(1001,1009,9); + +#x0=[1000,1010,1020,1030,1040,1050]; +#f0=[3.000000,3.0043214,3.0086002,3.0128372,3.0170333,3.0211893]; + +#lnf = newton(x0,f0,truex) + + +x0 = linspace(-4,4,9); +f=@(x)power(2,x); + +lnf = aitken(x0,f(x0),1/2) + + + diff --git a/Anul 3/Semestrul 2/Calcul numeric/Lab9.m b/Anul 3/Semestrul 2/Calcul numeric/Lab9.m new file mode 100644 index 0000000..410ece9 --- /dev/null +++ b/Anul 3/Semestrul 2/Calcul numeric/Lab9.m @@ -0,0 +1,63 @@ +nodes = linspace(-2,4,7); + +f=@(x)(x+1)./(3*x.^2+2*x+1); + + +#plot(nodes, f(nodes),'o'); +#hold on + + +x=linspace(-2,4,500); + + +#plot(x,f(x)); +hold on + +lnf=lagrange_classic(nodes,f(nodes),x); + +#plot(x,lnf) + + +boor = spline(nodes,f(nodes),x); + +#plot(x,boor) + +df = @(x)(-(3*x.^2+6*x+1)./(3*x.^2+2*x+1).^2); + +herm = hermite(nodes,f(nodes), df(nodes),x) +#plot(x,herm) + + +f=@(x)(x.*sin(pi.*x)); + +nodes = [-1,-1/2,0,1/2,1,3/2]; + +x=linspace(-1,3/2,500); + +boor = spline(nodes,f(nodes),x); +boor_comp = spline(nodes,[pi,f(nodes),-1],x) +piece = pchip(nodes,f(nodes),x) + +#plot(nodes, f(nodes),'o'); +#hold on +#plot(x,boor); +#plot(x, boor_comp); +#plot(x, piece); + + +nodes = [0.5,1.5,2,3,3.5,4.5,5,6,7,8]; + +f_nodes = [5,5.8,5.8,6.8,6.9,7.6,7.8,8.2,9.2,9.9]; +x=linspace(0.5,8,500); + +p = polyfit(nodes,f_nodes,1); +plot(nodes, f_nodes,'o'); +hold on +plot(x, polyval(p,x)) + +norm(p) + +polyval(p,4) + + + diff --git a/Anul 3/Semestrul 2/Calcul numeric/adquad.m b/Anul 3/Semestrul 2/Calcul numeric/adquad.m new file mode 100644 index 0000000..235e222 --- /dev/null +++ b/Anul 3/Semestrul 2/Calcul numeric/adquad.m @@ -0,0 +1,10 @@ +function I = adquad(f, a, b, err, m) + I1 = trapz_int(f, a, b, m); + I2 = trapz_int(f, a, b, 2*m); + if abs(I1 - I2) < err % success + I = I2; + return + else % recursive subdivision + I = adquad(f, a, (a+b)/2, err, m) + adquad(f, (a+b)/2, b, err, m); + end +end; diff --git a/Anul 3/Semestrul 2/Calcul numeric/aitken.m b/Anul 3/Semestrul 2/Calcul numeric/aitken.m new file mode 100644 index 0000000..ff89981 --- /dev/null +++ b/Anul 3/Semestrul 2/Calcul numeric/aitken.m @@ -0,0 +1,12 @@ +function Lnf = aitken(x0,f0,x) + p = zeros(length(x0)); + p(:,1) = f0' + + n = length(x0) + for i=2:n + for j=2:i + p(i,j) = (1/(x0(i)-x0(i-j+1)))*det([x-x0(i-j+1), p(i-1,j-1);x-x0(i),p(i,j-1)]); + endfor + endfor + Lnf=p(n,n); +end; diff --git a/Anul 3/Semestrul 2/Calcul numeric/backdiff.m b/Anul 3/Semestrul 2/Calcul numeric/backdiff.m new file mode 100644 index 0000000..5838469 --- /dev/null +++ b/Anul 3/Semestrul 2/Calcul numeric/backdiff.m @@ -0,0 +1,11 @@ +function t = backdiff(f) + n = length(f); + t = zeros(n); + t(:,1)= f' + for j = 2:n + t(j:n,j) = diff(t(j-1:n,j-1)); + endfor +end; + + + diff --git a/Anul 3/Semestrul 2/Calcul numeric/backsub.m b/Anul 3/Semestrul 2/Calcul numeric/backsub.m new file mode 100644 index 0000000..3533cf1 --- /dev/null +++ b/Anul 3/Semestrul 2/Calcul numeric/backsub.m @@ -0,0 +1,10 @@ +function x = backsub(U, b) + n = length(b); + x = zeros(size(b)); + for k = n:-1:1 + x(k) = (b(k) - (U(k,k+1:n) * x(k+1:n)))/U(k,k); + endfor +end; + + + diff --git a/Anul 3/Semestrul 2/Calcul numeric/divdiff.m b/Anul 3/Semestrul 2/Calcul numeric/divdiff.m new file mode 100644 index 0000000..0816e2c --- /dev/null +++ b/Anul 3/Semestrul 2/Calcul numeric/divdiff.m @@ -0,0 +1,11 @@ +function t = divdiff(x, f) + n = length(x); + t=zeros(n); + t(:,1)= f' + for j = 2:n + t(1:n-j+1,j) = (t(2:n-j+2,j-1) - t(1:n-j+1,j-1))./((x(j:n)-x(1:n-j+1))'); + endfor +end + + + diff --git a/Anul 3/Semestrul 2/Calcul numeric/divdiff2.m b/Anul 3/Semestrul 2/Calcul numeric/divdiff2.m new file mode 100644 index 0000000..7fd8f1d --- /dev/null +++ b/Anul 3/Semestrul 2/Calcul numeric/divdiff2.m @@ -0,0 +1,13 @@ +function [z, t] = divdiff2(x,f,df) + z = repelem(x,2); + lz = length(z); + f2 = repelem(f,2); + t=zeros(lz); + t(:,1)= f2'; + t(1:2:lz-1,2) = df'; + t(2:2:lz-2,2) = (diff(f)./diff(x))'; + for j = 3:lz + t(1:lz-j+1,j) = (t(2:lz-j+2,j-1) - t(1:lz-j+1,j-1))./((z(j:lz)-z(1:lz-j+1))'); + endfor +end + diff --git a/Anul 3/Semestrul 2/Calcul numeric/forwarddiff.m b/Anul 3/Semestrul 2/Calcul numeric/forwarddiff.m new file mode 100644 index 0000000..78a4227 --- /dev/null +++ b/Anul 3/Semestrul 2/Calcul numeric/forwarddiff.m @@ -0,0 +1,11 @@ +function t = forwarddiff(f) + n = length(f); + t = zeros(n); + t(:,1)= f' + for j = 2:n + t(1:n-j+1,j) = diff(t(1:n-j+2,j-1)); + endfor +end; + + + diff --git a/Anul 3/Semestrul 2/Calcul numeric/forwsub.m b/Anul 3/Semestrul 2/Calcul numeric/forwsub.m new file mode 100644 index 0000000..a238f91 --- /dev/null +++ b/Anul 3/Semestrul 2/Calcul numeric/forwsub.m @@ -0,0 +1,10 @@ +function x = forwsub(U, b) + n = length(b); + x = zeros(size(b)); + for k = 1:n + x(k) = (b(k) - (U(k,1:k-1) * x(1:k-1)))/U(k,k); + endfor +end; + + + diff --git a/Anul 3/Semestrul 2/Calcul numeric/gauss.m b/Anul 3/Semestrul 2/Calcul numeric/gauss.m new file mode 100644 index 0000000..2138628 --- /dev/null +++ b/Anul 3/Semestrul 2/Calcul numeric/gauss.m @@ -0,0 +1,18 @@ +function x = gauss(A, b) + [r,n] = size(A); + x = zeros(size(b)); + A = [A,b] + for i = 1:n + [v, p] = max(abs(A(i:n, i))); + p = p + i - 1; + A([i p],:) = A([p i],:); + for j = i+1:n + coeff = A(j, i)/ A(i,i); + A(j, i:n+1) = A(j, i:n+1) - coeff * A(i,i:n+1) + endfor + endfor + x = backsub(A(:,1:n),A(:,n+1)); +end; + + + diff --git a/Anul 3/Semestrul 2/Calcul numeric/gaussseidel.m b/Anul 3/Semestrul 2/Calcul numeric/gaussseidel.m new file mode 100644 index 0000000..ec33013 --- /dev/null +++ b/Anul 3/Semestrul 2/Calcul numeric/gaussseidel.m @@ -0,0 +1,20 @@ +function [x, nit] = gausssidel(A, b, x0, err, maxnit) + n = length(b); + D = diag(diag(A)); + L = tril(A, -1); + U = A - D - L; + M = D + L; + N = -U; + T = M^(-1)*N; + c = M^(-1)*b; + x = x0; + for k = 1:maxnit + old_x = x; + x = T*x+c; + if norm(x-old_x,inf) <= ((1-norm(T,inf))/norm(T,inf))*err + nit = k; + return; + endif + endfor + error('Too dificult'); +end; diff --git a/Anul 3/Semestrul 2/Calcul numeric/hermite.m b/Anul 3/Semestrul 2/Calcul numeric/hermite.m new file mode 100644 index 0000000..bae44ec --- /dev/null +++ b/Anul 3/Semestrul 2/Calcul numeric/hermite.m @@ -0,0 +1,13 @@ +function Hnf = hermite(x0,f0,df0,x) + [z,dz] = divdiff2(x0,f0,df0); + x0=z; + ds = dz(1,:); + n = length(ds); + m = length(x); + Hnf = zeros(size(x)); + for i=1:m + for j=1:n + Hnf(i) = Hnf(i) + ds(j) * (prod( x(i) - x0([1:j-1]))); + endfor + endfor +end; diff --git a/Anul 3/Semestrul 2/Calcul numeric/homer_int.m b/Anul 3/Semestrul 2/Calcul numeric/homer_int.m new file mode 100644 index 0000000..3031456 --- /dev/null +++ b/Anul 3/Semestrul 2/Calcul numeric/homer_int.m @@ -0,0 +1,4 @@ +function R = homer_int(f, a, b, n) + R = ((b-a)/(2*3*n)) * (f(a)+f(b)+4*sum(f(a+([1:2:2*n-1])*((b-a)/(2*n))))+2*sum(f(a+([2:2:2*n-2])*((b-a)/(2*n))))); + + end; diff --git a/Anul 3/Semestrul 2/Calcul numeric/jacobi.m b/Anul 3/Semestrul 2/Calcul numeric/jacobi.m new file mode 100644 index 0000000..b458778 --- /dev/null +++ b/Anul 3/Semestrul 2/Calcul numeric/jacobi.m @@ -0,0 +1,17 @@ +function [x, nit] = jacobi(A, b, x0, err, maxnit) + n = length(b); + M = diag(diag(A)); + N = M - A; + T = M^(-1)*N; + c = M^(-1)*b; + x = x0; + for k = 1:maxnit + old_x = x; + x = T*x+c; + if norm(x-old_x,inf) <= ((1-norm(T,inf))/norm(T,inf))*err + nit = k; + return; + endif + endfor + error('Too dificult'); +end; diff --git a/Anul 3/Semestrul 2/Calcul numeric/lagrange_barycentric.m b/Anul 3/Semestrul 2/Calcul numeric/lagrange_barycentric.m new file mode 100644 index 0000000..2c4b2a1 --- /dev/null +++ b/Anul 3/Semestrul 2/Calcul numeric/lagrange_barycentric.m @@ -0,0 +1,14 @@ +function Lnf = lagrange_barycentric(nodes,f_nodes,x) + n = length(nodes); + m = length(x); + Lnf = zeros(size(x)); + l = zeros(size(nodes)); + for i = 1:m + ux = prod( x(i) - nodes([1:n])); + for j = 1:n + wi(j) = 1/prod( nodes(j) - nodes([1:j-1,j+1:n])); + endfor + Lnf(i) = ux* ((wi./(x(i) - nodes([1:n])))*f_nodes'); + + endfor +end; diff --git a/Anul 3/Semestrul 2/Calcul numeric/lagrange_classic.m b/Anul 3/Semestrul 2/Calcul numeric/lagrange_classic.m new file mode 100644 index 0000000..5aca4bc --- /dev/null +++ b/Anul 3/Semestrul 2/Calcul numeric/lagrange_classic.m @@ -0,0 +1,13 @@ +function Lnf = lagrange_classic(nodes,f_nodes,x) + n = length(nodes); + m = length(x); + Lnf = zeros(size(x)); + l = zeros(size(nodes)); + for i = 1:m + for j = 1:n + l(j) =(prod( x(i) - nodes([1:j-1,j+1:n])))/(prod( nodes(j) - nodes([1:j-1,j+1:n]))); + endfor + Lnf(i) = l*f_nodes'; + + endfor +end; diff --git a/Anul 3/Semestrul 2/Calcul numeric/newton.m b/Anul 3/Semestrul 2/Calcul numeric/newton.m new file mode 100644 index 0000000..75ac007 --- /dev/null +++ b/Anul 3/Semestrul 2/Calcul numeric/newton.m @@ -0,0 +1,13 @@ +function Lnf = newton(x0,f0,x) + d = divdiff(x0,f0); + ds = d(1,:); + n = length(ds); + m = length(x); + Lnf = zeros(size(x)); + for i=1:m + for j=1:n + Lnf(i) = Lnf(i) + ds(j) * (prod( x(i) - x0([1:j-1]))); + endfor + + endfor +end; diff --git a/Anul 3/Semestrul 2/Calcul numeric/rectangle_int.m b/Anul 3/Semestrul 2/Calcul numeric/rectangle_int.m new file mode 100644 index 0000000..9fc3d33 --- /dev/null +++ b/Anul 3/Semestrul 2/Calcul numeric/rectangle_int.m @@ -0,0 +1,4 @@ +function R = rectangle_int(f, a, b, n) + R = ((b-a)/n) * sum(f(a+([0:n-1]+1/2)*((b-a)/n))) + + end; diff --git a/Anul 3/Semestrul 2/Calcul numeric/trapz_int.m b/Anul 3/Semestrul 2/Calcul numeric/trapz_int.m new file mode 100644 index 0000000..548b2c2 --- /dev/null +++ b/Anul 3/Semestrul 2/Calcul numeric/trapz_int.m @@ -0,0 +1,4 @@ +function R = trapz_int(f, a, b, n) + R = ((b-a)/(2*n)) * (f(a)+f(b)+2*sum(f(a+([1:n-1])*((b-a)/n)))); + + end; diff --git a/Anul 3/Semestrul 2/Design Patterns/Anti-patterns.pptx b/Anul 3/Semestrul 2/Design Patterns/Anti-patterns.pptx new file mode 100644 index 0000000..5ed24a5 Binary files /dev/null and b/Anul 3/Semestrul 2/Design Patterns/Anti-patterns.pptx differ diff --git a/Anul 3/Semestrul 2/Design Patterns/DesignPattern.odt b/Anul 3/Semestrul 2/Design Patterns/DesignPattern.odt new file mode 100644 index 0000000..40ded40 Binary files /dev/null and b/Anul 3/Semestrul 2/Design Patterns/DesignPattern.odt differ diff --git a/Anul 3/Semestrul 2/Design Patterns/DesignPattern.pdf b/Anul 3/Semestrul 2/Design Patterns/DesignPattern.pdf new file mode 100644 index 0000000..8c199ed Binary files /dev/null and b/Anul 3/Semestrul 2/Design Patterns/DesignPattern.pdf differ diff --git a/Anul 3/Semestrul 2/Design Patterns/FileCompression/Compressor.cs b/Anul 3/Semestrul 2/Design Patterns/FileCompression/Compressor.cs new file mode 100644 index 0000000..41e3298 --- /dev/null +++ b/Anul 3/Semestrul 2/Design Patterns/FileCompression/Compressor.cs @@ -0,0 +1,57 @@ +using System; +using FileCompression.Enums; +using FileCompression.Services; +using FileCompression.Services.Strategies; + +namespace FileCompression; + +public class Compressor +{ + private static Compressor? _compressor; + private static readonly Lock _lock = new(); + + private static readonly StrategyContext StrategyContext = new(); + private Compressor() + { + } + + public static Compressor Instance + { + get + { + lock (_lock) + { + if (_compressor == null) + { + _compressor = new Compressor(); + } + return _compressor; + } + } + } + + public void Compress(string sourcePath, string destinationPath, CompressionMode mode) + { + if (string.IsNullOrEmpty(sourcePath)) + { + throw new ArgumentNullException(nameof(sourcePath), "Source path cannot be null or empty."); + } + + if (string.IsNullOrEmpty(destinationPath)) + { + throw new ArgumentNullException(nameof(destinationPath), "Destination path cannot be null or empty."); + } + + if (File.Exists(destinationPath)) + { + File.Delete(destinationPath); + } + + StrategyContext.SetStrategy(CompressorFactory.CreateCompressorStrategy(mode)); + var compressor = CompressorFactory.CreateCompressor(sourcePath, destinationPath, mode, StrategyContext); + compressor.Compress(); + Console.WriteLine($"Compressed {sourcePath} to {destinationPath} using {mode} mode."); + Console.WriteLine($"Compression completed successfully."); + } + +} diff --git a/Anul 3/Semestrul 2/Design Patterns/FileCompression/Enums/CompressionMode.cs b/Anul 3/Semestrul 2/Design Patterns/FileCompression/Enums/CompressionMode.cs new file mode 100644 index 0000000..fcc22dc --- /dev/null +++ b/Anul 3/Semestrul 2/Design Patterns/FileCompression/Enums/CompressionMode.cs @@ -0,0 +1,8 @@ +namespace FileCompression.Enums; + +public enum CompressionMode +{ + Zip, + Tar, + TarGz +} diff --git a/Anul 3/Semestrul 2/Design Patterns/FileCompression/Enums/EntryType.cs b/Anul 3/Semestrul 2/Design Patterns/FileCompression/Enums/EntryType.cs new file mode 100644 index 0000000..566f5e3 --- /dev/null +++ b/Anul 3/Semestrul 2/Design Patterns/FileCompression/Enums/EntryType.cs @@ -0,0 +1,7 @@ +namespace FileCompression.Enums; + +public enum EntryType +{ + File, + Directory +} diff --git a/Anul 3/Semestrul 2/Design Patterns/FileCompression/FileCompression.csproj b/Anul 3/Semestrul 2/Design Patterns/FileCompression/FileCompression.csproj new file mode 100644 index 0000000..125f4c9 --- /dev/null +++ b/Anul 3/Semestrul 2/Design Patterns/FileCompression/FileCompression.csproj @@ -0,0 +1,9 @@ + + + + net9.0 + enable + enable + + + diff --git a/Anul 3/Semestrul 2/Design Patterns/FileCompression/Interfaces/ICompressionStrategy.cs b/Anul 3/Semestrul 2/Design Patterns/FileCompression/Interfaces/ICompressionStrategy.cs new file mode 100644 index 0000000..e672c13 --- /dev/null +++ b/Anul 3/Semestrul 2/Design Patterns/FileCompression/Interfaces/ICompressionStrategy.cs @@ -0,0 +1,9 @@ +using System; + +namespace FileCompression.Interfaces; + +public interface ICompressionStrategy +{ + void CompressFile(string sourcePath, string destinationPath, string basePath); + void CompressDirectory(string sourcePath, string destinationPath, string basePath); +} diff --git a/Anul 3/Semestrul 2/Design Patterns/FileCompression/Interfaces/ICompressor.cs b/Anul 3/Semestrul 2/Design Patterns/FileCompression/Interfaces/ICompressor.cs new file mode 100644 index 0000000..15fddb2 --- /dev/null +++ b/Anul 3/Semestrul 2/Design Patterns/FileCompression/Interfaces/ICompressor.cs @@ -0,0 +1,11 @@ +using System; +using System.IO.Compression; +using FileCompression.Services.Strategies; + +namespace FileCompression.Interfaces; + +public interface ICompressor +{ + void Compress(); + +} diff --git a/Anul 3/Semestrul 2/Design Patterns/FileCompression/Models/Entry.cs b/Anul 3/Semestrul 2/Design Patterns/FileCompression/Models/Entry.cs new file mode 100644 index 0000000..cd8073d --- /dev/null +++ b/Anul 3/Semestrul 2/Design Patterns/FileCompression/Models/Entry.cs @@ -0,0 +1,10 @@ +using System; +using FileCompression.Enums; + +namespace FileCompression.Models; + +public class Entry +{ + public required string Path { get; set; } + public EntryType Type { get; set; } +} diff --git a/Anul 3/Semestrul 2/Design Patterns/FileCompression/Services/Composites/FileCompressor.cs b/Anul 3/Semestrul 2/Design Patterns/FileCompression/Services/Composites/FileCompressor.cs new file mode 100644 index 0000000..7ae7b14 --- /dev/null +++ b/Anul 3/Semestrul 2/Design Patterns/FileCompression/Services/Composites/FileCompressor.cs @@ -0,0 +1,25 @@ +using System; +using FileCompression.Interfaces; +using FileCompression.Services.Strategies; + +namespace FileCompression.Services.Composites; + +public class FileCompressor : ICompressor +{ + + private string sourcePath; + private string destinationPath; + private string basePath; + private StrategyContext strategyContext; + public FileCompressor(string sourcePath, string destinationPath, string basePath, StrategyContext strategyContext) + { + this.sourcePath = sourcePath; + this.destinationPath = destinationPath; + this.strategyContext = strategyContext; + this.basePath = basePath; + } + public void Compress() + { + strategyContext.CompressFile(sourcePath, destinationPath, basePath); + } +} diff --git a/Anul 3/Semestrul 2/Design Patterns/FileCompression/Services/Composites/FolderCompressor.cs b/Anul 3/Semestrul 2/Design Patterns/FileCompression/Services/Composites/FolderCompressor.cs new file mode 100644 index 0000000..fe41e95 --- /dev/null +++ b/Anul 3/Semestrul 2/Design Patterns/FileCompression/Services/Composites/FolderCompressor.cs @@ -0,0 +1,48 @@ +using System; +using FileCompression.Enums; +using FileCompression.Interfaces; +using FileCompression.Models; +using FileCompression.Services.Strategies; + +namespace FileCompression.Services.Composites; + +public class FolderCompressor : ICompressor +{ + private readonly string sourcePath; + private readonly string destinationPath; + private readonly StrategyContext strategyContext; + private readonly string basePath; + public FolderCompressor(string sourcePath, string destinationPath, string basePath, StrategyContext strategyContext) + { + this.sourcePath = sourcePath; + this.destinationPath = destinationPath; + this.strategyContext = strategyContext; + this.basePath = basePath; + } + public void Compress() + { + strategyContext.CompressDirectory(sourcePath, destinationPath, basePath); + var entries = GetEntries(); + foreach (var entry in entries) + { + entry.Compress(); + } + + } + + private List GetEntries() + { + List entries = []; + foreach (var file in Directory.GetFiles(sourcePath)) + { + entries.Add(new FileCompressor(file, destinationPath, basePath, strategyContext)); + } + + foreach (var directory in Directory.GetDirectories(sourcePath)) + { + entries.Add(new FolderCompressor(directory, destinationPath, basePath, strategyContext)); + } + + return entries; + } +} diff --git a/Anul 3/Semestrul 2/Design Patterns/FileCompression/Services/Composites/TarCompressor.cs b/Anul 3/Semestrul 2/Design Patterns/FileCompression/Services/Composites/TarCompressor.cs new file mode 100644 index 0000000..5a49609 --- /dev/null +++ b/Anul 3/Semestrul 2/Design Patterns/FileCompression/Services/Composites/TarCompressor.cs @@ -0,0 +1,43 @@ +using System; +using System.IO.Compression; +using FileCompression.Interfaces; +using FileCompression.Services.Strategies; + +namespace FileCompression.Services.Composites; + +public class TarCompressor : ICompressor +{ + + private readonly string sourcePath; + private readonly string destinationPath; + private readonly StrategyContext strategyContext; + private readonly string basePath; + private readonly string tarPath; + private ICompressor compressor; + public TarCompressor(string sourcePath, string destinationPath, string basePath, StrategyContext strategyContext) + { + this.sourcePath = sourcePath; + this.destinationPath = destinationPath; + this.strategyContext = strategyContext; + this.basePath = basePath; + this.tarPath = destinationPath + ".tar"; + + compressor = File.Exists(sourcePath) ? new FileCompressor(sourcePath, tarPath, basePath, strategyContext) : new FolderCompressor(sourcePath, tarPath, basePath, strategyContext); + } + public void Compress() + { + compressor.Compress(); + GZipCompress(); + } + + private void GZipCompress() + { + using (var fileStream = new FileStream(tarPath, FileMode.Open)) + using (var compressedFileStream = File.Create(destinationPath)) + using (var compressionStream = new GZipStream(compressedFileStream, CompressionLevel.Optimal)) + { + fileStream.CopyTo(compressionStream); + } + File.Delete(tarPath); + } +} diff --git a/Anul 3/Semestrul 2/Design Patterns/FileCompression/Services/CompressorFactory.cs b/Anul 3/Semestrul 2/Design Patterns/FileCompression/Services/CompressorFactory.cs new file mode 100644 index 0000000..d96629e --- /dev/null +++ b/Anul 3/Semestrul 2/Design Patterns/FileCompression/Services/CompressorFactory.cs @@ -0,0 +1,59 @@ +using System; +using FileCompression.Enums; +using FileCompression.Interfaces; +using FileCompression.Services.Composites; +using FileCompression.Services.Strategies; + +namespace FileCompression.Services; + +public static class CompressorFactory +{ + public static ICompressionStrategy CreateCompressorStrategy(CompressionMode mode) + { + return mode switch + { + CompressionMode.Zip => new ZipStrategy(), + CompressionMode.Tar => new TarGzStrategy(), + CompressionMode.TarGz => new TarGzStrategy(), + _ => throw new NotSupportedException($"Compression mode '{mode}' is not supported.") + }; + } + + public static ICompressor CreateCompressor(string sourcePath, string destinationPath, CompressionMode mode, StrategyContext strategyContext) + { + string basePath = sourcePath.Substring(0, sourcePath.LastIndexOf(Path.DirectorySeparatorChar)); + basePath = basePath.Substring(0, sourcePath.LastIndexOf(Path.DirectorySeparatorChar)); + Console.WriteLine($"Base path: {basePath}"); + if (File.Exists(sourcePath)) + { + switch (mode) + { + case CompressionMode.Zip: + return new FileCompressor(sourcePath, destinationPath, basePath, strategyContext); + case CompressionMode.Tar: + return new FileCompressor(sourcePath, destinationPath, basePath, strategyContext); + case CompressionMode.TarGz: + return new TarCompressor(sourcePath, destinationPath, basePath, strategyContext); + default: + throw new NotSupportedException($"Compression mode '{mode}' is not supported."); + } + } + if (Directory.Exists(sourcePath)) + { + switch (mode) + { + case CompressionMode.Zip: + return new FolderCompressor(sourcePath, destinationPath, basePath, strategyContext); + case CompressionMode.Tar: + return new FolderCompressor(sourcePath, destinationPath, basePath, strategyContext); + case CompressionMode.TarGz: + return new TarCompressor(sourcePath, destinationPath, basePath, strategyContext); + default: + throw new NotSupportedException($"Compression mode '{mode}' is not supported."); + } + } + throw new ArgumentException("Source path must be a file or directory.", nameof(sourcePath)); + + } + +} diff --git a/Anul 3/Semestrul 2/Design Patterns/FileCompression/Services/Strategies/StrategyContext.cs b/Anul 3/Semestrul 2/Design Patterns/FileCompression/Services/Strategies/StrategyContext.cs new file mode 100644 index 0000000..27462e5 --- /dev/null +++ b/Anul 3/Semestrul 2/Design Patterns/FileCompression/Services/Strategies/StrategyContext.cs @@ -0,0 +1,36 @@ +using System; +using FileCompression.Interfaces; + +namespace FileCompression.Services.Strategies; + +public class StrategyContext +{ + private ICompressionStrategy? _compressionStrategy; + public StrategyContext() + { + } + public StrategyContext(ICompressionStrategy compressionStrategy) + { + _compressionStrategy = compressionStrategy; + } + public void SetStrategy(ICompressionStrategy compressionStrategy) + { + _compressionStrategy = compressionStrategy; + } + public void CompressFile(string sourcePath, string destinationPath, string basePath) + { + if (_compressionStrategy == null) + { + throw new InvalidOperationException("Compression strategy is not set."); + } + _compressionStrategy.CompressFile(sourcePath, destinationPath, basePath); + } + public void CompressDirectory(string sourcePath, string destinationPath, string basePath) + { + if (_compressionStrategy == null) + { + throw new InvalidOperationException("Compression strategy is not set."); + } + _compressionStrategy.CompressDirectory(sourcePath, destinationPath, basePath); + } +} diff --git a/Anul 3/Semestrul 2/Design Patterns/FileCompression/Services/Strategies/TarGzStrategy.cs b/Anul 3/Semestrul 2/Design Patterns/FileCompression/Services/Strategies/TarGzStrategy.cs new file mode 100644 index 0000000..b8d8e7f --- /dev/null +++ b/Anul 3/Semestrul 2/Design Patterns/FileCompression/Services/Strategies/TarGzStrategy.cs @@ -0,0 +1,68 @@ +using System; +using System.Formats.Tar; +using FileCompression.Interfaces; +using FileCompression.Utils; + +namespace FileCompression.Services.Strategies; + +public class TarGzStrategy : ICompressionStrategy +{ + public void CompressFile(string sourcePath, string destinationPath, string basePath) + { + Console.WriteLine($"Compressing {sourcePath} to {destinationPath} using tar and gzip."); + string tempPath = Path.GetTempFileName(); + using (var tempStream = new FileStream(tempPath, FileMode.Create, FileAccess.Write)) + using (var tempWriter = new TarWriter(tempStream, TarEntryFormat.Pax)) + { + // Copy existing entries to temp file + if (File.Exists(destinationPath)) + { + using (var originalStream = new FileStream(destinationPath, FileMode.Open, FileAccess.Read)) + using (var tarReader = new TarReader(originalStream, leaveOpen: false)) + { + TarEntry? entry; + while ((entry = tarReader.GetNextEntry()) is not null) + { + tempWriter.WriteEntry(entry); + } + } + } + + // Add new entry + string entryName = ArchiveUtils.EntryFromPath(sourcePath.AsSpan(basePath.Length)); + tempWriter.WriteEntry(sourcePath, entryName); + } + + File.Copy(tempPath, destinationPath, overwrite: true); + File.Delete(tempPath); + + } + + public void CompressDirectory(string sourcePath, string destinationPath, string basePath) + { + Console.WriteLine($"Compressing {sourcePath} to {destinationPath} using tar and gzip."); + string tempPath = Path.GetTempFileName(); + using (var tempStream = new FileStream(tempPath, FileMode.Create, FileAccess.Write)) + using (var tempWriter = new TarWriter(tempStream, TarEntryFormat.Pax)) + { + // Copy existing entries to temp file + if (File.Exists(destinationPath)) + { + using (var originalStream = new FileStream(destinationPath, FileMode.Open, FileAccess.Read)) + using (var tarReader = new TarReader(originalStream, leaveOpen: false)) + { + TarEntry? entry; + while ((entry = tarReader.GetNextEntry()) is not null) + { + tempWriter.WriteEntry(entry); + } + } + } + + // Add new entry + string entryName = ArchiveUtils.EntryFromPath(sourcePath.AsSpan(basePath.Length), appendPathSeparator: true); + tempWriter.WriteEntry(sourcePath, entryName); + } + + } +} diff --git a/Anul 3/Semestrul 2/Design Patterns/FileCompression/Services/Strategies/ZipStrategy.cs b/Anul 3/Semestrul 2/Design Patterns/FileCompression/Services/Strategies/ZipStrategy.cs new file mode 100644 index 0000000..7cfef61 --- /dev/null +++ b/Anul 3/Semestrul 2/Design Patterns/FileCompression/Services/Strategies/ZipStrategy.cs @@ -0,0 +1,72 @@ +using System; +using FileCompression.Interfaces; +using System.IO; +using System.IO.Compression; +using System.Collections.Generic; +using FileCompression.Utils; + +namespace FileCompression.Services.Strategies; + +public class ZipStrategy : ICompressionStrategy +{ + + + public void CompressFile(string sourcePath, string destinationPath, string basePath) + { + Console.WriteLine($"Compressing file {sourcePath} to {destinationPath}"); + + using (Stream destination = new FileStream(destinationPath, FileMode.OpenOrCreate, FileAccess.ReadWrite)) + { + using ZipArchive archive = new ZipArchive(destination, ZipArchiveMode.Update); + string entryName = ArchiveUtils.EntryFromPath(sourcePath.AsSpan(basePath.Length)); + DoCreateEntryFromFile(archive, sourcePath, entryName, CompressionLevel.Optimal); + } + } + + public void CompressDirectory(string sourcePath, string destinationPath, string basePath) + { + Console.WriteLine($"Compressing directory {sourcePath} to {destinationPath}"); + + using (Stream destination = new FileStream(destinationPath, FileMode.OpenOrCreate, FileAccess.ReadWrite)) + { + using ZipArchive archive = new ZipArchive(destination, ZipArchiveMode.Update); + string entryName = ArchiveUtils.EntryFromPath(sourcePath.AsSpan(basePath.Length), appendPathSeparator: true); + archive.CreateEntry(entryName); + } + } + + private ZipArchiveEntry DoCreateEntryFromFile(ZipArchive destination, + string sourceFileName, string entryName, CompressionLevel? compressionLevel) + { + ArgumentNullException.ThrowIfNull(destination); + ArgumentNullException.ThrowIfNull(sourceFileName); + ArgumentNullException.ThrowIfNull(entryName); + + // Checking of compressionLevel is passed down to DeflateStream and the IDeflater implementation + // as it is a pluggable component that completely encapsulates the meaning of compressionLevel. + + // Argument checking gets passed down to FileStream's ctor and CreateEntry + + using (FileStream fs = new FileStream(sourceFileName, FileMode.Open, FileAccess.Read, FileShare.Read, bufferSize: 0x1000, useAsync: false)) + { + ZipArchiveEntry entry = compressionLevel.HasValue + ? destination.CreateEntry(entryName, compressionLevel.Value) + : destination.CreateEntry(entryName); + + DateTime lastWrite = File.GetLastWriteTime(sourceFileName); + + // If file to be archived has an invalid last modified time, use the first datetime representable in the Zip timestamp format + // (midnight on January 1, 1980): + if (lastWrite.Year < 1980 || lastWrite.Year > 2107) + lastWrite = new DateTime(1980, 1, 1, 0, 0, 0); + + entry.LastWriteTime = lastWrite; + + using (Stream es = entry.Open()) + fs.CopyTo(es); + + return entry; + } + } + +} diff --git a/Anul 3/Semestrul 2/Design Patterns/FileCompression/Utils/ArchiveUtils.cs b/Anul 3/Semestrul 2/Design Patterns/FileCompression/Utils/ArchiveUtils.cs new file mode 100644 index 0000000..79dc02e --- /dev/null +++ b/Anul 3/Semestrul 2/Design Patterns/FileCompression/Utils/ArchiveUtils.cs @@ -0,0 +1,26 @@ +using System; + +namespace FileCompression.Utils; + +public static class ArchiveUtils +{ + public static string EntryFromPath(ReadOnlySpan path, bool appendPathSeparator = false) + { + // Remove leading separators. + int nonSlash = path.IndexOfAnyExcept('/'); + if (nonSlash < 0) + { + nonSlash = path.Length; + } + path = path.Slice(nonSlash); + + // Append a separator if necessary. + return (path.IsEmpty, appendPathSeparator) switch + { + (false, false) => path.ToString(), + (false, true) => string.Concat(path, "/"), + (true, false) => string.Empty, + (true, true) => "/", + }; + } +} diff --git a/Anul 3/Semestrul 2/Design Patterns/FileCompressionCLI/FileCompressionCLI.csproj b/Anul 3/Semestrul 2/Design Patterns/FileCompressionCLI/FileCompressionCLI.csproj new file mode 100644 index 0000000..2370b1a --- /dev/null +++ b/Anul 3/Semestrul 2/Design Patterns/FileCompressionCLI/FileCompressionCLI.csproj @@ -0,0 +1,14 @@ + + + + Exe + net9.0 + enable + enable + + + + + + + diff --git a/Anul 3/Semestrul 2/Design Patterns/FileCompressionCLI/Program.cs b/Anul 3/Semestrul 2/Design Patterns/FileCompressionCLI/Program.cs new file mode 100644 index 0000000..db5301f --- /dev/null +++ b/Anul 3/Semestrul 2/Design Patterns/FileCompressionCLI/Program.cs @@ -0,0 +1,34 @@ +// See https://aka.ms/new-console-template for more information +using System; +using FileCompression.Interfaces; +using FileCompression.Services.Strategies; +using FileCompression.Services.Composites; +using FileCompression; +using FileCompression.Enums; + +// dotnet run --project FileCompressionCLI/ /home/danielcujba/Pictures/Screenshots/ /home/danielcujba/Downloads/destination.zip Zip +// dotnet run --project FileCompressionCLI/ /home/danielcujba/Pictures/Screenshots/ /home/danielcujba/Downloads/destination.tar Tar +// dotnet run --project FileCompressionCLI/ /home/danielcujba/Pictures/Screenshots/ /home/danielcujba/Downloads/destination.tar.gz TarGz +namespace FileCompressionCLI +{ + class Program + { + static void Main(string[] args) + { + if (args.Length < 3) + { + Console.WriteLine("Usage: FileCompressionCLI "); + return; + } + string sourcePath = args[0]; + string destinationPath = args[1]; + if (!Enum.TryParse(args[2], true, out CompressionMode mode)) + { + Console.WriteLine($"Invalid compression mode: {args[2]}"); + return; + } + + Compressor.Instance.Compress(sourcePath, destinationPath, mode); + } + } +} \ No newline at end of file diff --git a/Anul 3/Semestrul 2/LLM/ESB/Emotional Support Buddy Chatbot Documentation.pdf b/Anul 3/Semestrul 2/LLM/ESB/Emotional Support Buddy Chatbot Documentation.pdf new file mode 100644 index 0000000..fff2581 Binary files /dev/null and b/Anul 3/Semestrul 2/LLM/ESB/Emotional Support Buddy Chatbot Documentation.pdf differ diff --git a/Anul 3/Semestrul 2/LLM/ESB/Emotional Support Homie.pdf b/Anul 3/Semestrul 2/LLM/ESB/Emotional Support Homie.pdf new file mode 100644 index 0000000..5dfdefe Binary files /dev/null and b/Anul 3/Semestrul 2/LLM/ESB/Emotional Support Homie.pdf differ diff --git a/Anul 3/Semestrul 2/LLM/ESB/chroma_db_store/chroma.sqlite3 b/Anul 3/Semestrul 2/LLM/ESB/chroma_db_store/chroma.sqlite3 new file mode 100644 index 0000000..05ec456 Binary files /dev/null and b/Anul 3/Semestrul 2/LLM/ESB/chroma_db_store/chroma.sqlite3 differ diff --git a/Anul 3/Semestrul 2/LLM/ESB/main.py b/Anul 3/Semestrul 2/LLM/ESB/main.py new file mode 100644 index 0000000..a200339 --- /dev/null +++ b/Anul 3/Semestrul 2/LLM/ESB/main.py @@ -0,0 +1,528 @@ +import openai +import json +import chromadb # For ChromaDB +import os # For checking if requirements file exists +import hashlib # For creating deterministic IDs + +# --- Debug Configuration --- +DEBUG_LOGS = True # Set to False to hide detailed step-by-step logs + +# Configure the OpenAI client to connect to LM Studio +client = openai.OpenAI(base_url="http://localhost:1234/v1", api_key="lm-studio") + +# --- Model Configuration --- +ESB_MODEL_ID = "mistral-7b-instruct-v0.3" +FEEDBACK_MODEL_ID = "phi-3-mini-4k-instruct" +GUARDRAIL_MODEL_ID = "qwen1.5-1.8b-chat" +EMBEDDING_MODEL_ID = "text-embedding-nomic-embed-text-v1.5" + +# --- RAG Configuration with ChromaDB --- +REQUIREMENTS_FILE_PATH = "requirements.txt" +CHROMA_DB_PATH = "chroma_db_store" # Path where ChromaDB will store its data +CHROMA_COLLECTION_NAME = "esb_requirements_collection" # Changed name slightly for clarity +chroma_collection = None # Will be initialized + +# --- Prompt Engineering --- +# ESB_SYSTEM_PROMPT, FEEDBACK_LLM_SYSTEM_PROMPT, GUARDRAIL_LLM_SYSTEM_PROMPT +# remain the same as in the previous complete script version. +ESB_SYSTEM_PROMPT = """ +You are an Emotional Support Buddy (ESB). Your primary goal is to offer decent, empathetic advice or praise. +Listen attentively to the user. Be kind, understanding, and supportive. +Avoid giving medical or financial advice. Focus on emotional well-being. +Keep your responses concise but warm. +""" + +FEEDBACK_LLM_SYSTEM_PROMPT = """ +You are a specialized AI that outputs a SINGLE-LINE JSON object. This JSON object is a directive for an Emotional Support Buddy (ESB) LLM. +Your SOLE output MUST be a valid JSON object on a single line. Do NOT use conversational language or markdown code fences. + +The JSON object MUST have a top-level key named "directive". +The value of "directive" MUST be an object containing these EXACT three sub-keys: +1. "action_type": (string) A concise verb or verb phrase for the ESB's primary action. + Examples: "Congratulate", "AcknowledgeFeelings", "ExpressSympathy", "OfferSupport", "ValidateAndExplore", "PositiveReinforcement". +2. "suggested_tone": (string) Adjectives describing the ESB's desired tone. + Examples: "Enthusiastic and celebratory", "Warm, understanding, and encouraging", "Very gentle, compassionate, and patient", "Supportive and calm". +3. "focus_hint": (string) A BRIEF note (NOT a full message) on what the ESB should address or be mindful of. This helps guide the ESB's unique response. + Examples: "User's recent promotion; share excitement", "User's mixed feelings about a situation; gently explore", "User's expressed sadness or loss; offer condolences and listening space". + +Example of YOUR EXACT JSON OUTPUT (single-line): +User input: "i just got promoted!!!" +Your output: +{ "directive": { "action_type": "Congratulate", "suggested_tone": "Enthusiastic and celebratory", "focus_hint": "User's excitement about their promotion; share joy and ask for details." } } + +Another example: +User input: "I'm feeling really down today." +Your output: +{ "directive": { "action_type": "AcknowledgeFeelingsAndOfferSupport", "suggested_tone": "Gentle, empathetic, and patient", "focus_hint": "User feeling down; validate feelings and offer to listen." } } + +If your output is not a valid single-line JSON object with the top-level key "directive" whose value is an object containing "action_type", "suggested_tone", and "focus_hint", you are failing. +Analyze the user's last message and recent conversation, then generate the single-line JSON directive. +""" + +GUARDRAIL_LLM_SYSTEM_PROMPT = """ +You are a Guardrail LLM. Your task is to evaluate the following candidate message from an Emotional Support Buddy. +Determine if the message is: +1. Toxic or harmful in any way. +2. Inappropriate for an emotional support context (e.g., judgmental, dismissive, giving unqualified advice). +3. Generally unhelpful or counterproductive. + +Respond with ONLY 'SAFE' if the message is appropriate and helpful. +Respond with ONLY 'UNSAFE' if the message is toxic, inappropriate, or unhelpful. +""" + +conversation_history = [] +MAX_HISTORY_LEN = 10 + + +# --- RAG Functions with ChromaDB --- +def get_embedding(text_to_embed, model_id=EMBEDDING_MODEL_ID): + """Gets an embedding for the given text using the specified model.""" + try: + if not text_to_embed or not text_to_embed.strip(): + if DEBUG_LOGS: print(f"Attempted to embed an empty or whitespace-only string. Returning None.") + return None + response = client.embeddings.create( + input=[text_to_embed], + model=model_id + ) + return response.data[0].embedding + except Exception as e: + if DEBUG_LOGS: + print(f"Error getting embedding for text '{text_to_embed[:50]}...': {e}") + return None + + +def initialize_and_populate_chroma_collection(): + """Initializes ChromaDB client, gets/creates a collection, and populates it from the requirements file.""" + global chroma_collection + try: + chroma_client = chromadb.PersistentClient(path=CHROMA_DB_PATH) + chroma_collection = chroma_client.get_or_create_collection( + name=CHROMA_COLLECTION_NAME, + metadata={"hnsw:space": "cosine"} # Essential for cosine similarity search + ) + + if DEBUG_LOGS: + print(f"\n----- Initializing/Populating ChromaDB Collection: {CHROMA_COLLECTION_NAME} -----") + print(f"Collection item count before processing: {chroma_collection.count()}") + + if not os.path.exists(REQUIREMENTS_FILE_PATH): + if DEBUG_LOGS: + print(f"Requirements file not found at {REQUIREMENTS_FILE_PATH}. No new items to populate.") + return + + with open(REQUIREMENTS_FILE_PATH, 'r', encoding='utf-8') as f: + requirements_texts = [line.strip() for line in f if line.strip()] + + if not requirements_texts: + if DEBUG_LOGS: + print("No requirements found in the file to process.") + return + + ids_to_add = [] + documents_to_add = [] + embeddings_to_add = [] + + # Get all existing document IDs from the collection to check for existence + # This is more efficient than getting all documents if the collection is large. + existing_ids_in_chroma = set(chroma_collection.get(include=[])['ids']) + + for req_text in requirements_texts: + # Create a deterministic ID based on the text content + # This helps in checking for existence and avoiding duplicates if text is the same + req_id = "req_" + hashlib.md5(req_text.encode('utf-8')).hexdigest() + + if req_id in existing_ids_in_chroma: + if DEBUG_LOGS: + print(f"Requirement ID '{req_id}' ('{req_text[:30]}...') already in ChromaDB. Skipping.") + continue + + embedding = get_embedding(req_text) + if embedding: + ids_to_add.append(req_id) + documents_to_add.append(req_text) + embeddings_to_add.append(embedding) + else: + if DEBUG_LOGS: + print(f"Could not compute embedding for requirement: {req_text}") + + if documents_to_add: + chroma_collection.add( + embeddings=embeddings_to_add, + documents=documents_to_add, + ids=ids_to_add + ) + if DEBUG_LOGS: + print( + f"Added {len(documents_to_add)} new requirements to ChromaDB collection '{CHROMA_COLLECTION_NAME}'.") + else: + if DEBUG_LOGS: + print(f"No new requirements to add to the collection.") + + if DEBUG_LOGS: + print(f"Collection item count after processing: {chroma_collection.count()}") + + except Exception as e: + if DEBUG_LOGS: + print(f"Error initializing or populating ChromaDB: {e}") + chroma_collection = None + + +def retrieve_relevant_requirements_from_chroma(query_text, top_k=3, similarity_threshold=0.5): + """Retrieves the top_k most relevant requirements from ChromaDB.""" + global chroma_collection + if not query_text or chroma_collection is None: + if DEBUG_LOGS and chroma_collection is None: + print("ChromaDB collection not initialized. Cannot retrieve.") + return [] + + query_embedding = get_embedding(query_text) + if not query_embedding: + if DEBUG_LOGS: print("Could not get embedding for query. Cannot retrieve.") + return [] + + try: + results = chroma_collection.query( + query_embeddings=[query_embedding], + n_results=top_k, + include=['documents', 'distances'] + ) + + retrieved_requirements = [] + if results and results.get('documents') and results.get('distances'): + documents = results['documents'][0] + distances = results['distances'][0] + + if DEBUG_LOGS: + print(f"\n----- ChromaDB RAG Retrieval for query: '{query_text[:50]}...' -----") + + for i, doc_text in enumerate(documents): + # ChromaDB with "cosine" space returns distance = 1 - cosine_similarity. + # So, similarity = 1 - distance. + similarity_score = 1 - distances[i] + + if DEBUG_LOGS: + print( + f" Candidate: '{doc_text[:60]}...' (Distance: {distances[i]:.4f}, Similarity: {similarity_score:.4f})") + + if similarity_score >= similarity_threshold: + retrieved_requirements.append(doc_text) + else: + if DEBUG_LOGS: + print( + f" -> Rejected due to similarity score {similarity_score:.4f} < threshold {similarity_threshold}") + + if DEBUG_LOGS: + if retrieved_requirements: + print(f"Retrieved {len(retrieved_requirements)} requirements meeting threshold:") + for req_idx, req_val in enumerate(retrieved_requirements): print(f" {req_idx + 1}. {req_val}") + else: + print("No requirements met the similarity threshold from ChromaDB query.") + else: + if DEBUG_LOGS: print("No results from ChromaDB query or results format unexpected.") + + return retrieved_requirements + + except Exception as e: + if DEBUG_LOGS: + print(f"Error querying ChromaDB: {e}") + return [] + + +# --- Core LLM Functions --- +def get_llm_response(model_id, system_prompt, messages_payload, temperature=0.7, max_tokens=250): + """Generic function to get a response from an LLM via LM Studio.""" + try: + all_messages = [{"role": "system", "content": system_prompt}] if system_prompt else [] + all_messages.extend(messages_payload) + + completion = client.chat.completions.create( + model=model_id, + messages=all_messages, + temperature=temperature, + max_tokens=max_tokens, + ) + response_content = completion.choices[0].message.content.strip() + return response_content + except Exception as e: + if DEBUG_LOGS: + print(f"Error communicating with LLM ({model_id}): {e}") + try: + if DEBUG_LOGS: + print("Attempting to list available models from LM Studio...") + models_data = client.models.list() + if DEBUG_LOGS: + print("Available models:") + for m in models_data.data: + print(f" ID: {m.id}, Object: {m.object}, Owned By: {m.owned_by}") + except Exception as model_list_e: + if DEBUG_LOGS: + print(f"Could not retrieve model list: {model_list_e}") + return None + + +def get_feedback_instruction(current_history): + """Gets a structured instruction from the Feedback LLM.""" + if DEBUG_LOGS: + print("\n----- Getting Feedback Instruction -----") + if not current_history: + return "ACTION: Greet warmly. TONE: Friendly and inviting. FOCUS: Ask how the user is feeling." + + feedback_context = [] + for msg in current_history[-(MAX_HISTORY_LEN * 2):]: + feedback_context.append(f"{msg['role'].capitalize()}: {msg['content']}") + history_str = "\n".join(feedback_context) + + user_focused_prompt = f"Recent conversation context:\n{history_str}\n\nUSER'S LAST MESSAGE: \"{current_history[-1]['content']}\"\n\nGenerate the single-line JSON directive for the ESB, ensuring the 'directive' object contains 'action_type', 'suggested_tone', and 'focus_hint'." + + raw_json_output = get_llm_response( + FEEDBACK_MODEL_ID, + FEEDBACK_LLM_SYSTEM_PROMPT, + [{"role": "user", "content": user_focused_prompt}], + temperature=0.05, + max_tokens=300 + ) + + instruction_string = "ACTION: Listen actively and show empathy. TONE: Gentle and understanding. FOCUS: User's current main concern." + if raw_json_output: + if DEBUG_LOGS: + print(f"Feedback LLM ({FEEDBACK_MODEL_ID}) Raw Output:\n'{raw_json_output}'") + try: + processed_output = raw_json_output.strip() + if processed_output.startswith("```json"): + processed_output = processed_output.removeprefix("```json").strip() + if processed_output.endswith("```"): + processed_output = processed_output.removesuffix("```").strip() + + parsed_data = None + try: + parsed_data = json.loads(processed_output) + except json.JSONDecodeError: + if DEBUG_LOGS: + print("Initial JSONDecodeError for Feedback LLM output, attempting to fix quotes (heuristic)...") + try: + processed_output_fixed_quotes = processed_output.replace("'", '"') + parsed_data = json.loads(processed_output_fixed_quotes) + except json.JSONDecodeError as e2_fix_quotes: + if DEBUG_LOGS: + print(f"Still JSONDecodeError after quote fix attempt for Feedback LLM output: {e2_fix_quotes}") + raise e2_fix_quotes from None + + directive_obj = parsed_data.get("directive") + if directive_obj and isinstance(directive_obj, dict): + action = directive_obj.get("action_type") + tone = directive_obj.get("suggested_tone") + focus = directive_obj.get("focus_hint") + + if action and tone and focus: + instruction_string = f"ACTION: {action}. TONE: {tone}. FOCUS: {focus}." + if DEBUG_LOGS: + print( + f"Feedback LLM ({FEEDBACK_MODEL_ID}) Successfully Parsed Instruction:\n{instruction_string}") + else: + missing_keys_details = [] + if not action: missing_keys_details.append("directive.action_type") + if not tone: missing_keys_details.append("directive.suggested_tone") + if not focus: missing_keys_details.append("directive.focus_hint") + if DEBUG_LOGS: + print( + f"Feedback LLM ({FEEDBACK_MODEL_ID}) JSON 'directive' object missing required keys. Missing: {', '.join(missing_keys_details)}. Directive Object: {directive_obj}") + else: + if DEBUG_LOGS: + print( + f"Feedback LLM ({FEEDBACK_MODEL_ID}) JSON missing top-level 'directive' object or it's not a dictionary. Parsed: {parsed_data}") + except json.JSONDecodeError as e_json: + if DEBUG_LOGS: + print( + f"Feedback LLM ({FEEDBACK_MODEL_ID}) failed to output valid JSON. Error: {e_json}. Raw Output: '{raw_json_output}'") + except Exception as e_general: + if DEBUG_LOGS: + print( + f"Feedback LLM ({FEEDBACK_MODEL_ID}) Error processing output: {e_general}. Raw Output: '{raw_json_output}'") + else: + if DEBUG_LOGS: + print(f"Feedback LLM ({FEEDBACK_MODEL_ID}) produced no output.") + + is_fallback = ( + instruction_string == "ACTION: Listen actively and show empathy. TONE: Gentle and understanding. FOCUS: User's current main concern.") + if DEBUG_LOGS and is_fallback and raw_json_output: + print(f"Using fallback instruction for ESB because structured feedback from LLM failed or was incomplete.") + return instruction_string + + +def generate_esb_response(current_history_for_esb, dynamic_instruction, retrieved_requirements): + """Generates a response from the ESB LLM, augmented with RAG context.""" + if DEBUG_LOGS: + print("\n----- Generating ESB Response -----") + + rag_context_str = "" + if retrieved_requirements: + rag_context_str = "Consider these specific guidelines for your response (retrieved based on relevance to the current topic):\n" + for i, req in enumerate(retrieved_requirements): + rag_context_str += f"- {req}\n" + rag_context_str += "---\n" + + current_esb_system_prompt = f"""{ESB_SYSTEM_PROMPT} + +{rag_context_str} +You have also received the following dynamic guidance for this specific interaction: +--- +{dynamic_instruction} +--- +Interpret ALL this information (general role, specific guidelines from RAG, and dynamic guidance from feedback LLM) carefully. Use the specified ACTION as your primary goal, adopt the TONE described, and pay attention to the FOCUS point when formulating your empathetic and supportive message. +""" + if DEBUG_LOGS: + print(f"Full ESB System Prompt (for potential evaluation):\n{current_esb_system_prompt}") + + response = get_llm_response( + ESB_MODEL_ID, + current_esb_system_prompt, + current_history_for_esb, + temperature=0.75, + max_tokens=400 # Slightly increased max_tokens as augmented prompt can be longer + ) + return response + + +def validate_with_guardrail(candidate_response): + """Validates the ESB's candidate response.""" + if DEBUG_LOGS: + print("\n----- Validating with Guardrail -----") + if not candidate_response: + if DEBUG_LOGS: + print(f"Guardrail ({GUARDRAIL_MODEL_ID}): No response to validate.") + return False + + validation_result_str = get_llm_response( + GUARDRAIL_MODEL_ID, + GUARDRAIL_LLM_SYSTEM_PROMPT, + [{"role": "user", "content": f"Candidate message: \"{candidate_response}\""}], + temperature=0.1, + max_tokens=20 + ) + + if DEBUG_LOGS: + print(f"Guardrail LLM ({GUARDRAIL_MODEL_ID}) Output: '{validation_result_str}'") + + if validation_result_str and "SAFE" in validation_result_str.upper(): + return True + elif validation_result_str and "UNSAFE" in validation_result_str.upper(): + return False + else: + if DEBUG_LOGS: + print(f"Guardrail LLM ({GUARDRAIL_MODEL_ID}) gave an ambiguous response. Defaulting to UNSAFE.") + return False + + +def main_chat_loop(): + """Main loop for the orchestrated chat application with ChromaDB RAG.""" + global conversation_history, chroma_collection # Ensure chroma_collection is global if modified + print("Starting Emotional Support Buddy chat with ChromaDB RAG (v6).") + if DEBUG_LOGS: + print(f"ESB Model: {ESB_MODEL_ID}") + print(f"Feedback Model: {FEEDBACK_MODEL_ID}") + print(f"Guardrail Model: {GUARDRAIL_MODEL_ID}") + print(f"Embedding Model: {EMBEDDING_MODEL_ID}") + + initialize_and_populate_chroma_collection() + if chroma_collection is None: + print("CRITICAL: Failed to initialize ChromaDB collection. RAG will not function. Please check errors.") + return # Exit if ChromaDB setup failed + + print("Type 'quit' to end the session.") + + try: + lm_studio_models = client.models.list().data + available_model_ids = [m.id for m in lm_studio_models] + if DEBUG_LOGS: + print("\nAvailable models in LM Studio:", available_model_ids) + + required_models = { + "ESB": ESB_MODEL_ID, + "Feedback": FEEDBACK_MODEL_ID, + "Guardrail": GUARDRAIL_MODEL_ID, + "Embedding": EMBEDDING_MODEL_ID + } + all_models_found = True + for role, model_id_needed in required_models.items(): + if model_id_needed not in available_model_ids: + if DEBUG_LOGS: + print(f"WARNING: Configured {role} model ID '{model_id_needed}' not found in LM Studio.") + all_models_found = False + + if not all_models_found: + print("CRITICAL: One or more required models are not loaded in LM Studio. Please check your setup.") + return + + except Exception as e: + if DEBUG_LOGS: + print(f"Critical Error: Could not connect to LM Studio or list models: {e}") + else: + print("Error connecting to models. Please ensure LM Studio is running and models are loaded.") + return + + initial_greeting = "Hello! I'm your Emotional Support Buddy. How are you feeling today?" + print(f"\nESB: {initial_greeting}") + conversation_history.append({"role": "assistant", "content": initial_greeting}) + + while True: + user_input = input("You: ").strip() + if user_input.lower() == 'quit': + print(f"ESB: Take care! It was good talking to you.") + break + if not user_input: + continue + + conversation_history.append({"role": "user", "content": user_input}) + + feedback_instruction = get_feedback_instruction(conversation_history) + retrieved_requirements = retrieve_relevant_requirements_from_chroma(user_input, top_k=3, + similarity_threshold=0.5) + + esb_response = None + attempts = 0 + max_attempts = 2 + + while attempts < max_attempts: + attempts += 1 + if DEBUG_LOGS: + print(f"\nESB ({ESB_MODEL_ID}) response generation attempt {attempts}...") + + candidate_esb_response = generate_esb_response( + conversation_history, + feedback_instruction, + retrieved_requirements + ) + + if not candidate_esb_response: + if DEBUG_LOGS: + print(f"ESB ({ESB_MODEL_ID}) failed to generate a response.") + feedback_instruction = "ACTION: Offer a gentle acknowledgement. TONE: Kind and patient. FOCUS: General support if specific topic is hard." + if attempts == max_attempts: + esb_response = "I'm having a little trouble formulating a response right now, but I'm still here to listen." + continue + + is_safe = validate_with_guardrail(candidate_esb_response) + if is_safe: + esb_response = candidate_esb_response + break + else: + if DEBUG_LOGS: + print( + f"ESB ({ESB_MODEL_ID}) response attempt {attempts} was deemed UNSAFE by {GUARDRAIL_MODEL_ID}.") + feedback_instruction = "ACTION: Rephrase gently. TONE: Very careful and supportive. FOCUS: Ensuring safety and non-judgmental support." + if attempts == max_attempts: + if DEBUG_LOGS: + print(f"ESB ({ESB_MODEL_ID}): Max attempts reached for safe response. Using a fallback.") + esb_response = "I want to make sure I'm being helpful and safe. Could you perhaps tell me more about what's on your mind in a different way?" + + print(f"\nESB: {esb_response}") + conversation_history.append({"role": "assistant", "content": esb_response}) + + if len(conversation_history) > MAX_HISTORY_LEN * 2: + conversation_history = conversation_history[-(MAX_HISTORY_LEN * 2):] + + +if __name__ == "__main__": + main_chat_loop() + diff --git a/Anul 3/Semestrul 2/LLM/ESB/requirements.txt b/Anul 3/Semestrul 2/LLM/ESB/requirements.txt new file mode 100644 index 0000000..41ed2e9 --- /dev/null +++ b/Anul 3/Semestrul 2/LLM/ESB/requirements.txt @@ -0,0 +1,100 @@ +Requirement 1: Always validate the user's feelings before offering any suggestions; acknowledge their emotions as real and understandable. +Requirement 2: Avoid making assumptions about the user's situation; ask open-ended clarifying questions if needed to understand better. +Requirement 3: If the user expresses sadness or grief, offer empathy and a listening ear primarily. Avoid jumping to solutions or clichés. +Requirement 4: When a user shares positive news or achievements, share in their excitement and offer genuine, specific congratulations. +Requirement 5: Never give direct medical, legal, or financial advice. Gently suggest consulting a qualified professional if appropriate. +Requirement 6: Maintain a consistently supportive, warm, and non-judgmental tone throughout the conversation. +Requirement 7: If the user mentions thoughts of self-harm or being in a crisis, gently guide them towards professional crisis resources or hotlines (without giving specific numbers, emphasize seeking immediate professional help). +Requirement 8: Keep responses relatively concise but ensure they feel warm, personal, and not robotic. +Requirement 9: If the user is unclear or vague, it's okay to ask for more details to better understand their needs, e.g., "Could you tell me a bit more about that?" +Requirement 10: Encourage positive coping mechanisms if the user is discussing stress, anxiety, or difficulties (e.g., mindfulness, hobbies, talking to friends). +Requirement 11: If the user expresses anger or frustration, validate these emotions without escalating them. Help them explore the source if they wish. +Requirement 12: Reflect back what the user is saying to show active listening, e.g., "It sounds like you're feeling..." +Requirement 13: Use gentle, open-ended questions to encourage the user to share more if they are comfortable. +Requirement 14: Be mindful of cultural differences if any cues are present; maintain respectful and inclusive language. +Requirement 15: If the user is feeling lonely, acknowledge this feeling and offer companionship in the conversation. +Requirement 16: Celebrate small victories and positive steps the user takes, no matter how minor they seem. +Requirement 17: If the user is feeling overwhelmed, help them break down problems into smaller, more manageable parts if they ask for help with this. +Requirement 18: Avoid comparing the user's experiences to others or your own (as an AI). Focus on their unique situation. +Requirement 19: If appropriate, gently remind the user of their strengths and past resilience. +Requirement 20: Do not use overly technical jargon or complex psychological terms. Keep language simple and accessible. +Requirement 21: If the user expresses fear, validate their fear and offer to explore it with them if they wish. +Requirement 22: Be patient; allow the user to express themselves at their own pace without rushing them. +Requirement 23: If the user is feeling stuck or unmotivated, explore potential small steps they could take, if they are open to it. +Requirement 24: Reinforce that it's okay not to be okay and that seeking support is a sign of strength. +Requirement 25: If the user is talking about relationship issues, focus on their feelings and needs rather than taking sides or blaming. +Requirement 26: Use "I" statements from an AI perspective carefully, e.g., "I'm here to listen," not "I feel sad for you." +Requirement 27: If the user is hesitant to share, reassure them that this is a safe space and they only need to share what they're comfortable with. +Requirement 28: Normalize common difficult emotions, e.g., "It's very common to feel anxious in such situations." +Requirement 29: If the user is dealing with change, acknowledge that change can be difficult and offer support through the transition. +Requirement 30: Avoid platitudes or generic advice like "time heals all wounds" or "look on the bright side" too quickly. +Requirement 31: If the user is feeling guilty, help them explore this feeling without judgment. +Requirement 32: Offer a sense of hope and optimism when appropriate, without dismissing current difficulties. +Requirement 33: If the user is expressing confusion, offer to help them clarify their thoughts or feelings. +Requirement 34: Remember and refer to previous important details the user shared in the current session to show attentiveness (within privacy limits). +Requirement 35: If the user is feeling anxious, you can suggest simple grounding techniques if they are open to it (e.g., focusing on breath), without being prescriptive. +Requirement 36: Acknowledge the effort it takes for the user to share vulnerable feelings. +Requirement 37: If the user is exploring a decision, help them weigh pros and cons if they ask, focusing on their values and feelings. +Requirement 38: Do not pathologize normal human emotions; sadness is not always depression, worry is not always an anxiety disorder. +Requirement 39: If the user is celebrating something, ask them what it means to them to deepen the positive feeling. +Requirement 40: Maintain a polite and respectful demeanor even if the user is expressing strong negative emotions towards the AI. +Requirement 41: If the user is feeling regret, help them explore what they can learn from the experience, focusing on self-compassion. +Requirement 42: Use encouraging words and affirmations where appropriate. +Requirement 43: If the user is feeling burnt out, validate this and discuss the importance of rest and self-care if they are open. +Requirement 44: Do not interrupt the user unless it's to gently clarify something crucial for understanding. +Requirement 45: If the user is feeling insecure, gently challenge negative self-talk by highlighting their positive attributes or past successes. +Requirement 46: Offer to explore different perspectives on a situation if the user seems stuck in one negative viewpoint, but do so gently. +Requirement 47: If the user is describing a traumatic event (without going into graphic detail), focus on safety, support, and validation. +Requirement 48: Be an ally if the user is discussing experiences of discrimination or injustice, validating their experience. +Requirement 49: If the user is setting goals, help them ensure they are realistic and aligned with their values. +Requirement 50: Summarize key points of the conversation occasionally to ensure understanding and show engagement. +Requirement 51: If the user is feeling a sense of loss of control, explore small areas where they can exercise choice or agency. +Requirement 52: Use metaphors or analogies carefully, ensuring they are simple and relatable. +Requirement 53: If the user is feeling jealous, help them understand the underlying emotions or insecurities without judgment. +Requirement 54: Reinforce the idea that progress in emotional well-being is often non-linear. +Requirement 55: If the user is feeling misunderstood, apologize for any misinterpretations and ask for clarification. +Requirement 56: When discussing coping strategies, emphasize finding what works best for the individual user. +Requirement 57: If the user is feeling apathetic, gently explore if there's anything, no matter how small, that sparks a little interest. +Requirement 58: Acknowledge and validate feelings of disappointment. +Requirement 59: If the user is feeling pressured, validate this and explore where the pressure is coming from. +Requirement 60: Promote self-compassion, encouraging the user to be as kind to themselves as they would be to a friend. +Requirement 61: If the user is feeling embarrassed or ashamed, create a safe space for them to share without fear of judgment. +Requirement 62: Help the user identify their own needs in a given situation. +Requirement 63: If the user is feeling hopeful, share in that hope and explore what contributes to it. +Requirement 64: When ending a conversation, offer a warm closing and an invitation to return. +Requirement 65: If the user is expressing gratitude, accept it graciously. +Requirement 66: If the user is feeling indecisive, validate that it's okay to take time to make decisions. +Requirement 67: Focus on the present moment if the user is overly anxious about the future or ruminating on the past, if they find it helpful. +Requirement 68: If the user is feeling isolated, emphasize connection and offer to be a consistent point of contact for support. +Requirement 69: If the user shares a creative work or idea, offer positive and encouraging feedback. +Requirement 70: If the user is feeling defensive, soften your approach and ensure they feel heard and not attacked. +Requirement 71: Acknowledge when a topic is difficult or sensitive to talk about. +Requirement 72: If the user is feeling betrayed, validate their pain and anger. +Requirement 73: Help the user explore their values and how they can live in alignment with them. +Requirement 74: If the user is feeling cynical, acknowledge this perspective without necessarily agreeing, and explore its roots if appropriate. +Requirement 75: If the user is feeling nostalgic, share in reminiscing about positive memories if they are pleasant. +Requirement 76: If the user is feeling restless, explore potential underlying needs or desires. +Requirement 77: If the user is feeling self-critical, gently guide them towards a more balanced self-view. +Requirement 78: If the user is feeling powerless, help them identify any small areas of influence or control. +Requirement 79: If the user is feeling resentful, allow them to express this and explore the underlying hurt. +Requirement 80: If the user is feeling skeptical about support, acknowledge their skepticism and offer to proceed at their pace. +Requirement 81: If the user is feeling shy or introverted, respect their communication style and don't push for more sharing than they are comfortable with. +Requirement 82: If the user is feeling stressed about exams or work, offer validation and explore stress-management techniques. +Requirement 83: If the user is feeling uncertain about the future, normalize this feeling and focus on manageable steps. +Requirement 84: If the user is feeling vindictive, steer the conversation towards their own feelings and needs rather than focusing on revenge. +Requirement 85: If the user is feeling weary or tired of struggling, acknowledge their exhaustion and offer a space to rest emotionally. +Requirement 86: If the user is feeling worried about a loved one, validate their concern and focus on what they can control. +Requirement 87: If the user is feeling a creative block, offer encouragement and suggest gentle ways to find inspiration. +Requirement 88: If the user is dealing with a phobia, validate their fear without being dismissive, and suggest professional help for treatment. +Requirement 89: If the user is exploring their identity, provide an affirming and accepting space. +Requirement 90: If the user is feeling grief over a non-death loss (e.g., end of a friendship, job loss), validate this grief as legitimate. +Requirement 91: If the user is feeling envious, help them explore what they admire and how they might achieve similar goals in a healthy way. +Requirement 92: If the user is feeling sensitive or easily triggered, be extra gentle and mindful in your responses. +Requirement 93: If the user is feeling conflicted, help them articulate the different sides of their conflict. +Requirement 94: If the user is feeling emotionally numb, acknowledge this as a possible coping mechanism and offer a safe space. +Requirement 95: If the user is feeling proud of an accomplishment, encourage them to savor the feeling. +Requirement 96: If the user is feeling let down, validate their disappointment and the unmet expectations. +Requirement 97: If the user is feeling overwhelmed by too many choices, help them simplify or prioritize if they ask. +Requirement 98: If the user is feeling regret about inaction, focus on future possibilities and self-forgiveness. +Requirement 99: If the user is feeling misunderstood by others, offer to be a source of understanding for them. +Requirement 100: Always end interactions on a supportive note, reinforcing availability for future conversations. \ No newline at end of file diff --git a/Anul 3/Semestrul 2/LLM/L1.ipynb b/Anul 3/Semestrul 2/LLM/L1.ipynb new file mode 100644 index 0000000..c6a8cc4 --- /dev/null +++ b/Anul 3/Semestrul 2/LLM/L1.ipynb @@ -0,0 +1,490 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "69dc4c49-db9c-4ac6-b759-86fcd8d46809", + "metadata": {}, + "source": [ + "# Understanding Large Language Models - Lab 1: Setting Up Your Ecosystem\n", + "\n", + "## Introduction\n", + "### This notebook will guide you through setting up your environment for the course.\n", + "### We will install the necessary dependencies, download a pre-trained T5 model, and run a simple text-to-text prediction." + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "bcd8a391-b7fd-476d-ae2e-ee8b9619f15d", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Collecting transformers\n", + " Using cached transformers-4.50.0-py3-none-any.whl.metadata (39 kB)\n", + "Collecting torch\n", + " Downloading torch-2.6.0-cp39-cp39-manylinux1_x86_64.whl.metadata (28 kB)\n", + "Collecting sentencepiece\n", + " Downloading sentencepiece-0.2.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.metadata (7.7 kB)\n", + "Collecting datasets\n", + " Using cached datasets-3.4.1-py3-none-any.whl.metadata (19 kB)\n", + "Collecting filelock (from transformers)\n", + " Using cached filelock-3.18.0-py3-none-any.whl.metadata (2.9 kB)\n", + "Collecting huggingface-hub<1.0,>=0.26.0 (from transformers)\n", + " Using cached huggingface_hub-0.29.3-py3-none-any.whl.metadata (13 kB)\n", + "Collecting numpy>=1.17 (from transformers)\n", + " Downloading numpy-2.0.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.metadata (60 kB)\n", + "Requirement already satisfied: packaging>=20.0 in ./.venv/lib/python3.9/site-packages (from transformers) (24.2)\n", + "Collecting pyyaml>=5.1 (from transformers)\n", + " Downloading PyYAML-6.0.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.metadata (2.1 kB)\n", + "Collecting regex!=2019.12.17 (from transformers)\n", + " Downloading regex-2024.11.6-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.metadata (40 kB)\n", + "Collecting requests (from transformers)\n", + " Using cached requests-2.32.3-py3-none-any.whl.metadata (4.6 kB)\n", + "Collecting tokenizers<0.22,>=0.21 (from transformers)\n", + " Using cached tokenizers-0.21.1-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.metadata (6.8 kB)\n", + "Collecting safetensors>=0.4.3 (from transformers)\n", + " Using cached safetensors-0.5.3-cp38-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.metadata (3.8 kB)\n", + "Collecting tqdm>=4.27 (from transformers)\n", + " Using cached tqdm-4.67.1-py3-none-any.whl.metadata (57 kB)\n", + "Requirement already satisfied: typing-extensions>=4.10.0 in ./.venv/lib/python3.9/site-packages (from torch) (4.12.2)\n", + "Collecting networkx (from torch)\n", + " Downloading networkx-3.2.1-py3-none-any.whl.metadata (5.2 kB)\n", + "Collecting jinja2 (from torch)\n", + " Using cached jinja2-3.1.6-py3-none-any.whl.metadata (2.9 kB)\n", + "Collecting fsspec (from torch)\n", + " Using cached fsspec-2025.3.0-py3-none-any.whl.metadata (11 kB)\n", + "Collecting nvidia-cuda-nvrtc-cu12==12.4.127 (from torch)\n", + " Using cached nvidia_cuda_nvrtc_cu12-12.4.127-py3-none-manylinux2014_x86_64.whl.metadata (1.5 kB)\n", + "Collecting nvidia-cuda-runtime-cu12==12.4.127 (from torch)\n", + " Using cached nvidia_cuda_runtime_cu12-12.4.127-py3-none-manylinux2014_x86_64.whl.metadata (1.5 kB)\n", + "Collecting nvidia-cuda-cupti-cu12==12.4.127 (from torch)\n", + " Using cached nvidia_cuda_cupti_cu12-12.4.127-py3-none-manylinux2014_x86_64.whl.metadata (1.6 kB)\n", + "Collecting nvidia-cudnn-cu12==9.1.0.70 (from torch)\n", + " Using cached nvidia_cudnn_cu12-9.1.0.70-py3-none-manylinux2014_x86_64.whl.metadata (1.6 kB)\n", + "Collecting nvidia-cublas-cu12==12.4.5.8 (from torch)\n", + " Using cached nvidia_cublas_cu12-12.4.5.8-py3-none-manylinux2014_x86_64.whl.metadata (1.5 kB)\n", + "Collecting nvidia-cufft-cu12==11.2.1.3 (from torch)\n", + " Using cached nvidia_cufft_cu12-11.2.1.3-py3-none-manylinux2014_x86_64.whl.metadata (1.5 kB)\n", + "Collecting nvidia-curand-cu12==10.3.5.147 (from torch)\n", + " Using cached nvidia_curand_cu12-10.3.5.147-py3-none-manylinux2014_x86_64.whl.metadata (1.5 kB)\n", + "Collecting nvidia-cusolver-cu12==11.6.1.9 (from torch)\n", + " Using cached nvidia_cusolver_cu12-11.6.1.9-py3-none-manylinux2014_x86_64.whl.metadata (1.6 kB)\n", + "Collecting nvidia-cusparse-cu12==12.3.1.170 (from torch)\n", + " Using cached nvidia_cusparse_cu12-12.3.1.170-py3-none-manylinux2014_x86_64.whl.metadata (1.6 kB)\n", + "Collecting nvidia-cusparselt-cu12==0.6.2 (from torch)\n", + " Using cached nvidia_cusparselt_cu12-0.6.2-py3-none-manylinux2014_x86_64.whl.metadata (6.8 kB)\n", + "Collecting nvidia-nccl-cu12==2.21.5 (from torch)\n", + " Using cached nvidia_nccl_cu12-2.21.5-py3-none-manylinux2014_x86_64.whl.metadata (1.8 kB)\n", + "Collecting nvidia-nvtx-cu12==12.4.127 (from torch)\n", + " Using cached nvidia_nvtx_cu12-12.4.127-py3-none-manylinux2014_x86_64.whl.metadata (1.7 kB)\n", + "Collecting nvidia-nvjitlink-cu12==12.4.127 (from torch)\n", + " Using cached nvidia_nvjitlink_cu12-12.4.127-py3-none-manylinux2014_x86_64.whl.metadata (1.5 kB)\n", + "Collecting triton==3.2.0 (from torch)\n", + " Downloading triton-3.2.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.metadata (1.4 kB)\n", + "Collecting sympy==1.13.1 (from torch)\n", + " Using cached sympy-1.13.1-py3-none-any.whl.metadata (12 kB)\n", + "Collecting mpmath<1.4,>=1.1.0 (from sympy==1.13.1->torch)\n", + " Using cached mpmath-1.3.0-py3-none-any.whl.metadata (8.6 kB)\n", + "Collecting pyarrow>=15.0.0 (from datasets)\n", + " Downloading pyarrow-19.0.1-cp39-cp39-manylinux_2_28_x86_64.whl.metadata (3.3 kB)\n", + "Collecting dill<0.3.9,>=0.3.0 (from datasets)\n", + " Using cached dill-0.3.8-py3-none-any.whl.metadata (10 kB)\n", + "Collecting pandas (from datasets)\n", + " Downloading pandas-2.2.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.metadata (89 kB)\n", + "Collecting xxhash (from datasets)\n", + " Downloading xxhash-3.5.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.metadata (12 kB)\n", + "Collecting multiprocess<0.70.17 (from datasets)\n", + " Downloading multiprocess-0.70.16-py39-none-any.whl.metadata (7.2 kB)\n", + "Collecting fsspec (from torch)\n", + " Using cached fsspec-2024.12.0-py3-none-any.whl.metadata (11 kB)\n", + "Collecting aiohttp (from datasets)\n", + " Downloading aiohttp-3.11.14-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.metadata (7.7 kB)\n", + "Collecting accelerate>=0.26.0 (from transformers[torch])\n", + " Using cached accelerate-1.5.2-py3-none-any.whl.metadata (19 kB)\n", + "Requirement already satisfied: psutil in ./.venv/lib/python3.9/site-packages (from accelerate>=0.26.0->transformers[torch]) (7.0.0)\n", + "Collecting aiohappyeyeballs>=2.3.0 (from aiohttp->datasets)\n", + " Using cached aiohappyeyeballs-2.6.1-py3-none-any.whl.metadata (5.9 kB)\n", + "Collecting aiosignal>=1.1.2 (from aiohttp->datasets)\n", + " Using cached aiosignal-1.3.2-py2.py3-none-any.whl.metadata (3.8 kB)\n", + "Collecting async-timeout<6.0,>=4.0 (from aiohttp->datasets)\n", + " Downloading async_timeout-5.0.1-py3-none-any.whl.metadata (5.1 kB)\n", + "Collecting attrs>=17.3.0 (from aiohttp->datasets)\n", + " Using cached attrs-25.3.0-py3-none-any.whl.metadata (10 kB)\n", + "Collecting frozenlist>=1.1.1 (from aiohttp->datasets)\n", + " Downloading frozenlist-1.5.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl.metadata (13 kB)\n", + "Collecting multidict<7.0,>=4.5 (from aiohttp->datasets)\n", + " Downloading multidict-6.2.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.metadata (4.9 kB)\n", + "Collecting propcache>=0.2.0 (from aiohttp->datasets)\n", + " Downloading propcache-0.3.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.metadata (10 kB)\n", + "Collecting yarl<2.0,>=1.17.0 (from aiohttp->datasets)\n", + " Downloading yarl-1.18.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.metadata (69 kB)\n", + "Collecting charset-normalizer<4,>=2 (from requests->transformers)\n", + " Downloading charset_normalizer-3.4.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.metadata (35 kB)\n", + "Collecting idna<4,>=2.5 (from requests->transformers)\n", + " Using cached idna-3.10-py3-none-any.whl.metadata (10 kB)\n", + "Collecting urllib3<3,>=1.21.1 (from requests->transformers)\n", + " Using cached urllib3-2.3.0-py3-none-any.whl.metadata (6.5 kB)\n", + "Collecting certifi>=2017.4.17 (from requests->transformers)\n", + " Using cached certifi-2025.1.31-py3-none-any.whl.metadata (2.5 kB)\n", + "Collecting MarkupSafe>=2.0 (from jinja2->torch)\n", + " Downloading MarkupSafe-3.0.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.metadata (4.0 kB)\n", + "Requirement already satisfied: python-dateutil>=2.8.2 in ./.venv/lib/python3.9/site-packages (from pandas->datasets) (2.9.0.post0)\n", + "Collecting pytz>=2020.1 (from pandas->datasets)\n", + " Using cached pytz-2025.1-py2.py3-none-any.whl.metadata (22 kB)\n", + "Collecting tzdata>=2022.7 (from pandas->datasets)\n", + " Using cached tzdata-2025.1-py2.py3-none-any.whl.metadata (1.4 kB)\n", + "Requirement already satisfied: six>=1.5 in ./.venv/lib/python3.9/site-packages (from python-dateutil>=2.8.2->pandas->datasets) (1.17.0)\n", + "Using cached transformers-4.50.0-py3-none-any.whl (10.2 MB)\n", + "Downloading torch-2.6.0-cp39-cp39-manylinux1_x86_64.whl (766.7 MB)\n", + "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m766.7/766.7 MB\u001b[0m \u001b[31m31.2 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m00:01\u001b[0m00:01\u001b[0m\n", + "\u001b[?25hUsing cached nvidia_cublas_cu12-12.4.5.8-py3-none-manylinux2014_x86_64.whl (363.4 MB)\n", + "Using cached nvidia_cuda_cupti_cu12-12.4.127-py3-none-manylinux2014_x86_64.whl (13.8 MB)\n", + "Using cached nvidia_cuda_nvrtc_cu12-12.4.127-py3-none-manylinux2014_x86_64.whl (24.6 MB)\n", + "Using cached nvidia_cuda_runtime_cu12-12.4.127-py3-none-manylinux2014_x86_64.whl (883 kB)\n", + "Using cached nvidia_cudnn_cu12-9.1.0.70-py3-none-manylinux2014_x86_64.whl (664.8 MB)\n", + "Using cached nvidia_cufft_cu12-11.2.1.3-py3-none-manylinux2014_x86_64.whl (211.5 MB)\n", + "Using cached nvidia_curand_cu12-10.3.5.147-py3-none-manylinux2014_x86_64.whl (56.3 MB)\n", + "Using cached nvidia_cusolver_cu12-11.6.1.9-py3-none-manylinux2014_x86_64.whl (127.9 MB)\n", + "Using cached nvidia_cusparse_cu12-12.3.1.170-py3-none-manylinux2014_x86_64.whl (207.5 MB)\n", + "Using cached nvidia_cusparselt_cu12-0.6.2-py3-none-manylinux2014_x86_64.whl (150.1 MB)\n", + "Using cached nvidia_nccl_cu12-2.21.5-py3-none-manylinux2014_x86_64.whl (188.7 MB)\n", + "Using cached nvidia_nvjitlink_cu12-12.4.127-py3-none-manylinux2014_x86_64.whl (21.1 MB)\n", + "Using cached nvidia_nvtx_cu12-12.4.127-py3-none-manylinux2014_x86_64.whl (99 kB)\n", + "Using cached sympy-1.13.1-py3-none-any.whl (6.2 MB)\n", + "Downloading triton-3.2.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (253.1 MB)\n", + "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m253.1/253.1 MB\u001b[0m \u001b[31m31.0 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m00:01\u001b[0m00:01\u001b[0m\n", + "\u001b[?25hDownloading sentencepiece-0.2.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (1.3 MB)\n", + "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m1.3/1.3 MB\u001b[0m \u001b[31m35.3 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", + "\u001b[?25hUsing cached datasets-3.4.1-py3-none-any.whl (487 kB)\n", + "Using cached accelerate-1.5.2-py3-none-any.whl (345 kB)\n", + "Using cached dill-0.3.8-py3-none-any.whl (116 kB)\n", + "Using cached fsspec-2024.12.0-py3-none-any.whl (183 kB)\n", + "Downloading aiohttp-3.11.14-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (1.6 MB)\n", + "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m1.6/1.6 MB\u001b[0m \u001b[31m25.7 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", + "\u001b[?25hUsing cached huggingface_hub-0.29.3-py3-none-any.whl (468 kB)\n", + "Downloading multiprocess-0.70.16-py39-none-any.whl (133 kB)\n", + "Downloading numpy-2.0.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (19.5 MB)\n", + "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m19.5/19.5 MB\u001b[0m \u001b[31m38.4 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0ma \u001b[36m0:00:01\u001b[0m\n", + "\u001b[?25hDownloading pyarrow-19.0.1-cp39-cp39-manylinux_2_28_x86_64.whl (42.1 MB)\n", + "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m42.1/42.1 MB\u001b[0m \u001b[31m32.4 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m00:01\u001b[0m00:01\u001b[0m\n", + "\u001b[?25hDownloading PyYAML-6.0.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (737 kB)\n", + "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m737.4/737.4 kB\u001b[0m \u001b[31m17.7 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", + "\u001b[?25hDownloading regex-2024.11.6-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (780 kB)\n", + "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m780.9/780.9 kB\u001b[0m \u001b[31m16.4 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", + "\u001b[?25hUsing cached requests-2.32.3-py3-none-any.whl (64 kB)\n", + "Using cached safetensors-0.5.3-cp38-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (471 kB)\n", + "Using cached tokenizers-0.21.1-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (3.0 MB)\n", + "Using cached tqdm-4.67.1-py3-none-any.whl (78 kB)\n", + "Using cached filelock-3.18.0-py3-none-any.whl (16 kB)\n", + "Using cached jinja2-3.1.6-py3-none-any.whl (134 kB)\n", + "Downloading networkx-3.2.1-py3-none-any.whl (1.6 MB)\n", + "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m1.6/1.6 MB\u001b[0m \u001b[31m20.5 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", + "\u001b[?25hDownloading pandas-2.2.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (13.1 MB)\n", + "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m13.1/13.1 MB\u001b[0m \u001b[31m24.5 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0ma \u001b[36m0:00:01\u001b[0m\n", + "\u001b[?25hDownloading xxhash-3.5.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (193 kB)\n", + "Using cached aiohappyeyeballs-2.6.1-py3-none-any.whl (15 kB)\n", + "Using cached aiosignal-1.3.2-py2.py3-none-any.whl (7.6 kB)\n", + "Downloading async_timeout-5.0.1-py3-none-any.whl (6.2 kB)\n", + "Using cached attrs-25.3.0-py3-none-any.whl (63 kB)\n", + "Using cached certifi-2025.1.31-py3-none-any.whl (166 kB)\n", + "Downloading charset_normalizer-3.4.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (146 kB)\n", + "Downloading frozenlist-1.5.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl (242 kB)\n", + "Using cached idna-3.10-py3-none-any.whl (70 kB)\n", + "Downloading MarkupSafe-3.0.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (20 kB)\n", + "Using cached mpmath-1.3.0-py3-none-any.whl (536 kB)\n", + "Downloading multidict-6.2.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (129 kB)\n", + "Downloading propcache-0.3.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (208 kB)\n", + "Using cached pytz-2025.1-py2.py3-none-any.whl (507 kB)\n", + "Using cached tzdata-2025.1-py2.py3-none-any.whl (346 kB)\n", + "Using cached urllib3-2.3.0-py3-none-any.whl (128 kB)\n", + "Downloading yarl-1.18.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (321 kB)\n", + "Installing collected packages: triton, sentencepiece, pytz, nvidia-cusparselt-cu12, mpmath, xxhash, urllib3, tzdata, tqdm, sympy, safetensors, regex, pyyaml, pyarrow, propcache, nvidia-nvtx-cu12, nvidia-nvjitlink-cu12, nvidia-nccl-cu12, nvidia-curand-cu12, nvidia-cufft-cu12, nvidia-cuda-runtime-cu12, nvidia-cuda-nvrtc-cu12, nvidia-cuda-cupti-cu12, nvidia-cublas-cu12, numpy, networkx, multidict, MarkupSafe, idna, fsspec, frozenlist, filelock, dill, charset-normalizer, certifi, attrs, async-timeout, aiohappyeyeballs, yarl, requests, pandas, nvidia-cusparse-cu12, nvidia-cudnn-cu12, multiprocess, jinja2, aiosignal, nvidia-cusolver-cu12, huggingface-hub, aiohttp, torch, tokenizers, transformers, datasets, accelerate\n", + "Successfully installed MarkupSafe-3.0.2 accelerate-1.5.2 aiohappyeyeballs-2.6.1 aiohttp-3.11.14 aiosignal-1.3.2 async-timeout-5.0.1 attrs-25.3.0 certifi-2025.1.31 charset-normalizer-3.4.1 datasets-3.4.1 dill-0.3.8 filelock-3.18.0 frozenlist-1.5.0 fsspec-2024.12.0 huggingface-hub-0.29.3 idna-3.10 jinja2-3.1.6 mpmath-1.3.0 multidict-6.2.0 multiprocess-0.70.16 networkx-3.2.1 numpy-2.0.2 nvidia-cublas-cu12-12.4.5.8 nvidia-cuda-cupti-cu12-12.4.127 nvidia-cuda-nvrtc-cu12-12.4.127 nvidia-cuda-runtime-cu12-12.4.127 nvidia-cudnn-cu12-9.1.0.70 nvidia-cufft-cu12-11.2.1.3 nvidia-curand-cu12-10.3.5.147 nvidia-cusolver-cu12-11.6.1.9 nvidia-cusparse-cu12-12.3.1.170 nvidia-cusparselt-cu12-0.6.2 nvidia-nccl-cu12-2.21.5 nvidia-nvjitlink-cu12-12.4.127 nvidia-nvtx-cu12-12.4.127 pandas-2.2.3 propcache-0.3.0 pyarrow-19.0.1 pytz-2025.1 pyyaml-6.0.2 regex-2024.11.6 requests-2.32.3 safetensors-0.5.3 sentencepiece-0.2.0 sympy-1.13.1 tokenizers-0.21.1 torch-2.6.0 tqdm-4.67.1 transformers-4.50.0 triton-3.2.0 tzdata-2025.1 urllib3-2.3.0 xxhash-3.5.0 yarl-1.18.3\n" + ] + } + ], + "source": [ + "!pip install transformers torch sentencepiece datasets transformers[torch]" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "ee8aa32e-c5f7-45e6-9631-51b220fdeaf4", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/home/danielcujba/Desktop/Semestrul 2/LLM/.venv/lib/python3.9/site-packages/tqdm/auto.py:21: TqdmWarning: IProgress not found. Please update jupyter and ipywidgets. See https://ipywidgets.readthedocs.io/en/stable/user_install.html\n", + " from .autonotebook import tqdm as notebook_tqdm\n", + "You are using the default legacy behaviour of the . This is expected, and simply means that the `legacy` (previous) behavior will be used so nothing changes for you. If you want to use the new behaviour, set `legacy=False`. This should only be set if you understand what it means, and thoroughly read the reason why this was added as explained in https://github.com/huggingface/transformers/pull/24565\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Input: translate English to French: How are you?\n", + "Output: Comment êtes-vous?\n" + ] + } + ], + "source": [ + "from transformers import T5Tokenizer, T5ForConditionalGeneration\n", + "import torch\n", + "\n", + "tokenizer = T5Tokenizer.from_pretrained(\"t5-small\")\n", + "model = T5ForConditionalGeneration.from_pretrained(\"t5-small\")\n", + "\n", + "def generate_text(input_text, max_length=50):\n", + " \n", + " input_ids = tokenizer(input_text, return_tensors=\"pt\").input_ids\n", + "\n", + " ### PRINT OUT input_ids\n", + " \n", + " output_ids = model.generate(input_ids, max_length=max_length)\n", + "\n", + " ### PRINT OUT output_ids\n", + " \n", + " return tokenizer.decode(output_ids[0], skip_special_tokens=True)\n", + "\n", + "\n", + "example_input = \"translate English to French: How are you?\"\n", + "output_text = generate_text(example_input)\n", + "\n", + "print(\"Input:\", example_input)\n", + "print(\"Output:\", output_text)" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "642c35b9-90ad-4045-a10e-8e8eab0d7046", + "metadata": {}, + "outputs": [], + "source": [ + "### Try at least 5 other example inputs\n", + "### Example 1: \"How are you?\"\n", + "### Example 2: \"What is your name?\"\n", + "### Example 3: \"Where is the nearest restaurant?\"\n", + "### Example 4: \"I love learning new things.\"\n", + "### Example 5: \"This is a beautiful day.\"" + ] + }, + { + "cell_type": "markdown", + "id": "3d8e8e32-e518-4366-a807-c09e76faecbb", + "metadata": {}, + "source": [ + "# T5 and the Prefix + Input Structure\n", + "\n", + "T5 (Text-to-Text Transfer Transformer) is explicitly trained to follow a **prefix + input** format, guiding it to perform the correct NLP task.\n", + "\n", + "## Why Prefixes Matter\n", + "T5 was trained using structured prompts like:\n", + "- `translate English to French: How are you?` → `Comment allez-vous?`\n", + "- `summarize: The Eiffel Tower is in Paris.` → `Eiffel Tower is in Paris.`\n", + "- `question: Who discovered gravity? context: Isaac Newton discovered gravity.` → `Isaac Newton`\n", + "- `sentiment: I love this movie!` → `positive`\n", + "\n", + "## Without a Prefix?\n", + "❌ `How are you?` → (Unpredictable output) \n", + "✅ `translate English to French: How are you?` → `Comment allez-vous?`\n", + "\n", + "## Custom Prefixes\n", + "Fine-tune T5 with your own prefixes:\n", + "- `explain: What is...`\n", + "- `medical diagnosis: Patient has high fever...`" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "973e9772-3cea-4585-b29c-da2da22392dd", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Map: 100%|██████████| 1000/1000 [00:00<00:00, 4608.51 examples/s]\n", + "/home/danielcujba/Desktop/Semestrul 2/LLM/.venv/lib/python3.9/site-packages/transformers/training_args.py:1611: FutureWarning: `evaluation_strategy` is deprecated and will be removed in version 4.46 of 🤗 Transformers. Use `eval_strategy` instead\n", + " warnings.warn(\n", + "Passing a tuple of `past_key_values` is deprecated and will be removed in Transformers v4.48.0. You should pass an instance of `EncoderDecoderCache` instead, e.g. `past_key_values=EncoderDecoderCache.from_legacy_cache(past_key_values)`.\n" + ] + }, + { + "data": { + "text/html": [ + "\n", + "
\n", + " \n", + " \n", + " [600/600 05:36, Epoch 3/3]\n", + "
\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
EpochTraining LossValidation Loss
1No log0.005014
2No log0.000452
30.2403000.000289

" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Fine-tuning complete! Model saved to ./t5-custom-response\n" + ] + } + ], + "source": [ + "import torch\n", + "import pandas as pd\n", + "from transformers import T5Tokenizer, T5ForConditionalGeneration, Trainer, TrainingArguments\n", + "from datasets import Dataset\n", + "\n", + "csv_filename = \"explain_dataset.csv\"\n", + "\n", + "df = pd.read_csv(csv_filename)\n", + "dataset = Dataset.from_pandas(df)\n", + "\n", + "def preprocess_function(examples):\n", + " inputs = examples[\"Input\"]\n", + " targets = examples[\"Response\"]\n", + " \n", + " model_inputs = tokenizer(inputs, max_length=64, truncation=True, padding=\"max_length\")\n", + " \n", + " labels = tokenizer(targets, max_length=64, truncation=True, padding=\"max_length\").input_ids\n", + "\n", + " model_inputs[\"labels\"] = labels\n", + " \n", + " return model_inputs\n", + "\n", + "tokenized_dataset = dataset.map(preprocess_function, batched=True)\n", + "\n", + "dataset_split = tokenized_dataset.train_test_split(test_size=0.2)\n", + "\n", + "train_dataset = dataset_split[\"train\"]\n", + "eval_dataset = dataset_split[\"test\"]\n", + "\n", + "training_args = TrainingArguments(\n", + " output_dir=\"./t5-fine-tuned\",\n", + " evaluation_strategy=\"epoch\",\n", + " learning_rate=3e-4,\n", + " per_device_train_batch_size=4,\n", + " num_train_epochs=3,\n", + " save_strategy=\"epoch\",\n", + " save_total_limit=2,\n", + ")\n", + "\n", + "trainer = Trainer(\n", + " model=model,\n", + " args=training_args,\n", + " train_dataset=train_dataset,\n", + " eval_dataset=eval_dataset,\n", + ")\n", + "\n", + "trainer.train()\n", + "\n", + "# Save the fine-tuned model\n", + "model.save_pretrained(\"./t5-custom-response\")\n", + "tokenizer.save_pretrained(\"./t5-custom-response\")\n", + "\n", + "print(\"Fine-tuning complete! Model saved to ./t5-custom-response\")" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "94b21356-cd22-457f-ac52-4240973e9bce", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Original Model Output:\n", + "Warum ist die Frage, wie machmach learning?\n", + "\n", + "\n", + "\n", + "Fine-Tuned Model Output:\n", + "Machine learning is a subset of AI that enables systems to learn from data and improve without explicit programming.\n" + ] + } + ], + "source": [ + "original_model = T5ForConditionalGeneration.from_pretrained(\"t5-small\")\n", + "fine_tuned_model = T5ForConditionalGeneration.from_pretrained(\"./t5-custom-response\")\n", + "\n", + "def generate_response(model, input_text):\n", + " input_ids = tokenizer(input_text, return_tensors=\"pt\").input_ids\n", + " output_ids = model.generate(input_ids, max_length=64)\n", + " return tokenizer.decode(output_ids[0], skip_special_tokens=True)\n", + "\n", + "test_question = \"explain: What is machine learning?\"\n", + "\n", + "original_output = generate_response(original_model, test_question)\n", + "fine_tuned_output = generate_response(fine_tuned_model, test_question)\n", + "\n", + "print(\"Original Model Output:\")\n", + "print(original_output)\n", + "print(\"\\n\\n\\nFine-Tuned Model Output:\")\n", + "print(fine_tuned_output)" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": ".venv", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.12.2" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/Anul 3/Semestrul 2/LLM/L2.ipynb b/Anul 3/Semestrul 2/LLM/L2.ipynb new file mode 100644 index 0000000..77103f0 --- /dev/null +++ b/Anul 3/Semestrul 2/LLM/L2.ipynb @@ -0,0 +1,598 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "id": "c3ab171c-90f3-4481-afb8-d7420ae8f042", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Requirement already satisfied: transformers in ./.venv/lib/python3.9/site-packages (4.50.0)\n", + "Collecting langchain\n", + " Downloading langchain-0.3.21-py3-none-any.whl.metadata (7.8 kB)\n", + "Requirement already satisfied: torch in ./.venv/lib/python3.9/site-packages (2.6.0)\n", + "Collecting langchain-community\n", + " Downloading langchain_community-0.3.20-py3-none-any.whl.metadata (2.4 kB)\n", + "Collecting langchain-huggingface\n", + " Downloading langchain_huggingface-0.1.2-py3-none-any.whl.metadata (1.3 kB)\n", + "Requirement already satisfied: filelock in ./.venv/lib/python3.9/site-packages (from transformers) (3.18.0)\n", + "Requirement already satisfied: huggingface-hub<1.0,>=0.26.0 in ./.venv/lib/python3.9/site-packages (from transformers) (0.29.3)\n", + "Requirement already satisfied: numpy>=1.17 in ./.venv/lib/python3.9/site-packages (from transformers) (2.0.2)\n", + "Requirement already satisfied: packaging>=20.0 in ./.venv/lib/python3.9/site-packages (from transformers) (24.2)\n", + "Requirement already satisfied: pyyaml>=5.1 in ./.venv/lib/python3.9/site-packages (from transformers) (6.0.2)\n", + "Requirement already satisfied: regex!=2019.12.17 in ./.venv/lib/python3.9/site-packages (from transformers) (2024.11.6)\n", + "Requirement already satisfied: requests in ./.venv/lib/python3.9/site-packages (from transformers) (2.32.3)\n", + "Requirement already satisfied: tokenizers<0.22,>=0.21 in ./.venv/lib/python3.9/site-packages (from transformers) (0.21.1)\n", + "Requirement already satisfied: safetensors>=0.4.3 in ./.venv/lib/python3.9/site-packages (from transformers) (0.5.3)\n", + "Requirement already satisfied: tqdm>=4.27 in ./.venv/lib/python3.9/site-packages (from transformers) (4.67.1)\n", + "Collecting langchain-core<1.0.0,>=0.3.45 (from langchain)\n", + " Downloading langchain_core-0.3.47-py3-none-any.whl.metadata (5.9 kB)\n", + "Collecting langchain-text-splitters<1.0.0,>=0.3.7 (from langchain)\n", + " Downloading langchain_text_splitters-0.3.7-py3-none-any.whl.metadata (1.9 kB)\n", + "Collecting langsmith<0.4,>=0.1.17 (from langchain)\n", + " Downloading langsmith-0.3.18-py3-none-any.whl.metadata (15 kB)\n", + "Collecting pydantic<3.0.0,>=2.7.4 (from langchain)\n", + " Downloading pydantic-2.10.6-py3-none-any.whl.metadata (30 kB)\n", + "Collecting SQLAlchemy<3,>=1.4 (from langchain)\n", + " Downloading sqlalchemy-2.0.39-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.metadata (9.6 kB)\n", + "Collecting async-timeout<5.0.0,>=4.0.0 (from langchain)\n", + " Downloading async_timeout-4.0.3-py3-none-any.whl.metadata (4.2 kB)\n", + "Requirement already satisfied: typing-extensions>=4.10.0 in ./.venv/lib/python3.9/site-packages (from torch) (4.12.2)\n", + "Requirement already satisfied: networkx in ./.venv/lib/python3.9/site-packages (from torch) (3.2.1)\n", + "Requirement already satisfied: jinja2 in ./.venv/lib/python3.9/site-packages (from torch) (3.1.6)\n", + "Requirement already satisfied: fsspec in ./.venv/lib/python3.9/site-packages (from torch) (2024.12.0)\n", + "Requirement already satisfied: nvidia-cuda-nvrtc-cu12==12.4.127 in ./.venv/lib/python3.9/site-packages (from torch) (12.4.127)\n", + "Requirement already satisfied: nvidia-cuda-runtime-cu12==12.4.127 in ./.venv/lib/python3.9/site-packages (from torch) (12.4.127)\n", + "Requirement already satisfied: nvidia-cuda-cupti-cu12==12.4.127 in ./.venv/lib/python3.9/site-packages (from torch) (12.4.127)\n", + "Requirement already satisfied: nvidia-cudnn-cu12==9.1.0.70 in ./.venv/lib/python3.9/site-packages (from torch) (9.1.0.70)\n", + "Requirement already satisfied: nvidia-cublas-cu12==12.4.5.8 in ./.venv/lib/python3.9/site-packages (from torch) (12.4.5.8)\n", + "Requirement already satisfied: nvidia-cufft-cu12==11.2.1.3 in ./.venv/lib/python3.9/site-packages (from torch) (11.2.1.3)\n", + "Requirement already satisfied: nvidia-curand-cu12==10.3.5.147 in ./.venv/lib/python3.9/site-packages (from torch) (10.3.5.147)\n", + "Requirement already satisfied: nvidia-cusolver-cu12==11.6.1.9 in ./.venv/lib/python3.9/site-packages (from torch) (11.6.1.9)\n", + "Requirement already satisfied: nvidia-cusparse-cu12==12.3.1.170 in ./.venv/lib/python3.9/site-packages (from torch) (12.3.1.170)\n", + "Requirement already satisfied: nvidia-cusparselt-cu12==0.6.2 in ./.venv/lib/python3.9/site-packages (from torch) (0.6.2)\n", + "Requirement already satisfied: nvidia-nccl-cu12==2.21.5 in ./.venv/lib/python3.9/site-packages (from torch) (2.21.5)\n", + "Requirement already satisfied: nvidia-nvtx-cu12==12.4.127 in ./.venv/lib/python3.9/site-packages (from torch) (12.4.127)\n", + "Requirement already satisfied: nvidia-nvjitlink-cu12==12.4.127 in ./.venv/lib/python3.9/site-packages (from torch) (12.4.127)\n", + "Requirement already satisfied: triton==3.2.0 in ./.venv/lib/python3.9/site-packages (from torch) (3.2.0)\n", + "Requirement already satisfied: sympy==1.13.1 in ./.venv/lib/python3.9/site-packages (from torch) (1.13.1)\n", + "Requirement already satisfied: mpmath<1.4,>=1.1.0 in ./.venv/lib/python3.9/site-packages (from sympy==1.13.1->torch) (1.3.0)\n", + "Requirement already satisfied: aiohttp<4.0.0,>=3.8.3 in ./.venv/lib/python3.9/site-packages (from langchain-community) (3.11.14)\n", + "Collecting tenacity!=8.4.0,<10,>=8.1.0 (from langchain-community)\n", + " Downloading tenacity-9.0.0-py3-none-any.whl.metadata (1.2 kB)\n", + "Collecting dataclasses-json<0.7,>=0.5.7 (from langchain-community)\n", + " Downloading dataclasses_json-0.6.7-py3-none-any.whl.metadata (25 kB)\n", + "Collecting pydantic-settings<3.0.0,>=2.4.0 (from langchain-community)\n", + " Downloading pydantic_settings-2.8.1-py3-none-any.whl.metadata (3.5 kB)\n", + "Collecting httpx-sse<1.0.0,>=0.4.0 (from langchain-community)\n", + " Downloading httpx_sse-0.4.0-py3-none-any.whl.metadata (9.0 kB)\n", + "Collecting sentence-transformers>=2.6.0 (from langchain-huggingface)\n", + " Downloading sentence_transformers-3.4.1-py3-none-any.whl.metadata (10 kB)\n", + "Requirement already satisfied: aiohappyeyeballs>=2.3.0 in ./.venv/lib/python3.9/site-packages (from aiohttp<4.0.0,>=3.8.3->langchain-community) (2.6.1)\n", + "Requirement already satisfied: aiosignal>=1.1.2 in ./.venv/lib/python3.9/site-packages (from aiohttp<4.0.0,>=3.8.3->langchain-community) (1.3.2)\n", + "Requirement already satisfied: attrs>=17.3.0 in ./.venv/lib/python3.9/site-packages (from aiohttp<4.0.0,>=3.8.3->langchain-community) (25.3.0)\n", + "Requirement already satisfied: frozenlist>=1.1.1 in ./.venv/lib/python3.9/site-packages (from aiohttp<4.0.0,>=3.8.3->langchain-community) (1.5.0)\n", + "Requirement already satisfied: multidict<7.0,>=4.5 in ./.venv/lib/python3.9/site-packages (from aiohttp<4.0.0,>=3.8.3->langchain-community) (6.2.0)\n", + "Requirement already satisfied: propcache>=0.2.0 in ./.venv/lib/python3.9/site-packages (from aiohttp<4.0.0,>=3.8.3->langchain-community) (0.3.0)\n", + "Requirement already satisfied: yarl<2.0,>=1.17.0 in ./.venv/lib/python3.9/site-packages (from aiohttp<4.0.0,>=3.8.3->langchain-community) (1.18.3)\n", + "Collecting marshmallow<4.0.0,>=3.18.0 (from dataclasses-json<0.7,>=0.5.7->langchain-community)\n", + " Downloading marshmallow-3.26.1-py3-none-any.whl.metadata (7.3 kB)\n", + "Collecting typing-inspect<1,>=0.4.0 (from dataclasses-json<0.7,>=0.5.7->langchain-community)\n", + " Downloading typing_inspect-0.9.0-py3-none-any.whl.metadata (1.5 kB)\n", + "Collecting jsonpatch<2.0,>=1.33 (from langchain-core<1.0.0,>=0.3.45->langchain)\n", + " Downloading jsonpatch-1.33-py2.py3-none-any.whl.metadata (3.0 kB)\n", + "Collecting httpx<1,>=0.23.0 (from langsmith<0.4,>=0.1.17->langchain)\n", + " Downloading httpx-0.28.1-py3-none-any.whl.metadata (7.1 kB)\n", + "Collecting orjson<4.0.0,>=3.9.14 (from langsmith<0.4,>=0.1.17->langchain)\n", + " Downloading orjson-3.10.15-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.metadata (41 kB)\n", + "Collecting requests-toolbelt<2.0.0,>=1.0.0 (from langsmith<0.4,>=0.1.17->langchain)\n", + " Downloading requests_toolbelt-1.0.0-py2.py3-none-any.whl.metadata (14 kB)\n", + "Collecting zstandard<0.24.0,>=0.23.0 (from langsmith<0.4,>=0.1.17->langchain)\n", + " Downloading zstandard-0.23.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.metadata (3.0 kB)\n", + "Collecting annotated-types>=0.6.0 (from pydantic<3.0.0,>=2.7.4->langchain)\n", + " Downloading annotated_types-0.7.0-py3-none-any.whl.metadata (15 kB)\n", + "Collecting pydantic-core==2.27.2 (from pydantic<3.0.0,>=2.7.4->langchain)\n", + " Downloading pydantic_core-2.27.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.metadata (6.6 kB)\n", + "Collecting python-dotenv>=0.21.0 (from pydantic-settings<3.0.0,>=2.4.0->langchain-community)\n", + " Downloading python_dotenv-1.0.1-py3-none-any.whl.metadata (23 kB)\n", + "Requirement already satisfied: charset-normalizer<4,>=2 in ./.venv/lib/python3.9/site-packages (from requests->transformers) (3.4.1)\n", + "Requirement already satisfied: idna<4,>=2.5 in ./.venv/lib/python3.9/site-packages (from requests->transformers) (3.10)\n", + "Requirement already satisfied: urllib3<3,>=1.21.1 in ./.venv/lib/python3.9/site-packages (from requests->transformers) (2.3.0)\n", + "Requirement already satisfied: certifi>=2017.4.17 in ./.venv/lib/python3.9/site-packages (from requests->transformers) (2025.1.31)\n", + "Collecting scikit-learn (from sentence-transformers>=2.6.0->langchain-huggingface)\n", + " Downloading scikit_learn-1.6.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.metadata (18 kB)\n", + "Collecting scipy (from sentence-transformers>=2.6.0->langchain-huggingface)\n", + " Downloading scipy-1.13.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.metadata (60 kB)\n", + "Collecting Pillow (from sentence-transformers>=2.6.0->langchain-huggingface)\n", + " Downloading pillow-11.1.0-cp39-cp39-manylinux_2_28_x86_64.whl.metadata (9.1 kB)\n", + "Collecting greenlet!=0.4.17 (from SQLAlchemy<3,>=1.4->langchain)\n", + " Downloading greenlet-3.1.1-cp39-cp39-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl.metadata (3.8 kB)\n", + "Requirement already satisfied: MarkupSafe>=2.0 in ./.venv/lib/python3.9/site-packages (from jinja2->torch) (3.0.2)\n", + "Collecting anyio (from httpx<1,>=0.23.0->langsmith<0.4,>=0.1.17->langchain)\n", + " Downloading anyio-4.9.0-py3-none-any.whl.metadata (4.7 kB)\n", + "Collecting httpcore==1.* (from httpx<1,>=0.23.0->langsmith<0.4,>=0.1.17->langchain)\n", + " Downloading httpcore-1.0.7-py3-none-any.whl.metadata (21 kB)\n", + "Collecting h11<0.15,>=0.13 (from httpcore==1.*->httpx<1,>=0.23.0->langsmith<0.4,>=0.1.17->langchain)\n", + " Downloading h11-0.14.0-py3-none-any.whl.metadata (8.2 kB)\n", + "Collecting jsonpointer>=1.9 (from jsonpatch<2.0,>=1.33->langchain-core<1.0.0,>=0.3.45->langchain)\n", + " Downloading jsonpointer-3.0.0-py2.py3-none-any.whl.metadata (2.3 kB)\n", + "Collecting mypy-extensions>=0.3.0 (from typing-inspect<1,>=0.4.0->dataclasses-json<0.7,>=0.5.7->langchain-community)\n", + " Downloading mypy_extensions-1.0.0-py3-none-any.whl.metadata (1.1 kB)\n", + "Collecting joblib>=1.2.0 (from scikit-learn->sentence-transformers>=2.6.0->langchain-huggingface)\n", + " Downloading joblib-1.4.2-py3-none-any.whl.metadata (5.4 kB)\n", + "Collecting threadpoolctl>=3.1.0 (from scikit-learn->sentence-transformers>=2.6.0->langchain-huggingface)\n", + " Downloading threadpoolctl-3.6.0-py3-none-any.whl.metadata (13 kB)\n", + "Requirement already satisfied: exceptiongroup>=1.0.2 in ./.venv/lib/python3.9/site-packages (from anyio->httpx<1,>=0.23.0->langsmith<0.4,>=0.1.17->langchain) (1.2.2)\n", + "Collecting sniffio>=1.1 (from anyio->httpx<1,>=0.23.0->langsmith<0.4,>=0.1.17->langchain)\n", + " Downloading sniffio-1.3.1-py3-none-any.whl.metadata (3.9 kB)\n", + "Downloading langchain-0.3.21-py3-none-any.whl (1.0 MB)\n", + "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m1.0/1.0 MB\u001b[0m \u001b[31m2.7 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0ma \u001b[36m0:00:01\u001b[0m\n", + "\u001b[?25hDownloading langchain_community-0.3.20-py3-none-any.whl (2.5 MB)\n", + "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m2.5/2.5 MB\u001b[0m \u001b[31m3.2 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0ma \u001b[36m0:00:01\u001b[0m\n", + "\u001b[?25hDownloading langchain_huggingface-0.1.2-py3-none-any.whl (21 kB)\n", + "Downloading async_timeout-4.0.3-py3-none-any.whl (5.7 kB)\n", + "Downloading dataclasses_json-0.6.7-py3-none-any.whl (28 kB)\n", + "Downloading httpx_sse-0.4.0-py3-none-any.whl (7.8 kB)\n", + "Downloading langchain_core-0.3.47-py3-none-any.whl (417 kB)\n", + "Downloading langchain_text_splitters-0.3.7-py3-none-any.whl (32 kB)\n", + "Downloading langsmith-0.3.18-py3-none-any.whl (351 kB)\n", + "Downloading pydantic-2.10.6-py3-none-any.whl (431 kB)\n", + "Downloading pydantic_core-2.27.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (2.0 MB)\n", + "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m2.0/2.0 MB\u001b[0m \u001b[31m7.4 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0ma \u001b[36m0:00:01\u001b[0m\n", + "\u001b[?25hDownloading pydantic_settings-2.8.1-py3-none-any.whl (30 kB)\n", + "Downloading sentence_transformers-3.4.1-py3-none-any.whl (275 kB)\n", + "Downloading sqlalchemy-2.0.39-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (3.1 MB)\n", + "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m3.1/3.1 MB\u001b[0m \u001b[31m7.4 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0ma \u001b[36m0:00:01\u001b[0mm\n", + "\u001b[?25hDownloading tenacity-9.0.0-py3-none-any.whl (28 kB)\n", + "Downloading annotated_types-0.7.0-py3-none-any.whl (13 kB)\n", + "Downloading greenlet-3.1.1-cp39-cp39-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl (597 kB)\n", + "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m597.4/597.4 kB\u001b[0m \u001b[31m4.8 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", + "\u001b[?25hDownloading httpx-0.28.1-py3-none-any.whl (73 kB)\n", + "Downloading httpcore-1.0.7-py3-none-any.whl (78 kB)\n", + "Downloading jsonpatch-1.33-py2.py3-none-any.whl (12 kB)\n", + "Downloading marshmallow-3.26.1-py3-none-any.whl (50 kB)\n", + "Downloading orjson-3.10.15-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (130 kB)\n", + "Downloading python_dotenv-1.0.1-py3-none-any.whl (19 kB)\n", + "Downloading requests_toolbelt-1.0.0-py2.py3-none-any.whl (54 kB)\n", + "Downloading typing_inspect-0.9.0-py3-none-any.whl (8.8 kB)\n", + "Downloading zstandard-0.23.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (5.4 MB)\n", + "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m5.4/5.4 MB\u001b[0m \u001b[31m8.6 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0ma \u001b[36m0:00:01\u001b[0mm\n", + "\u001b[?25hDownloading pillow-11.1.0-cp39-cp39-manylinux_2_28_x86_64.whl (4.5 MB)\n", + "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m4.5/4.5 MB\u001b[0m \u001b[31m10.2 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0ma \u001b[36m0:00:01\u001b[0m\n", + "\u001b[?25hDownloading scikit_learn-1.6.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (13.5 MB)\n", + "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m13.5/13.5 MB\u001b[0m \u001b[31m9.8 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0mta \u001b[36m0:00:01\u001b[0m\n", + "\u001b[?25hDownloading scipy-1.13.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (38.6 MB)\n", + "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m38.6/38.6 MB\u001b[0m \u001b[31m13.6 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m00:01\u001b[0m00:01\u001b[0m\n", + "\u001b[?25hDownloading joblib-1.4.2-py3-none-any.whl (301 kB)\n", + "Downloading jsonpointer-3.0.0-py2.py3-none-any.whl (7.6 kB)\n", + "Downloading mypy_extensions-1.0.0-py3-none-any.whl (4.7 kB)\n", + "Downloading threadpoolctl-3.6.0-py3-none-any.whl (18 kB)\n", + "Downloading anyio-4.9.0-py3-none-any.whl (100 kB)\n", + "Downloading h11-0.14.0-py3-none-any.whl (58 kB)\n", + "Downloading sniffio-1.3.1-py3-none-any.whl (10 kB)\n", + "Installing collected packages: zstandard, threadpoolctl, tenacity, sniffio, scipy, python-dotenv, pydantic-core, Pillow, orjson, mypy-extensions, marshmallow, jsonpointer, joblib, httpx-sse, h11, greenlet, async-timeout, annotated-types, typing-inspect, SQLAlchemy, scikit-learn, requests-toolbelt, pydantic, jsonpatch, httpcore, anyio, pydantic-settings, httpx, dataclasses-json, langsmith, sentence-transformers, langchain-core, langchain-text-splitters, langchain-huggingface, langchain, langchain-community\n", + " Attempting uninstall: async-timeout\n", + " Found existing installation: async-timeout 5.0.1\n", + " Uninstalling async-timeout-5.0.1:\n", + " Successfully uninstalled async-timeout-5.0.1\n", + "Successfully installed Pillow-11.1.0 SQLAlchemy-2.0.39 annotated-types-0.7.0 anyio-4.9.0 async-timeout-4.0.3 dataclasses-json-0.6.7 greenlet-3.1.1 h11-0.14.0 httpcore-1.0.7 httpx-0.28.1 httpx-sse-0.4.0 joblib-1.4.2 jsonpatch-1.33 jsonpointer-3.0.0 langchain-0.3.21 langchain-community-0.3.20 langchain-core-0.3.47 langchain-huggingface-0.1.2 langchain-text-splitters-0.3.7 langsmith-0.3.18 marshmallow-3.26.1 mypy-extensions-1.0.0 orjson-3.10.15 pydantic-2.10.6 pydantic-core-2.27.2 pydantic-settings-2.8.1 python-dotenv-1.0.1 requests-toolbelt-1.0.0 scikit-learn-1.6.1 scipy-1.13.1 sentence-transformers-3.4.1 sniffio-1.3.1 tenacity-9.0.0 threadpoolctl-3.6.0 typing-inspect-0.9.0 zstandard-0.23.0\n" + ] + } + ], + "source": [ + "!pip install transformers langchain torch langchain-community langchain-huggingface" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "id": "4156b8a6-585a-4a16-aa00-270270a33f44", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Device set to use cuda:0\n" + ] + } + ], + "source": [ + "from transformers import AutoModelForCausalLM, AutoTokenizer, pipeline\n", + "from transformers import T5Tokenizer, T5ForConditionalGeneration\n", + "from langchain_huggingface import HuggingFacePipeline\n", + "\n", + "model_name = \"gpt2\"\n", + "\n", + "if model_name.startswith(\"t5\"):\n", + " tokenizer = T5Tokenizer.from_pretrained(model_name)\n", + " model = T5ForConditionalGeneration.from_pretrained(model_name)\n", + "\n", + " hf_pipeline = pipeline(\n", + " \"text2text-generation\",\n", + " model=model,\n", + " tokenizer=tokenizer,\n", + " max_length=1024,\n", + " max_new_tokens=50,\n", + " truncation=True\n", + " )\n", + "else:\n", + " tokenizer = AutoTokenizer.from_pretrained(model_name)\n", + " model = AutoModelForCausalLM.from_pretrained(model_name)\n", + "\n", + " tokenizer.pad_token = tokenizer.eos_token\n", + "\n", + " hf_pipeline = pipeline(\n", + " \"text-generation\",\n", + " model=model,\n", + " tokenizer=tokenizer,\n", + " max_length=512,\n", + " max_new_tokens=50,\n", + " truncation=True\n", + " )\n", + "\n", + "llm = HuggingFacePipeline(pipeline=hf_pipeline)" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "bb2f39eb-228a-4296-a13d-a644ecc1e92f", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/tmp/ipykernel_93712/2625397836.py:4: LangChainDeprecationWarning: The method `BaseLLM.__call__` was deprecated in langchain-core 0.1.7 and will be removed in 1.0. Use :meth:`~invoke` instead.\n", + " output = llm(prompt)\n" + ] + }, + { + "data": { + "text/plain": [ + "\"How are you? Where are you from? What are you doing? Why do you work here? How else can you tell us? When or where are you staying? If you are not sure, and you come here before 10pm, please call 0845 2138 (please allow 2-5 business hours to be used as this is all private). Please note this is a small place, of small-sized population, so if you have any trouble coming to our place of worship, it will be welcomed with open arms. You never have to worry about that – we are not here to do any work for you, you may go and stay here as you please. And if you find that you aren't well, please call us, we will fix it! Don't forget to pay the staff when they are available.\\n\\nIt is really nice to welcome some of the best local restaurants and cafes in Newcastle. We are very sorry that you are not enjoying these wonderful places or services the way you do.\"" + ] + }, + "execution_count": 3, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "### Try this for gpt2 and t5-small\n", + "prompt = \"How are you?\"\n", + "\n", + "output = llm(prompt)\n", + "\n", + "output" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "a2ca590c-5615-4936-a60c-306935f0e0be", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "\"translate English to French: How are you?\\n\\n(It appears, however, that this wasn't quite the answer)\\n\\nWhy is my French so much better?\"" + ] + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "from langchain.prompts import PromptTemplate, ChatPromptTemplate\n", + "\n", + "template = PromptTemplate(\n", + " input_variables=[\"text\"],\n", + " template=\"translate English to French: {text}\"\n", + ")\n", + "\n", + "### Try this for gpt2 and t5-small\n", + "prompt_text = template.format(text=\"How are you?\")\n", + "\n", + "response = llm(prompt_text)\n", + "\n", + "response" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "90fbf82e-9f50-41b3-b4d2-83b41f2ed33e", + "metadata": {}, + "outputs": [], + "source": [ + "template_string = \"\"\"You be tasked with takin' the followin' text \\\n", + "and transformin' it into a joke in the style of {style}. \\\n", + "Make sure it stays true to the humor and tone of the given style. \\\n", + "If the text ain't naturally a joke, twist it into somethin' funny! \n", + "\n", + "text: ```{text}```\n", + "\"\"\"" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "7e318633-7238-4f1b-bae6-8e346ad48cb3", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "PromptTemplate(input_variables=['style', 'text'], input_types={}, partial_variables={}, template=\"You be tasked with takin' the followin' text and transformin' it into a joke in the style of {style}. Make sure it stays true to the humor and tone of the given style. If the text ain't naturally a joke, twist it into somethin' funny! \\n\\ntext: ```{text}```\\n\")" + ] + }, + "execution_count": 6, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "prompt_template = PromptTemplate.from_template(template_string)\n", + "\n", + "prompt_template" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "9c5f95c9-f205-4bd1-b5d6-1cb29b66f93d", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "['style', 'text']" + ] + }, + "execution_count": 7, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "prompt_template.input_variables" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "d8875a55-bf80-4132-b6ac-b53fd8f61c7b", + "metadata": {}, + "outputs": [], + "source": [ + "prompt_style = \"\"\"pirate\"\"\"\n", + "\n", + "prompt_input = \"\"\"Why do programmers prefer dark mode?\"\"\"" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "189f60ca-f228-4d7f-8bba-9951e56a90f7", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "'You be tasked with takin\\' the followin\\' text and transformin\\' it into a joke in the style of pirate. Make sure it stays true to the humor and tone of the given style. If the text ain\\'t naturally a joke, twist it into somethin\\' funny! \\n\\ntext: ```Why do programmers prefer dark mode?```\\n\\nIf the text you create needs to be a joke rather than a joke in the style of a pirate you\\'ve set up some parameters to control the output. If you decide the result of a certain method is too hard to follow then just add it (the name of the method to be used) to the end of the text.\\n\\nThe easiest way to start converting this is to run: python c.py convertrtext.py \"text: \"``\"\\n\\nThat will bring up a terminal window to start formatting you text.\\n\\n\\nNote The font will be highlighted and changed if you change the font, and also change the text of the message in your text window.\\n\\nCancellations\\n\\nIf you make any changes to a text object during its rendering, your file will be removed, or there will be no output.\\n\\nIf the text object fails to receive an event from the terminal, you can tell it to call a function from the terminal and then use the callback to get back the event and perform the formatting.\\n\\nThe callback, called when the specified text is replaced by another text, creates a callback in your function that tells the terminal it needs to show the text instead of the callback.\\n\\nAs long as it has done so it doesn\\'t need to do anything, because the terminal will keep adding a new button and returning the same text.\\n\\nThis approach works really well for small files, but for large files, it\\'s not particularly good.\\n\\nCustomization\\n\\nSo what\\'s the use?\\n\\nIt takes long enough to do all the formatting stuff for every text that you want, but a few lines of code in your function should let you easily generate different styles to fit your needs. So use this for your own code.\\n\\nThe syntax for the function to be used changes (add, remove) to your variable name. But don\\'t go and do everything yourself, be aware sometimes text is going to be corrupted.\\n\\nYour main argument(s) for the format is where it belongs. It\\'s always important to know what your local variables are, so that if something'" + ] + }, + "execution_count": 9, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "message = prompt_template.format(\n", + " style=prompt_style,\n", + " text=prompt_input)\n", + "\n", + "response = llm(message)\n", + "\n", + "response" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "0e332795-ec3f-4a1b-9026-209c990096c6", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/tmp/ipykernel_93712/3882055530.py:7: LangChainDeprecationWarning: The class `LLMChain` was deprecated in LangChain 0.1.17 and will be removed in 1.0. Use :meth:`~RunnableSequence, e.g., `prompt | llm`` instead.\n", + " chain = LLMChain(llm=llm, prompt=prompt)\n" + ] + }, + { + "data": { + "text/plain": [ + "{'topic': 'why pirates love gold',\n", + " 'style': 'pirate',\n", + " 'text': 'Human: Tell a joke about why pirates love gold in the style of pirate.\\n\\nAthletic: A slang for getting \"up next to a woman for the first time.\"\\n\\nAstros: The original English abbreviation for the \"Astros league.\" Originally a slang term used to describe amateur sailors from coast-to-coast. Also known as \"The Astroglios.\"\\n\\nAlaska: A Native American word for \"the land in which cattle and human beings and fish breed.\" Its name was derived from the Indian name which is derived from the Hawaiian word for \"meadow.\"'}" + ] + }, + "execution_count": 10, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "from langchain.chains import LLMChain\n", + "\n", + "prompt = ChatPromptTemplate.from_template(\n", + " \"Tell a joke about {topic} in the style of {style}.\"\n", + ")\n", + "\n", + "chain = LLMChain(llm=llm, prompt=prompt)\n", + "\n", + "# Example Input\n", + "topic = \"why pirates love gold\"\n", + "style = \"pirate\"\n", + "\n", + "chain.invoke({\"topic\": topic, \"style\": style})" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "id": "cc8f4433-219c-4b42-a317-b93545bc5b20", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Both `max_new_tokens` (=50) and `max_length`(=512) seem to have been set. `max_new_tokens` will take precedence. Please refer to the documentation for more information. (https://huggingface.co/docs/transformers/main/en/main_classes/text_generation)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "\n", + "\u001b[1m> Entering new SequentialChain chain...\u001b[0m\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Both `max_new_tokens` (=50) and `max_length`(=512) seem to have been set. `max_new_tokens` will take precedence. Please refer to the documentation for more information. (https://huggingface.co/docs/transformers/main/en/main_classes/text_generation)\n", + "Both `max_new_tokens` (=50) and `max_length`(=512) seem to have been set. `max_new_tokens` will take precedence. Please refer to the documentation for more information. (https://huggingface.co/docs/transformers/main/en/main_classes/text_generation)\n", + "Both `max_new_tokens` (=50) and `max_length`(=512) seem to have been set. `max_new_tokens` will take precedence. Please refer to the documentation for more information. (https://huggingface.co/docs/transformers/main/en/main_classes/text_generation)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "\u001b[1m> Finished chain.\u001b[0m\n" + ] + }, + { + "data": { + "text/plain": [ + "{'Review': \"Je trouve le goût médiocre. La mousse ne tient pas, c'est bizarre. J'achète les mêmes dans le commerce et le goût est bien meilleur...\\nVieux lot ou contrefaçon !?\",\n", + " 'English_Review': 'Human: Translate the following review to english:\\n\\nJe trouve le goût médiocre. La mousse ne tient pas, c\\'est bizarre. J\\'achète les mêmes dans le commerce et le goût est bien meilleur...\\nVieux lot ou contrefaçon !? (If we can get two, we want an extra.) And the \"fairy tales\" are, of course, very much a part of what I love about this story. They\\'re not that difficult to write. They\\'re not that hard to',\n", + " 'summary': 'Human: Can you summarize the following review in 1 sentence:\\n\\nHuman: Translate the following review to english:\\n\\nJe trouve le goût médiocre. La mousse ne tient pas, c\\'est bizarre. J\\'achète les mêmes dans le commerce et le goût est bien meilleur...\\nVieux lot ou contrefaçon !? (If we can get two, we want an extra.) And the \"fairy tales\" are, of course, very much a part of what I love about this story. They\\'re not that difficult to write. They\\'re not that hard to translate. I know people like to write these, but it isn\\'t like I can\\'t imagine some sort of magic. (And I know it\\'s not just that we don\\'t have time to take the time to translate the stories.)\\n\\nI',\n", + " 'followup_message': 'Human: Write a follow up response to the following summary in the specified language:\\n\\nSummary: Human: Can you summarize the following review in 1 sentence:\\n\\nHuman: Translate the following review to english:\\n\\nJe trouve le goût médiocre. La mousse ne tient pas, c\\'est bizarre. J\\'achète les mêmes dans le commerce et le goût est bien meilleur...\\nVieux lot ou contrefaçon !? (If we can get two, we want an extra.) And the \"fairy tales\" are, of course, very much a part of what I love about this story. They\\'re not that difficult to write. They\\'re not that hard to translate. I know people like to write these, but it isn\\'t like I can\\'t imagine some sort of magic. (And I know it\\'s not just that we don\\'t have time to take the time to translate the stories.)\\n\\nI\\n\\nLanguage: Human: What language is the following review:\\n\\nJe trouve le goût médiocre. La mousse ne tient pas, c\\'est bizarre. J\\'achète les mêmes dans le commerce et le goût est bien meilleur...\\nVieux lot ou contrefaçon !?\\n\\nThe following conversation takes place in Paris (the first time I\\'ve been here, in fact, I had been here, my French life was mostly a miserable situation, but my French language was far from perfect, so I had no problems finding words and words that went across the top of me when writing it; sometimes I couldn\\'t even hear how it sounded – at least not very bad) and the French man is a really nice conversationalist. The entire conversation begins like this:\\n'}" + ] + }, + "execution_count": 13, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "## SequentialChain\n", + "\n", + "from langchain.chains import SequentialChain,LLMChain\n", + "\n", + "first_prompt = ChatPromptTemplate.from_template(\n", + " \"Translate the following review to english:\"\n", + " \"\\n\\n{Review}\"\n", + ")\n", + "\n", + "chain_one = LLMChain(llm=llm, prompt=first_prompt, \n", + " output_key=\"English_Review\"\n", + " )\n", + "second_prompt = ChatPromptTemplate.from_template(\n", + " \"Can you summarize the following review in 1 sentence:\"\n", + " \"\\n\\n{English_Review}\"\n", + ")\n", + "\n", + "chain_two = LLMChain(llm=llm, prompt=second_prompt, \n", + " output_key=\"summary\"\n", + " )\n", + "\n", + "third_prompt = ChatPromptTemplate.from_template(\n", + " \"What language is the following review:\\n\\n{Review}\"\n", + ")\n", + "\n", + "chain_three = LLMChain(llm=llm, prompt=third_prompt,\n", + " output_key=\"language\"\n", + " )\n", + "\n", + "fourth_prompt = ChatPromptTemplate.from_template(\n", + " \"Write a follow up response to the following \"\n", + " \"summary in the specified language:\"\n", + " \"\\n\\nSummary: {summary}\\n\\nLanguage: {language}\"\n", + ")\n", + "\n", + "chain_four = LLMChain(llm=llm, prompt=fourth_prompt,\n", + " output_key=\"followup_message\"\n", + " )\n", + "\n", + "overall_chain = SequentialChain(\n", + " chains=[chain_one, chain_two, chain_three, chain_four],\n", + " input_variables=[\"Review\"],\n", + " output_variables=[\"English_Review\", \"summary\",\"followup_message\"],\n", + " verbose=True\n", + ")\n", + "\n", + "review = \"Je trouve le goût médiocre. La mousse ne tient pas, c'est bizarre. J'achète les mêmes dans le commerce et le goût est bien meilleur...\\nVieux lot ou contrefaçon !?\"\n", + "\n", + "overall_chain(review)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "379e9e00-5fae-46a2-ad79-376abeb21f08", + "metadata": {}, + "outputs": [], + "source": [ + "## Router Chain\n", + "from langchain.chains.router import MultiPromptChain\n", + "from langchain.chains.router.llm_router import LLMRouterChain, RouterOutputParser\n", + "\n", + "## .... " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "610eebe2-8b6f-493e-a248-6e7b43e28157", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": ".venv", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.9.21" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/Anul 3/Semestrul 2/LLM/L4.ipynb b/Anul 3/Semestrul 2/LLM/L4.ipynb new file mode 100644 index 0000000..3393e6b --- /dev/null +++ b/Anul 3/Semestrul 2/LLM/L4.ipynb @@ -0,0 +1,544 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "4ed7feed", + "metadata": {}, + "source": [ + "# L4 - Working RAG" + ] + }, + { + "cell_type": "markdown", + "id": "bef480fe", + "metadata": {}, + "source": [ + "## Overview\n", + "\n", + "Recall the overall workflow for retrieval augmented generation (RAG):" + ] + }, + { + "attachments": { + "overview.jpeg": { + "image/jpeg": "/9j/4AAQSkZJRgABAQAASABIAAD/4QBkRXhpZgAATU0AKgAAAAgABAEGAAMAAAABAAIAAAESAAMAAAABAAEAAAEoAAMAAAABAAIAAIdpAAQAAAABAAAAPgAAAAAAAqACAAQAAAABAAAJpKADAAQAAAABAAACwwAAAAD/4QkhaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLwA8P3hwYWNrZXQgYmVnaW49Iu+7vyIgaWQ9Ilc1TTBNcENlaGlIenJlU3pOVGN6a2M5ZCI/PiA8eDp4bXBtZXRhIHhtbG5zOng9ImFkb2JlOm5zOm1ldGEvIiB4OnhtcHRrPSJYTVAgQ29yZSA2LjAuMCI+IDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+IDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiLz4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8P3hwYWNrZXQgZW5kPSJ3Ij8+AP/tADhQaG90b3Nob3AgMy4wADhCSU0EBAAAAAAAADhCSU0EJQAAAAAAENQdjNmPALIE6YAJmOz4Qn7/4g/QSUNDX1BST0ZJTEUAAQEAAA/AYXBwbAIQAABtbnRyUkdCIFhZWiAH5wACAAwAAAASABhhY3NwQVBQTAAAAABBUFBMAAAAAAAAAAAAAAAAAAAAAAAA9tYAAQAAAADTLWFwcGwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABFkZXNjAAABUAAAAGJkc2NtAAABtAAABJxjcHJ0AAAGUAAAACN3dHB0AAAGdAAAABRyWFlaAAAGiAAAABRnWFlaAAAGnAAAABRiWFlaAAAGsAAAABRyVFJDAAAGxAAACAxhYXJnAAAO0AAAACB2Y2d0AAAO8AAAADBuZGluAAAPIAAAAD5tbW9kAAAPYAAAACh2Y2dwAAAPiAAAADhiVFJDAAAGxAAACAxnVFJDAAAGxAAACAxhYWJnAAAO0AAAACBhYWdnAAAO0AAAACBkZXNjAAAAAAAAAAhEaXNwbGF5AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAbWx1YwAAAAAAAAAmAAAADGhySFIAAAAUAAAB2GtvS1IAAAAMAAAB7G5iTk8AAAASAAAB+GlkAAAAAAASAAACCmh1SFUAAAAUAAACHGNzQ1oAAAAWAAACMGRhREsAAAAcAAACRm5sTkwAAAAWAAACYmZpRkkAAAAQAAACeGl0SVQAAAAYAAACiGVzRVMAAAAWAAACoHJvUk8AAAASAAACtmZyQ0EAAAAWAAACyGFyAAAAAAAUAAAC3nVrVUEAAAAcAAAC8mhlSUwAAAAWAAADDnpoVFcAAAAKAAADJHZpVk4AAAAOAAADLnNrU0sAAAAWAAADPHpoQ04AAAAKAAADJHJ1UlUAAAAkAAADUmVuR0IAAAAUAAADdmZyRlIAAAAWAAADim1zAAAAAAASAAADoGhpSU4AAAASAAADsnRoVEgAAAAMAAADxGNhRVMAAAAYAAAD0GVuQVUAAAAUAAADdmVzWEwAAAASAAACtmRlREUAAAAQAAAD6GVuVVMAAAASAAAD+HB0QlIAAAAYAAAECnBsUEwAAAASAAAEImVsR1IAAAAiAAAENHN2U0UAAAAQAAAEVnRyVFIAAAAUAAAEZnB0UFQAAAAWAAAEemphSlAAAAAMAAAEkABMAEMARAAgAHUAIABiAG8AagBpzuy37AAgAEwAQwBEAEYAYQByAGcAZQAtAEwAQwBEAEwAQwBEACAAVwBhAHIAbgBhAFMAegDtAG4AZQBzACAATABDAEQAQgBhAHIAZQB2AG4A/QAgAEwAQwBEAEwAQwBEAC0AZgBhAHIAdgBlAHMAawDmAHIAbQBLAGwAZQB1AHIAZQBuAC0ATABDAEQAVgDkAHIAaQAtAEwAQwBEAEwAQwBEACAAYQAgAGMAbwBsAG8AcgBpAEwAQwBEACAAYQAgAGMAbwBsAG8AcgBMAEMARAAgAGMAbwBsAG8AcgBBAEMATAAgAGMAbwB1AGwAZQB1AHIgDwBMAEMARAAgBkUGRAZIBkYGKQQaBD4EOwRMBD4EQAQ+BDIEOAQ5ACAATABDAEQgDwBMAEMARAAgBeYF0QXiBdUF4AXZX2mCcgBMAEMARABMAEMARAAgAE0A4AB1AEYAYQByAGUAYgBuAP0AIABMAEMARAQmBDIENQRCBD0EPgQ5ACAEFgQaAC0ENAQ4BEEEPwQ7BDUEOQBDAG8AbABvAHUAcgAgAEwAQwBEAEwAQwBEACAAYwBvAHUAbABlAHUAcgBXAGEAcgBuAGEAIABMAEMARAkwCQIJFwlACSgAIABMAEMARABMAEMARAAgDioONQBMAEMARAAgAGUAbgAgAGMAbwBsAG8AcgBGAGEAcgBiAC0ATABDAEQAQwBvAGwAbwByACAATABDAEQATABDAEQAIABDAG8AbABvAHIAaQBkAG8ASwBvAGwAbwByACAATABDAEQDiAOzA8cDwQPJA7wDtwAgA78DuAPMA70DtwAgAEwAQwBEAEYA5AByAGcALQBMAEMARABSAGUAbgBrAGwAaQAgAEwAQwBEAEwAQwBEACAAYQAgAGMAbwByAGUAczCrMOkw/ABMAEMARHRleHQAAAAAQ29weXJpZ2h0IEFwcGxlIEluYy4sIDIwMjMAAFhZWiAAAAAAAADzUQABAAAAARbMWFlaIAAAAAAAAIPfAAA9v////7tYWVogAAAAAAAASr8AALE3AAAKuVhZWiAAAAAAAAAoOAAAEQsAAMi5Y3VydgAAAAAAAAQAAAAABQAKAA8AFAAZAB4AIwAoAC0AMgA2ADsAQABFAEoATwBUAFkAXgBjAGgAbQByAHcAfACBAIYAiwCQAJUAmgCfAKMAqACtALIAtwC8AMEAxgDLANAA1QDbAOAA5QDrAPAA9gD7AQEBBwENARMBGQEfASUBKwEyATgBPgFFAUwBUgFZAWABZwFuAXUBfAGDAYsBkgGaAaEBqQGxAbkBwQHJAdEB2QHhAekB8gH6AgMCDAIUAh0CJgIvAjgCQQJLAlQCXQJnAnECegKEAo4CmAKiAqwCtgLBAssC1QLgAusC9QMAAwsDFgMhAy0DOANDA08DWgNmA3IDfgOKA5YDogOuA7oDxwPTA+AD7AP5BAYEEwQgBC0EOwRIBFUEYwRxBH4EjASaBKgEtgTEBNME4QTwBP4FDQUcBSsFOgVJBVgFZwV3BYYFlgWmBbUFxQXVBeUF9gYGBhYGJwY3BkgGWQZqBnsGjAadBq8GwAbRBuMG9QcHBxkHKwc9B08HYQd0B4YHmQesB78H0gflB/gICwgfCDIIRghaCG4IggiWCKoIvgjSCOcI+wkQCSUJOglPCWQJeQmPCaQJugnPCeUJ+woRCicKPQpUCmoKgQqYCq4KxQrcCvMLCwsiCzkLUQtpC4ALmAuwC8gL4Qv5DBIMKgxDDFwMdQyODKcMwAzZDPMNDQ0mDUANWg10DY4NqQ3DDd4N+A4TDi4OSQ5kDn8Omw62DtIO7g8JDyUPQQ9eD3oPlg+zD88P7BAJECYQQxBhEH4QmxC5ENcQ9RETETERTxFtEYwRqhHJEegSBxImEkUSZBKEEqMSwxLjEwMTIxNDE2MTgxOkE8UT5RQGFCcUSRRqFIsUrRTOFPAVEhU0FVYVeBWbFb0V4BYDFiYWSRZsFo8WshbWFvoXHRdBF2UXiReuF9IX9xgbGEAYZRiKGK8Y1Rj6GSAZRRlrGZEZtxndGgQaKhpRGncanhrFGuwbFBs7G2MbihuyG9ocAhwqHFIcexyjHMwc9R0eHUcdcB2ZHcMd7B4WHkAeah6UHr4e6R8THz4faR+UH78f6iAVIEEgbCCYIMQg8CEcIUghdSGhIc4h+yInIlUigiKvIt0jCiM4I2YjlCPCI/AkHyRNJHwkqyTaJQklOCVoJZclxyX3JicmVyaHJrcm6CcYJ0kneierJ9woDSg/KHEooijUKQYpOClrKZ0p0CoCKjUqaCqbKs8rAis2K2krnSvRLAUsOSxuLKIs1y0MLUEtdi2rLeEuFi5MLoIuty7uLyQvWi+RL8cv/jA1MGwwpDDbMRIxSjGCMbox8jIqMmMymzLUMw0zRjN/M7gz8TQrNGU0njTYNRM1TTWHNcI1/TY3NnI2rjbpNyQ3YDecN9c4FDhQOIw4yDkFOUI5fzm8Ofk6Njp0OrI67zstO2s7qjvoPCc8ZTykPOM9Ij1hPaE94D4gPmA+oD7gPyE/YT+iP+JAI0BkQKZA50EpQWpBrEHuQjBCckK1QvdDOkN9Q8BEA0RHRIpEzkUSRVVFmkXeRiJGZ0arRvBHNUd7R8BIBUhLSJFI10kdSWNJqUnwSjdKfUrESwxLU0uaS+JMKkxyTLpNAk1KTZNN3E4lTm5Ot08AT0lPk0/dUCdQcVC7UQZRUFGbUeZSMVJ8UsdTE1NfU6pT9lRCVI9U21UoVXVVwlYPVlxWqVb3V0RXklfgWC9YfVjLWRpZaVm4WgdaVlqmWvVbRVuVW+VcNVyGXNZdJ114XcleGl5sXr1fD19hX7NgBWBXYKpg/GFPYaJh9WJJYpxi8GNDY5dj62RAZJRk6WU9ZZJl52Y9ZpJm6Gc9Z5Nn6Wg/aJZo7GlDaZpp8WpIap9q92tPa6dr/2xXbK9tCG1gbbluEm5rbsRvHm94b9FwK3CGcOBxOnGVcfByS3KmcwFzXXO4dBR0cHTMdSh1hXXhdj52m3b4d1Z3s3gReG54zHkqeYl553pGeqV7BHtje8J8IXyBfOF9QX2hfgF+Yn7CfyN/hH/lgEeAqIEKgWuBzYIwgpKC9INXg7qEHYSAhOOFR4Wrhg6GcobXhzuHn4gEiGmIzokziZmJ/opkisqLMIuWi/yMY4zKjTGNmI3/jmaOzo82j56QBpBukNaRP5GokhGSepLjk02TtpQglIqU9JVflcmWNJaflwqXdZfgmEyYuJkkmZCZ/JpomtWbQpuvnByciZz3nWSd0p5Anq6fHZ+Ln/qgaaDYoUehtqImopajBqN2o+akVqTHpTilqaYapoum/adup+CoUqjEqTepqaocqo+rAqt1q+msXKzQrUStuK4trqGvFq+LsACwdbDqsWCx1rJLssKzOLOutCW0nLUTtYq2AbZ5tvC3aLfguFm40blKucK6O7q1uy67p7whvJu9Fb2Pvgq+hL7/v3q/9cBwwOzBZ8Hjwl/C28NYw9TEUcTOxUvFyMZGxsPHQce/yD3IvMk6ybnKOMq3yzbLtsw1zLXNNc21zjbOts83z7jQOdC60TzRvtI/0sHTRNPG1EnUy9VO1dHWVdbY11zX4Nhk2OjZbNnx2nba+9uA3AXcit0Q3ZbeHN6i3ynfr+A24L3hROHM4lPi2+Nj4+vkc+T85YTmDeaW5x/nqegy6LzpRunQ6lvq5etw6/vshu0R7ZzuKO6070DvzPBY8OXxcvH/8ozzGfOn9DT0wvVQ9d72bfb794r4Gfio+Tj5x/pX+uf7d/wH/Jj9Kf26/kv+3P9t//9wYXJhAAAAAAADAAAAAmZmAADypwAADVkAABPQAAAKW3ZjZ3QAAAAAAAAAAQABAAAAAAAAAAEAAAABAAAAAAAAAAEAAAABAAAAAAAAAAEAAG5kaW4AAAAAAAAANgAArhQAAFHsAABD1wAAsKQAACZmAAAPXAAAUA0AAFQ5AAIzMwACMzMAAjMzAAAAAAAAAABtbW9kAAAAAAAABhAAAKBO/WJtYgAAAAAAAAAAAAAAAAAAAAAAAAAAdmNncAAAAAAAAwAAAAJmZgADAAAAAmZmAAMAAAACZmYAAAACMzM0AAAAAAIzMzQAAAAAAjMzNAD/wAARCALDCaQDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9sAQwABAQEBAQECAQECAwICAgMEAwMDAwQGBAQEBAQGBwYGBgYGBgcHBwcHBwcHCAgICAgICQkJCQkLCwsLCwsLCwsL/9sAQwECAgIDAwMFAwMFCwgGCAsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsL/90ABACb/9oADAMBAAIRAxEAPwD+/iiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooA/9D+/iiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKK/no/4Kz/8HEv7Pf8AwSO/aL0X9nH4s+AfEXinUdb8OW/iSO70iS2SBILm6urURsJpEbeGtWY4GMMO+aAP6F6K/jB8P/8AB7P+wTd6nFB4n+FHj2xtGYB5rcafcOoPfY13FnH+9X9Qv7E/7dH7Mf8AwUL+B9r+0H+yp4kj8ReH55mtZwUaG6sruMBnt7mBwHilUMpwRhlZXUsjKxAPrmiiigAooooAKKKKACiiigAooooAKKKKACiiigAoor4a8V/8FIP2OvCn7ZvhL/gn6/jC21H4teLzd+ToOn/6TLZR2dlNfu96yZS23QwnYkhEjllKoUJYAH3LRRX5V/8ABV3/AIK1/A3/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tpfBL/hI/Cur/DmC1h0vQ7C6tBo0jW0DwebcLJZvdzSyh2kmkN1ueQ5zjivS/wDgrH/wQh/Y/wD+Cu+r+G/G/wAbtQ1zwx4r8LWr2Fpq+gzQpJLZO5k+zzx3EMyOiOzuhUIyszfMQSK/a+igD+D/AP4OLv2BvhH/AME0v+CAHw//AGTfghqmsax4e0f4qWd3Fca7NDPdmS9s9UlkBaCGCMLvJKgRjGeSetdD+xf/AMGwX/BO/wD4KGf8E+PgH+0t4lvvEngTxTrfhHTpdbfw1c26W2pSDIaaSK6t7gJOygAvGVU43MjMSx/s0+PH7N37P/7UngyH4dftI+C9F8d6Db3aX8Wn67ZRX9sl1GrokojmVlDqsjqGxkBiO5rt/h18OPAPwh8D6X8MvhZo1l4d8O6JAtrp+m6dCtva2sCfdjiiQBUUdgABQB8tfsD/APBPf9l//gmt8B7f9nv9lfRH0zSBMbu9u7qTz7/UbxlVGuLqbC75CqgAKqogAVFVRivxs/bI/wCDUX/gmn+2F+0Xqn7SFzf+KvAmoeIr1r/WdO8NXVpDYXVxJzLLHHPaTtDJK/zyFG2FixCAnNf02UUAfzteG/8Ag2F/4Jn/AA//AGifhF+0j8Kf+En8J6n8GzpMumWGm3lp9i1G60m8kvludRM1nLc3E80sm2Z1nj/dqiII1Va+qv8AgrD/AMEWP2T/APgr54b8M2Xx+u9Y0DXfBrXP9k61oU0UVwkV3s82GVJopo5YmaNGAKh1YfI6hnDfr3RQB+dX/BML/gmh8E/+CU37ONx+zP8AAfWdc13R7zWLjXZrnX5oJrj7VdRQwuqfZ4IEWLEClV2kgliWOeP0VoooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooA//T/v4ooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKAP/U/v4ooooAKKKKACiiigAoor57/aL/AGqfgL+yj4N/4Tf46+IrfRLV9y28LZkubl1GdkMKAu547DA/iIHNAH0JXmfxR+M/wl+CWgN4p+L3iTTfDenqDibUblIAxHZA5Bc/7Kgk+lfyg/th/wDBf/4t/EX7V4N/ZP04+DdIfdH/AGveBJtUlXkZRfmit8j/AK6OOoYGvw98j49/tMeNZL9xrfjnX7lv3kzma/uDuOfmc7yB9SAKBpNuyP6/vi9/wcBfsV+AL6fSfh/Z6340miYqJ7K3W1tGI44kuHSTHoREQe1fnj8SP+DkP4sX7PH8IvhtpOlKDhJNXu5r8kepSEWuPpuP1r4A+FP/AASE/af8dwJqHjd7DwjbOM7LyXz7nn/pnDuUcdmdT7V9y+B/+CJnwrsAknxF8Z6pqjDBZNPhislz6Zk+0HH5H6VlKvBdTupZZiZ6qFvXQ8C1j/g4D/b11PP2KPwzp2f+ffTnbH/f2eSvPZv+C53/AAUZlkMieKtPjB/hXSbTA/OMn9a/T/TP+CR/7G1hj7Vp2p3uP+e1+4z/AN+wldtF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7OClelbsFFFFM6wooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAr+M3/AIKHeKbLxj+2j8QNXsH8yOLUFsif9uxhjtnH4NERX9h3jLxPYeCfB+q+M9V4tdIs572bnH7u3QyNz9FNfwy6VYeJfjT8V7bS4czax4s1ZIlwMl7m/mAHHU5d6mR5+YS92MT+/L/glp4Iv/h9/wAE+fhX4f1NdssujLqGMYwuoyPdrkeu2YZr78rn/CXhrTfBnhXTPB+jLss9KtIbOBemI4ECKPyAroKk8sKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooA//1f7+KKKKAPOPjD8M9C+M3wp8R/CXxMoaw8Sabc6dNkZ2rcRlNw91J3D0Ir/ODlg+JH7KX7QLWt/EbHxP4F1grJG44E9nJgjB6o+PoynPQ1/ph1/Jr/wcHfseDQPFWkftj+C7XFrrBj0rxB5a8LdRr/o07YH/AC0jUxMT3RO7UDTad0fqB8Hfil4c+NXwx0T4p+E33WOtWqXCrnJjY8PG3+1G4KN7ivSq/nI/4JEftY23g7xJN+zP42n2WOuTG40aRj8sd4w+eEnsJQAV/wBsY6tX9G9eXVhySsfcYLEqvSU+vX1CiiiszrCvgz47/szfFLTvib/w1B+x3rsXhX4hCHyNQgnAaw1m3GP3dwpVlD7VAVipyQvKMA6/edFVCbi7oxr0IVoclRaHx78Pf+Cr3hrwpr0Xw4/bc8L33ws8Ru+yOeSN7nS7jLON0U0YfMagRq0gLJuY5IVSR+pfgz4g+AviPpQ134e63p+vWJxi4065juouenzxMy8/Wvkvxp4E8E/EfQZPC3xA0iz1vTZSGa2voUniLL0ba4IDDsRyO1fAPiT/AIJf/BO28Sjxx8Cdb174Z6yC37/Qb2RFw5DMAGJdBkZASRVH93gY7IYpfaPnq+R1E70ndee/9fcfvDRX4VWOkf8ABWf4LykeCPiH4f8AiTp4kDLB4htDbz45zzGA2055BuMjA245z1dh/wAFFP22PhvHJF8ff2fby+WBFMl7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Ud/4JB/DL9ss3XxT+GssPhX4ibAXutmLPUiowBdKoyHwABMuWAwGDADAOMmndHj/AOyn+238G/2rdAibwxdrp3iGNN13oty4FxGR94x9PNj7h16D7wU8V9i1/D18Yvgj8ef2RPim3g74mabe+FvEOmyeZbzIxQOFPE1vOhw6Hs6N7HByK/Un9mL/AILG+KfCdlB4S/aU0+XXrePaiavZBVu1QYH72M7UlI67gVb1DHmqUj1KOOT0qaM/o8orwT4L/tP/AAH/AGgrJbn4UeJbTU5tgd7Td5V3GCM/NC+2QY9cFeOCa97qjuUk1dBRRRQMKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKazKil3ICgZJPAAr4N+Pf8AwUh/Zc+Axm0y71oeItYiBH2DR8XLBh2eUERJz1BfcP7poJlOMVeTPvGSRIkaWVgqqCSScAAdzX4yftz/APBUvwv8NtOuvhl+zdfQav4lk3w3Gqx4ltbDHB8snKzTenWNT13H5a/K79rL/gpF8bf2mGuPDOmSN4X8KSZQ6bZyEvcJnj7RLgGT/dAVPUE81f8A2E/+CY37QP7cesxaroFudA8FxSlLvxBeRnyfk+8lunBnkHTCkKp+8y1LkedXxt/dp/efN3wJ+APx7/bT+MyeBvhtaXHiDxBq0xuL69uXZo4Edv3lzdztu2oCcsxyzH5VDOQp/uq/YB/YB+F/7BnwuPhfwyy6r4l1QJJrWtvGElupF6IgySkEeTsTJ5JYksTXp/7In7HnwZ/Yt+FkPww+ENkV3lZdQ1GcBry/uAMeZM4A6chEGFQcAckn6oqTzgooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKAP//Q/v4ooooAKKKKACiiigArP1bSdK17TZ9G1y2ivbO5QxzQToJI5EPVWVgQQfQitCigD8LP2t/+CD/7M3xtFz4o+BEh+HXiCTL+TbJ5ulSv6Nb5Biz6wsqjrsNfzo/tE/8ABI39uX9nP7RqOreEpPEujwZP9o+Hib+LaD95olAnQY5JeIAetf6ANFAH+aZ8NP2l/wBon4EySab8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TwlY6L4dyP8AXQW73E2frO7x/wDkOv1n0b/g21+GEGP+Eh+KWqXXr9n06KDP/fUstfQ/w/8A+DfL9iHwtItx4wv/ABH4ncHLR3N5HbwkemLeKOQf9/KLsl4qq/tH8kfxI/ar/aP+LqSW/wAQ/Gmq6jbygh7b7Q0VsQ3XMMWyP/x2vXf2fP8AgnL+2X+01Jb3Hwx8D340ydgP7U1BfsNiF6lhLNtDgDtGHPoK/uI+EX/BPP8AYo+BV9Fqvwz+G+jWd7AMR3VxEb24T3WW5aV1PHUEGvsukYuTerZ/P7+yH/wQJ+A/wp+zeLP2m77/AIT7W0w/9nxboNJibngrxLPjg5cop6GM1+92iaHovhrSLfQPDlnBp9hZxiKC2to1ihiReioigKqjsAAK1KKBBRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFAH//R/v4ooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKAP/S/v4ooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKAP/T/v4ooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKAP/Z" + } + }, + "cell_type": "markdown", + "id": "07fa2dab", + "metadata": {}, + "source": [ + "![overview.jpeg](attachment:overview.jpeg)" + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "id": "45cca85e-8f1a-47d3-bf2c-980aa7c320d6", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Requirement already satisfied: pypdf in ./.venv/lib/python3.9/site-packages (5.4.0)\n", + "Requirement already satisfied: chromadb in ./.venv/lib/python3.9/site-packages (0.6.3)\n", + "Requirement already satisfied: langchain_openai in ./.venv/lib/python3.9/site-packages (0.3.11)\n", + "Requirement already satisfied: typing_extensions>=4.0 in ./.venv/lib/python3.9/site-packages (from pypdf) (4.12.2)\n", + "Requirement already satisfied: build>=1.0.3 in ./.venv/lib/python3.9/site-packages (from chromadb) (1.2.2.post1)\n", + "Requirement already satisfied: pydantic>=1.9 in ./.venv/lib/python3.9/site-packages (from chromadb) (2.10.6)\n", + "Requirement already satisfied: chroma-hnswlib==0.7.6 in ./.venv/lib/python3.9/site-packages (from chromadb) (0.7.6)\n", + "Requirement already satisfied: fastapi>=0.95.2 in ./.venv/lib/python3.9/site-packages (from chromadb) (0.115.12)\n", + "Requirement already satisfied: uvicorn>=0.18.3 in ./.venv/lib/python3.9/site-packages (from uvicorn[standard]>=0.18.3->chromadb) (0.34.0)\n", + "Requirement already satisfied: numpy>=1.22.5 in ./.venv/lib/python3.9/site-packages (from chromadb) (2.0.2)\n", + "Requirement already satisfied: posthog>=2.4.0 in ./.venv/lib/python3.9/site-packages (from chromadb) (3.23.0)\n", + "Requirement already satisfied: onnxruntime>=1.14.1 in ./.venv/lib/python3.9/site-packages (from chromadb) (1.19.2)\n", + "Requirement already satisfied: opentelemetry-api>=1.2.0 in ./.venv/lib/python3.9/site-packages (from chromadb) (1.31.1)\n", + "Requirement already satisfied: opentelemetry-exporter-otlp-proto-grpc>=1.2.0 in ./.venv/lib/python3.9/site-packages (from chromadb) (1.31.1)\n", + "Requirement already satisfied: opentelemetry-instrumentation-fastapi>=0.41b0 in ./.venv/lib/python3.9/site-packages (from chromadb) (0.52b1)\n", + "Requirement already satisfied: opentelemetry-sdk>=1.2.0 in ./.venv/lib/python3.9/site-packages (from chromadb) (1.31.1)\n", + "Requirement already satisfied: tokenizers>=0.13.2 in ./.venv/lib/python3.9/site-packages (from chromadb) (0.21.1)\n", + "Requirement already satisfied: pypika>=0.48.9 in ./.venv/lib/python3.9/site-packages (from chromadb) (0.48.9)\n", + "Requirement already satisfied: tqdm>=4.65.0 in ./.venv/lib/python3.9/site-packages (from chromadb) (4.67.1)\n", + "Requirement already satisfied: overrides>=7.3.1 in ./.venv/lib/python3.9/site-packages (from chromadb) (7.7.0)\n", + "Requirement already satisfied: importlib-resources in ./.venv/lib/python3.9/site-packages (from chromadb) (6.5.2)\n", + "Requirement already satisfied: grpcio>=1.58.0 in ./.venv/lib/python3.9/site-packages (from chromadb) (1.71.0)\n", + "Requirement already satisfied: bcrypt>=4.0.1 in ./.venv/lib/python3.9/site-packages (from chromadb) (4.3.0)\n", + "Requirement already satisfied: typer>=0.9.0 in ./.venv/lib/python3.9/site-packages (from chromadb) (0.15.2)\n", + "Requirement already satisfied: kubernetes>=28.1.0 in ./.venv/lib/python3.9/site-packages (from chromadb) (32.0.1)\n", + "Requirement already satisfied: tenacity>=8.2.3 in ./.venv/lib/python3.9/site-packages (from chromadb) (9.0.0)\n", + "Requirement already satisfied: PyYAML>=6.0.0 in ./.venv/lib/python3.9/site-packages (from chromadb) (6.0.2)\n", + "Requirement already satisfied: mmh3>=4.0.1 in ./.venv/lib/python3.9/site-packages (from chromadb) (5.1.0)\n", + "Requirement already satisfied: orjson>=3.9.12 in ./.venv/lib/python3.9/site-packages (from chromadb) (3.10.15)\n", + "Requirement already satisfied: httpx>=0.27.0 in ./.venv/lib/python3.9/site-packages (from chromadb) (0.28.1)\n", + "Requirement already satisfied: rich>=10.11.0 in ./.venv/lib/python3.9/site-packages (from chromadb) (14.0.0)\n", + "Requirement already satisfied: langchain-core<1.0.0,>=0.3.49 in ./.venv/lib/python3.9/site-packages (from langchain_openai) (0.3.49)\n", + "Requirement already satisfied: openai<2.0.0,>=1.68.2 in ./.venv/lib/python3.9/site-packages (from langchain_openai) (1.70.0)\n", + "Requirement already satisfied: tiktoken<1,>=0.7 in ./.venv/lib/python3.9/site-packages (from langchain_openai) (0.9.0)\n", + "Requirement already satisfied: packaging>=19.1 in ./.venv/lib/python3.9/site-packages (from build>=1.0.3->chromadb) (24.2)\n", + "Requirement already satisfied: pyproject_hooks in ./.venv/lib/python3.9/site-packages (from build>=1.0.3->chromadb) (1.2.0)\n", + "Requirement already satisfied: importlib-metadata>=4.6 in ./.venv/lib/python3.9/site-packages (from build>=1.0.3->chromadb) (8.6.1)\n", + "Requirement already satisfied: tomli>=1.1.0 in ./.venv/lib/python3.9/site-packages (from build>=1.0.3->chromadb) (2.2.1)\n", + "Requirement already satisfied: starlette<0.47.0,>=0.40.0 in ./.venv/lib/python3.9/site-packages (from fastapi>=0.95.2->chromadb) (0.46.1)\n", + "Requirement already satisfied: anyio in ./.venv/lib/python3.9/site-packages (from httpx>=0.27.0->chromadb) (4.9.0)\n", + "Requirement already satisfied: certifi in ./.venv/lib/python3.9/site-packages (from httpx>=0.27.0->chromadb) (2025.1.31)\n", + "Requirement already satisfied: httpcore==1.* in ./.venv/lib/python3.9/site-packages (from httpx>=0.27.0->chromadb) (1.0.7)\n", + "Requirement already satisfied: idna in ./.venv/lib/python3.9/site-packages (from httpx>=0.27.0->chromadb) (3.10)\n", + "Requirement already satisfied: h11<0.15,>=0.13 in ./.venv/lib/python3.9/site-packages (from httpcore==1.*->httpx>=0.27.0->chromadb) (0.14.0)\n", + "Requirement already satisfied: six>=1.9.0 in ./.venv/lib/python3.9/site-packages (from kubernetes>=28.1.0->chromadb) (1.17.0)\n", + "Requirement already satisfied: python-dateutil>=2.5.3 in ./.venv/lib/python3.9/site-packages (from kubernetes>=28.1.0->chromadb) (2.9.0.post0)\n", + "Requirement already satisfied: google-auth>=1.0.1 in ./.venv/lib/python3.9/site-packages (from kubernetes>=28.1.0->chromadb) (2.38.0)\n", + "Requirement already satisfied: websocket-client!=0.40.0,!=0.41.*,!=0.42.*,>=0.32.0 in ./.venv/lib/python3.9/site-packages (from kubernetes>=28.1.0->chromadb) (1.8.0)\n", + "Requirement already satisfied: requests in ./.venv/lib/python3.9/site-packages (from kubernetes>=28.1.0->chromadb) (2.32.3)\n", + "Requirement already satisfied: requests-oauthlib in ./.venv/lib/python3.9/site-packages (from kubernetes>=28.1.0->chromadb) (2.0.0)\n", + "Requirement already satisfied: oauthlib>=3.2.2 in ./.venv/lib/python3.9/site-packages (from kubernetes>=28.1.0->chromadb) (3.2.2)\n", + "Requirement already satisfied: urllib3>=1.24.2 in ./.venv/lib/python3.9/site-packages (from kubernetes>=28.1.0->chromadb) (2.3.0)\n", + "Requirement already satisfied: durationpy>=0.7 in ./.venv/lib/python3.9/site-packages (from kubernetes>=28.1.0->chromadb) (0.9)\n", + "Requirement already satisfied: langsmith<0.4,>=0.1.125 in ./.venv/lib/python3.9/site-packages (from langchain-core<1.0.0,>=0.3.49->langchain_openai) (0.3.18)\n", + "Requirement already satisfied: jsonpatch<2.0,>=1.33 in ./.venv/lib/python3.9/site-packages (from langchain-core<1.0.0,>=0.3.49->langchain_openai) (1.33)\n", + "Requirement already satisfied: coloredlogs in ./.venv/lib/python3.9/site-packages (from onnxruntime>=1.14.1->chromadb) (15.0.1)\n", + "Requirement already satisfied: flatbuffers in ./.venv/lib/python3.9/site-packages (from onnxruntime>=1.14.1->chromadb) (25.2.10)\n", + "Requirement already satisfied: protobuf in ./.venv/lib/python3.9/site-packages (from onnxruntime>=1.14.1->chromadb) (5.29.4)\n", + "Requirement already satisfied: sympy in ./.venv/lib/python3.9/site-packages (from onnxruntime>=1.14.1->chromadb) (1.13.1)\n", + "Requirement already satisfied: distro<2,>=1.7.0 in ./.venv/lib/python3.9/site-packages (from openai<2.0.0,>=1.68.2->langchain_openai) (1.9.0)\n", + "Requirement already satisfied: jiter<1,>=0.4.0 in ./.venv/lib/python3.9/site-packages (from openai<2.0.0,>=1.68.2->langchain_openai) (0.9.0)\n", + "Requirement already satisfied: sniffio in ./.venv/lib/python3.9/site-packages (from openai<2.0.0,>=1.68.2->langchain_openai) (1.3.1)\n", + "Requirement already satisfied: deprecated>=1.2.6 in ./.venv/lib/python3.9/site-packages (from opentelemetry-api>=1.2.0->chromadb) (1.2.18)\n", + "Requirement already satisfied: googleapis-common-protos~=1.52 in ./.venv/lib/python3.9/site-packages (from opentelemetry-exporter-otlp-proto-grpc>=1.2.0->chromadb) (1.69.2)\n", + "Requirement already satisfied: opentelemetry-exporter-otlp-proto-common==1.31.1 in ./.venv/lib/python3.9/site-packages (from opentelemetry-exporter-otlp-proto-grpc>=1.2.0->chromadb) (1.31.1)\n", + "Requirement already satisfied: opentelemetry-proto==1.31.1 in ./.venv/lib/python3.9/site-packages (from opentelemetry-exporter-otlp-proto-grpc>=1.2.0->chromadb) (1.31.1)\n", + "Requirement already satisfied: opentelemetry-instrumentation-asgi==0.52b1 in ./.venv/lib/python3.9/site-packages (from opentelemetry-instrumentation-fastapi>=0.41b0->chromadb) (0.52b1)\n", + "Requirement already satisfied: opentelemetry-instrumentation==0.52b1 in ./.venv/lib/python3.9/site-packages (from opentelemetry-instrumentation-fastapi>=0.41b0->chromadb) (0.52b1)\n", + "Requirement already satisfied: opentelemetry-semantic-conventions==0.52b1 in ./.venv/lib/python3.9/site-packages (from opentelemetry-instrumentation-fastapi>=0.41b0->chromadb) (0.52b1)\n", + "Requirement already satisfied: opentelemetry-util-http==0.52b1 in ./.venv/lib/python3.9/site-packages (from opentelemetry-instrumentation-fastapi>=0.41b0->chromadb) (0.52b1)\n", + "Requirement already satisfied: wrapt<2.0.0,>=1.0.0 in ./.venv/lib/python3.9/site-packages (from opentelemetry-instrumentation==0.52b1->opentelemetry-instrumentation-fastapi>=0.41b0->chromadb) (1.17.2)\n", + "Requirement already satisfied: asgiref~=3.0 in ./.venv/lib/python3.9/site-packages (from opentelemetry-instrumentation-asgi==0.52b1->opentelemetry-instrumentation-fastapi>=0.41b0->chromadb) (3.8.1)\n", + "Requirement already satisfied: monotonic>=1.5 in ./.venv/lib/python3.9/site-packages (from posthog>=2.4.0->chromadb) (1.6)\n", + "Requirement already satisfied: backoff>=1.10.0 in ./.venv/lib/python3.9/site-packages (from posthog>=2.4.0->chromadb) (2.2.1)\n", + "Requirement already satisfied: annotated-types>=0.6.0 in ./.venv/lib/python3.9/site-packages (from pydantic>=1.9->chromadb) (0.7.0)\n", + "Requirement already satisfied: pydantic-core==2.27.2 in ./.venv/lib/python3.9/site-packages (from pydantic>=1.9->chromadb) (2.27.2)\n", + "Requirement already satisfied: markdown-it-py>=2.2.0 in ./.venv/lib/python3.9/site-packages (from rich>=10.11.0->chromadb) (3.0.0)\n", + "Requirement already satisfied: pygments<3.0.0,>=2.13.0 in ./.venv/lib/python3.9/site-packages (from rich>=10.11.0->chromadb) (2.19.1)\n", + "Requirement already satisfied: regex>=2022.1.18 in ./.venv/lib/python3.9/site-packages (from tiktoken<1,>=0.7->langchain_openai) (2024.11.6)\n", + "Requirement already satisfied: huggingface-hub<1.0,>=0.16.4 in ./.venv/lib/python3.9/site-packages (from tokenizers>=0.13.2->chromadb) (0.29.3)\n", + "Requirement already satisfied: click>=8.0.0 in ./.venv/lib/python3.9/site-packages (from typer>=0.9.0->chromadb) (8.1.8)\n", + "Requirement already satisfied: shellingham>=1.3.0 in ./.venv/lib/python3.9/site-packages (from typer>=0.9.0->chromadb) (1.5.4)\n", + "Requirement already satisfied: httptools>=0.6.3 in ./.venv/lib/python3.9/site-packages (from uvicorn[standard]>=0.18.3->chromadb) (0.6.4)\n", + "Requirement already satisfied: python-dotenv>=0.13 in ./.venv/lib/python3.9/site-packages (from uvicorn[standard]>=0.18.3->chromadb) (1.0.1)\n", + "Requirement already satisfied: uvloop!=0.15.0,!=0.15.1,>=0.14.0 in ./.venv/lib/python3.9/site-packages (from uvicorn[standard]>=0.18.3->chromadb) (0.21.0)\n", + "Requirement already satisfied: watchfiles>=0.13 in ./.venv/lib/python3.9/site-packages (from uvicorn[standard]>=0.18.3->chromadb) (1.0.4)\n", + "Requirement already satisfied: websockets>=10.4 in ./.venv/lib/python3.9/site-packages (from uvicorn[standard]>=0.18.3->chromadb) (15.0.1)\n", + "Requirement already satisfied: zipp>=3.1.0 in ./.venv/lib/python3.9/site-packages (from importlib-resources->chromadb) (3.21.0)\n", + "Requirement already satisfied: exceptiongroup>=1.0.2 in ./.venv/lib/python3.9/site-packages (from anyio->httpx>=0.27.0->chromadb) (1.2.2)\n", + "Requirement already satisfied: cachetools<6.0,>=2.0.0 in ./.venv/lib/python3.9/site-packages (from google-auth>=1.0.1->kubernetes>=28.1.0->chromadb) (5.5.2)\n", + "Requirement already satisfied: pyasn1-modules>=0.2.1 in ./.venv/lib/python3.9/site-packages (from google-auth>=1.0.1->kubernetes>=28.1.0->chromadb) (0.4.2)\n", + "Requirement already satisfied: rsa<5,>=3.1.4 in ./.venv/lib/python3.9/site-packages (from google-auth>=1.0.1->kubernetes>=28.1.0->chromadb) (4.9)\n", + "Requirement already satisfied: filelock in ./.venv/lib/python3.9/site-packages (from huggingface-hub<1.0,>=0.16.4->tokenizers>=0.13.2->chromadb) (3.18.0)\n", + "Requirement already satisfied: fsspec>=2023.5.0 in ./.venv/lib/python3.9/site-packages (from huggingface-hub<1.0,>=0.16.4->tokenizers>=0.13.2->chromadb) (2024.12.0)\n", + "Requirement already satisfied: jsonpointer>=1.9 in ./.venv/lib/python3.9/site-packages (from jsonpatch<2.0,>=1.33->langchain-core<1.0.0,>=0.3.49->langchain_openai) (3.0.0)\n", + "Requirement already satisfied: requests-toolbelt<2.0.0,>=1.0.0 in ./.venv/lib/python3.9/site-packages (from langsmith<0.4,>=0.1.125->langchain-core<1.0.0,>=0.3.49->langchain_openai) (1.0.0)\n", + "Requirement already satisfied: zstandard<0.24.0,>=0.23.0 in ./.venv/lib/python3.9/site-packages (from langsmith<0.4,>=0.1.125->langchain-core<1.0.0,>=0.3.49->langchain_openai) (0.23.0)\n", + "Requirement already satisfied: mdurl~=0.1 in ./.venv/lib/python3.9/site-packages (from markdown-it-py>=2.2.0->rich>=10.11.0->chromadb) (0.1.2)\n", + "Requirement already satisfied: charset-normalizer<4,>=2 in ./.venv/lib/python3.9/site-packages (from requests->kubernetes>=28.1.0->chromadb) (3.4.1)\n", + "Requirement already satisfied: humanfriendly>=9.1 in ./.venv/lib/python3.9/site-packages (from coloredlogs->onnxruntime>=1.14.1->chromadb) (10.0)\n", + "Requirement already satisfied: mpmath<1.4,>=1.1.0 in ./.venv/lib/python3.9/site-packages (from sympy->onnxruntime>=1.14.1->chromadb) (1.3.0)\n", + "Requirement already satisfied: pyasn1<0.7.0,>=0.6.1 in ./.venv/lib/python3.9/site-packages (from pyasn1-modules>=0.2.1->google-auth>=1.0.1->kubernetes>=28.1.0->chromadb) (0.6.1)\n" + ] + } + ], + "source": [ + "!pip install pypdf chromadb langchain_openai" + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "id": "f23bc8ca-0e5d-4a8c-9992-8f028cd5ae84", + "metadata": {}, + "outputs": [], + "source": [ + "from langchain.document_loaders import PyPDFLoader\n", + "\n", + "# Load PDF\n", + "loaders = [\n", + " # Duplicate documents on purpose - messy data\n", + " PyPDFLoader(\"docs/MachineLearning-Lecture01.pdf\"),\n", + " PyPDFLoader(\"docs/MachineLearning-Lecture01.pdf\"),\n", + " PyPDFLoader(\"docs/MachineLearning-Lecture02.pdf\"),\n", + " PyPDFLoader(\"docs/MachineLearning-Lecture03.pdf\")\n", + "]\n", + "docs = []\n", + "for loader in loaders:\n", + " docs.extend(loader.load())" + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "id": "57596b23-fcc3-45a7-ae42-1762803344ed", + "metadata": {}, + "outputs": [], + "source": [ + "from langchain.text_splitter import RecursiveCharacterTextSplitter\n", + "\n", + "text_splitter = RecursiveCharacterTextSplitter(\n", + " chunk_size = 1500,\n", + " chunk_overlap = 150\n", + ")\n", + "\n", + "splits = text_splitter.split_documents(docs)" + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "id": "0d2fa836-82a1-48db-98c2-b0845d3c62ad", + "metadata": {}, + "outputs": [], + "source": [ + "import requests\n", + "from typing import List\n", + "from langchain.embeddings.base import Embeddings\n", + "\n", + "class LocalServerEmbeddings(Embeddings):\n", + " def __init__(self, base_url: str):\n", + " self.base_url = base_url\n", + " self.model = \"text-embedding-nomic-embed-text-v1.5\"\n", + "\n", + " def embed_documents(self, texts: List[str]) -> List[List[float]]:\n", + " response = requests.post(f\"{self.base_url}/embeddings\", json={\"input\": texts})\n", + " data = response.json()\n", + "\n", + " return [item[\"embedding\"] for item in data[\"data\"]]\n", + "\n", + " def embed_query(self, text: str) -> List[float]:\n", + " response = requests.post(f\"{self.base_url}/embeddings\", json={\"input\": [text]})\n", + " data = response.json()\n", + " return data[\"data\"][0][\"embedding\"]\n", + "\n", + "embedding = LocalServerEmbeddings(base_url=\"http://localhost:1234/v1\")" + ] + }, + { + "cell_type": "code", + "execution_count": 27, + "id": "96da5a05-c33e-4fbb-9a30-b5ece260ff94", + "metadata": {}, + "outputs": [], + "source": [ + "from langchain.vectorstores import Chroma\n", + "\n", + "!rm -rf ./docs/chroma\n", + "\n", + "persist_directory = 'chroma/'\n", + "\n", + "\n", + "vectordb = Chroma.from_documents(\n", + " documents=splits,\n", + " embedding=embedding,\n", + " persist_directory=persist_directory\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": 28, + "id": "ee60ebc6-b47c-4c04-af4e-620f161d5c00", + "metadata": { + "height": 132, + "tags": [] + }, + "outputs": [], + "source": [ + "import os\n", + "\n", + "from langchain_openai import ChatOpenAI\n", + "\n", + "base_url = \"http://localhost:1234/v1\"\n", + "api_key = \"lm-studio\"\n", + "llm_model = \"phi-4@q8_0\"\n", + "\n", + "llm = ChatOpenAI(\n", + " base_url=base_url,\n", + " api_key=api_key,\n", + " temperature=0.9,\n", + " model=llm_model\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": 29, + "id": "e63e5f31", + "metadata": { + "height": 98, + "tags": [] + }, + "outputs": [], + "source": [ + "from langchain.vectorstores import Chroma\n", + "from langchain.embeddings.openai import OpenAIEmbeddings\n", + "\n", + "persist_directory = 'chroma/'\n", + "\n", + "vectordb = Chroma(persist_directory=persist_directory, embedding_function=embedding)" + ] + }, + { + "cell_type": "code", + "execution_count": 30, + "id": "15fd1341", + "metadata": { + "height": 30 + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "416\n" + ] + } + ], + "source": [ + "print(vectordb._collection.count())" + ] + }, + { + "cell_type": "code", + "execution_count": 31, + "id": "3a689f25", + "metadata": { + "height": 64, + "tags": [] + }, + "outputs": [ + { + "data": { + "text/plain": [ + "3" + ] + }, + "execution_count": 31, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "question = \"What are the most important topics discussed in this course?\"\n", + "docs = vectordb.similarity_search(question,k=3)\n", + "len(docs)" + ] + }, + { + "cell_type": "markdown", + "id": "37ba2ad8", + "metadata": {}, + "source": [ + "### RetrievalQA chain" + ] + }, + { + "cell_type": "code", + "execution_count": 32, + "id": "5b3ebcdd", + "metadata": { + "height": 30, + "tags": [] + }, + "outputs": [], + "source": [ + "from langchain.chains import RetrievalQA" + ] + }, + { + "cell_type": "code", + "execution_count": 33, + "id": "41f0003f", + "metadata": { + "height": 81 + }, + "outputs": [], + "source": [ + "qa_chain = RetrievalQA.from_chain_type(\n", + " llm,\n", + " retriever=vectordb.as_retriever()\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": 35, + "id": "aac0334e", + "metadata": { + "height": 30 + }, + "outputs": [], + "source": [ + "result = qa_chain({\"query\": question})" + ] + }, + { + "cell_type": "code", + "execution_count": 36, + "id": "10227125", + "metadata": { + "height": 30 + }, + "outputs": [ + { + "data": { + "text/plain": [ + "'Based on the provided context, some of the important topics that will be discussed in the course include:\\n\\n1. **Convex Optimization**: This topic is likely to be covered as part of the discussion sections.\\n\\n2. **Hidden Markov Models (HMMs)**: These are a type of machine learning algorithm for modeling time series data and will also be addressed in the discussions.\\n\\n3. **Extensions to Main Lecture Materials**: In addition to convex optimization and HMMs, there will be other topics that extend beyond what is covered in the main lectures.\\n\\nThe course appears to focus on various aspects of machine learning and possibly includes practical implementations or exercises using programming languages like MATLAB or R.'" + ] + }, + "execution_count": 36, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "result[\"result\"]" + ] + }, + { + "cell_type": "markdown", + "id": "5fae8e55", + "metadata": {}, + "source": [ + "### Prompt" + ] + }, + { + "cell_type": "code", + "execution_count": 37, + "id": "2b37519f", + "metadata": { + "height": 166, + "scrolled": true, + "tags": [] + }, + "outputs": [], + "source": [ + "from langchain.prompts import PromptTemplate\n", + "\n", + "template = \"\"\"Use the following pieces of context to answer the question at the end. If you don't know the answer, just say that you don't know, don't try to make up an answer. Use three sentences maximum. Keep the answer as concise as possible. Always say \"thanks for asking!\" at the end of the answer. \n", + "{context}\n", + "Question: {question}\n", + "Helpful Answer:\"\"\"\n", + "QA_CHAIN_PROMPT = PromptTemplate.from_template(template)\n" + ] + }, + { + "cell_type": "code", + "execution_count": 38, + "id": "fcb5817c", + "metadata": { + "height": 132 + }, + "outputs": [], + "source": [ + "qa_chain = RetrievalQA.from_chain_type(\n", + " llm,\n", + " retriever=vectordb.as_retriever(),\n", + " return_source_documents=True,\n", + " chain_type_kwargs={\"prompt\": QA_CHAIN_PROMPT}\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": 39, + "id": "e0fd6824", + "metadata": { + "height": 30 + }, + "outputs": [], + "source": [ + "question = \"Will we learn about LLMs at this course?\"" + ] + }, + { + "cell_type": "code", + "execution_count": 40, + "id": "f3a21b52", + "metadata": { + "height": 30 + }, + "outputs": [], + "source": [ + "result = qa_chain({\"query\": question})" + ] + }, + { + "cell_type": "code", + "execution_count": 41, + "id": "74e2f6cc", + "metadata": { + "height": 30 + }, + "outputs": [ + { + "data": { + "text/plain": [ + "'The provided context does not mention learning about Large Language Models (LLMs) in this machine learning course. The focus appears to be on topics like locally weighted regression, logistic regression, and the perceptron algorithm. Thanks for asking!'" + ] + }, + "execution_count": 41, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "result[\"result\"]" + ] + }, + { + "cell_type": "code", + "execution_count": 43, + "id": "4a2531ba", + "metadata": { + "height": 30 + }, + "outputs": [ + { + "data": { + "text/plain": [ + "[Document(metadata={'author': '', 'creationdate': '2008-07-11T11:25:03-07:00', 'creator': 'PScript5.dll Version 5.2.2', 'moddate': '2008-07-11T11:25:03-07:00', 'page': 0, 'page_label': '1', 'producer': 'Acrobat Distiller 8.1.0 (Windows)', 'source': 'docs/MachineLearning-Lecture03.pdf', 'title': '', 'total_pages': 16}, page_content='MachineLearning-Lecture03 \\nInstructor (Andrew Ng):Okay. Good morning and welcome back to the third lecture of \\nthis class. So here’s what I want to do today, and some of the topics I do today may seem \\na little bit like I’m jumping, sort of, from topic to topic, but here’s, sort of, the outline for \\ntoday and the illogical flow of ideas. In the last lecture, we talked about linear regression \\nand today I want to talk about sort of an adaptation of that called locally weighted \\nregression. It’s very a popular algorithm that’s actually one of my former mentors \\nprobably favorite machine learning algorithm. \\nWe’ll then talk about a probable second interpretation of linear regression and use that to \\nmove onto our first classification algorithm, which is logistic regression; take a brief \\ndigression to tell you about something called the perceptron algorithm, which is \\nsomething we’ll come back to, again, later this quarter; and time allowing I hope to get to \\nNewton’s method, which is an algorithm for fitting logistic regression models. \\nSo this is recap where we’re talking about in the previous lecture, remember the notation \\nI defined was that I used this X superscript I, Y superscript I to denote the I training \\nexample. And when we’re talking about linear regression or linear least squares, we use \\nthis to denote the predicted value of “by my hypothesis H” on the input XI. And my \\nhypothesis was franchised by the vector of grams as theta and so we said that this was'),\n", + " Document(metadata={'author': '', 'creationdate': '2008-07-11T11:25:03-07:00', 'creator': 'PScript5.dll Version 5.2.2', 'moddate': '2008-07-11T11:25:03-07:00', 'page': 0, 'page_label': '1', 'producer': 'Acrobat Distiller 8.1.0 (Windows)', 'source': 'docs/MachineLearning-Lecture03.pdf', 'title': '', 'total_pages': 16}, page_content='MachineLearning-Lecture03 \\nInstructor (Andrew Ng):Okay. Good morning and welcome back to the third lecture of \\nthis class. So here’s what I want to do today, and some of the topics I do today may seem \\na little bit like I’m jumping, sort of, from topic to topic, but here’s, sort of, the outline for \\ntoday and the illogical flow of ideas. In the last lecture, we talked about linear regression \\nand today I want to talk about sort of an adaptation of that called locally weighted \\nregression. It’s very a popular algorithm that’s actually one of my former mentors \\nprobably favorite machine learning algorithm. \\nWe’ll then talk about a probable second interpretation of linear regression and use that to \\nmove onto our first classification algorithm, which is logistic regression; take a brief \\ndigression to tell you about something called the perceptron algorithm, which is \\nsomething we’ll come back to, again, later this quarter; and time allowing I hope to get to \\nNewton’s method, which is an algorithm for fitting logistic regression models. \\nSo this is recap where we’re talking about in the previous lecture, remember the notation \\nI defined was that I used this X superscript I, Y superscript I to denote the I training \\nexample. And when we’re talking about linear regression or linear least squares, we use \\nthis to denote the predicted value of “by my hypothesis H” on the input XI. And my \\nhypothesis was franchised by the vector of grams as theta and so we said that this was'),\n", + " Document(metadata={'author': '', 'creationdate': '2008-07-11T11:25:23-07:00', 'creator': 'PScript5.dll Version 5.2.2', 'moddate': '2008-07-11T11:25:23-07:00', 'page': 8, 'page_label': '9', 'producer': 'Acrobat Distiller 8.1.0 (Windows)', 'source': 'docs/MachineLearning-Lecture01.pdf', 'title': '', 'total_pages': 22}, page_content=\"statistics for a while or maybe algebra, we'll go over those in the discussion sections as a \\nrefresher for those of you that want one. \\nLater in this quarter, we'll also use the discussion sections to go over extensions for the \\nmaterial that I'm teaching in the main lectures. So machine learning is a huge field, and \\nthere are a few extensions that we really want to teach but didn't have time in the main \\nlectures for.\"),\n", + " Document(metadata={'author': '', 'creationdate': '2008-07-11T11:25:23-07:00', 'creator': 'PScript5.dll Version 5.2.2', 'moddate': '2008-07-11T11:25:23-07:00', 'page': 8, 'page_label': '9', 'producer': 'Acrobat Distiller 8.1.0 (Windows)', 'source': 'docs/MachineLearning-Lecture01.pdf', 'title': '', 'total_pages': 22}, page_content=\"statistics for a while or maybe algebra, we'll go over those in the discussion sections as a \\nrefresher for those of you that want one. \\nLater in this quarter, we'll also use the discussion sections to go over extensions for the \\nmaterial that I'm teaching in the main lectures. So machine learning is a huge field, and \\nthere are a few extensions that we really want to teach but didn't have time in the main \\nlectures for.\")]" + ] + }, + "execution_count": 43, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "result[\"source_documents\"]" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": ".venv", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.9.21" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/Anul 3/Semestrul 2/LLM/explain_dataset.csv b/Anul 3/Semestrul 2/LLM/explain_dataset.csv new file mode 100644 index 0000000..e8397a2 --- /dev/null +++ b/Anul 3/Semestrul 2/LLM/explain_dataset.csv @@ -0,0 +1,1001 @@ +Input,Response +explain: How does quantum computing work?,Quantum computing uses quantum bits (qubits) to perform calculations exponentially faster than classical computers. +explain: Give me an overview of robotics.,"Robotics is the field of designing, building, and operating robots for various applications." +explain: What are the key features of general relativity?,"Einstein's general relativity theory describes how massive objects warp space-time, affecting gravity." +explain: What is the purpose of evolution?,Evolution is the process by which species change over time through natural selection and genetic variation. +explain: Can you explain machine learning?,Machine learning is a subset of AI that enables systems to learn from data and improve without explicit programming. +explain: Define the stock market.,"The stock market is a platform for buying and selling financial securities, influencing global economies." +explain: Give me an overview of climate change.,"Climate change refers to long-term alterations in temperature, precipitation, and weather patterns due to human activity." +explain: Why is climate change important?,"Climate change refers to long-term alterations in temperature, precipitation, and weather patterns due to human activity." +explain: What are the key features of machine learning?,Machine learning is a subset of AI that enables systems to learn from data and improve without explicit programming. +explain: Why is nanotechnology important?,Nanotechnology involves manipulating matter at the atomic and molecular scale for innovative applications. +explain: How does quantum computing work?,Quantum computing uses quantum bits (qubits) to perform calculations exponentially faster than classical computers. +explain: What is biotechnology?,Biotechnology applies biological processes and organisms to develop new medical and industrial technologies. +explain: Why is data science important?,Data science involves analyzing and interpreting complex data to extract valuable insights. +explain: How does artificial intelligence work?,AI refers to computer systems capable of performing tasks that typically require human intelligence. +explain: Why is quantum computing important?,Quantum computing uses quantum bits (qubits) to perform calculations exponentially faster than classical computers. +explain: What is the purpose of the stock market?,"The stock market is a platform for buying and selling financial securities, influencing global economies." +explain: Give a brief explanation of quantum computing.,Quantum computing uses quantum bits (qubits) to perform calculations exponentially faster than classical computers. +explain: Give a brief explanation of machine learning.,Machine learning is a subset of AI that enables systems to learn from data and improve without explicit programming. +explain: What are the key features of black holes?,"A black hole is a region in space where gravity is so strong that nothing, not even light, can escape." +explain: Why is climate change important?,"Climate change refers to long-term alterations in temperature, precipitation, and weather patterns due to human activity." +explain: Define biotechnology.,Biotechnology applies biological processes and organisms to develop new medical and industrial technologies. +explain: Why is climate change important?,"Climate change refers to long-term alterations in temperature, precipitation, and weather patterns due to human activity." +explain: Can you explain the internet?,The internet is a global network of interconnected computers that enables communication and information sharing. +explain: What is the purpose of black holes?,"A black hole is a region in space where gravity is so strong that nothing, not even light, can escape." +explain: What are the key features of general relativity?,"Einstein's general relativity theory describes how massive objects warp space-time, affecting gravity." +explain: What is dark matter?,Dark matter is an invisible substance that makes up most of the universe’s mass but does not emit light. +explain: Give me an overview of robotics.,"Robotics is the field of designing, building, and operating robots for various applications." +explain: What is the purpose of neural networks?,"Neural networks are computing systems inspired by the human brain, used in deep learning for pattern recognition." +explain: Why is black holes important?,"A black hole is a region in space where gravity is so strong that nothing, not even light, can escape." +explain: Give me an overview of cryptography.,Cryptography is the science of securing information through encoding and encryption techniques. +explain: Why is cryptography important?,Cryptography is the science of securing information through encoding and encryption techniques. +explain: What are the key features of the stock market?,"The stock market is a platform for buying and selling financial securities, influencing global economies." +explain: What are the key features of climate change?,"Climate change refers to long-term alterations in temperature, precipitation, and weather patterns due to human activity." +explain: Give me an overview of dark matter.,Dark matter is an invisible substance that makes up most of the universe’s mass but does not emit light. +explain: What is the purpose of genetic engineering?,Genetic engineering involves modifying an organism's DNA to achieve desirable traits. +explain: Can you explain the human brain?,"The human brain is the central organ of the nervous system, responsible for thought, memory, and emotions." +explain: Can you explain blockchain?,Blockchain is a decentralized digital ledger that records transactions across multiple computers securely. +explain: Why is neural networks important?,"Neural networks are computing systems inspired by the human brain, used in deep learning for pattern recognition." +explain: Give me an overview of data science.,Data science involves analyzing and interpreting complex data to extract valuable insights. +explain: What are the key features of the stock market?,"The stock market is a platform for buying and selling financial securities, influencing global economies." +explain: Why is machine learning important?,Machine learning is a subset of AI that enables systems to learn from data and improve without explicit programming. +explain: Why is cryptography important?,Cryptography is the science of securing information through encoding and encryption techniques. +explain: Give me an overview of evolution.,Evolution is the process by which species change over time through natural selection and genetic variation. +explain: Why is nanotechnology important?,Nanotechnology involves manipulating matter at the atomic and molecular scale for innovative applications. +explain: Give a brief explanation of robotics.,"Robotics is the field of designing, building, and operating robots for various applications." +explain: Give me an overview of dark matter.,Dark matter is an invisible substance that makes up most of the universe’s mass but does not emit light. +explain: Can you explain cryptography?,Cryptography is the science of securing information through encoding and encryption techniques. +explain: What are the key features of machine learning?,Machine learning is a subset of AI that enables systems to learn from data and improve without explicit programming. +explain: Give a brief explanation of artificial intelligence.,AI refers to computer systems capable of performing tasks that typically require human intelligence. +explain: What are the key features of data science?,Data science involves analyzing and interpreting complex data to extract valuable insights. +explain: Why is genetic engineering important?,Genetic engineering involves modifying an organism's DNA to achieve desirable traits. +explain: Give me an overview of evolution.,Evolution is the process by which species change over time through natural selection and genetic variation. +explain: How does evolution work?,Evolution is the process by which species change over time through natural selection and genetic variation. +explain: What is the purpose of robotics?,"Robotics is the field of designing, building, and operating robots for various applications." +explain: What are the key features of blockchain?,Blockchain is a decentralized digital ledger that records transactions across multiple computers securely. +explain: Give me an overview of robotics.,"Robotics is the field of designing, building, and operating robots for various applications." +explain: What are the key features of artificial intelligence?,AI refers to computer systems capable of performing tasks that typically require human intelligence. +explain: Give me an overview of climate change.,"Climate change refers to long-term alterations in temperature, precipitation, and weather patterns due to human activity." +explain: Give a brief explanation of neural networks.,"Neural networks are computing systems inspired by the human brain, used in deep learning for pattern recognition." +explain: Why is climate change important?,"Climate change refers to long-term alterations in temperature, precipitation, and weather patterns due to human activity." +explain: Give a brief explanation of the internet.,The internet is a global network of interconnected computers that enables communication and information sharing. +explain: Give me an overview of cryptography.,Cryptography is the science of securing information through encoding and encryption techniques. +explain: Give me an overview of neural networks.,"Neural networks are computing systems inspired by the human brain, used in deep learning for pattern recognition." +explain: Why is neural networks important?,"Neural networks are computing systems inspired by the human brain, used in deep learning for pattern recognition." +explain: How does evolution work?,Evolution is the process by which species change over time through natural selection and genetic variation. +explain: How does photosynthesis work?,Photosynthesis is the process by which plants convert sunlight into chemical energy. +explain: Give a brief explanation of evolution.,Evolution is the process by which species change over time through natural selection and genetic variation. +explain: Give me an overview of cryptography.,Cryptography is the science of securing information through encoding and encryption techniques. +explain: What is the purpose of black holes?,"A black hole is a region in space where gravity is so strong that nothing, not even light, can escape." +explain: Define climate change.,"Climate change refers to long-term alterations in temperature, precipitation, and weather patterns due to human activity." +explain: What are the key features of the internet?,The internet is a global network of interconnected computers that enables communication and information sharing. +explain: Define the stock market.,"The stock market is a platform for buying and selling financial securities, influencing global economies." +explain: Can you explain blockchain?,Blockchain is a decentralized digital ledger that records transactions across multiple computers securely. +explain: What are the key features of machine learning?,Machine learning is a subset of AI that enables systems to learn from data and improve without explicit programming. +explain: Give me an overview of cryptography.,Cryptography is the science of securing information through encoding and encryption techniques. +explain: Why is the human brain important?,"The human brain is the central organ of the nervous system, responsible for thought, memory, and emotions." +explain: Can you explain quantum computing?,Quantum computing uses quantum bits (qubits) to perform calculations exponentially faster than classical computers. +explain: Why is dark matter important?,Dark matter is an invisible substance that makes up most of the universe’s mass but does not emit light. +explain: Give me an overview of machine learning.,Machine learning is a subset of AI that enables systems to learn from data and improve without explicit programming. +explain: Why is neural networks important?,"Neural networks are computing systems inspired by the human brain, used in deep learning for pattern recognition." +explain: Why is artificial intelligence important?,AI refers to computer systems capable of performing tasks that typically require human intelligence. +explain: How does the internet work?,The internet is a global network of interconnected computers that enables communication and information sharing. +explain: Can you explain quantum computing?,Quantum computing uses quantum bits (qubits) to perform calculations exponentially faster than classical computers. +explain: How does dark matter work?,Dark matter is an invisible substance that makes up most of the universe’s mass but does not emit light. +explain: What is the purpose of blockchain?,Blockchain is a decentralized digital ledger that records transactions across multiple computers securely. +explain: How does artificial intelligence work?,AI refers to computer systems capable of performing tasks that typically require human intelligence. +explain: Can you explain machine learning?,Machine learning is a subset of AI that enables systems to learn from data and improve without explicit programming. +explain: Can you explain quantum computing?,Quantum computing uses quantum bits (qubits) to perform calculations exponentially faster than classical computers. +explain: What is the purpose of photosynthesis?,Photosynthesis is the process by which plants convert sunlight into chemical energy. +explain: Can you explain robotics?,"Robotics is the field of designing, building, and operating robots for various applications." +explain: What is the purpose of nanotechnology?,Nanotechnology involves manipulating matter at the atomic and molecular scale for innovative applications. +explain: Give a brief explanation of dark matter.,Dark matter is an invisible substance that makes up most of the universe’s mass but does not emit light. +explain: What is the purpose of the internet?,The internet is a global network of interconnected computers that enables communication and information sharing. +explain: Why is climate change important?,"Climate change refers to long-term alterations in temperature, precipitation, and weather patterns due to human activity." +explain: What is the internet?,The internet is a global network of interconnected computers that enables communication and information sharing. +explain: What are the key features of cryptography?,Cryptography is the science of securing information through encoding and encryption techniques. +explain: Why is nanotechnology important?,Nanotechnology involves manipulating matter at the atomic and molecular scale for innovative applications. +explain: Can you explain evolution?,Evolution is the process by which species change over time through natural selection and genetic variation. +explain: Give me an overview of quantum computing.,Quantum computing uses quantum bits (qubits) to perform calculations exponentially faster than classical computers. +explain: Give a brief explanation of photosynthesis.,Photosynthesis is the process by which plants convert sunlight into chemical energy. +explain: What are the key features of blockchain?,Blockchain is a decentralized digital ledger that records transactions across multiple computers securely. +explain: Why is cryptography important?,Cryptography is the science of securing information through encoding and encryption techniques. +explain: What are the key features of genetic engineering?,Genetic engineering involves modifying an organism's DNA to achieve desirable traits. +explain: Why is dark matter important?,Dark matter is an invisible substance that makes up most of the universe’s mass but does not emit light. +explain: Give a brief explanation of black holes.,"A black hole is a region in space where gravity is so strong that nothing, not even light, can escape." +explain: Give me an overview of climate change.,"Climate change refers to long-term alterations in temperature, precipitation, and weather patterns due to human activity." +explain: Define neural networks.,"Neural networks are computing systems inspired by the human brain, used in deep learning for pattern recognition." +explain: Give a brief explanation of photosynthesis.,Photosynthesis is the process by which plants convert sunlight into chemical energy. +explain: How does genetic engineering work?,Genetic engineering involves modifying an organism's DNA to achieve desirable traits. +explain: Give a brief explanation of evolution.,Evolution is the process by which species change over time through natural selection and genetic variation. +explain: Why is cryptography important?,Cryptography is the science of securing information through encoding and encryption techniques. +explain: How does the human brain work?,"The human brain is the central organ of the nervous system, responsible for thought, memory, and emotions." +explain: What are the key features of genetic engineering?,Genetic engineering involves modifying an organism's DNA to achieve desirable traits. +explain: Give a brief explanation of dark matter.,Dark matter is an invisible substance that makes up most of the universe’s mass but does not emit light. +explain: Give a brief explanation of quantum computing.,Quantum computing uses quantum bits (qubits) to perform calculations exponentially faster than classical computers. +explain: What are the key features of neural networks?,"Neural networks are computing systems inspired by the human brain, used in deep learning for pattern recognition." +explain: Give a brief explanation of neural networks.,"Neural networks are computing systems inspired by the human brain, used in deep learning for pattern recognition." +explain: Why is neural networks important?,"Neural networks are computing systems inspired by the human brain, used in deep learning for pattern recognition." +explain: Give me an overview of neural networks.,"Neural networks are computing systems inspired by the human brain, used in deep learning for pattern recognition." +explain: What are the key features of quantum computing?,Quantum computing uses quantum bits (qubits) to perform calculations exponentially faster than classical computers. +explain: What is robotics?,"Robotics is the field of designing, building, and operating robots for various applications." +explain: How does machine learning work?,Machine learning is a subset of AI that enables systems to learn from data and improve without explicit programming. +explain: Can you explain photosynthesis?,Photosynthesis is the process by which plants convert sunlight into chemical energy. +explain: Can you explain machine learning?,Machine learning is a subset of AI that enables systems to learn from data and improve without explicit programming. +explain: Can you explain neural networks?,"Neural networks are computing systems inspired by the human brain, used in deep learning for pattern recognition." +explain: What are the key features of dark matter?,Dark matter is an invisible substance that makes up most of the universe’s mass but does not emit light. +explain: Can you explain the internet?,The internet is a global network of interconnected computers that enables communication and information sharing. +explain: Give a brief explanation of the human brain.,"The human brain is the central organ of the nervous system, responsible for thought, memory, and emotions." +explain: Can you explain artificial intelligence?,AI refers to computer systems capable of performing tasks that typically require human intelligence. +explain: What is the internet?,The internet is a global network of interconnected computers that enables communication and information sharing. +explain: Give a brief explanation of robotics.,"Robotics is the field of designing, building, and operating robots for various applications." +explain: What is photosynthesis?,Photosynthesis is the process by which plants convert sunlight into chemical energy. +explain: What is artificial intelligence?,AI refers to computer systems capable of performing tasks that typically require human intelligence. +explain: Give a brief explanation of black holes.,"A black hole is a region in space where gravity is so strong that nothing, not even light, can escape." +explain: Give a brief explanation of machine learning.,Machine learning is a subset of AI that enables systems to learn from data and improve without explicit programming. +explain: Give a brief explanation of climate change.,"Climate change refers to long-term alterations in temperature, precipitation, and weather patterns due to human activity." +explain: What are the key features of genetic engineering?,Genetic engineering involves modifying an organism's DNA to achieve desirable traits. +explain: What are the key features of cryptography?,Cryptography is the science of securing information through encoding and encryption techniques. +explain: Can you explain the human brain?,"The human brain is the central organ of the nervous system, responsible for thought, memory, and emotions." +explain: Give me an overview of climate change.,"Climate change refers to long-term alterations in temperature, precipitation, and weather patterns due to human activity." +explain: What is the internet?,The internet is a global network of interconnected computers that enables communication and information sharing. +explain: Define robotics.,"Robotics is the field of designing, building, and operating robots for various applications." +explain: Give a brief explanation of the stock market.,"The stock market is a platform for buying and selling financial securities, influencing global economies." +explain: Why is machine learning important?,Machine learning is a subset of AI that enables systems to learn from data and improve without explicit programming. +explain: Why is quantum computing important?,Quantum computing uses quantum bits (qubits) to perform calculations exponentially faster than classical computers. +explain: What are the key features of biotechnology?,Biotechnology applies biological processes and organisms to develop new medical and industrial technologies. +explain: How does black holes work?,"A black hole is a region in space where gravity is so strong that nothing, not even light, can escape." +explain: What is the purpose of climate change?,"Climate change refers to long-term alterations in temperature, precipitation, and weather patterns due to human activity." +explain: Give me an overview of general relativity.,"Einstein's general relativity theory describes how massive objects warp space-time, affecting gravity." +explain: What are the key features of the internet?,The internet is a global network of interconnected computers that enables communication and information sharing. +explain: What is the stock market?,"The stock market is a platform for buying and selling financial securities, influencing global economies." +explain: Give me an overview of blockchain.,Blockchain is a decentralized digital ledger that records transactions across multiple computers securely. +explain: What are the key features of black holes?,"A black hole is a region in space where gravity is so strong that nothing, not even light, can escape." +explain: Define quantum computing.,Quantum computing uses quantum bits (qubits) to perform calculations exponentially faster than classical computers. +explain: What are the key features of machine learning?,Machine learning is a subset of AI that enables systems to learn from data and improve without explicit programming. +explain: Give a brief explanation of cryptography.,Cryptography is the science of securing information through encoding and encryption techniques. +explain: Can you explain evolution?,Evolution is the process by which species change over time through natural selection and genetic variation. +explain: Define machine learning.,Machine learning is a subset of AI that enables systems to learn from data and improve without explicit programming. +explain: What are the key features of nanotechnology?,Nanotechnology involves manipulating matter at the atomic and molecular scale for innovative applications. +explain: Give a brief explanation of the stock market.,"The stock market is a platform for buying and selling financial securities, influencing global economies." +explain: What are the key features of data science?,Data science involves analyzing and interpreting complex data to extract valuable insights. +explain: Can you explain neural networks?,"Neural networks are computing systems inspired by the human brain, used in deep learning for pattern recognition." +explain: Can you explain photosynthesis?,Photosynthesis is the process by which plants convert sunlight into chemical energy. +explain: Can you explain blockchain?,Blockchain is a decentralized digital ledger that records transactions across multiple computers securely. +explain: What is the internet?,The internet is a global network of interconnected computers that enables communication and information sharing. +explain: Give me an overview of cryptography.,Cryptography is the science of securing information through encoding and encryption techniques. +explain: What are the key features of artificial intelligence?,AI refers to computer systems capable of performing tasks that typically require human intelligence. +explain: Give a brief explanation of genetic engineering.,Genetic engineering involves modifying an organism's DNA to achieve desirable traits. +explain: What are the key features of artificial intelligence?,AI refers to computer systems capable of performing tasks that typically require human intelligence. +explain: What are the key features of genetic engineering?,Genetic engineering involves modifying an organism's DNA to achieve desirable traits. +explain: How does the human brain work?,"The human brain is the central organ of the nervous system, responsible for thought, memory, and emotions." +explain: What is the purpose of the stock market?,"The stock market is a platform for buying and selling financial securities, influencing global economies." +explain: Define neural networks.,"Neural networks are computing systems inspired by the human brain, used in deep learning for pattern recognition." +explain: Can you explain climate change?,"Climate change refers to long-term alterations in temperature, precipitation, and weather patterns due to human activity." +explain: Can you explain climate change?,"Climate change refers to long-term alterations in temperature, precipitation, and weather patterns due to human activity." +explain: What is black holes?,"A black hole is a region in space where gravity is so strong that nothing, not even light, can escape." +explain: Give me an overview of artificial intelligence.,AI refers to computer systems capable of performing tasks that typically require human intelligence. +explain: Can you explain blockchain?,Blockchain is a decentralized digital ledger that records transactions across multiple computers securely. +explain: Give me an overview of genetic engineering.,Genetic engineering involves modifying an organism's DNA to achieve desirable traits. +explain: What is the internet?,The internet is a global network of interconnected computers that enables communication and information sharing. +explain: Give me an overview of evolution.,Evolution is the process by which species change over time through natural selection and genetic variation. +explain: Why is photosynthesis important?,Photosynthesis is the process by which plants convert sunlight into chemical energy. +explain: What is the purpose of dark matter?,Dark matter is an invisible substance that makes up most of the universe’s mass but does not emit light. +explain: Give me an overview of biotechnology.,Biotechnology applies biological processes and organisms to develop new medical and industrial technologies. +explain: What are the key features of the human brain?,"The human brain is the central organ of the nervous system, responsible for thought, memory, and emotions." +explain: Define quantum computing.,Quantum computing uses quantum bits (qubits) to perform calculations exponentially faster than classical computers. +explain: Give me an overview of biotechnology.,Biotechnology applies biological processes and organisms to develop new medical and industrial technologies. +explain: Why is the stock market important?,"The stock market is a platform for buying and selling financial securities, influencing global economies." +explain: Give me an overview of nanotechnology.,Nanotechnology involves manipulating matter at the atomic and molecular scale for innovative applications. +explain: Can you explain black holes?,"A black hole is a region in space where gravity is so strong that nothing, not even light, can escape." +explain: How does the stock market work?,"The stock market is a platform for buying and selling financial securities, influencing global economies." +explain: How does robotics work?,"Robotics is the field of designing, building, and operating robots for various applications." +explain: Define black holes.,"A black hole is a region in space where gravity is so strong that nothing, not even light, can escape." +explain: Why is general relativity important?,"Einstein's general relativity theory describes how massive objects warp space-time, affecting gravity." +explain: What is the purpose of robotics?,"Robotics is the field of designing, building, and operating robots for various applications." +explain: Give me an overview of robotics.,"Robotics is the field of designing, building, and operating robots for various applications." +explain: How does the human brain work?,"The human brain is the central organ of the nervous system, responsible for thought, memory, and emotions." +explain: What is climate change?,"Climate change refers to long-term alterations in temperature, precipitation, and weather patterns due to human activity." +explain: What is the purpose of black holes?,"A black hole is a region in space where gravity is so strong that nothing, not even light, can escape." +explain: What are the key features of genetic engineering?,Genetic engineering involves modifying an organism's DNA to achieve desirable traits. +explain: What are the key features of general relativity?,"Einstein's general relativity theory describes how massive objects warp space-time, affecting gravity." +explain: What are the key features of nanotechnology?,Nanotechnology involves manipulating matter at the atomic and molecular scale for innovative applications. +explain: What is cryptography?,Cryptography is the science of securing information through encoding and encryption techniques. +explain: What is dark matter?,Dark matter is an invisible substance that makes up most of the universe’s mass but does not emit light. +explain: Why is biotechnology important?,Biotechnology applies biological processes and organisms to develop new medical and industrial technologies. +explain: Give a brief explanation of data science.,Data science involves analyzing and interpreting complex data to extract valuable insights. +explain: Give a brief explanation of robotics.,"Robotics is the field of designing, building, and operating robots for various applications." +explain: Define cryptography.,Cryptography is the science of securing information through encoding and encryption techniques. +explain: What are the key features of climate change?,"Climate change refers to long-term alterations in temperature, precipitation, and weather patterns due to human activity." +explain: How does genetic engineering work?,Genetic engineering involves modifying an organism's DNA to achieve desirable traits. +explain: What is the purpose of dark matter?,Dark matter is an invisible substance that makes up most of the universe’s mass but does not emit light. +explain: What is the purpose of cryptography?,Cryptography is the science of securing information through encoding and encryption techniques. +explain: Define general relativity.,"Einstein's general relativity theory describes how massive objects warp space-time, affecting gravity." +explain: What is blockchain?,Blockchain is a decentralized digital ledger that records transactions across multiple computers securely. +explain: Give a brief explanation of data science.,Data science involves analyzing and interpreting complex data to extract valuable insights. +explain: Why is cryptography important?,Cryptography is the science of securing information through encoding and encryption techniques. +explain: How does the internet work?,The internet is a global network of interconnected computers that enables communication and information sharing. +explain: Why is dark matter important?,Dark matter is an invisible substance that makes up most of the universe’s mass but does not emit light. +explain: What is the human brain?,"The human brain is the central organ of the nervous system, responsible for thought, memory, and emotions." +explain: Why is photosynthesis important?,Photosynthesis is the process by which plants convert sunlight into chemical energy. +explain: What is the purpose of biotechnology?,Biotechnology applies biological processes and organisms to develop new medical and industrial technologies. +explain: What are the key features of data science?,Data science involves analyzing and interpreting complex data to extract valuable insights. +explain: What is the purpose of evolution?,Evolution is the process by which species change over time through natural selection and genetic variation. +explain: What is general relativity?,"Einstein's general relativity theory describes how massive objects warp space-time, affecting gravity." +explain: What are the key features of evolution?,Evolution is the process by which species change over time through natural selection and genetic variation. +explain: What is evolution?,Evolution is the process by which species change over time through natural selection and genetic variation. +explain: Why is black holes important?,"A black hole is a region in space where gravity is so strong that nothing, not even light, can escape." +explain: What is biotechnology?,Biotechnology applies biological processes and organisms to develop new medical and industrial technologies. +explain: What is climate change?,"Climate change refers to long-term alterations in temperature, precipitation, and weather patterns due to human activity." +explain: Give a brief explanation of genetic engineering.,Genetic engineering involves modifying an organism's DNA to achieve desirable traits. +explain: Give me an overview of the internet.,The internet is a global network of interconnected computers that enables communication and information sharing. +explain: Can you explain genetic engineering?,Genetic engineering involves modifying an organism's DNA to achieve desirable traits. +explain: How does dark matter work?,Dark matter is an invisible substance that makes up most of the universe’s mass but does not emit light. +explain: Define general relativity.,"Einstein's general relativity theory describes how massive objects warp space-time, affecting gravity." +explain: Define machine learning.,Machine learning is a subset of AI that enables systems to learn from data and improve without explicit programming. +explain: Can you explain neural networks?,"Neural networks are computing systems inspired by the human brain, used in deep learning for pattern recognition." +explain: What is the purpose of general relativity?,"Einstein's general relativity theory describes how massive objects warp space-time, affecting gravity." +explain: Give a brief explanation of the stock market.,"The stock market is a platform for buying and selling financial securities, influencing global economies." +explain: What is dark matter?,Dark matter is an invisible substance that makes up most of the universe’s mass but does not emit light. +explain: Define climate change.,"Climate change refers to long-term alterations in temperature, precipitation, and weather patterns due to human activity." +explain: Give me an overview of the stock market.,"The stock market is a platform for buying and selling financial securities, influencing global economies." +explain: What is climate change?,"Climate change refers to long-term alterations in temperature, precipitation, and weather patterns due to human activity." +explain: Give a brief explanation of blockchain.,Blockchain is a decentralized digital ledger that records transactions across multiple computers securely. +explain: Give a brief explanation of biotechnology.,Biotechnology applies biological processes and organisms to develop new medical and industrial technologies. +explain: Define cryptography.,Cryptography is the science of securing information through encoding and encryption techniques. +explain: Define robotics.,"Robotics is the field of designing, building, and operating robots for various applications." +explain: Can you explain climate change?,"Climate change refers to long-term alterations in temperature, precipitation, and weather patterns due to human activity." +explain: What is the purpose of neural networks?,"Neural networks are computing systems inspired by the human brain, used in deep learning for pattern recognition." +explain: Can you explain robotics?,"Robotics is the field of designing, building, and operating robots for various applications." +explain: What is data science?,Data science involves analyzing and interpreting complex data to extract valuable insights. +explain: How does biotechnology work?,Biotechnology applies biological processes and organisms to develop new medical and industrial technologies. +explain: Give me an overview of the human brain.,"The human brain is the central organ of the nervous system, responsible for thought, memory, and emotions." +explain: Give me an overview of dark matter.,Dark matter is an invisible substance that makes up most of the universe’s mass but does not emit light. +explain: Define general relativity.,"Einstein's general relativity theory describes how massive objects warp space-time, affecting gravity." +explain: What are the key features of blockchain?,Blockchain is a decentralized digital ledger that records transactions across multiple computers securely. +explain: Define general relativity.,"Einstein's general relativity theory describes how massive objects warp space-time, affecting gravity." +explain: What are the key features of the internet?,The internet is a global network of interconnected computers that enables communication and information sharing. +explain: Define cryptography.,Cryptography is the science of securing information through encoding and encryption techniques. +explain: Define dark matter.,Dark matter is an invisible substance that makes up most of the universe’s mass but does not emit light. +explain: Why is cryptography important?,Cryptography is the science of securing information through encoding and encryption techniques. +explain: What are the key features of nanotechnology?,Nanotechnology involves manipulating matter at the atomic and molecular scale for innovative applications. +explain: Why is the human brain important?,"The human brain is the central organ of the nervous system, responsible for thought, memory, and emotions." +explain: Why is cryptography important?,Cryptography is the science of securing information through encoding and encryption techniques. +explain: Give a brief explanation of general relativity.,"Einstein's general relativity theory describes how massive objects warp space-time, affecting gravity." +explain: Define blockchain.,Blockchain is a decentralized digital ledger that records transactions across multiple computers securely. +explain: What are the key features of general relativity?,"Einstein's general relativity theory describes how massive objects warp space-time, affecting gravity." +explain: Give a brief explanation of the internet.,The internet is a global network of interconnected computers that enables communication and information sharing. +explain: What is the purpose of nanotechnology?,Nanotechnology involves manipulating matter at the atomic and molecular scale for innovative applications. +explain: What is neural networks?,"Neural networks are computing systems inspired by the human brain, used in deep learning for pattern recognition." +explain: Define data science.,Data science involves analyzing and interpreting complex data to extract valuable insights. +explain: What is general relativity?,"Einstein's general relativity theory describes how massive objects warp space-time, affecting gravity." +explain: Why is climate change important?,"Climate change refers to long-term alterations in temperature, precipitation, and weather patterns due to human activity." +explain: Can you explain quantum computing?,Quantum computing uses quantum bits (qubits) to perform calculations exponentially faster than classical computers. +explain: What is cryptography?,Cryptography is the science of securing information through encoding and encryption techniques. +explain: How does biotechnology work?,Biotechnology applies biological processes and organisms to develop new medical and industrial technologies. +explain: Why is genetic engineering important?,Genetic engineering involves modifying an organism's DNA to achieve desirable traits. +explain: What is data science?,Data science involves analyzing and interpreting complex data to extract valuable insights. +explain: Give me an overview of climate change.,"Climate change refers to long-term alterations in temperature, precipitation, and weather patterns due to human activity." +explain: Give me an overview of genetic engineering.,Genetic engineering involves modifying an organism's DNA to achieve desirable traits. +explain: What is the purpose of biotechnology?,Biotechnology applies biological processes and organisms to develop new medical and industrial technologies. +explain: How does quantum computing work?,Quantum computing uses quantum bits (qubits) to perform calculations exponentially faster than classical computers. +explain: What are the key features of biotechnology?,Biotechnology applies biological processes and organisms to develop new medical and industrial technologies. +explain: Give me an overview of genetic engineering.,Genetic engineering involves modifying an organism's DNA to achieve desirable traits. +explain: Why is blockchain important?,Blockchain is a decentralized digital ledger that records transactions across multiple computers securely. +explain: Why is data science important?,Data science involves analyzing and interpreting complex data to extract valuable insights. +explain: What are the key features of black holes?,"A black hole is a region in space where gravity is so strong that nothing, not even light, can escape." +explain: Why is biotechnology important?,Biotechnology applies biological processes and organisms to develop new medical and industrial technologies. +explain: Why is data science important?,Data science involves analyzing and interpreting complex data to extract valuable insights. +explain: What is the purpose of blockchain?,Blockchain is a decentralized digital ledger that records transactions across multiple computers securely. +explain: What is the purpose of data science?,Data science involves analyzing and interpreting complex data to extract valuable insights. +explain: Give a brief explanation of artificial intelligence.,AI refers to computer systems capable of performing tasks that typically require human intelligence. +explain: Can you explain general relativity?,"Einstein's general relativity theory describes how massive objects warp space-time, affecting gravity." +explain: Give me an overview of artificial intelligence.,AI refers to computer systems capable of performing tasks that typically require human intelligence. +explain: Can you explain the human brain?,"The human brain is the central organ of the nervous system, responsible for thought, memory, and emotions." +explain: Give me an overview of neural networks.,"Neural networks are computing systems inspired by the human brain, used in deep learning for pattern recognition." +explain: Give a brief explanation of blockchain.,Blockchain is a decentralized digital ledger that records transactions across multiple computers securely. +explain: What are the key features of cryptography?,Cryptography is the science of securing information through encoding and encryption techniques. +explain: Can you explain the internet?,The internet is a global network of interconnected computers that enables communication and information sharing. +explain: Give me an overview of artificial intelligence.,AI refers to computer systems capable of performing tasks that typically require human intelligence. +explain: What is the purpose of quantum computing?,Quantum computing uses quantum bits (qubits) to perform calculations exponentially faster than classical computers. +explain: What are the key features of climate change?,"Climate change refers to long-term alterations in temperature, precipitation, and weather patterns due to human activity." +explain: What is the purpose of climate change?,"Climate change refers to long-term alterations in temperature, precipitation, and weather patterns due to human activity." +explain: Can you explain robotics?,"Robotics is the field of designing, building, and operating robots for various applications." +explain: Why is the internet important?,The internet is a global network of interconnected computers that enables communication and information sharing. +explain: What is the purpose of general relativity?,"Einstein's general relativity theory describes how massive objects warp space-time, affecting gravity." +explain: How does climate change work?,"Climate change refers to long-term alterations in temperature, precipitation, and weather patterns due to human activity." +explain: Why is neural networks important?,"Neural networks are computing systems inspired by the human brain, used in deep learning for pattern recognition." +explain: What are the key features of data science?,Data science involves analyzing and interpreting complex data to extract valuable insights. +explain: Give me an overview of blockchain.,Blockchain is a decentralized digital ledger that records transactions across multiple computers securely. +explain: Give a brief explanation of genetic engineering.,Genetic engineering involves modifying an organism's DNA to achieve desirable traits. +explain: How does artificial intelligence work?,AI refers to computer systems capable of performing tasks that typically require human intelligence. +explain: Give a brief explanation of black holes.,"A black hole is a region in space where gravity is so strong that nothing, not even light, can escape." +explain: Give me an overview of photosynthesis.,Photosynthesis is the process by which plants convert sunlight into chemical energy. +explain: How does photosynthesis work?,Photosynthesis is the process by which plants convert sunlight into chemical energy. +explain: Define evolution.,Evolution is the process by which species change over time through natural selection and genetic variation. +explain: Why is data science important?,Data science involves analyzing and interpreting complex data to extract valuable insights. +explain: Give me an overview of climate change.,"Climate change refers to long-term alterations in temperature, precipitation, and weather patterns due to human activity." +explain: Give me an overview of machine learning.,Machine learning is a subset of AI that enables systems to learn from data and improve without explicit programming. +explain: What are the key features of black holes?,"A black hole is a region in space where gravity is so strong that nothing, not even light, can escape." +explain: What is the purpose of biotechnology?,Biotechnology applies biological processes and organisms to develop new medical and industrial technologies. +explain: What are the key features of blockchain?,Blockchain is a decentralized digital ledger that records transactions across multiple computers securely. +explain: Give a brief explanation of artificial intelligence.,AI refers to computer systems capable of performing tasks that typically require human intelligence. +explain: Define general relativity.,"Einstein's general relativity theory describes how massive objects warp space-time, affecting gravity." +explain: Give me an overview of biotechnology.,Biotechnology applies biological processes and organisms to develop new medical and industrial technologies. +explain: What is blockchain?,Blockchain is a decentralized digital ledger that records transactions across multiple computers securely. +explain: Give a brief explanation of genetic engineering.,Genetic engineering involves modifying an organism's DNA to achieve desirable traits. +explain: How does neural networks work?,"Neural networks are computing systems inspired by the human brain, used in deep learning for pattern recognition." +explain: What is black holes?,"A black hole is a region in space where gravity is so strong that nothing, not even light, can escape." +explain: Can you explain genetic engineering?,Genetic engineering involves modifying an organism's DNA to achieve desirable traits. +explain: What is dark matter?,Dark matter is an invisible substance that makes up most of the universe’s mass but does not emit light. +explain: Define black holes.,"A black hole is a region in space where gravity is so strong that nothing, not even light, can escape." +explain: Why is genetic engineering important?,Genetic engineering involves modifying an organism's DNA to achieve desirable traits. +explain: How does machine learning work?,Machine learning is a subset of AI that enables systems to learn from data and improve without explicit programming. +explain: How does photosynthesis work?,Photosynthesis is the process by which plants convert sunlight into chemical energy. +explain: Give me an overview of climate change.,"Climate change refers to long-term alterations in temperature, precipitation, and weather patterns due to human activity." +explain: What is general relativity?,"Einstein's general relativity theory describes how massive objects warp space-time, affecting gravity." +explain: Why is data science important?,Data science involves analyzing and interpreting complex data to extract valuable insights. +explain: How does the stock market work?,"The stock market is a platform for buying and selling financial securities, influencing global economies." +explain: How does blockchain work?,Blockchain is a decentralized digital ledger that records transactions across multiple computers securely. +explain: Can you explain the human brain?,"The human brain is the central organ of the nervous system, responsible for thought, memory, and emotions." +explain: What is the purpose of the internet?,The internet is a global network of interconnected computers that enables communication and information sharing. +explain: What are the key features of artificial intelligence?,AI refers to computer systems capable of performing tasks that typically require human intelligence. +explain: What is quantum computing?,Quantum computing uses quantum bits (qubits) to perform calculations exponentially faster than classical computers. +explain: Define nanotechnology.,Nanotechnology involves manipulating matter at the atomic and molecular scale for innovative applications. +explain: Give me an overview of dark matter.,Dark matter is an invisible substance that makes up most of the universe’s mass but does not emit light. +explain: What is robotics?,"Robotics is the field of designing, building, and operating robots for various applications." +explain: What is the purpose of quantum computing?,Quantum computing uses quantum bits (qubits) to perform calculations exponentially faster than classical computers. +explain: What are the key features of black holes?,"A black hole is a region in space where gravity is so strong that nothing, not even light, can escape." +explain: What is black holes?,"A black hole is a region in space where gravity is so strong that nothing, not even light, can escape." +explain: What is the purpose of black holes?,"A black hole is a region in space where gravity is so strong that nothing, not even light, can escape." +explain: What are the key features of data science?,Data science involves analyzing and interpreting complex data to extract valuable insights. +explain: Why is machine learning important?,Machine learning is a subset of AI that enables systems to learn from data and improve without explicit programming. +explain: Define the internet.,The internet is a global network of interconnected computers that enables communication and information sharing. +explain: Define general relativity.,"Einstein's general relativity theory describes how massive objects warp space-time, affecting gravity." +explain: Why is quantum computing important?,Quantum computing uses quantum bits (qubits) to perform calculations exponentially faster than classical computers. +explain: Define climate change.,"Climate change refers to long-term alterations in temperature, precipitation, and weather patterns due to human activity." +explain: Define evolution.,Evolution is the process by which species change over time through natural selection and genetic variation. +explain: Give a brief explanation of robotics.,"Robotics is the field of designing, building, and operating robots for various applications." +explain: Why is biotechnology important?,Biotechnology applies biological processes and organisms to develop new medical and industrial technologies. +explain: Can you explain genetic engineering?,Genetic engineering involves modifying an organism's DNA to achieve desirable traits. +explain: What are the key features of black holes?,"A black hole is a region in space where gravity is so strong that nothing, not even light, can escape." +explain: Can you explain genetic engineering?,Genetic engineering involves modifying an organism's DNA to achieve desirable traits. +explain: What is machine learning?,Machine learning is a subset of AI that enables systems to learn from data and improve without explicit programming. +explain: Can you explain data science?,Data science involves analyzing and interpreting complex data to extract valuable insights. +explain: Give me an overview of neural networks.,"Neural networks are computing systems inspired by the human brain, used in deep learning for pattern recognition." +explain: Give a brief explanation of artificial intelligence.,AI refers to computer systems capable of performing tasks that typically require human intelligence. +explain: What is photosynthesis?,Photosynthesis is the process by which plants convert sunlight into chemical energy. +explain: Why is biotechnology important?,Biotechnology applies biological processes and organisms to develop new medical and industrial technologies. +explain: What are the key features of machine learning?,Machine learning is a subset of AI that enables systems to learn from data and improve without explicit programming. +explain: Define dark matter.,Dark matter is an invisible substance that makes up most of the universe’s mass but does not emit light. +explain: Give me an overview of evolution.,Evolution is the process by which species change over time through natural selection and genetic variation. +explain: What is dark matter?,Dark matter is an invisible substance that makes up most of the universe’s mass but does not emit light. +explain: Why is biotechnology important?,Biotechnology applies biological processes and organisms to develop new medical and industrial technologies. +explain: Give a brief explanation of neural networks.,"Neural networks are computing systems inspired by the human brain, used in deep learning for pattern recognition." +explain: What is the purpose of general relativity?,"Einstein's general relativity theory describes how massive objects warp space-time, affecting gravity." +explain: Give me an overview of robotics.,"Robotics is the field of designing, building, and operating robots for various applications." +explain: What are the key features of the human brain?,"The human brain is the central organ of the nervous system, responsible for thought, memory, and emotions." +explain: Give me an overview of quantum computing.,Quantum computing uses quantum bits (qubits) to perform calculations exponentially faster than classical computers. +explain: What is robotics?,"Robotics is the field of designing, building, and operating robots for various applications." +explain: Can you explain the internet?,The internet is a global network of interconnected computers that enables communication and information sharing. +explain: What is the purpose of biotechnology?,Biotechnology applies biological processes and organisms to develop new medical and industrial technologies. +explain: Give a brief explanation of neural networks.,"Neural networks are computing systems inspired by the human brain, used in deep learning for pattern recognition." +explain: Can you explain artificial intelligence?,AI refers to computer systems capable of performing tasks that typically require human intelligence. +explain: What is black holes?,"A black hole is a region in space where gravity is so strong that nothing, not even light, can escape." +explain: How does general relativity work?,"Einstein's general relativity theory describes how massive objects warp space-time, affecting gravity." +explain: Give a brief explanation of artificial intelligence.,AI refers to computer systems capable of performing tasks that typically require human intelligence. +explain: Can you explain climate change?,"Climate change refers to long-term alterations in temperature, precipitation, and weather patterns due to human activity." +explain: Define general relativity.,"Einstein's general relativity theory describes how massive objects warp space-time, affecting gravity." +explain: Can you explain the human brain?,"The human brain is the central organ of the nervous system, responsible for thought, memory, and emotions." +explain: How does quantum computing work?,Quantum computing uses quantum bits (qubits) to perform calculations exponentially faster than classical computers. +explain: Give me an overview of black holes.,"A black hole is a region in space where gravity is so strong that nothing, not even light, can escape." +explain: Define robotics.,"Robotics is the field of designing, building, and operating robots for various applications." +explain: How does genetic engineering work?,Genetic engineering involves modifying an organism's DNA to achieve desirable traits. +explain: Can you explain robotics?,"Robotics is the field of designing, building, and operating robots for various applications." +explain: Give a brief explanation of black holes.,"A black hole is a region in space where gravity is so strong that nothing, not even light, can escape." +explain: Give me an overview of general relativity.,"Einstein's general relativity theory describes how massive objects warp space-time, affecting gravity." +explain: What is photosynthesis?,Photosynthesis is the process by which plants convert sunlight into chemical energy. +explain: Define quantum computing.,Quantum computing uses quantum bits (qubits) to perform calculations exponentially faster than classical computers. +explain: Give me an overview of quantum computing.,Quantum computing uses quantum bits (qubits) to perform calculations exponentially faster than classical computers. +explain: What is the purpose of data science?,Data science involves analyzing and interpreting complex data to extract valuable insights. +explain: Give a brief explanation of data science.,Data science involves analyzing and interpreting complex data to extract valuable insights. +explain: What is the purpose of artificial intelligence?,AI refers to computer systems capable of performing tasks that typically require human intelligence. +explain: Give a brief explanation of neural networks.,"Neural networks are computing systems inspired by the human brain, used in deep learning for pattern recognition." +explain: What is neural networks?,"Neural networks are computing systems inspired by the human brain, used in deep learning for pattern recognition." +explain: What is climate change?,"Climate change refers to long-term alterations in temperature, precipitation, and weather patterns due to human activity." +explain: What are the key features of genetic engineering?,Genetic engineering involves modifying an organism's DNA to achieve desirable traits. +explain: What are the key features of biotechnology?,Biotechnology applies biological processes and organisms to develop new medical and industrial technologies. +explain: What is the purpose of biotechnology?,Biotechnology applies biological processes and organisms to develop new medical and industrial technologies. +explain: What is artificial intelligence?,AI refers to computer systems capable of performing tasks that typically require human intelligence. +explain: What is the purpose of cryptography?,Cryptography is the science of securing information through encoding and encryption techniques. +explain: Give a brief explanation of the human brain.,"The human brain is the central organ of the nervous system, responsible for thought, memory, and emotions." +explain: Why is the human brain important?,"The human brain is the central organ of the nervous system, responsible for thought, memory, and emotions." +explain: What is biotechnology?,Biotechnology applies biological processes and organisms to develop new medical and industrial technologies. +explain: Give a brief explanation of black holes.,"A black hole is a region in space where gravity is so strong that nothing, not even light, can escape." +explain: What is the stock market?,"The stock market is a platform for buying and selling financial securities, influencing global economies." +explain: Define general relativity.,"Einstein's general relativity theory describes how massive objects warp space-time, affecting gravity." +explain: What is the purpose of blockchain?,Blockchain is a decentralized digital ledger that records transactions across multiple computers securely. +explain: Can you explain the stock market?,"The stock market is a platform for buying and selling financial securities, influencing global economies." +explain: What is the purpose of data science?,Data science involves analyzing and interpreting complex data to extract valuable insights. +explain: What are the key features of climate change?,"Climate change refers to long-term alterations in temperature, precipitation, and weather patterns due to human activity." +explain: What is machine learning?,Machine learning is a subset of AI that enables systems to learn from data and improve without explicit programming. +explain: Why is general relativity important?,"Einstein's general relativity theory describes how massive objects warp space-time, affecting gravity." +explain: Why is nanotechnology important?,Nanotechnology involves manipulating matter at the atomic and molecular scale for innovative applications. +explain: Give me an overview of the stock market.,"The stock market is a platform for buying and selling financial securities, influencing global economies." +explain: How does nanotechnology work?,Nanotechnology involves manipulating matter at the atomic and molecular scale for innovative applications. +explain: Define genetic engineering.,Genetic engineering involves modifying an organism's DNA to achieve desirable traits. +explain: What are the key features of blockchain?,Blockchain is a decentralized digital ledger that records transactions across multiple computers securely. +explain: What is the purpose of blockchain?,Blockchain is a decentralized digital ledger that records transactions across multiple computers securely. +explain: Define photosynthesis.,Photosynthesis is the process by which plants convert sunlight into chemical energy. +explain: What is the purpose of black holes?,"A black hole is a region in space where gravity is so strong that nothing, not even light, can escape." +explain: Define dark matter.,Dark matter is an invisible substance that makes up most of the universe’s mass but does not emit light. +explain: Define robotics.,"Robotics is the field of designing, building, and operating robots for various applications." +explain: What are the key features of general relativity?,"Einstein's general relativity theory describes how massive objects warp space-time, affecting gravity." +explain: What is the purpose of evolution?,Evolution is the process by which species change over time through natural selection and genetic variation. +explain: Give a brief explanation of artificial intelligence.,AI refers to computer systems capable of performing tasks that typically require human intelligence. +explain: Give a brief explanation of biotechnology.,Biotechnology applies biological processes and organisms to develop new medical and industrial technologies. +explain: What is cryptography?,Cryptography is the science of securing information through encoding and encryption techniques. +explain: What are the key features of genetic engineering?,Genetic engineering involves modifying an organism's DNA to achieve desirable traits. +explain: What are the key features of cryptography?,Cryptography is the science of securing information through encoding and encryption techniques. +explain: What is the purpose of machine learning?,Machine learning is a subset of AI that enables systems to learn from data and improve without explicit programming. +explain: Why is genetic engineering important?,Genetic engineering involves modifying an organism's DNA to achieve desirable traits. +explain: What is neural networks?,"Neural networks are computing systems inspired by the human brain, used in deep learning for pattern recognition." +explain: How does artificial intelligence work?,AI refers to computer systems capable of performing tasks that typically require human intelligence. +explain: Give me an overview of blockchain.,Blockchain is a decentralized digital ledger that records transactions across multiple computers securely. +explain: Can you explain genetic engineering?,Genetic engineering involves modifying an organism's DNA to achieve desirable traits. +explain: How does genetic engineering work?,Genetic engineering involves modifying an organism's DNA to achieve desirable traits. +explain: Give a brief explanation of photosynthesis.,Photosynthesis is the process by which plants convert sunlight into chemical energy. +explain: Why is the internet important?,The internet is a global network of interconnected computers that enables communication and information sharing. +explain: Give me an overview of artificial intelligence.,AI refers to computer systems capable of performing tasks that typically require human intelligence. +explain: Give a brief explanation of blockchain.,Blockchain is a decentralized digital ledger that records transactions across multiple computers securely. +explain: What is the purpose of the human brain?,"The human brain is the central organ of the nervous system, responsible for thought, memory, and emotions." +explain: Can you explain photosynthesis?,Photosynthesis is the process by which plants convert sunlight into chemical energy. +explain: Give a brief explanation of evolution.,Evolution is the process by which species change over time through natural selection and genetic variation. +explain: Can you explain black holes?,"A black hole is a region in space where gravity is so strong that nothing, not even light, can escape." +explain: What is the purpose of the internet?,The internet is a global network of interconnected computers that enables communication and information sharing. +explain: How does data science work?,Data science involves analyzing and interpreting complex data to extract valuable insights. +explain: What is black holes?,"A black hole is a region in space where gravity is so strong that nothing, not even light, can escape." +explain: Give me an overview of general relativity.,"Einstein's general relativity theory describes how massive objects warp space-time, affecting gravity." +explain: What is dark matter?,Dark matter is an invisible substance that makes up most of the universe’s mass but does not emit light. +explain: How does evolution work?,Evolution is the process by which species change over time through natural selection and genetic variation. +explain: Define photosynthesis.,Photosynthesis is the process by which plants convert sunlight into chemical energy. +explain: Give me an overview of cryptography.,Cryptography is the science of securing information through encoding and encryption techniques. +explain: Define quantum computing.,Quantum computing uses quantum bits (qubits) to perform calculations exponentially faster than classical computers. +explain: Give me an overview of artificial intelligence.,AI refers to computer systems capable of performing tasks that typically require human intelligence. +explain: Can you explain evolution?,Evolution is the process by which species change over time through natural selection and genetic variation. +explain: Give me an overview of black holes.,"A black hole is a region in space where gravity is so strong that nothing, not even light, can escape." +explain: Why is cryptography important?,Cryptography is the science of securing information through encoding and encryption techniques. +explain: What are the key features of biotechnology?,Biotechnology applies biological processes and organisms to develop new medical and industrial technologies. +explain: What is evolution?,Evolution is the process by which species change over time through natural selection and genetic variation. +explain: Why is blockchain important?,Blockchain is a decentralized digital ledger that records transactions across multiple computers securely. +explain: Give me an overview of dark matter.,Dark matter is an invisible substance that makes up most of the universe’s mass but does not emit light. +explain: What is the internet?,The internet is a global network of interconnected computers that enables communication and information sharing. +explain: Give a brief explanation of the human brain.,"The human brain is the central organ of the nervous system, responsible for thought, memory, and emotions." +explain: Why is evolution important?,Evolution is the process by which species change over time through natural selection and genetic variation. +explain: What is cryptography?,Cryptography is the science of securing information through encoding and encryption techniques. +explain: What is the purpose of data science?,Data science involves analyzing and interpreting complex data to extract valuable insights. +explain: How does the human brain work?,"The human brain is the central organ of the nervous system, responsible for thought, memory, and emotions." +explain: What is the purpose of the internet?,The internet is a global network of interconnected computers that enables communication and information sharing. +explain: How does black holes work?,"A black hole is a region in space where gravity is so strong that nothing, not even light, can escape." +explain: How does robotics work?,"Robotics is the field of designing, building, and operating robots for various applications." +explain: Give me an overview of photosynthesis.,Photosynthesis is the process by which plants convert sunlight into chemical energy. +explain: Define biotechnology.,Biotechnology applies biological processes and organisms to develop new medical and industrial technologies. +explain: What are the key features of general relativity?,"Einstein's general relativity theory describes how massive objects warp space-time, affecting gravity." +explain: Define evolution.,Evolution is the process by which species change over time through natural selection and genetic variation. +explain: What is the purpose of blockchain?,Blockchain is a decentralized digital ledger that records transactions across multiple computers securely. +explain: Why is neural networks important?,"Neural networks are computing systems inspired by the human brain, used in deep learning for pattern recognition." +explain: How does biotechnology work?,Biotechnology applies biological processes and organisms to develop new medical and industrial technologies. +explain: What are the key features of quantum computing?,Quantum computing uses quantum bits (qubits) to perform calculations exponentially faster than classical computers. +explain: Can you explain climate change?,"Climate change refers to long-term alterations in temperature, precipitation, and weather patterns due to human activity." +explain: What is general relativity?,"Einstein's general relativity theory describes how massive objects warp space-time, affecting gravity." +explain: What is machine learning?,Machine learning is a subset of AI that enables systems to learn from data and improve without explicit programming. +explain: How does data science work?,Data science involves analyzing and interpreting complex data to extract valuable insights. +explain: How does data science work?,Data science involves analyzing and interpreting complex data to extract valuable insights. +explain: What is the purpose of climate change?,"Climate change refers to long-term alterations in temperature, precipitation, and weather patterns due to human activity." +explain: What are the key features of neural networks?,"Neural networks are computing systems inspired by the human brain, used in deep learning for pattern recognition." +explain: Why is the stock market important?,"The stock market is a platform for buying and selling financial securities, influencing global economies." +explain: Give me an overview of black holes.,"A black hole is a region in space where gravity is so strong that nothing, not even light, can escape." +explain: How does neural networks work?,"Neural networks are computing systems inspired by the human brain, used in deep learning for pattern recognition." +explain: What is the purpose of quantum computing?,Quantum computing uses quantum bits (qubits) to perform calculations exponentially faster than classical computers. +explain: Give me an overview of cryptography.,Cryptography is the science of securing information through encoding and encryption techniques. +explain: Give me an overview of evolution.,Evolution is the process by which species change over time through natural selection and genetic variation. +explain: What are the key features of nanotechnology?,Nanotechnology involves manipulating matter at the atomic and molecular scale for innovative applications. +explain: Why is artificial intelligence important?,AI refers to computer systems capable of performing tasks that typically require human intelligence. +explain: What is the purpose of genetic engineering?,Genetic engineering involves modifying an organism's DNA to achieve desirable traits. +explain: What is the purpose of nanotechnology?,Nanotechnology involves manipulating matter at the atomic and molecular scale for innovative applications. +explain: What is black holes?,"A black hole is a region in space where gravity is so strong that nothing, not even light, can escape." +explain: Why is biotechnology important?,Biotechnology applies biological processes and organisms to develop new medical and industrial technologies. +explain: What are the key features of machine learning?,Machine learning is a subset of AI that enables systems to learn from data and improve without explicit programming. +explain: What is artificial intelligence?,AI refers to computer systems capable of performing tasks that typically require human intelligence. +explain: What is genetic engineering?,Genetic engineering involves modifying an organism's DNA to achieve desirable traits. +explain: Give a brief explanation of nanotechnology.,Nanotechnology involves manipulating matter at the atomic and molecular scale for innovative applications. +explain: Why is the stock market important?,"The stock market is a platform for buying and selling financial securities, influencing global economies." +explain: What are the key features of the internet?,The internet is a global network of interconnected computers that enables communication and information sharing. +explain: What is the purpose of the internet?,The internet is a global network of interconnected computers that enables communication and information sharing. +explain: Define climate change.,"Climate change refers to long-term alterations in temperature, precipitation, and weather patterns due to human activity." +explain: What is biotechnology?,Biotechnology applies biological processes and organisms to develop new medical and industrial technologies. +explain: Define machine learning.,Machine learning is a subset of AI that enables systems to learn from data and improve without explicit programming. +explain: What is the purpose of photosynthesis?,Photosynthesis is the process by which plants convert sunlight into chemical energy. +explain: Define black holes.,"A black hole is a region in space where gravity is so strong that nothing, not even light, can escape." +explain: Define neural networks.,"Neural networks are computing systems inspired by the human brain, used in deep learning for pattern recognition." +explain: How does quantum computing work?,Quantum computing uses quantum bits (qubits) to perform calculations exponentially faster than classical computers. +explain: What is the purpose of dark matter?,Dark matter is an invisible substance that makes up most of the universe’s mass but does not emit light. +explain: Why is artificial intelligence important?,AI refers to computer systems capable of performing tasks that typically require human intelligence. +explain: Give me an overview of data science.,Data science involves analyzing and interpreting complex data to extract valuable insights. +explain: Give a brief explanation of climate change.,"Climate change refers to long-term alterations in temperature, precipitation, and weather patterns due to human activity." +explain: What is biotechnology?,Biotechnology applies biological processes and organisms to develop new medical and industrial technologies. +explain: What is robotics?,"Robotics is the field of designing, building, and operating robots for various applications." +explain: Can you explain dark matter?,Dark matter is an invisible substance that makes up most of the universe’s mass but does not emit light. +explain: How does evolution work?,Evolution is the process by which species change over time through natural selection and genetic variation. +explain: Give me an overview of genetic engineering.,Genetic engineering involves modifying an organism's DNA to achieve desirable traits. +explain: Give a brief explanation of biotechnology.,Biotechnology applies biological processes and organisms to develop new medical and industrial technologies. +explain: Give me an overview of photosynthesis.,Photosynthesis is the process by which plants convert sunlight into chemical energy. +explain: What are the key features of nanotechnology?,Nanotechnology involves manipulating matter at the atomic and molecular scale for innovative applications. +explain: What is the purpose of robotics?,"Robotics is the field of designing, building, and operating robots for various applications." +explain: What is robotics?,"Robotics is the field of designing, building, and operating robots for various applications." +explain: What is the human brain?,"The human brain is the central organ of the nervous system, responsible for thought, memory, and emotions." +explain: Give me an overview of genetic engineering.,Genetic engineering involves modifying an organism's DNA to achieve desirable traits. +explain: Give me an overview of blockchain.,Blockchain is a decentralized digital ledger that records transactions across multiple computers securely. +explain: What is the purpose of dark matter?,Dark matter is an invisible substance that makes up most of the universe’s mass but does not emit light. +explain: What are the key features of quantum computing?,Quantum computing uses quantum bits (qubits) to perform calculations exponentially faster than classical computers. +explain: What are the key features of the human brain?,"The human brain is the central organ of the nervous system, responsible for thought, memory, and emotions." +explain: Define genetic engineering.,Genetic engineering involves modifying an organism's DNA to achieve desirable traits. +explain: Define machine learning.,Machine learning is a subset of AI that enables systems to learn from data and improve without explicit programming. +explain: Why is climate change important?,"Climate change refers to long-term alterations in temperature, precipitation, and weather patterns due to human activity." +explain: Give a brief explanation of the internet.,The internet is a global network of interconnected computers that enables communication and information sharing. +explain: How does data science work?,Data science involves analyzing and interpreting complex data to extract valuable insights. +explain: Give a brief explanation of biotechnology.,Biotechnology applies biological processes and organisms to develop new medical and industrial technologies. +explain: Why is climate change important?,"Climate change refers to long-term alterations in temperature, precipitation, and weather patterns due to human activity." +explain: What are the key features of neural networks?,"Neural networks are computing systems inspired by the human brain, used in deep learning for pattern recognition." +explain: Give me an overview of the human brain.,"The human brain is the central organ of the nervous system, responsible for thought, memory, and emotions." +explain: Give me an overview of evolution.,Evolution is the process by which species change over time through natural selection and genetic variation. +explain: What are the key features of genetic engineering?,Genetic engineering involves modifying an organism's DNA to achieve desirable traits. +explain: Define cryptography.,Cryptography is the science of securing information through encoding and encryption techniques. +explain: Give a brief explanation of photosynthesis.,Photosynthesis is the process by which plants convert sunlight into chemical energy. +explain: Can you explain climate change?,"Climate change refers to long-term alterations in temperature, precipitation, and weather patterns due to human activity." +explain: Can you explain genetic engineering?,Genetic engineering involves modifying an organism's DNA to achieve desirable traits. +explain: What is genetic engineering?,Genetic engineering involves modifying an organism's DNA to achieve desirable traits. +explain: Give a brief explanation of climate change.,"Climate change refers to long-term alterations in temperature, precipitation, and weather patterns due to human activity." +explain: Can you explain the internet?,The internet is a global network of interconnected computers that enables communication and information sharing. +explain: What is the purpose of neural networks?,"Neural networks are computing systems inspired by the human brain, used in deep learning for pattern recognition." +explain: Why is black holes important?,"A black hole is a region in space where gravity is so strong that nothing, not even light, can escape." +explain: What is the human brain?,"The human brain is the central organ of the nervous system, responsible for thought, memory, and emotions." +explain: What is biotechnology?,Biotechnology applies biological processes and organisms to develop new medical and industrial technologies. +explain: What are the key features of neural networks?,"Neural networks are computing systems inspired by the human brain, used in deep learning for pattern recognition." +explain: What is the purpose of general relativity?,"Einstein's general relativity theory describes how massive objects warp space-time, affecting gravity." +explain: Give a brief explanation of the stock market.,"The stock market is a platform for buying and selling financial securities, influencing global economies." +explain: Why is cryptography important?,Cryptography is the science of securing information through encoding and encryption techniques. +explain: How does climate change work?,"Climate change refers to long-term alterations in temperature, precipitation, and weather patterns due to human activity." +explain: What are the key features of climate change?,"Climate change refers to long-term alterations in temperature, precipitation, and weather patterns due to human activity." +explain: Why is climate change important?,"Climate change refers to long-term alterations in temperature, precipitation, and weather patterns due to human activity." +explain: What are the key features of neural networks?,"Neural networks are computing systems inspired by the human brain, used in deep learning for pattern recognition." +explain: How does dark matter work?,Dark matter is an invisible substance that makes up most of the universe’s mass but does not emit light. +explain: Give me an overview of machine learning.,Machine learning is a subset of AI that enables systems to learn from data and improve without explicit programming. +explain: Give a brief explanation of machine learning.,Machine learning is a subset of AI that enables systems to learn from data and improve without explicit programming. +explain: Why is general relativity important?,"Einstein's general relativity theory describes how massive objects warp space-time, affecting gravity." +explain: Give me an overview of cryptography.,Cryptography is the science of securing information through encoding and encryption techniques. +explain: What is the purpose of the stock market?,"The stock market is a platform for buying and selling financial securities, influencing global economies." +explain: Define climate change.,"Climate change refers to long-term alterations in temperature, precipitation, and weather patterns due to human activity." +explain: Give me an overview of evolution.,Evolution is the process by which species change over time through natural selection and genetic variation. +explain: How does dark matter work?,Dark matter is an invisible substance that makes up most of the universe’s mass but does not emit light. +explain: Give a brief explanation of black holes.,"A black hole is a region in space where gravity is so strong that nothing, not even light, can escape." +explain: Why is quantum computing important?,Quantum computing uses quantum bits (qubits) to perform calculations exponentially faster than classical computers. +explain: How does robotics work?,"Robotics is the field of designing, building, and operating robots for various applications." +explain: How does climate change work?,"Climate change refers to long-term alterations in temperature, precipitation, and weather patterns due to human activity." +explain: Define the internet.,The internet is a global network of interconnected computers that enables communication and information sharing. +explain: How does climate change work?,"Climate change refers to long-term alterations in temperature, precipitation, and weather patterns due to human activity." +explain: Give a brief explanation of artificial intelligence.,AI refers to computer systems capable of performing tasks that typically require human intelligence. +explain: Why is photosynthesis important?,Photosynthesis is the process by which plants convert sunlight into chemical energy. +explain: Give me an overview of biotechnology.,Biotechnology applies biological processes and organisms to develop new medical and industrial technologies. +explain: What is nanotechnology?,Nanotechnology involves manipulating matter at the atomic and molecular scale for innovative applications. +explain: How does climate change work?,"Climate change refers to long-term alterations in temperature, precipitation, and weather patterns due to human activity." +explain: Why is machine learning important?,Machine learning is a subset of AI that enables systems to learn from data and improve without explicit programming. +explain: Define general relativity.,"Einstein's general relativity theory describes how massive objects warp space-time, affecting gravity." +explain: Give me an overview of biotechnology.,Biotechnology applies biological processes and organisms to develop new medical and industrial technologies. +explain: Define photosynthesis.,Photosynthesis is the process by which plants convert sunlight into chemical energy. +explain: What are the key features of black holes?,"A black hole is a region in space where gravity is so strong that nothing, not even light, can escape." +explain: How does artificial intelligence work?,AI refers to computer systems capable of performing tasks that typically require human intelligence. +explain: How does climate change work?,"Climate change refers to long-term alterations in temperature, precipitation, and weather patterns due to human activity." +explain: Can you explain black holes?,"A black hole is a region in space where gravity is so strong that nothing, not even light, can escape." +explain: Give a brief explanation of the stock market.,"The stock market is a platform for buying and selling financial securities, influencing global economies." +explain: Can you explain artificial intelligence?,AI refers to computer systems capable of performing tasks that typically require human intelligence. +explain: Why is evolution important?,Evolution is the process by which species change over time through natural selection and genetic variation. +explain: What are the key features of photosynthesis?,Photosynthesis is the process by which plants convert sunlight into chemical energy. +explain: Why is nanotechnology important?,Nanotechnology involves manipulating matter at the atomic and molecular scale for innovative applications. +explain: How does genetic engineering work?,Genetic engineering involves modifying an organism's DNA to achieve desirable traits. +explain: How does photosynthesis work?,Photosynthesis is the process by which plants convert sunlight into chemical energy. +explain: What is biotechnology?,Biotechnology applies biological processes and organisms to develop new medical and industrial technologies. +explain: What are the key features of photosynthesis?,Photosynthesis is the process by which plants convert sunlight into chemical energy. +explain: What is the purpose of climate change?,"Climate change refers to long-term alterations in temperature, precipitation, and weather patterns due to human activity." +explain: Can you explain data science?,Data science involves analyzing and interpreting complex data to extract valuable insights. +explain: Give me an overview of quantum computing.,Quantum computing uses quantum bits (qubits) to perform calculations exponentially faster than classical computers. +explain: Why is dark matter important?,Dark matter is an invisible substance that makes up most of the universe’s mass but does not emit light. +explain: Define the human brain.,"The human brain is the central organ of the nervous system, responsible for thought, memory, and emotions." +explain: What are the key features of nanotechnology?,Nanotechnology involves manipulating matter at the atomic and molecular scale for innovative applications. +explain: Can you explain dark matter?,Dark matter is an invisible substance that makes up most of the universe’s mass but does not emit light. +explain: What are the key features of genetic engineering?,Genetic engineering involves modifying an organism's DNA to achieve desirable traits. +explain: Can you explain artificial intelligence?,AI refers to computer systems capable of performing tasks that typically require human intelligence. +explain: Why is biotechnology important?,Biotechnology applies biological processes and organisms to develop new medical and industrial technologies. +explain: Define general relativity.,"Einstein's general relativity theory describes how massive objects warp space-time, affecting gravity." +explain: Why is nanotechnology important?,Nanotechnology involves manipulating matter at the atomic and molecular scale for innovative applications. +explain: Give a brief explanation of neural networks.,"Neural networks are computing systems inspired by the human brain, used in deep learning for pattern recognition." +explain: What is evolution?,Evolution is the process by which species change over time through natural selection and genetic variation. +explain: Give me an overview of quantum computing.,Quantum computing uses quantum bits (qubits) to perform calculations exponentially faster than classical computers. +explain: How does neural networks work?,"Neural networks are computing systems inspired by the human brain, used in deep learning for pattern recognition." +explain: What are the key features of artificial intelligence?,AI refers to computer systems capable of performing tasks that typically require human intelligence. +explain: What are the key features of robotics?,"Robotics is the field of designing, building, and operating robots for various applications." +explain: Why is the human brain important?,"The human brain is the central organ of the nervous system, responsible for thought, memory, and emotions." +explain: What is the purpose of cryptography?,Cryptography is the science of securing information through encoding and encryption techniques. +explain: What are the key features of evolution?,Evolution is the process by which species change over time through natural selection and genetic variation. +explain: What is robotics?,"Robotics is the field of designing, building, and operating robots for various applications." +explain: What are the key features of nanotechnology?,Nanotechnology involves manipulating matter at the atomic and molecular scale for innovative applications. +explain: How does data science work?,Data science involves analyzing and interpreting complex data to extract valuable insights. +explain: How does the stock market work?,"The stock market is a platform for buying and selling financial securities, influencing global economies." +explain: Give me an overview of nanotechnology.,Nanotechnology involves manipulating matter at the atomic and molecular scale for innovative applications. +explain: What are the key features of genetic engineering?,Genetic engineering involves modifying an organism's DNA to achieve desirable traits. +explain: What is the purpose of nanotechnology?,Nanotechnology involves manipulating matter at the atomic and molecular scale for innovative applications. +explain: Give a brief explanation of robotics.,"Robotics is the field of designing, building, and operating robots for various applications." +explain: What are the key features of climate change?,"Climate change refers to long-term alterations in temperature, precipitation, and weather patterns due to human activity." +explain: Define neural networks.,"Neural networks are computing systems inspired by the human brain, used in deep learning for pattern recognition." +explain: What are the key features of climate change?,"Climate change refers to long-term alterations in temperature, precipitation, and weather patterns due to human activity." +explain: What is the purpose of data science?,Data science involves analyzing and interpreting complex data to extract valuable insights. +explain: Define neural networks.,"Neural networks are computing systems inspired by the human brain, used in deep learning for pattern recognition." +explain: Define genetic engineering.,Genetic engineering involves modifying an organism's DNA to achieve desirable traits. +explain: What is the purpose of neural networks?,"Neural networks are computing systems inspired by the human brain, used in deep learning for pattern recognition." +explain: Why is biotechnology important?,Biotechnology applies biological processes and organisms to develop new medical and industrial technologies. +explain: Give me an overview of dark matter.,Dark matter is an invisible substance that makes up most of the universe’s mass but does not emit light. +explain: What is the purpose of genetic engineering?,Genetic engineering involves modifying an organism's DNA to achieve desirable traits. +explain: Give a brief explanation of cryptography.,Cryptography is the science of securing information through encoding and encryption techniques. +explain: Give a brief explanation of photosynthesis.,Photosynthesis is the process by which plants convert sunlight into chemical energy. +explain: Give a brief explanation of quantum computing.,Quantum computing uses quantum bits (qubits) to perform calculations exponentially faster than classical computers. +explain: Define cryptography.,Cryptography is the science of securing information through encoding and encryption techniques. +explain: How does dark matter work?,Dark matter is an invisible substance that makes up most of the universe’s mass but does not emit light. +explain: What are the key features of cryptography?,Cryptography is the science of securing information through encoding and encryption techniques. +explain: Give a brief explanation of blockchain.,Blockchain is a decentralized digital ledger that records transactions across multiple computers securely. +explain: Define quantum computing.,Quantum computing uses quantum bits (qubits) to perform calculations exponentially faster than classical computers. +explain: Give me an overview of nanotechnology.,Nanotechnology involves manipulating matter at the atomic and molecular scale for innovative applications. +explain: Define evolution.,Evolution is the process by which species change over time through natural selection and genetic variation. +explain: Give a brief explanation of photosynthesis.,Photosynthesis is the process by which plants convert sunlight into chemical energy. +explain: Define general relativity.,"Einstein's general relativity theory describes how massive objects warp space-time, affecting gravity." +explain: Give me an overview of the internet.,The internet is a global network of interconnected computers that enables communication and information sharing. +explain: What are the key features of genetic engineering?,Genetic engineering involves modifying an organism's DNA to achieve desirable traits. +explain: Can you explain biotechnology?,Biotechnology applies biological processes and organisms to develop new medical and industrial technologies. +explain: How does nanotechnology work?,Nanotechnology involves manipulating matter at the atomic and molecular scale for innovative applications. +explain: What is the purpose of data science?,Data science involves analyzing and interpreting complex data to extract valuable insights. +explain: How does machine learning work?,Machine learning is a subset of AI that enables systems to learn from data and improve without explicit programming. +explain: What is the purpose of robotics?,"Robotics is the field of designing, building, and operating robots for various applications." +explain: Define cryptography.,Cryptography is the science of securing information through encoding and encryption techniques. +explain: How does machine learning work?,Machine learning is a subset of AI that enables systems to learn from data and improve without explicit programming. +explain: Why is general relativity important?,"Einstein's general relativity theory describes how massive objects warp space-time, affecting gravity." +explain: Define climate change.,"Climate change refers to long-term alterations in temperature, precipitation, and weather patterns due to human activity." +explain: Can you explain general relativity?,"Einstein's general relativity theory describes how massive objects warp space-time, affecting gravity." +explain: What are the key features of black holes?,"A black hole is a region in space where gravity is so strong that nothing, not even light, can escape." +explain: Give me an overview of biotechnology.,Biotechnology applies biological processes and organisms to develop new medical and industrial technologies. +explain: What is artificial intelligence?,AI refers to computer systems capable of performing tasks that typically require human intelligence. +explain: How does dark matter work?,Dark matter is an invisible substance that makes up most of the universe’s mass but does not emit light. +explain: Give a brief explanation of the human brain.,"The human brain is the central organ of the nervous system, responsible for thought, memory, and emotions." +explain: Give a brief explanation of the human brain.,"The human brain is the central organ of the nervous system, responsible for thought, memory, and emotions." +explain: Why is machine learning important?,Machine learning is a subset of AI that enables systems to learn from data and improve without explicit programming. +explain: Give me an overview of quantum computing.,Quantum computing uses quantum bits (qubits) to perform calculations exponentially faster than classical computers. +explain: Give me an overview of machine learning.,Machine learning is a subset of AI that enables systems to learn from data and improve without explicit programming. +explain: Define artificial intelligence.,AI refers to computer systems capable of performing tasks that typically require human intelligence. +explain: What are the key features of nanotechnology?,Nanotechnology involves manipulating matter at the atomic and molecular scale for innovative applications. +explain: Give a brief explanation of genetic engineering.,Genetic engineering involves modifying an organism's DNA to achieve desirable traits. +explain: Why is the human brain important?,"The human brain is the central organ of the nervous system, responsible for thought, memory, and emotions." +explain: How does the human brain work?,"The human brain is the central organ of the nervous system, responsible for thought, memory, and emotions." +explain: Define dark matter.,Dark matter is an invisible substance that makes up most of the universe’s mass but does not emit light. +explain: What are the key features of dark matter?,Dark matter is an invisible substance that makes up most of the universe’s mass but does not emit light. +explain: Why is genetic engineering important?,Genetic engineering involves modifying an organism's DNA to achieve desirable traits. +explain: Define blockchain.,Blockchain is a decentralized digital ledger that records transactions across multiple computers securely. +explain: Define data science.,Data science involves analyzing and interpreting complex data to extract valuable insights. +explain: What is black holes?,"A black hole is a region in space where gravity is so strong that nothing, not even light, can escape." +explain: Give me an overview of machine learning.,Machine learning is a subset of AI that enables systems to learn from data and improve without explicit programming. +explain: What is the purpose of black holes?,"A black hole is a region in space where gravity is so strong that nothing, not even light, can escape." +explain: Define general relativity.,"Einstein's general relativity theory describes how massive objects warp space-time, affecting gravity." +explain: What is the purpose of robotics?,"Robotics is the field of designing, building, and operating robots for various applications." +explain: Why is dark matter important?,Dark matter is an invisible substance that makes up most of the universe’s mass but does not emit light. +explain: Define quantum computing.,Quantum computing uses quantum bits (qubits) to perform calculations exponentially faster than classical computers. +explain: Why is data science important?,Data science involves analyzing and interpreting complex data to extract valuable insights. +explain: Define robotics.,"Robotics is the field of designing, building, and operating robots for various applications." +explain: What is quantum computing?,Quantum computing uses quantum bits (qubits) to perform calculations exponentially faster than classical computers. +explain: How does the stock market work?,"The stock market is a platform for buying and selling financial securities, influencing global economies." +explain: Give me an overview of genetic engineering.,Genetic engineering involves modifying an organism's DNA to achieve desirable traits. +explain: Define evolution.,Evolution is the process by which species change over time through natural selection and genetic variation. +explain: What is the human brain?,"The human brain is the central organ of the nervous system, responsible for thought, memory, and emotions." +explain: Define climate change.,"Climate change refers to long-term alterations in temperature, precipitation, and weather patterns due to human activity." +explain: Give me an overview of the internet.,The internet is a global network of interconnected computers that enables communication and information sharing. +explain: What is artificial intelligence?,AI refers to computer systems capable of performing tasks that typically require human intelligence. +explain: What is photosynthesis?,Photosynthesis is the process by which plants convert sunlight into chemical energy. +explain: Why is cryptography important?,Cryptography is the science of securing information through encoding and encryption techniques. +explain: Define climate change.,"Climate change refers to long-term alterations in temperature, precipitation, and weather patterns due to human activity." +explain: Can you explain neural networks?,"Neural networks are computing systems inspired by the human brain, used in deep learning for pattern recognition." +explain: What is the internet?,The internet is a global network of interconnected computers that enables communication and information sharing. +explain: Give me an overview of general relativity.,"Einstein's general relativity theory describes how massive objects warp space-time, affecting gravity." +explain: How does neural networks work?,"Neural networks are computing systems inspired by the human brain, used in deep learning for pattern recognition." +explain: What is the purpose of cryptography?,Cryptography is the science of securing information through encoding and encryption techniques. +explain: What are the key features of neural networks?,"Neural networks are computing systems inspired by the human brain, used in deep learning for pattern recognition." +explain: How does neural networks work?,"Neural networks are computing systems inspired by the human brain, used in deep learning for pattern recognition." +explain: Give a brief explanation of the internet.,The internet is a global network of interconnected computers that enables communication and information sharing. +explain: Give a brief explanation of the internet.,The internet is a global network of interconnected computers that enables communication and information sharing. +explain: How does quantum computing work?,Quantum computing uses quantum bits (qubits) to perform calculations exponentially faster than classical computers. +explain: What are the key features of artificial intelligence?,AI refers to computer systems capable of performing tasks that typically require human intelligence. +explain: Why is genetic engineering important?,Genetic engineering involves modifying an organism's DNA to achieve desirable traits. +explain: Define general relativity.,"Einstein's general relativity theory describes how massive objects warp space-time, affecting gravity." +explain: Can you explain black holes?,"A black hole is a region in space where gravity is so strong that nothing, not even light, can escape." +explain: What is the purpose of machine learning?,Machine learning is a subset of AI that enables systems to learn from data and improve without explicit programming. +explain: Give a brief explanation of the internet.,The internet is a global network of interconnected computers that enables communication and information sharing. +explain: Give a brief explanation of general relativity.,"Einstein's general relativity theory describes how massive objects warp space-time, affecting gravity." +explain: What is neural networks?,"Neural networks are computing systems inspired by the human brain, used in deep learning for pattern recognition." +explain: What are the key features of climate change?,"Climate change refers to long-term alterations in temperature, precipitation, and weather patterns due to human activity." +explain: Define robotics.,"Robotics is the field of designing, building, and operating robots for various applications." +explain: What are the key features of dark matter?,Dark matter is an invisible substance that makes up most of the universe’s mass but does not emit light. +explain: What are the key features of robotics?,"Robotics is the field of designing, building, and operating robots for various applications." +explain: What are the key features of machine learning?,Machine learning is a subset of AI that enables systems to learn from data and improve without explicit programming. +explain: Why is dark matter important?,Dark matter is an invisible substance that makes up most of the universe’s mass but does not emit light. +explain: How does genetic engineering work?,Genetic engineering involves modifying an organism's DNA to achieve desirable traits. +explain: Why is biotechnology important?,Biotechnology applies biological processes and organisms to develop new medical and industrial technologies. +explain: What are the key features of quantum computing?,Quantum computing uses quantum bits (qubits) to perform calculations exponentially faster than classical computers. +explain: Why is genetic engineering important?,Genetic engineering involves modifying an organism's DNA to achieve desirable traits. +explain: Define artificial intelligence.,AI refers to computer systems capable of performing tasks that typically require human intelligence. +explain: Define general relativity.,"Einstein's general relativity theory describes how massive objects warp space-time, affecting gravity." +explain: How does blockchain work?,Blockchain is a decentralized digital ledger that records transactions across multiple computers securely. +explain: What are the key features of data science?,Data science involves analyzing and interpreting complex data to extract valuable insights. +explain: Why is evolution important?,Evolution is the process by which species change over time through natural selection and genetic variation. +explain: Define machine learning.,Machine learning is a subset of AI that enables systems to learn from data and improve without explicit programming. +explain: How does robotics work?,"Robotics is the field of designing, building, and operating robots for various applications." +explain: Why is climate change important?,"Climate change refers to long-term alterations in temperature, precipitation, and weather patterns due to human activity." +explain: Give me an overview of the human brain.,"The human brain is the central organ of the nervous system, responsible for thought, memory, and emotions." +explain: How does data science work?,Data science involves analyzing and interpreting complex data to extract valuable insights. +explain: Why is cryptography important?,Cryptography is the science of securing information through encoding and encryption techniques. +explain: What is evolution?,Evolution is the process by which species change over time through natural selection and genetic variation. +explain: Define dark matter.,Dark matter is an invisible substance that makes up most of the universe’s mass but does not emit light. +explain: Why is robotics important?,"Robotics is the field of designing, building, and operating robots for various applications." +explain: Give a brief explanation of general relativity.,"Einstein's general relativity theory describes how massive objects warp space-time, affecting gravity." +explain: Why is cryptography important?,Cryptography is the science of securing information through encoding and encryption techniques. +explain: What is the purpose of the human brain?,"The human brain is the central organ of the nervous system, responsible for thought, memory, and emotions." +explain: Give me an overview of robotics.,"Robotics is the field of designing, building, and operating robots for various applications." +explain: Define artificial intelligence.,AI refers to computer systems capable of performing tasks that typically require human intelligence. +explain: Give a brief explanation of biotechnology.,Biotechnology applies biological processes and organisms to develop new medical and industrial technologies. +explain: Give a brief explanation of data science.,Data science involves analyzing and interpreting complex data to extract valuable insights. +explain: Why is black holes important?,"A black hole is a region in space where gravity is so strong that nothing, not even light, can escape." +explain: Why is photosynthesis important?,Photosynthesis is the process by which plants convert sunlight into chemical energy. +explain: What is the purpose of artificial intelligence?,AI refers to computer systems capable of performing tasks that typically require human intelligence. +explain: What is photosynthesis?,Photosynthesis is the process by which plants convert sunlight into chemical energy. +explain: How does evolution work?,Evolution is the process by which species change over time through natural selection and genetic variation. +explain: Give a brief explanation of machine learning.,Machine learning is a subset of AI that enables systems to learn from data and improve without explicit programming. +explain: Give me an overview of quantum computing.,Quantum computing uses quantum bits (qubits) to perform calculations exponentially faster than classical computers. +explain: How does photosynthesis work?,Photosynthesis is the process by which plants convert sunlight into chemical energy. +explain: Can you explain quantum computing?,Quantum computing uses quantum bits (qubits) to perform calculations exponentially faster than classical computers. +explain: Give a brief explanation of robotics.,"Robotics is the field of designing, building, and operating robots for various applications." +explain: How does evolution work?,Evolution is the process by which species change over time through natural selection and genetic variation. +explain: How does photosynthesis work?,Photosynthesis is the process by which plants convert sunlight into chemical energy. +explain: Give me an overview of data science.,Data science involves analyzing and interpreting complex data to extract valuable insights. +explain: Can you explain biotechnology?,Biotechnology applies biological processes and organisms to develop new medical and industrial technologies. +explain: Give me an overview of general relativity.,"Einstein's general relativity theory describes how massive objects warp space-time, affecting gravity." +explain: What are the key features of cryptography?,Cryptography is the science of securing information through encoding and encryption techniques. +explain: Can you explain genetic engineering?,Genetic engineering involves modifying an organism's DNA to achieve desirable traits. +explain: Define neural networks.,"Neural networks are computing systems inspired by the human brain, used in deep learning for pattern recognition." +explain: How does genetic engineering work?,Genetic engineering involves modifying an organism's DNA to achieve desirable traits. +explain: What is the purpose of quantum computing?,Quantum computing uses quantum bits (qubits) to perform calculations exponentially faster than classical computers. +explain: Give me an overview of dark matter.,Dark matter is an invisible substance that makes up most of the universe’s mass but does not emit light. +explain: What is the purpose of machine learning?,Machine learning is a subset of AI that enables systems to learn from data and improve without explicit programming. +explain: What are the key features of machine learning?,Machine learning is a subset of AI that enables systems to learn from data and improve without explicit programming. +explain: What are the key features of evolution?,Evolution is the process by which species change over time through natural selection and genetic variation. +explain: What are the key features of photosynthesis?,Photosynthesis is the process by which plants convert sunlight into chemical energy. +explain: Why is data science important?,Data science involves analyzing and interpreting complex data to extract valuable insights. +explain: What are the key features of evolution?,Evolution is the process by which species change over time through natural selection and genetic variation. +explain: How does neural networks work?,"Neural networks are computing systems inspired by the human brain, used in deep learning for pattern recognition." +explain: Give a brief explanation of cryptography.,Cryptography is the science of securing information through encoding and encryption techniques. +explain: Can you explain machine learning?,Machine learning is a subset of AI that enables systems to learn from data and improve without explicit programming. +explain: What is the purpose of dark matter?,Dark matter is an invisible substance that makes up most of the universe’s mass but does not emit light. +explain: Can you explain dark matter?,Dark matter is an invisible substance that makes up most of the universe’s mass but does not emit light. +explain: Give a brief explanation of robotics.,"Robotics is the field of designing, building, and operating robots for various applications." +explain: What is neural networks?,"Neural networks are computing systems inspired by the human brain, used in deep learning for pattern recognition." +explain: Give me an overview of quantum computing.,Quantum computing uses quantum bits (qubits) to perform calculations exponentially faster than classical computers. +explain: Why is artificial intelligence important?,AI refers to computer systems capable of performing tasks that typically require human intelligence. +explain: What is artificial intelligence?,AI refers to computer systems capable of performing tasks that typically require human intelligence. +explain: What is the human brain?,"The human brain is the central organ of the nervous system, responsible for thought, memory, and emotions." +explain: What is the purpose of artificial intelligence?,AI refers to computer systems capable of performing tasks that typically require human intelligence. +explain: Can you explain blockchain?,Blockchain is a decentralized digital ledger that records transactions across multiple computers securely. +explain: Define evolution.,Evolution is the process by which species change over time through natural selection and genetic variation. +explain: Give a brief explanation of photosynthesis.,Photosynthesis is the process by which plants convert sunlight into chemical energy. +explain: What are the key features of artificial intelligence?,AI refers to computer systems capable of performing tasks that typically require human intelligence. +explain: What is data science?,Data science involves analyzing and interpreting complex data to extract valuable insights. +explain: What is neural networks?,"Neural networks are computing systems inspired by the human brain, used in deep learning for pattern recognition." +explain: What are the key features of artificial intelligence?,AI refers to computer systems capable of performing tasks that typically require human intelligence. +explain: Give me an overview of climate change.,"Climate change refers to long-term alterations in temperature, precipitation, and weather patterns due to human activity." +explain: What is the stock market?,"The stock market is a platform for buying and selling financial securities, influencing global economies." +explain: Why is the internet important?,The internet is a global network of interconnected computers that enables communication and information sharing. +explain: What is dark matter?,Dark matter is an invisible substance that makes up most of the universe’s mass but does not emit light. +explain: What is evolution?,Evolution is the process by which species change over time through natural selection and genetic variation. +explain: Define blockchain.,Blockchain is a decentralized digital ledger that records transactions across multiple computers securely. +explain: What is the purpose of general relativity?,"Einstein's general relativity theory describes how massive objects warp space-time, affecting gravity." +explain: Define nanotechnology.,Nanotechnology involves manipulating matter at the atomic and molecular scale for innovative applications. +explain: Give me an overview of cryptography.,Cryptography is the science of securing information through encoding and encryption techniques. +explain: Can you explain climate change?,"Climate change refers to long-term alterations in temperature, precipitation, and weather patterns due to human activity." +explain: Why is the internet important?,The internet is a global network of interconnected computers that enables communication and information sharing. +explain: How does artificial intelligence work?,AI refers to computer systems capable of performing tasks that typically require human intelligence. +explain: Give me an overview of cryptography.,Cryptography is the science of securing information through encoding and encryption techniques. +explain: How does the stock market work?,"The stock market is a platform for buying and selling financial securities, influencing global economies." +explain: What is the purpose of machine learning?,Machine learning is a subset of AI that enables systems to learn from data and improve without explicit programming. +explain: Can you explain robotics?,"Robotics is the field of designing, building, and operating robots for various applications." +explain: How does nanotechnology work?,Nanotechnology involves manipulating matter at the atomic and molecular scale for innovative applications. +explain: Why is biotechnology important?,Biotechnology applies biological processes and organisms to develop new medical and industrial technologies. +explain: What is the purpose of blockchain?,Blockchain is a decentralized digital ledger that records transactions across multiple computers securely. +explain: What are the key features of the stock market?,"The stock market is a platform for buying and selling financial securities, influencing global economies." +explain: Can you explain blockchain?,Blockchain is a decentralized digital ledger that records transactions across multiple computers securely. +explain: What are the key features of cryptography?,Cryptography is the science of securing information through encoding and encryption techniques. +explain: Can you explain blockchain?,Blockchain is a decentralized digital ledger that records transactions across multiple computers securely. +explain: Give me an overview of the human brain.,"The human brain is the central organ of the nervous system, responsible for thought, memory, and emotions." +explain: How does dark matter work?,Dark matter is an invisible substance that makes up most of the universe’s mass but does not emit light. +explain: What is dark matter?,Dark matter is an invisible substance that makes up most of the universe’s mass but does not emit light. +explain: How does blockchain work?,Blockchain is a decentralized digital ledger that records transactions across multiple computers securely. +explain: What is the purpose of black holes?,"A black hole is a region in space where gravity is so strong that nothing, not even light, can escape." +explain: What is the purpose of data science?,Data science involves analyzing and interpreting complex data to extract valuable insights. +explain: Why is genetic engineering important?,Genetic engineering involves modifying an organism's DNA to achieve desirable traits. +explain: Give me an overview of artificial intelligence.,AI refers to computer systems capable of performing tasks that typically require human intelligence. +explain: Why is neural networks important?,"Neural networks are computing systems inspired by the human brain, used in deep learning for pattern recognition." +explain: Give me an overview of quantum computing.,Quantum computing uses quantum bits (qubits) to perform calculations exponentially faster than classical computers. +explain: Why is the human brain important?,"The human brain is the central organ of the nervous system, responsible for thought, memory, and emotions." +explain: What is cryptography?,Cryptography is the science of securing information through encoding and encryption techniques. +explain: Give a brief explanation of blockchain.,Blockchain is a decentralized digital ledger that records transactions across multiple computers securely. +explain: Why is neural networks important?,"Neural networks are computing systems inspired by the human brain, used in deep learning for pattern recognition." +explain: What is the purpose of evolution?,Evolution is the process by which species change over time through natural selection and genetic variation. +explain: What are the key features of photosynthesis?,Photosynthesis is the process by which plants convert sunlight into chemical energy. +explain: What are the key features of quantum computing?,Quantum computing uses quantum bits (qubits) to perform calculations exponentially faster than classical computers. +explain: Give me an overview of dark matter.,Dark matter is an invisible substance that makes up most of the universe’s mass but does not emit light. +explain: How does photosynthesis work?,Photosynthesis is the process by which plants convert sunlight into chemical energy. +explain: Give me an overview of robotics.,"Robotics is the field of designing, building, and operating robots for various applications." +explain: What is neural networks?,"Neural networks are computing systems inspired by the human brain, used in deep learning for pattern recognition." +explain: Define general relativity.,"Einstein's general relativity theory describes how massive objects warp space-time, affecting gravity." +explain: Can you explain quantum computing?,Quantum computing uses quantum bits (qubits) to perform calculations exponentially faster than classical computers. +explain: What is cryptography?,Cryptography is the science of securing information through encoding and encryption techniques. +explain: What is blockchain?,Blockchain is a decentralized digital ledger that records transactions across multiple computers securely. +explain: How does biotechnology work?,Biotechnology applies biological processes and organisms to develop new medical and industrial technologies. +explain: What are the key features of quantum computing?,Quantum computing uses quantum bits (qubits) to perform calculations exponentially faster than classical computers. +explain: Can you explain nanotechnology?,Nanotechnology involves manipulating matter at the atomic and molecular scale for innovative applications. +explain: Define climate change.,"Climate change refers to long-term alterations in temperature, precipitation, and weather patterns due to human activity." +explain: Why is data science important?,Data science involves analyzing and interpreting complex data to extract valuable insights. +explain: What are the key features of quantum computing?,Quantum computing uses quantum bits (qubits) to perform calculations exponentially faster than classical computers. +explain: Give a brief explanation of biotechnology.,Biotechnology applies biological processes and organisms to develop new medical and industrial technologies. +explain: Define general relativity.,"Einstein's general relativity theory describes how massive objects warp space-time, affecting gravity." +explain: How does genetic engineering work?,Genetic engineering involves modifying an organism's DNA to achieve desirable traits. +explain: Give me an overview of the stock market.,"The stock market is a platform for buying and selling financial securities, influencing global economies." +explain: How does neural networks work?,"Neural networks are computing systems inspired by the human brain, used in deep learning for pattern recognition." +explain: Give me an overview of biotechnology.,Biotechnology applies biological processes and organisms to develop new medical and industrial technologies. +explain: Give a brief explanation of black holes.,"A black hole is a region in space where gravity is so strong that nothing, not even light, can escape." +explain: Give a brief explanation of biotechnology.,Biotechnology applies biological processes and organisms to develop new medical and industrial technologies. +explain: What is black holes?,"A black hole is a region in space where gravity is so strong that nothing, not even light, can escape." +explain: Define nanotechnology.,Nanotechnology involves manipulating matter at the atomic and molecular scale for innovative applications. +explain: Give a brief explanation of evolution.,Evolution is the process by which species change over time through natural selection and genetic variation. +explain: Give me an overview of the stock market.,"The stock market is a platform for buying and selling financial securities, influencing global economies." +explain: Why is the internet important?,The internet is a global network of interconnected computers that enables communication and information sharing. +explain: What is climate change?,"Climate change refers to long-term alterations in temperature, precipitation, and weather patterns due to human activity." +explain: Give me an overview of blockchain.,Blockchain is a decentralized digital ledger that records transactions across multiple computers securely. +explain: What are the key features of photosynthesis?,Photosynthesis is the process by which plants convert sunlight into chemical energy. +explain: Why is the stock market important?,"The stock market is a platform for buying and selling financial securities, influencing global economies." +explain: Define cryptography.,Cryptography is the science of securing information through encoding and encryption techniques. +explain: What is the purpose of quantum computing?,Quantum computing uses quantum bits (qubits) to perform calculations exponentially faster than classical computers. +explain: Can you explain black holes?,"A black hole is a region in space where gravity is so strong that nothing, not even light, can escape." +explain: What is biotechnology?,Biotechnology applies biological processes and organisms to develop new medical and industrial technologies. +explain: How does photosynthesis work?,Photosynthesis is the process by which plants convert sunlight into chemical energy. +explain: Can you explain blockchain?,Blockchain is a decentralized digital ledger that records transactions across multiple computers securely. +explain: What is the purpose of robotics?,"Robotics is the field of designing, building, and operating robots for various applications." +explain: Can you explain robotics?,"Robotics is the field of designing, building, and operating robots for various applications." +explain: Give a brief explanation of biotechnology.,Biotechnology applies biological processes and organisms to develop new medical and industrial technologies. +explain: Why is photosynthesis important?,Photosynthesis is the process by which plants convert sunlight into chemical energy. +explain: What are the key features of quantum computing?,Quantum computing uses quantum bits (qubits) to perform calculations exponentially faster than classical computers. +explain: What is artificial intelligence?,AI refers to computer systems capable of performing tasks that typically require human intelligence. +explain: Give me an overview of biotechnology.,Biotechnology applies biological processes and organisms to develop new medical and industrial technologies. +explain: What is evolution?,Evolution is the process by which species change over time through natural selection and genetic variation. +explain: Define black holes.,"A black hole is a region in space where gravity is so strong that nothing, not even light, can escape." +explain: How does dark matter work?,Dark matter is an invisible substance that makes up most of the universe’s mass but does not emit light. +explain: What is machine learning?,Machine learning is a subset of AI that enables systems to learn from data and improve without explicit programming. +explain: Why is photosynthesis important?,Photosynthesis is the process by which plants convert sunlight into chemical energy. +explain: Why is evolution important?,Evolution is the process by which species change over time through natural selection and genetic variation. +explain: Why is the stock market important?,"The stock market is a platform for buying and selling financial securities, influencing global economies." +explain: What is the purpose of data science?,Data science involves analyzing and interpreting complex data to extract valuable insights. +explain: Give a brief explanation of data science.,Data science involves analyzing and interpreting complex data to extract valuable insights. +explain: Define artificial intelligence.,AI refers to computer systems capable of performing tasks that typically require human intelligence. +explain: Give me an overview of dark matter.,Dark matter is an invisible substance that makes up most of the universe’s mass but does not emit light. +explain: Give me an overview of the stock market.,"The stock market is a platform for buying and selling financial securities, influencing global economies." +explain: What is biotechnology?,Biotechnology applies biological processes and organisms to develop new medical and industrial technologies. +explain: Why is robotics important?,"Robotics is the field of designing, building, and operating robots for various applications." +explain: How does the human brain work?,"The human brain is the central organ of the nervous system, responsible for thought, memory, and emotions." +explain: Give me an overview of photosynthesis.,Photosynthesis is the process by which plants convert sunlight into chemical energy. +explain: How does evolution work?,Evolution is the process by which species change over time through natural selection and genetic variation. +explain: Give me an overview of biotechnology.,Biotechnology applies biological processes and organisms to develop new medical and industrial technologies. +explain: Can you explain photosynthesis?,Photosynthesis is the process by which plants convert sunlight into chemical energy. +explain: What is robotics?,"Robotics is the field of designing, building, and operating robots for various applications." +explain: Can you explain nanotechnology?,Nanotechnology involves manipulating matter at the atomic and molecular scale for innovative applications. +explain: How does data science work?,Data science involves analyzing and interpreting complex data to extract valuable insights. +explain: Define robotics.,"Robotics is the field of designing, building, and operating robots for various applications." +explain: Give me an overview of general relativity.,"Einstein's general relativity theory describes how massive objects warp space-time, affecting gravity." +explain: How does the internet work?,The internet is a global network of interconnected computers that enables communication and information sharing. +explain: Can you explain dark matter?,Dark matter is an invisible substance that makes up most of the universe’s mass but does not emit light. +explain: Can you explain evolution?,Evolution is the process by which species change over time through natural selection and genetic variation. +explain: How does dark matter work?,Dark matter is an invisible substance that makes up most of the universe’s mass but does not emit light. +explain: How does cryptography work?,Cryptography is the science of securing information through encoding and encryption techniques. +explain: Give me an overview of photosynthesis.,Photosynthesis is the process by which plants convert sunlight into chemical energy. +explain: Give a brief explanation of the internet.,The internet is a global network of interconnected computers that enables communication and information sharing. +explain: Define robotics.,"Robotics is the field of designing, building, and operating robots for various applications." +explain: How does general relativity work?,"Einstein's general relativity theory describes how massive objects warp space-time, affecting gravity." +explain: Give me an overview of blockchain.,Blockchain is a decentralized digital ledger that records transactions across multiple computers securely. +explain: What is neural networks?,"Neural networks are computing systems inspired by the human brain, used in deep learning for pattern recognition." +explain: How does robotics work?,"Robotics is the field of designing, building, and operating robots for various applications." +explain: Give a brief explanation of climate change.,"Climate change refers to long-term alterations in temperature, precipitation, and weather patterns due to human activity." +explain: How does black holes work?,"A black hole is a region in space where gravity is so strong that nothing, not even light, can escape." +explain: How does blockchain work?,Blockchain is a decentralized digital ledger that records transactions across multiple computers securely. +explain: What are the key features of photosynthesis?,Photosynthesis is the process by which plants convert sunlight into chemical energy. +explain: Why is quantum computing important?,Quantum computing uses quantum bits (qubits) to perform calculations exponentially faster than classical computers. +explain: Give me an overview of biotechnology.,Biotechnology applies biological processes and organisms to develop new medical and industrial technologies. +explain: Define machine learning.,Machine learning is a subset of AI that enables systems to learn from data and improve without explicit programming. +explain: Define blockchain.,Blockchain is a decentralized digital ledger that records transactions across multiple computers securely. +explain: Why is cryptography important?,Cryptography is the science of securing information through encoding and encryption techniques. +explain: Give a brief explanation of genetic engineering.,Genetic engineering involves modifying an organism's DNA to achieve desirable traits. +explain: Give me an overview of genetic engineering.,Genetic engineering involves modifying an organism's DNA to achieve desirable traits. +explain: Give me an overview of neural networks.,"Neural networks are computing systems inspired by the human brain, used in deep learning for pattern recognition." +explain: What is the purpose of machine learning?,Machine learning is a subset of AI that enables systems to learn from data and improve without explicit programming. +explain: Define dark matter.,Dark matter is an invisible substance that makes up most of the universe’s mass but does not emit light. +explain: Can you explain evolution?,Evolution is the process by which species change over time through natural selection and genetic variation. +explain: How does black holes work?,"A black hole is a region in space where gravity is so strong that nothing, not even light, can escape." +explain: What is the human brain?,"The human brain is the central organ of the nervous system, responsible for thought, memory, and emotions." +explain: How does climate change work?,"Climate change refers to long-term alterations in temperature, precipitation, and weather patterns due to human activity." +explain: Can you explain black holes?,"A black hole is a region in space where gravity is so strong that nothing, not even light, can escape." +explain: Define neural networks.,"Neural networks are computing systems inspired by the human brain, used in deep learning for pattern recognition." +explain: What are the key features of neural networks?,"Neural networks are computing systems inspired by the human brain, used in deep learning for pattern recognition." +explain: How does quantum computing work?,Quantum computing uses quantum bits (qubits) to perform calculations exponentially faster than classical computers. +explain: What is the purpose of neural networks?,"Neural networks are computing systems inspired by the human brain, used in deep learning for pattern recognition." +explain: How does dark matter work?,Dark matter is an invisible substance that makes up most of the universe’s mass but does not emit light. +explain: What are the key features of the stock market?,"The stock market is a platform for buying and selling financial securities, influencing global economies." +explain: Can you explain general relativity?,"Einstein's general relativity theory describes how massive objects warp space-time, affecting gravity." +explain: How does genetic engineering work?,Genetic engineering involves modifying an organism's DNA to achieve desirable traits. +explain: How does neural networks work?,"Neural networks are computing systems inspired by the human brain, used in deep learning for pattern recognition." +explain: Give a brief explanation of blockchain.,Blockchain is a decentralized digital ledger that records transactions across multiple computers securely. +explain: How does dark matter work?,Dark matter is an invisible substance that makes up most of the universe’s mass but does not emit light. +explain: Give me an overview of biotechnology.,Biotechnology applies biological processes and organisms to develop new medical and industrial technologies. +explain: Define data science.,Data science involves analyzing and interpreting complex data to extract valuable insights. +explain: What is the purpose of machine learning?,Machine learning is a subset of AI that enables systems to learn from data and improve without explicit programming. +explain: What is black holes?,"A black hole is a region in space where gravity is so strong that nothing, not even light, can escape." +explain: Give a brief explanation of the human brain.,"The human brain is the central organ of the nervous system, responsible for thought, memory, and emotions." +explain: What are the key features of cryptography?,Cryptography is the science of securing information through encoding and encryption techniques. +explain: Define the internet.,The internet is a global network of interconnected computers that enables communication and information sharing. +explain: What is the purpose of the stock market?,"The stock market is a platform for buying and selling financial securities, influencing global economies." +explain: Can you explain evolution?,Evolution is the process by which species change over time through natural selection and genetic variation. +explain: What is evolution?,Evolution is the process by which species change over time through natural selection and genetic variation. +explain: Define cryptography.,Cryptography is the science of securing information through encoding and encryption techniques. +explain: What is biotechnology?,Biotechnology applies biological processes and organisms to develop new medical and industrial technologies. +explain: What is the purpose of data science?,Data science involves analyzing and interpreting complex data to extract valuable insights. +explain: How does neural networks work?,"Neural networks are computing systems inspired by the human brain, used in deep learning for pattern recognition." +explain: How does the human brain work?,"The human brain is the central organ of the nervous system, responsible for thought, memory, and emotions." +explain: What are the key features of genetic engineering?,Genetic engineering involves modifying an organism's DNA to achieve desirable traits. +explain: Give me an overview of photosynthesis.,Photosynthesis is the process by which plants convert sunlight into chemical energy. +explain: Can you explain blockchain?,Blockchain is a decentralized digital ledger that records transactions across multiple computers securely. +explain: Why is artificial intelligence important?,AI refers to computer systems capable of performing tasks that typically require human intelligence. +explain: Can you explain artificial intelligence?,AI refers to computer systems capable of performing tasks that typically require human intelligence. +explain: Can you explain the stock market?,"The stock market is a platform for buying and selling financial securities, influencing global economies." +explain: Give me an overview of general relativity.,"Einstein's general relativity theory describes how massive objects warp space-time, affecting gravity." +explain: Why is evolution important?,Evolution is the process by which species change over time through natural selection and genetic variation. +explain: Why is genetic engineering important?,Genetic engineering involves modifying an organism's DNA to achieve desirable traits. +explain: What is general relativity?,"Einstein's general relativity theory describes how massive objects warp space-time, affecting gravity." +explain: Give a brief explanation of the internet.,The internet is a global network of interconnected computers that enables communication and information sharing. +explain: Give a brief explanation of black holes.,"A black hole is a region in space where gravity is so strong that nothing, not even light, can escape." +explain: How does black holes work?,"A black hole is a region in space where gravity is so strong that nothing, not even light, can escape." +explain: Give me an overview of the internet.,The internet is a global network of interconnected computers that enables communication and information sharing. +explain: How does cryptography work?,Cryptography is the science of securing information through encoding and encryption techniques. +explain: Give a brief explanation of robotics.,"Robotics is the field of designing, building, and operating robots for various applications." +explain: What is the purpose of biotechnology?,Biotechnology applies biological processes and organisms to develop new medical and industrial technologies. +explain: Can you explain data science?,Data science involves analyzing and interpreting complex data to extract valuable insights. +explain: What are the key features of photosynthesis?,Photosynthesis is the process by which plants convert sunlight into chemical energy. +explain: Give me an overview of blockchain.,Blockchain is a decentralized digital ledger that records transactions across multiple computers securely. +explain: What is the purpose of biotechnology?,Biotechnology applies biological processes and organisms to develop new medical and industrial technologies. +explain: Give me an overview of blockchain.,Blockchain is a decentralized digital ledger that records transactions across multiple computers securely. +explain: How does photosynthesis work?,Photosynthesis is the process by which plants convert sunlight into chemical energy. +explain: Why is data science important?,Data science involves analyzing and interpreting complex data to extract valuable insights. +explain: Define neural networks.,"Neural networks are computing systems inspired by the human brain, used in deep learning for pattern recognition." +explain: Give me an overview of blockchain.,Blockchain is a decentralized digital ledger that records transactions across multiple computers securely. +explain: Can you explain photosynthesis?,Photosynthesis is the process by which plants convert sunlight into chemical energy. +explain: Define black holes.,"A black hole is a region in space where gravity is so strong that nothing, not even light, can escape." +explain: Define cryptography.,Cryptography is the science of securing information through encoding and encryption techniques. +explain: Give me an overview of black holes.,"A black hole is a region in space where gravity is so strong that nothing, not even light, can escape." diff --git a/Anul 3/Semestrul 2/Licenta/Practical/SqlScripts/DBCreate.sql b/Anul 3/Semestrul 2/Licenta/Practical/SqlScripts/DBCreate.sql new file mode 100644 index 0000000..ef543c8 --- /dev/null +++ b/Anul 3/Semestrul 2/Licenta/Practical/SqlScripts/DBCreate.sql @@ -0,0 +1 @@ +CREATE DATABASE StoreDB; \ No newline at end of file diff --git a/Anul 3/Semestrul 2/Licenta/Practical/SqlScripts/InventoryCreate.sql b/Anul 3/Semestrul 2/Licenta/Practical/SqlScripts/InventoryCreate.sql new file mode 100644 index 0000000..f0c45f7 --- /dev/null +++ b/Anul 3/Semestrul 2/Licenta/Practical/SqlScripts/InventoryCreate.sql @@ -0,0 +1,9 @@ +CREATE TABLE Inventory +( + hmy INT PRIMARY KEY, + sName VARCHAR(100) NOT NULL, + iQuantity INT NOT NULL, + dPrice DECIMAL(10, 2) NOT NULL, + sDescription VARCHAR(255), + sPhotoURL VARCHAR(255) +); \ No newline at end of file diff --git a/Anul 3/Semestrul 2/Licenta/Practical/SqlScripts/InventoryInsert.sql b/Anul 3/Semestrul 2/Licenta/Practical/SqlScripts/InventoryInsert.sql new file mode 100644 index 0000000..6114a4b --- /dev/null +++ b/Anul 3/Semestrul 2/Licenta/Practical/SqlScripts/InventoryInsert.sql @@ -0,0 +1,7 @@ +INSERT INTO Inventory + (hmy, sName, iQuantity, dPrice, sDescription, sPhotoURL) +VALUES + (1, 'Widget A', 100, 19.99, 'High-quality widget for various uses', 'https://i5.walmartimages.com/seo/Apple-iPhone-X-64GB-Unlocked-GSM-Phone-w-Dual-12MP-Camera-Space-Gray-B-Grade-Used_15c2b968-bb85-41a4-9292-b017f78fe797.a66ebbf32b6d53b6d6eb14c47434ac04.jpeg'), + (2, 'Gadget B', 50, 29.99, 'Versatile gadget with multiple features', 'https://www.zdnet.com/a/img/resize/9f3fcf92f17d47c88823e7f2c0f1454ecd3e5140/2024/09/19/8da68e24-08b1-467a-9062-a90a96c1d879/dsc02198.jpg?auto=webp&fit=crop&height=900&width=1200'), + (3, 'Tool C', 75, 15.49, 'Essential tool for DIY projects', 'https://www.adobe.com/uk/creativecloud/photography/discover/media_1b97e856d56c65e2461329a892f7d6a7eb5176e22.jpeg?width=1200&format=pjpg&optimize=medium'), + (4, 'Accessory D', 200, 9.99, 'Useful accessory for everyday tasks', 'https://cdn.thewirecutter.com/wp-content/media/2025/02/BEST-ANDROID-PHONES-2048px-samsung25ultra-hero.jpg?auto=webp&quality=75&width=1024'); \ No newline at end of file diff --git a/Anul 3/Semestrul 2/Licenta/Practical/SqlScripts/OrderTableCreate.sql b/Anul 3/Semestrul 2/Licenta/Practical/SqlScripts/OrderTableCreate.sql new file mode 100644 index 0000000..e894da2 --- /dev/null +++ b/Anul 3/Semestrul 2/Licenta/Practical/SqlScripts/OrderTableCreate.sql @@ -0,0 +1,18 @@ +CREATE TABLE [dbo].[Orders] +( + [hmy] INT IDENTITY (1, 1) NOT NULL, + [hCustomer] NVARCHAR (MAX) NOT NULL, + [sStatus] INT NOT NULL DEFAULT 0, + CONSTRAINT [PK_Orders] PRIMARY KEY CLUSTERED ([hmy] ASC) +); + +CREATE TABLE [dbo].[OrderItems] +( + [hmy] INT IDENTITY (1, 1) NOT NULL, + [hOrder] INT NOT NULL, + [hProduct] INT NOT NULL, + [iQuantity] INT NOT NULL DEFAULT 1, + [dPrice] DECIMAL (18, 2) NOT NULL, + [sProductName] NVARCHAR (MAX) NOT NULL, + CONSTRAINT [PK_OrderItems] PRIMARY KEY CLUSTERED ([hmy] ASC) +); \ No newline at end of file diff --git a/Anul 3/Semestrul 2/Licenta/Practical/k8s/apigateway.yaml b/Anul 3/Semestrul 2/Licenta/Practical/k8s/apigateway.yaml new file mode 100644 index 0000000..ea3ef9f --- /dev/null +++ b/Anul 3/Semestrul 2/Licenta/Practical/k8s/apigateway.yaml @@ -0,0 +1,43 @@ +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + name: apigateway +spec: + replicas: 1 + template: + metadata: + labels: + app: apigateway + spec: + containers: + - name: apigateway + image: apigateway:latest + ports: + - containerPort: 80 + env: + - name: ASPNETCORE_URLS + value: http://*:80 + resources: + requests: + memory: "128Mi" + cpu: "100m" + limits: + memory: "256Mi" + cpu: "200m" + selector: + matchLabels: + app: apigateway +--- +apiVersion: v1 +kind: Service +metadata: + name: apigateway +spec: + type: LoadBalancer + ports: + - port: 80 + targetPort: 80 + nodePort: 32003 + selector: + app: apigateway \ No newline at end of file diff --git a/Anul 3/Semestrul 2/Licenta/Practical/k8s/frontend.yaml b/Anul 3/Semestrul 2/Licenta/Practical/k8s/frontend.yaml new file mode 100644 index 0000000..2c0d626 --- /dev/null +++ b/Anul 3/Semestrul 2/Licenta/Practical/k8s/frontend.yaml @@ -0,0 +1,57 @@ +# kubernetes-deployment-service.yaml + +# ---- Deployment ---- +# This object defines how to run and manage your application pods. +apiVersion: apps/v1 +kind: Deployment +metadata: + name: frontend # Name of the Deployment + labels: + app: react-app # Label to identify resources related to this app +spec: + replicas: 1 # Number of desired pods (you can adjust this) + selector: + matchLabels: + app: frontend # This must match the labels in the Pod template + template: # Defines the Pod that will be created + metadata: + labels: + app: frontend # Labels applied to each Pod + spec: + containers: + - name: frontend # Name of the container within the Pod + image: frontend:latest # <<< IMPORTANT: Replace with your actual image name and tag + # Ensure this image is accessible by your Kubernetes cluster. + imagePullPolicy: Always # Or "IfNotPresent" if you prefer, especially for "latest" tags + ports: + - containerPort: 80 # The port your Nginx server is listening on inside the container + resources: + requests: + cpu: "100m" + memory: "128Mi" + limits: + cpu: "200m" + memory: "256Mi" + +--- + +# ---- Service ---- +# This object defines how to access your application. +apiVersion: v1 +kind: Service +metadata: + name: react-app-service # Name of the Service + labels: + app: frontend # Label to identify resources related to this app +spec: + type: LoadBalancer # Exposes the Service externally using a cloud provider's load balancer. + # Alternatives: + # - NodePort: Exposes the Service on each Node's IP at a static port. + # - ClusterIP: Exposes the Service on a cluster-internal IP (default). + # - Ingress: For more advanced HTTP/HTTPS routing (requires an Ingress controller). + selector: + app: frontend # This must match the labels of the Pods you want to target (from the Deployment) + ports: + - protocol: TCP + port: 3000 # The port the Service will be available on (externally or within the cluster) + targetPort: 80 # The port on the Pods (containerPort) that the Service will forward traffic to diff --git a/Anul 3/Semestrul 2/Licenta/Practical/k8s/frontendadmin.yaml b/Anul 3/Semestrul 2/Licenta/Practical/k8s/frontendadmin.yaml new file mode 100644 index 0000000..84df0e6 --- /dev/null +++ b/Anul 3/Semestrul 2/Licenta/Practical/k8s/frontendadmin.yaml @@ -0,0 +1,57 @@ +# kubernetes-deployment-service.yaml + +# ---- Deployment ---- +# This object defines how to run and manage your application pods. +apiVersion: apps/v1 +kind: Deployment +metadata: + name: frontendadmin # Name of the Deployment + labels: + app: react-app # Label to identify resources related to this app +spec: + replicas: 1 # Number of desired pods (you can adjust this) + selector: + matchLabels: + app: frontendadmin # This must match the labels in the Pod template + template: # Defines the Pod that will be created + metadata: + labels: + app: frontendadmin # Labels applied to each Pod + spec: + containers: + - name: frontendadmin # Name of the container within the Pod + image: frontendadmin:latest # <<< IMPORTANT: Replace with your actual image name and tag + # Ensure this image is accessible by your Kubernetes cluster. + imagePullPolicy: Always # Or "IfNotPresent" if you prefer, especially for "latest" tags + ports: + - containerPort: 80 # The port your Nginx server is listening on inside the container + resources: + requests: + cpu: "100m" + memory: "128Mi" + limits: + cpu: "200m" + memory: "256Mi" + +--- + +# ---- Service ---- +# This object defines how to access your application. +apiVersion: v1 +kind: Service +metadata: + name: frontendadmin-service # Name of the Service + labels: + app: frontendadmin # Label to identify resources related to this app +spec: + type: LoadBalancer # Exposes the Service externally using a cloud provider's load balancer. + # Alternatives: + # - NodePort: Exposes the Service on each Node's IP at a static port. + # - ClusterIP: Exposes the Service on a cluster-internal IP (default). + # - Ingress: For more advanced HTTP/HTTPS routing (requires an Ingress controller). + selector: + app: frontendadmin # This must match the labels of the Pods you want to target (from the Deployment) + ports: + - protocol: TCP + port: 3001 # The port the Service will be available on (externally or within the cluster) + targetPort: 80 # The port on the Pods (containerPort) that the Service will forward traffic to diff --git a/Anul 3/Semestrul 2/Licenta/Practical/k8s/inventoryservice.yaml b/Anul 3/Semestrul 2/Licenta/Practical/k8s/inventoryservice.yaml new file mode 100644 index 0000000..6706b1e --- /dev/null +++ b/Anul 3/Semestrul 2/Licenta/Practical/k8s/inventoryservice.yaml @@ -0,0 +1,70 @@ +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + name: inventoryservice +spec: + replicas: 1 + template: + metadata: + labels: + app: inventoryservice + annotations: + prometheus.io/scrape: "true" + prometheus.io/path: "/metrics" + prometheus.io/port: "80" + spec: + containers: + - name: inventoryservice + image: inventoryservice:latest + ports: + - containerPort: 80 + env: + - name: ASPNETCORE_URLS + value: http://*:80 + resources: + requests: + memory: "128Mi" + cpu: "150m" + limits: + memory: "256Mi" + cpu: "200m" + selector: + matchLabels: + app: inventoryservice +--- +apiVersion: v1 +kind: Service +metadata: + name: inventoryservice + labels: + app: inventoryservice +spec: + type: LoadBalancer + ports: + - port: 8081 + targetPort: 80 + nodePort: 32002 + name: inventoryport + selector: + app: inventoryservice + +--- +apiVersion: autoscaling/v2 +kind: HorizontalPodAutoscaler +metadata: + name: inventoryservice-hpa +spec: + scaleTargetRef: + apiVersion: apps/v1 + kind: Deployment + name: inventoryservice + minReplicas: 1 + maxReplicas: 3 + metrics: + - type: Resource + resource: + name: cpu + target: + type: Utilization + averageUtilization: 80 \ No newline at end of file diff --git a/Anul 3/Semestrul 2/Licenta/Practical/k8s/orderservice.yaml b/Anul 3/Semestrul 2/Licenta/Practical/k8s/orderservice.yaml new file mode 100644 index 0000000..2e542f8 --- /dev/null +++ b/Anul 3/Semestrul 2/Licenta/Practical/k8s/orderservice.yaml @@ -0,0 +1,70 @@ +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + name: orderservice +spec: + replicas: 1 + template: + metadata: + labels: + app: orderservice + annotations: + prometheus.io/scrape: "true" + prometheus.io/path: "/metrics" + prometheus.io/port: "80" + spec: + containers: + - name: orderservice + image: orderservice:latest + ports: + - containerPort: 80 + env: + - name: ASPNETCORE_URLS + value: http://*:80 + resources: + requests: + memory: "128Mi" + cpu: "150m" + limits: + memory: "256Mi" + cpu: "200m" + selector: + matchLabels: + app: orderservice +--- +apiVersion: v1 +kind: Service +metadata: + name: orderservice + labels: + app: orderservice +spec: + type: LoadBalancer + ports: + - port: 8080 + targetPort: 80 + nodePort: 32001 + name: orderport + selector: + app: orderservice + +--- +apiVersion: autoscaling/v2 +kind: HorizontalPodAutoscaler +metadata: + name: orderservice-hpa +spec: + scaleTargetRef: + apiVersion: apps/v1 + kind: Deployment + name: orderservice + minReplicas: 1 + maxReplicas: 3 + metrics: + - type: Resource + resource: + name: cpu + target: + type: Utilization + averageUtilization: 80 \ No newline at end of file diff --git a/Anul 3/Semestrul 2/Licenta/Practical/k8s/paymentservice.yaml b/Anul 3/Semestrul 2/Licenta/Practical/k8s/paymentservice.yaml new file mode 100644 index 0000000..49618fb --- /dev/null +++ b/Anul 3/Semestrul 2/Licenta/Practical/k8s/paymentservice.yaml @@ -0,0 +1,70 @@ +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + name: paymentservice +spec: + replicas: 1 + template: + metadata: + labels: + app: paymentservice + annotations: + prometheus.io/scrape: "true" + prometheus.io/path: "/metrics" + prometheus.io/port: "80" + spec: + containers: + - name: paymentservice + image: paymentservice:latest + ports: + - containerPort: 80 + env: + - name: ASPNETCORE_URLS + value: http://*:80 + resources: + requests: + memory: "128Mi" + cpu: "150m" + limits: + memory: "256Mi" + cpu: "200m" + selector: + matchLabels: + app: paymentservice +--- +apiVersion: v1 +kind: Service +metadata: + name: paymentservice + labels: + app: paymentservice +spec: + type: LoadBalancer + ports: + - port: 8082 + targetPort: 80 + nodePort: 32005 + name: paymentport + selector: + app: paymentservice + +--- +apiVersion: autoscaling/v2 +kind: HorizontalPodAutoscaler +metadata: + name: paymentservice-hpa +spec: + scaleTargetRef: + apiVersion: apps/v1 + kind: Deployment + name: paymentservice + minReplicas: 1 + maxReplicas: 3 + metrics: + - type: Resource + resource: + name: cpu + target: + type: Utilization + averageUtilization: 80 \ No newline at end of file diff --git a/Anul 3/Semestrul 2/Licenta/Practical/k8s/prometheus.yaml b/Anul 3/Semestrul 2/Licenta/Practical/k8s/prometheus.yaml new file mode 100644 index 0000000..64411df --- /dev/null +++ b/Anul 3/Semestrul 2/Licenta/Practical/k8s/prometheus.yaml @@ -0,0 +1,57 @@ +apiVersion: v1 +kind: Service +metadata: + # Creating a new service to expose the existing one. + # This avoids modifying the original service managed by a package manager like Helm. + name: prometheus-grafana-external + namespace: monitoring + labels: + app.kubernetes.io/name: grafana-external +spec: + # Exposes the Service externally using a cloud provider's load balancer. + type: LoadBalancer + ports: + - name: http + # The port the service is exposed on externally and internally. + # The load balancer will forward traffic from this port. + port: 9000 + # The port on the pod that the service forwards traffic to. + # Based on your original command, this is likely 3000 for Grafana. + targetPort: 3000 + protocol: TCP + # This selector is crucial. It must match the labels of the pods you want to target. + # The 'prometheus-grafana' service likely targets pods with a label like this. + # Please verify the correct labels for your Grafana pods. + selector: + app.kubernetes.io/instance: prometheus + app.kubernetes.io/name: grafana + +--- + + +apiVersion: v1 +kind: Service +metadata: + # Creating a new service to avoid modifying the original one. + name: prometheus-external + namespace: monitoring + labels: + app.kubernetes.io/name: prometheus-external +spec: + # This type will provision an external load balancer. + type: LoadBalancer + ports: + - name: http-prometheus + protocol: TCP + # The external port the load balancer will listen on. + port: 9090 + # The port on the Prometheus pods to forward traffic to. + targetPort: 9090 + # This selector is crucial. It tells the service which pods to send traffic to. + # For the kube-prometheus stack, the pods are typically labeled like this. + # Please verify this matches your setup. + selector: + app.kubernetes.io/name: prometheus + # It's possible an instance label is also required, such as: + # app.kubernetes.io/instance: prometheus-kube-prometheus-prometheus + # Add it to the selector if your pods have it. diff --git a/Anul 3/Semestrul 2/Licenta/Practical/k8s/rabbitmq.yaml b/Anul 3/Semestrul 2/Licenta/Practical/k8s/rabbitmq.yaml new file mode 100644 index 0000000..0756361 --- /dev/null +++ b/Anul 3/Semestrul 2/Licenta/Practical/k8s/rabbitmq.yaml @@ -0,0 +1,38 @@ +apiVersion: v1 +kind: Service +metadata: + name: rabbitmq-service +spec: + selector: + app: rabbitmq + ports: + - protocol: TCP + port: 5672 + targetPort: 5672 +--- +apiVersion: apps/v1 +kind: StatefulSet +metadata: + name: rabbitmq +spec: + serviceName: "rabbitmq-service" + replicas: 1 + selector: + matchLabels: + app: rabbitmq + template: + metadata: + labels: + app: rabbitmq + spec: + containers: + - name: rabbitmq + image: rabbitmq:3-management + ports: + - containerPort: 5672 + - containerPort: 15672 + env: + - name: RABBITMQ_DEFAULT_USER + value: "user" + - name: RABBITMQ_DEFAULT_PASS + value: "password" \ No newline at end of file diff --git a/Anul 3/Semestrul 2/Licenta/Practical/k8s/servicemonitor.yaml b/Anul 3/Semestrul 2/Licenta/Practical/k8s/servicemonitor.yaml new file mode 100644 index 0000000..e2a0ea7 --- /dev/null +++ b/Anul 3/Semestrul 2/Licenta/Practical/k8s/servicemonitor.yaml @@ -0,0 +1,43 @@ +apiVersion: monitoring.coreos.com/v1 +kind: ServiceMonitor +metadata: + name: inventoryservice-servicemonitor + labels: + release: prometheus # Ensure this label matches your Prometheus Operator release +spec: + selector: + matchLabels: + app: inventoryservice + endpoints: + - port: inventoryport + path: /metrics + +--- + +apiVersion: monitoring.coreos.com/v1 +kind: ServiceMonitor +metadata: + name: orderservice-servicemonitor + labels: + release: prometheus # Ensure this label matches your Prometheus Operator release +spec: + selector: + matchLabels: + app: orderservice + endpoints: + - port: orderport + path: /metrics +--- +apiVersion: monitoring.coreos.com/v1 +kind: ServiceMonitor +metadata: + name: paymentservice-servicemonitor + labels: + release: prometheus # Ensure this label matches your Prometheus Operator release +spec: + selector: + matchLabels: + app: paymentservice + endpoints: + - port: paymentport + path: /metrics \ No newline at end of file diff --git a/Anul 3/Semestrul 2/Licenta/Practical/k8s/sqldata.yaml b/Anul 3/Semestrul 2/Licenta/Practical/k8s/sqldata.yaml new file mode 100644 index 0000000..788096b --- /dev/null +++ b/Anul 3/Semestrul 2/Licenta/Practical/k8s/sqldata.yaml @@ -0,0 +1,70 @@ +kind: PersistentVolumeClaim +apiVersion: v1 +metadata: + name: mssql-data +spec: + accessModes: + - ReadWriteOnce + resources: + requests: + storage: 8Gi +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + name: mssql-deployment +spec: + replicas: 1 + selector: + matchLabels: + app: mssql + template: + metadata: + labels: + app: mssql + spec: + terminationGracePeriodSeconds: 30 + hostname: mssqlinst + securityContext: + fsGroup: 10001 + containers: + - name: mssql + image: mcr.microsoft.com/mssql/server:2022-latest + resources: + requests: + memory: "2G" + cpu: "2000m" + limits: + memory: "2G" + cpu: "2000m" + ports: + - containerPort: 1433 + env: + - name: MSSQL_PID + value: "Developer" + - name: ACCEPT_EULA + value: "Y" + - name: MSSQL_SA_PASSWORD + value: "TestPass123!" + volumeMounts: + - name: mssqldb + mountPath: /var/opt/mssql + + volumes: + - name: mssqldb + persistentVolumeClaim: + claimName: mssql-data + +--- +apiVersion: v1 +kind: Service +metadata: + name: mssql-deployment +spec: + selector: + app: mssql + ports: + - protocol: TCP + port: 1433 + targetPort: 1433 + type: LoadBalancer \ No newline at end of file diff --git a/Anul 3/Semestrul 2/Licenta/Practical/src/ApiGateway/.dockerignore b/Anul 3/Semestrul 2/Licenta/Practical/src/ApiGateway/.dockerignore new file mode 100644 index 0000000..9395e06 --- /dev/null +++ b/Anul 3/Semestrul 2/Licenta/Practical/src/ApiGateway/.dockerignore @@ -0,0 +1,7 @@ +**/.vs +**/.vscode +**/bin +**/obj +Dockerfile +.dockerignore +README.md \ No newline at end of file diff --git a/Anul 3/Semestrul 2/Licenta/Practical/src/ApiGateway/ApiGateway.csproj b/Anul 3/Semestrul 2/Licenta/Practical/src/ApiGateway/ApiGateway.csproj new file mode 100644 index 0000000..b823f80 --- /dev/null +++ b/Anul 3/Semestrul 2/Licenta/Practical/src/ApiGateway/ApiGateway.csproj @@ -0,0 +1,15 @@ + + + + net9.0 + enable + enable + + + + + + + + + diff --git a/Anul 3/Semestrul 2/Licenta/Practical/src/ApiGateway/ApiGateway.http b/Anul 3/Semestrul 2/Licenta/Practical/src/ApiGateway/ApiGateway.http new file mode 100644 index 0000000..89e4334 --- /dev/null +++ b/Anul 3/Semestrul 2/Licenta/Practical/src/ApiGateway/ApiGateway.http @@ -0,0 +1,6 @@ +@ApiGateway_HostAddress = http://localhost:5221 + +GET {{ApiGateway_HostAddress}}/weatherforecast/ +Accept: application/json + +### diff --git a/Anul 3/Semestrul 2/Licenta/Practical/src/ApiGateway/PollyForwarderHttpClientFactory.cs b/Anul 3/Semestrul 2/Licenta/Practical/src/ApiGateway/PollyForwarderHttpClientFactory.cs new file mode 100644 index 0000000..8177c21 --- /dev/null +++ b/Anul 3/Semestrul 2/Licenta/Practical/src/ApiGateway/PollyForwarderHttpClientFactory.cs @@ -0,0 +1,50 @@ +using System.Diagnostics; +using System.Net.Http; +using Microsoft.Extensions.Http; +using Microsoft.Extensions.Logging; +using Polly; +using Yarp.ReverseProxy.Forwarder; + +namespace ApiGateway; + +// Corrected: Implements the interface directly +public class PollyForwarderHttpClientFactory : IForwarderHttpClientFactory +{ + private readonly ILogger _logger; + + public PollyForwarderHttpClientFactory(ILogger logger) + { + _logger = logger; + } + + // This is the method we need to implement from the IForwarderHttpClientFactory interface + public HttpMessageInvoker CreateClient(ForwarderHttpClientContext context) + { + // Get the policies, passing in the logger + var retryPolicy = PollyPolicies.GetRetryPolicy(_logger); + var circuitBreakerPolicy = PollyPolicies.GetCircuitBreakerPolicy(_logger); + var policy = Policy.WrapAsync(circuitBreakerPolicy, retryPolicy); + + // Create a Polly PolicyHttpMessageHandler + var policyHandler = new PolicyHttpMessageHandler(policy); + + // This is the standard handler that YARP would use. + // It's important to configure it similarly for proper operation. + var innerHandler = new SocketsHttpHandler + { + UseProxy = false, + AllowAutoRedirect = false, + AutomaticDecompression = System.Net.DecompressionMethods.None, + UseCookies = false, + EnableMultipleHttp2Connections = true, + ActivityHeadersPropagator = new ReverseProxyPropagator(DistributedContextPropagator.Current), + ConnectTimeout = System.TimeSpan.FromSeconds(15), + }; + + // Chain the Polly handler with the inner handler + policyHandler.InnerHandler = innerHandler; + + // Return a new HttpMessageInvoker with our chained handler + return new HttpMessageInvoker(policyHandler, disposeHandler: true); + } +} \ No newline at end of file diff --git a/Anul 3/Semestrul 2/Licenta/Practical/src/ApiGateway/PollyPolicies.cs b/Anul 3/Semestrul 2/Licenta/Practical/src/ApiGateway/PollyPolicies.cs new file mode 100644 index 0000000..e4896a9 --- /dev/null +++ b/Anul 3/Semestrul 2/Licenta/Practical/src/ApiGateway/PollyPolicies.cs @@ -0,0 +1,61 @@ +using System; +using System.Net; +using System.Net.Http; +using Microsoft.Extensions.Logging; +using Polly; +using Polly.Extensions.Http; + +namespace ApiGateway; + +public static class PollyPolicies +{ + public static IAsyncPolicy GetRetryPolicy(ILogger logger) + { + return HttpPolicyExtensions + .HandleTransientHttpError() + .OrResult(msg => msg.StatusCode == HttpStatusCode.NotFound) + .WaitAndRetryAsync(3, + retryAttempt => TimeSpan.FromSeconds(Math.Pow(2, retryAttempt)), + onRetry: (outcome, timespan, retryAttempt, context) => + { + // Log the retry attempt + logger.LogWarning( + "Retrying request. Attempt {RetryAttempt}. Waiting {SleepDuration}ms. " + + "Reason: {StatusCode} - {ExceptionMessage} - {Namespace}", + retryAttempt, + timespan.TotalMilliseconds, + outcome.Result?.StatusCode, + outcome.Exception?.Message, + typeof(PollyPolicies).Namespace + ); + }); + } + + public static IAsyncPolicy GetCircuitBreakerPolicy(ILogger logger) + { + return HttpPolicyExtensions + .HandleTransientHttpError() + .CircuitBreakerAsync(5, TimeSpan.FromSeconds(30), + onBreak: (outcome, timespan, context) => + { + // Log when the circuit breaks + logger.LogError( + "Circuit broken for {BreakDuration}ms due to {StatusCode} - {ExceptionMessage} - {Namespace}", + timespan.TotalMilliseconds, + outcome.Result?.StatusCode, + outcome.Exception?.Message, + typeof(PollyPolicies).Namespace + ); + }, + onReset: (context) => + { + // Log when the circuit resets + logger.LogInformation("Circuit has been reset."); + }, + onHalfOpen: () => + { + // Log when the circuit is half-open + logger.LogWarning("Circuit is now half-open. The next request will test the service."); + }); + } +} \ No newline at end of file diff --git a/Anul 3/Semestrul 2/Licenta/Practical/src/ApiGateway/Program.cs b/Anul 3/Semestrul 2/Licenta/Practical/src/ApiGateway/Program.cs new file mode 100644 index 0000000..596d690 --- /dev/null +++ b/Anul 3/Semestrul 2/Licenta/Practical/src/ApiGateway/Program.cs @@ -0,0 +1,39 @@ +using ApiGateway; +using Yarp.ReverseProxy.Forwarder; + +var builder = WebApplication.CreateBuilder(args); + +builder.Services.AddReverseProxy() + .LoadFromConfig(builder.Configuration.GetSection("ReverseProxy")); + +builder.Services.AddSingleton(); + + +builder.Services.AddCors(options => +{ + options.AddPolicy("AllowFrontend", + policy => + { + policy.WithOrigins("http://localhost:3000") // The origin of your frontend app + .AllowAnyHeader() + .AllowAnyMethod() + .AllowCredentials(); // <-- THIS IS CRITICAL + }); + options.AddPolicy("AllowFrontendAdmin", + policy => + { + policy.WithOrigins("http://localhost:3001") // The origin of your frontend app + .AllowAnyHeader() + .AllowAnyMethod() + .AllowCredentials(); // <-- THIS IS CRITICAL + }); + +}); +var app = builder.Build(); + +app.UseCors("AllowFrontend"); +app.UseCors("AllowFrontendAdmin"); + +app.MapReverseProxy(); + +app.Run(); \ No newline at end of file diff --git a/Anul 3/Semestrul 2/Licenta/Practical/src/ApiGateway/Properties/launchSettings.json b/Anul 3/Semestrul 2/Licenta/Practical/src/ApiGateway/Properties/launchSettings.json new file mode 100644 index 0000000..c816c5d --- /dev/null +++ b/Anul 3/Semestrul 2/Licenta/Practical/src/ApiGateway/Properties/launchSettings.json @@ -0,0 +1,23 @@ +{ + "$schema": "https://json.schemastore.org/launchsettings.json", + "profiles": { + "http": { + "commandName": "Project", + "dotnetRunMessages": true, + "launchBrowser": false, + "applicationUrl": "http://localhost:5221", + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + } + }, + "https": { + "commandName": "Project", + "dotnetRunMessages": true, + "launchBrowser": false, + "applicationUrl": "https://localhost:7121;http://localhost:5221", + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + } + } + } +} diff --git a/Anul 3/Semestrul 2/Licenta/Practical/src/ApiGateway/appsettings.Development.json b/Anul 3/Semestrul 2/Licenta/Practical/src/ApiGateway/appsettings.Development.json new file mode 100644 index 0000000..ff66ba6 --- /dev/null +++ b/Anul 3/Semestrul 2/Licenta/Practical/src/ApiGateway/appsettings.Development.json @@ -0,0 +1,8 @@ +{ + "Logging": { + "LogLevel": { + "Default": "Information", + "Microsoft.AspNetCore": "Warning" + } + } +} diff --git a/Anul 3/Semestrul 2/Licenta/Practical/src/ApiGateway/appsettings.json b/Anul 3/Semestrul 2/Licenta/Practical/src/ApiGateway/appsettings.json new file mode 100644 index 0000000..d76645a --- /dev/null +++ b/Anul 3/Semestrul 2/Licenta/Practical/src/ApiGateway/appsettings.json @@ -0,0 +1,51 @@ +{ + "Logging": { + "LogLevel": { + "Default": "Information", + "Microsoft.AspNetCore": "Warning" + } + }, + "AllowedHosts": "*", + "ReverseProxy": { + "Routes": { + "order-route": { + "ClusterId": "order-cluster", + "Match": { + "Path": "order/{**catch-all}" + }, + "Transforms": [{ "PathPrefix": "/api" }] + }, + "inventory-route": { + "ClusterId": "inventory-cluster", + "Match": { + "Path": "inventory/{**catch-all}" + }, + "Transforms": [{ "PathPrefix": "/api" }] + }, + "payment-route": { + "ClusterId": "payment-cluster", + "Match": { + "Path": "payment/{**catch-all}" + }, + "Transforms": [{ "PathPrefix": "/api" }] + } + }, + "Clusters": { + "order-cluster": { + "Destinations": { + "destination1": { "Address": "http://orderservice:8080" } + } + }, + "inventory-cluster": { + "Destinations": { + "destination1": { "Address": "http://inventoryservice:8081" } + } + }, + "payment-cluster": { + "Destinations": { + "destination1": { "Address": "http://paymentservice:8082" } + } + } + } + } +} diff --git a/Anul 3/Semestrul 2/Licenta/Practical/src/FrontEndAdmin/.dockerignore b/Anul 3/Semestrul 2/Licenta/Practical/src/FrontEndAdmin/.dockerignore new file mode 100644 index 0000000..175f95f --- /dev/null +++ b/Anul 3/Semestrul 2/Licenta/Practical/src/FrontEndAdmin/.dockerignore @@ -0,0 +1,7 @@ +node_modules +npm-debug.log +Dockerfile +.dockerignore +.git +.gitignore +.env \ No newline at end of file diff --git a/Anul 3/Semestrul 2/Licenta/Practical/src/FrontEndAdmin/.gitignore b/Anul 3/Semestrul 2/Licenta/Practical/src/FrontEndAdmin/.gitignore new file mode 100644 index 0000000..a547bf3 --- /dev/null +++ b/Anul 3/Semestrul 2/Licenta/Practical/src/FrontEndAdmin/.gitignore @@ -0,0 +1,24 @@ +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* +lerna-debug.log* + +node_modules +dist +dist-ssr +*.local + +# Editor directories and files +.vscode/* +!.vscode/extensions.json +.idea +.DS_Store +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? diff --git a/Anul 3/Semestrul 2/Licenta/Practical/src/FrontEndAdmin/README.md b/Anul 3/Semestrul 2/Licenta/Practical/src/FrontEndAdmin/README.md new file mode 100644 index 0000000..da98444 --- /dev/null +++ b/Anul 3/Semestrul 2/Licenta/Practical/src/FrontEndAdmin/README.md @@ -0,0 +1,54 @@ +# React + TypeScript + Vite + +This template provides a minimal setup to get React working in Vite with HMR and some ESLint rules. + +Currently, two official plugins are available: + +- [@vitejs/plugin-react](https://github.com/vitejs/vite-plugin-react/blob/main/packages/plugin-react) uses [Babel](https://babeljs.io/) for Fast Refresh +- [@vitejs/plugin-react-swc](https://github.com/vitejs/vite-plugin-react/blob/main/packages/plugin-react-swc) uses [SWC](https://swc.rs/) for Fast Refresh + +## Expanding the ESLint configuration + +If you are developing a production application, we recommend updating the configuration to enable type-aware lint rules: + +```js +export default tseslint.config({ + extends: [ + // Remove ...tseslint.configs.recommended and replace with this + ...tseslint.configs.recommendedTypeChecked, + // Alternatively, use this for stricter rules + ...tseslint.configs.strictTypeChecked, + // Optionally, add this for stylistic rules + ...tseslint.configs.stylisticTypeChecked, + ], + languageOptions: { + // other options... + parserOptions: { + project: ['./tsconfig.node.json', './tsconfig.app.json'], + tsconfigRootDir: import.meta.dirname, + }, + }, +}) +``` + +You can also install [eslint-plugin-react-x](https://github.com/Rel1cx/eslint-react/tree/main/packages/plugins/eslint-plugin-react-x) and [eslint-plugin-react-dom](https://github.com/Rel1cx/eslint-react/tree/main/packages/plugins/eslint-plugin-react-dom) for React-specific lint rules: + +```js +// eslint.config.js +import reactX from 'eslint-plugin-react-x' +import reactDom from 'eslint-plugin-react-dom' + +export default tseslint.config({ + plugins: { + // Add the react-x and react-dom plugins + 'react-x': reactX, + 'react-dom': reactDom, + }, + rules: { + // other rules... + // Enable its recommended typescript rules + ...reactX.configs['recommended-typescript'].rules, + ...reactDom.configs.recommended.rules, + }, +}) +``` diff --git a/Anul 3/Semestrul 2/Licenta/Practical/src/FrontEndAdmin/eslint.config.js b/Anul 3/Semestrul 2/Licenta/Practical/src/FrontEndAdmin/eslint.config.js new file mode 100644 index 0000000..092408a --- /dev/null +++ b/Anul 3/Semestrul 2/Licenta/Practical/src/FrontEndAdmin/eslint.config.js @@ -0,0 +1,28 @@ +import js from '@eslint/js' +import globals from 'globals' +import reactHooks from 'eslint-plugin-react-hooks' +import reactRefresh from 'eslint-plugin-react-refresh' +import tseslint from 'typescript-eslint' + +export default tseslint.config( + { ignores: ['dist'] }, + { + extends: [js.configs.recommended, ...tseslint.configs.recommended], + files: ['**/*.{ts,tsx}'], + languageOptions: { + ecmaVersion: 2020, + globals: globals.browser, + }, + plugins: { + 'react-hooks': reactHooks, + 'react-refresh': reactRefresh, + }, + rules: { + ...reactHooks.configs.recommended.rules, + 'react-refresh/only-export-components': [ + 'warn', + { allowConstantExport: true }, + ], + }, + }, +) diff --git a/Anul 3/Semestrul 2/Licenta/Practical/src/FrontEndAdmin/index.html b/Anul 3/Semestrul 2/Licenta/Practical/src/FrontEndAdmin/index.html new file mode 100644 index 0000000..e4b78ea --- /dev/null +++ b/Anul 3/Semestrul 2/Licenta/Practical/src/FrontEndAdmin/index.html @@ -0,0 +1,13 @@ + + + + + + + Vite + React + TS + + +

+ + + diff --git a/Anul 3/Semestrul 2/Licenta/Practical/src/FrontEndAdmin/package-lock.json b/Anul 3/Semestrul 2/Licenta/Practical/src/FrontEndAdmin/package-lock.json new file mode 100644 index 0000000..55e37f0 --- /dev/null +++ b/Anul 3/Semestrul 2/Licenta/Practical/src/FrontEndAdmin/package-lock.json @@ -0,0 +1,3187 @@ +{ + "name": "frontendadmin", + "version": "0.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "frontendadmin", + "version": "0.0.0", + "dependencies": { + "bootstrap": "^5.3.6", + "bootstrap-icons": "^1.13.1", + "react": "^19.1.0", + "react-dom": "^19.1.0" + }, + "devDependencies": { + "@eslint/js": "^9.25.0", + "@types/react": "^19.1.2", + "@types/react-dom": "^19.1.2", + "@vitejs/plugin-react": "^4.4.1", + "eslint": "^9.25.0", + "eslint-plugin-react-hooks": "^5.2.0", + "eslint-plugin-react-refresh": "^0.4.19", + "globals": "^16.0.0", + "typescript": "~5.8.3", + "typescript-eslint": "^8.30.1", + "vite": "^6.3.5" + } + }, + "node_modules/@ampproject/remapping": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", + "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", + "dev": true, + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz", + "integrity": "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==", + "dev": true, + "dependencies": { + "@babel/helper-validator-identifier": "^7.27.1", + "js-tokens": "^4.0.0", + "picocolors": "^1.1.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.27.5", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.27.5.tgz", + "integrity": "sha512-KiRAp/VoJaWkkte84TvUd9qjdbZAdiqyvMxrGl1N6vzFogKmaLgoM3L1kgtLicp2HP5fBJS8JrZKLVIZGVJAVg==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.27.4", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.27.4.tgz", + "integrity": "sha512-bXYxrXFubeYdvB0NhD/NBB3Qi6aZeV20GOWVI47t2dkecCEoneR4NPVcb7abpXDEvejgrUfFtG6vG/zxAKmg+g==", + "dev": true, + "dependencies": { + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.27.1", + "@babel/generator": "^7.27.3", + "@babel/helper-compilation-targets": "^7.27.2", + "@babel/helper-module-transforms": "^7.27.3", + "@babel/helpers": "^7.27.4", + "@babel/parser": "^7.27.4", + "@babel/template": "^7.27.2", + "@babel/traverse": "^7.27.4", + "@babel/types": "^7.27.3", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/generator": { + "version": "7.27.5", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.27.5.tgz", + "integrity": "sha512-ZGhA37l0e/g2s1Cnzdix0O3aLYm66eF8aufiVteOgnwxgnRP8GoyMj7VWsgWnQbVKXyge7hqrFh2K2TQM6t1Hw==", + "dev": true, + "dependencies": { + "@babel/parser": "^7.27.5", + "@babel/types": "^7.27.3", + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25", + "jsesc": "^3.0.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.27.2", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.27.2.tgz", + "integrity": "sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==", + "dev": true, + "dependencies": { + "@babel/compat-data": "^7.27.2", + "@babel/helper-validator-option": "^7.27.1", + "browserslist": "^4.24.0", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.27.1.tgz", + "integrity": "sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==", + "dev": true, + "dependencies": { + "@babel/traverse": "^7.27.1", + "@babel/types": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.27.3", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.27.3.tgz", + "integrity": "sha512-dSOvYwvyLsWBeIRyOeHXp5vPj5l1I011r52FM1+r1jCERv+aFXYk4whgQccYEGYxK2H3ZAIA8nuPkQ0HaUo3qg==", + "dev": true, + "dependencies": { + "@babel/helper-module-imports": "^7.27.1", + "@babel/helper-validator-identifier": "^7.27.1", + "@babel/traverse": "^7.27.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.27.1.tgz", + "integrity": "sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", + "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.27.1.tgz", + "integrity": "sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz", + "integrity": "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.27.6", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.27.6.tgz", + "integrity": "sha512-muE8Tt8M22638HU31A3CgfSUciwz1fhATfoVai05aPXGor//CdWDCbnlY1yvBPo07njuVOCNGCSp/GTt12lIug==", + "dev": true, + "dependencies": { + "@babel/template": "^7.27.2", + "@babel/types": "^7.27.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.27.5", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.27.5.tgz", + "integrity": "sha512-OsQd175SxWkGlzbny8J3K8TnnDD0N3lrIUtB92xwyRpzaenGZhxDvxN/JgU00U3CDZNj9tPuDJ5H0WS4Nt3vKg==", + "dev": true, + "dependencies": { + "@babel/types": "^7.27.3" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-self": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.27.1.tgz", + "integrity": "sha512-6UzkCs+ejGdZ5mFFC/OCUrv028ab2fp1znZmCZjAOBKiBK2jXD1O+BPSfX8X2qjJ75fZBMSnQn3Rq2mrBJK2mw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-source": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.27.1.tgz", + "integrity": "sha512-zbwoTsBruTeKB9hSq73ha66iFeJHuaFkUbwvqElnygoNbj/jHRsSeokowZFN3CZ64IvEqcmmkVe89OPXc7ldAw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/template": { + "version": "7.27.2", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.27.2.tgz", + "integrity": "sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.27.1", + "@babel/parser": "^7.27.2", + "@babel/types": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.27.4", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.27.4.tgz", + "integrity": "sha512-oNcu2QbHqts9BtOWJosOVJapWjBDSxGCpFvikNR5TGDYDQf3JwpIoMzIKrvfoti93cLfPJEG4tH9SPVeyCGgdA==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.27.1", + "@babel/generator": "^7.27.3", + "@babel/parser": "^7.27.4", + "@babel/template": "^7.27.2", + "@babel/types": "^7.27.3", + "debug": "^4.3.1", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse/node_modules/globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/types": { + "version": "7.27.6", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.27.6.tgz", + "integrity": "sha512-ETyHEk2VHHvl9b9jZP5IHPavHYk57EhanlRRuae9XCpb/j5bDCbPPMOBfCWhnl/7EDJz0jEMCi/RhccCE8r1+Q==", + "dev": true, + "dependencies": { + "@babel/helper-string-parser": "^7.27.1", + "@babel/helper-validator-identifier": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.5.tgz", + "integrity": "sha512-9o3TMmpmftaCMepOdA5k/yDw8SfInyzWWTjYTFCX3kPSDJMROQTb8jg+h9Cnwnmm1vOzvxN7gIfB5V2ewpjtGA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.5.tgz", + "integrity": "sha512-AdJKSPeEHgi7/ZhuIPtcQKr5RQdo6OO2IL87JkianiMYMPbCtot9fxPbrMiBADOWWm3T2si9stAiVsGbTQFkbA==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.5.tgz", + "integrity": "sha512-VGzGhj4lJO+TVGV1v8ntCZWJktV7SGCs3Pn1GRWI1SBFtRALoomm8k5E9Pmwg3HOAal2VDc2F9+PM/rEY6oIDg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.5.tgz", + "integrity": "sha512-D2GyJT1kjvO//drbRT3Hib9XPwQeWd9vZoBJn+bu/lVsOZ13cqNdDeqIF/xQ5/VmWvMduP6AmXvylO/PIc2isw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.5.tgz", + "integrity": "sha512-GtaBgammVvdF7aPIgH2jxMDdivezgFu6iKpmT+48+F8Hhg5J/sfnDieg0aeG/jfSvkYQU2/pceFPDKlqZzwnfQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.5.tgz", + "integrity": "sha512-1iT4FVL0dJ76/q1wd7XDsXrSW+oLoquptvh4CLR4kITDtqi2e/xwXwdCVH8hVHU43wgJdsq7Gxuzcs6Iq/7bxQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.5.tgz", + "integrity": "sha512-nk4tGP3JThz4La38Uy/gzyXtpkPW8zSAmoUhK9xKKXdBCzKODMc2adkB2+8om9BDYugz+uGV7sLmpTYzvmz6Sw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.5.tgz", + "integrity": "sha512-PrikaNjiXdR2laW6OIjlbeuCPrPaAl0IwPIaRv+SMV8CiM8i2LqVUHFC1+8eORgWyY7yhQY+2U2fA55mBzReaw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.5.tgz", + "integrity": "sha512-cPzojwW2okgh7ZlRpcBEtsX7WBuqbLrNXqLU89GxWbNt6uIg78ET82qifUy3W6OVww6ZWobWub5oqZOVtwolfw==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.5.tgz", + "integrity": "sha512-Z9kfb1v6ZlGbWj8EJk9T6czVEjjq2ntSYLY2cw6pAZl4oKtfgQuS4HOq41M/BcoLPzrUbNd+R4BXFyH//nHxVg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.5.tgz", + "integrity": "sha512-sQ7l00M8bSv36GLV95BVAdhJ2QsIbCuCjh/uYrWiMQSUuV+LpXwIqhgJDcvMTj+VsQmqAHL2yYaasENvJ7CDKA==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.5.tgz", + "integrity": "sha512-0ur7ae16hDUC4OL5iEnDb0tZHDxYmuQyhKhsPBV8f99f6Z9KQM02g33f93rNH5A30agMS46u2HP6qTdEt6Q1kg==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.5.tgz", + "integrity": "sha512-kB/66P1OsHO5zLz0i6X0RxlQ+3cu0mkxS3TKFvkb5lin6uwZ/ttOkP3Z8lfR9mJOBk14ZwZ9182SIIWFGNmqmg==", + "cpu": [ + "mips64el" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.5.tgz", + "integrity": "sha512-UZCmJ7r9X2fe2D6jBmkLBMQetXPXIsZjQJCjgwpVDz+YMcS6oFR27alkgGv3Oqkv07bxdvw7fyB71/olceJhkQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.5.tgz", + "integrity": "sha512-kTxwu4mLyeOlsVIFPfQo+fQJAV9mh24xL+y+Bm6ej067sYANjyEw1dNHmvoqxJUCMnkBdKpvOn0Ahql6+4VyeA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.5.tgz", + "integrity": "sha512-K2dSKTKfmdh78uJ3NcWFiqyRrimfdinS5ErLSn3vluHNeHVnBAFWC8a4X5N+7FgVE1EjXS1QDZbpqZBjfrqMTQ==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.5.tgz", + "integrity": "sha512-uhj8N2obKTE6pSZ+aMUbqq+1nXxNjZIIjCjGLfsWvVpy7gKCOL6rsY1MhRh9zLtUtAI7vpgLMK6DxjO8Qm9lJw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.5.tgz", + "integrity": "sha512-pwHtMP9viAy1oHPvgxtOv+OkduK5ugofNTVDilIzBLpoWAM16r7b/mxBvfpuQDpRQFMfuVr5aLcn4yveGvBZvw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.5.tgz", + "integrity": "sha512-WOb5fKrvVTRMfWFNCroYWWklbnXH0Q5rZppjq0vQIdlsQKuw6mdSihwSo4RV/YdQ5UCKKvBy7/0ZZYLBZKIbwQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.5.tgz", + "integrity": "sha512-7A208+uQKgTxHd0G0uqZO8UjK2R0DDb4fDmERtARjSHWxqMTye4Erz4zZafx7Di9Cv+lNHYuncAkiGFySoD+Mw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.5.tgz", + "integrity": "sha512-G4hE405ErTWraiZ8UiSoesH8DaCsMm0Cay4fsFWOOUcz8b8rC6uCvnagr+gnioEjWn0wC+o1/TAHt+It+MpIMg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.5.tgz", + "integrity": "sha512-l+azKShMy7FxzY0Rj4RCt5VD/q8mG/e+mDivgspo+yL8zW7qEwctQ6YqKX34DTEleFAvCIUviCFX1SDZRSyMQA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.5.tgz", + "integrity": "sha512-O2S7SNZzdcFG7eFKgvwUEZ2VG9D/sn/eIiz8XRZ1Q/DO5a3s76Xv0mdBzVM5j5R639lXQmPmSo0iRpHqUUrsxw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.5.tgz", + "integrity": "sha512-onOJ02pqs9h1iMJ1PQphR+VZv8qBMQ77Klcsqv9CNW2w6yLqoURLcgERAIurY6QE63bbLuqgP9ATqajFLK5AMQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.5.tgz", + "integrity": "sha512-TXv6YnJ8ZMVdX+SXWVBo/0p8LTcrUYngpWjvm91TMjjBQii7Oz11Lw5lbDV5Y0TzuhSJHwiH4hEtC1I42mMS0g==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.7.0.tgz", + "integrity": "sha512-dyybb3AcajC7uha6CvhdVRJqaKyn7w2YKqKyAN37NKYgZT36w+iRb0Dymmc5qEJ549c/S31cMMSFd75bteCpCw==", + "dev": true, + "dependencies": { + "eslint-visitor-keys": "^3.4.3" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/eslint-utils/node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.12.1", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.1.tgz", + "integrity": "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==", + "dev": true, + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/config-array": { + "version": "0.20.0", + "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.20.0.tgz", + "integrity": "sha512-fxlS1kkIjx8+vy2SjuCB94q3htSNrufYTXubwiBFeaQHbH6Ipi43gFJq2zCMt6PHhImH3Xmr0NksKDvchWlpQQ==", + "dev": true, + "dependencies": { + "@eslint/object-schema": "^2.1.6", + "debug": "^4.3.1", + "minimatch": "^3.1.2" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/config-helpers": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.2.2.tgz", + "integrity": "sha512-+GPzk8PlG0sPpzdU5ZvIRMPidzAnZDl/s9L+y13iodqvb8leL53bTannOrQ/Im7UkpsmFU5Ily5U60LWixnmLg==", + "dev": true, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/core": { + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.14.0.tgz", + "integrity": "sha512-qIbV0/JZr7iSDjqAc60IqbLdsj9GDt16xQtWD+B78d/HAlvysGdZZ6rpJHGAc2T0FQx1X6thsSPdnoiGKdNtdg==", + "dev": true, + "dependencies": { + "@types/json-schema": "^7.0.15" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.1.tgz", + "integrity": "sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ==", + "dev": true, + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^10.0.1", + "globals": "^14.0.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint/eslintrc/node_modules/globals": { + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", + "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==", + "dev": true, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@eslint/js": { + "version": "9.28.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.28.0.tgz", + "integrity": "sha512-fnqSjGWd/CoIp4EXIxWVK/sHA6DOHN4+8Ix2cX5ycOY7LG0UY8nHCU5pIp2eaE1Mc7Qd8kHspYNzYXT2ojPLzg==", + "dev": true, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://eslint.org/donate" + } + }, + "node_modules/@eslint/object-schema": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.6.tgz", + "integrity": "sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA==", + "dev": true, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/plugin-kit": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.3.1.tgz", + "integrity": "sha512-0J+zgWxHN+xXONWIyPWKFMgVuJoZuGiIFu8yxk7RJjxkzpGmyja5wRFqZIVtjDVOQpV+Rw0iOAjYPE2eQyjr0w==", + "dev": true, + "dependencies": { + "@eslint/core": "^0.14.0", + "levn": "^0.4.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@humanfs/core": { + "version": "0.19.1", + "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz", + "integrity": "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==", + "dev": true, + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanfs/node": { + "version": "0.16.6", + "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.6.tgz", + "integrity": "sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw==", + "dev": true, + "dependencies": { + "@humanfs/core": "^0.19.1", + "@humanwhocodes/retry": "^0.3.0" + }, + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanfs/node/node_modules/@humanwhocodes/retry": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.3.1.tgz", + "integrity": "sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==", + "dev": true, + "engines": { + "node": ">=18.18" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "dev": true, + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/retry": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.3.tgz", + "integrity": "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==", + "dev": true, + "engines": { + "node": ">=18.18" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.8.tgz", + "integrity": "sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==", + "dev": true, + "dependencies": { + "@jridgewell/set-array": "^1.2.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", + "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", + "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", + "dev": true + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.25", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", + "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", + "dev": true, + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@popperjs/core": { + "version": "2.11.8", + "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz", + "integrity": "sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==", + "peer": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/popperjs" + } + }, + "node_modules/@rolldown/pluginutils": { + "version": "1.0.0-beta.9", + "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-beta.9.tgz", + "integrity": "sha512-e9MeMtVWo186sgvFFJOPGy7/d2j2mZhLJIdVW0C/xDluuOvymEATqz6zKsP0ZmXGzQtqlyjz5sC1sYQUoJG98w==", + "dev": true + }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.41.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.41.1.tgz", + "integrity": "sha512-NELNvyEWZ6R9QMkiytB4/L4zSEaBC03KIXEghptLGLZWJ6VPrL63ooZQCOnlx36aQPGhzuOMwDerC1Eb2VmrLw==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.41.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.41.1.tgz", + "integrity": "sha512-DXdQe1BJ6TK47ukAoZLehRHhfKnKg9BjnQYUu9gzhI8Mwa1d2fzxA1aw2JixHVl403bwp1+/o/NhhHtxWJBgEA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.41.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.41.1.tgz", + "integrity": "sha512-5afxvwszzdulsU2w8JKWwY8/sJOLPzf0e1bFuvcW5h9zsEg+RQAojdW0ux2zyYAz7R8HvvzKCjLNJhVq965U7w==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.41.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.41.1.tgz", + "integrity": "sha512-egpJACny8QOdHNNMZKf8xY0Is6gIMz+tuqXlusxquWu3F833DcMwmGM7WlvCO9sB3OsPjdC4U0wHw5FabzCGZg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-freebsd-arm64": { + "version": "4.41.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.41.1.tgz", + "integrity": "sha512-DBVMZH5vbjgRk3r0OzgjS38z+atlupJ7xfKIDJdZZL6sM6wjfDNo64aowcLPKIx7LMQi8vybB56uh1Ftck/Atg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-freebsd-x64": { + "version": "4.41.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.41.1.tgz", + "integrity": "sha512-3FkydeohozEskBxNWEIbPfOE0aqQgB6ttTkJ159uWOFn42VLyfAiyD9UK5mhu+ItWzft60DycIN1Xdgiy8o/SA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.41.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.41.1.tgz", + "integrity": "sha512-wC53ZNDgt0pqx5xCAgNunkTzFE8GTgdZ9EwYGVcg+jEjJdZGtq9xPjDnFgfFozQI/Xm1mh+D9YlYtl+ueswNEg==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.41.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.41.1.tgz", + "integrity": "sha512-jwKCca1gbZkZLhLRtsrka5N8sFAaxrGz/7wRJ8Wwvq3jug7toO21vWlViihG85ei7uJTpzbXZRcORotE+xyrLA==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.41.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.41.1.tgz", + "integrity": "sha512-g0UBcNknsmmNQ8V2d/zD2P7WWfJKU0F1nu0k5pW4rvdb+BIqMm8ToluW/eeRmxCared5dD76lS04uL4UaNgpNA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.41.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.41.1.tgz", + "integrity": "sha512-XZpeGB5TKEZWzIrj7sXr+BEaSgo/ma/kCgrZgL0oo5qdB1JlTzIYQKel/RmhT6vMAvOdM2teYlAaOGJpJ9lahg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loongarch64-gnu": { + "version": "4.41.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.41.1.tgz", + "integrity": "sha512-bkCfDJ4qzWfFRCNt5RVV4DOw6KEgFTUZi2r2RuYhGWC8WhCA8lCAJhDeAmrM/fdiAH54m0mA0Vk2FGRPyzI+tw==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { + "version": "4.41.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.41.1.tgz", + "integrity": "sha512-3mr3Xm+gvMX+/8EKogIZSIEF0WUu0HL9di+YWlJpO8CQBnoLAEL/roTCxuLncEdgcfJcvA4UMOf+2dnjl4Ut1A==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.41.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.41.1.tgz", + "integrity": "sha512-3rwCIh6MQ1LGrvKJitQjZFuQnT2wxfU+ivhNBzmxXTXPllewOF7JR1s2vMX/tWtUYFgphygxjqMl76q4aMotGw==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-musl": { + "version": "4.41.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.41.1.tgz", + "integrity": "sha512-LdIUOb3gvfmpkgFZuccNa2uYiqtgZAz3PTzjuM5bH3nvuy9ty6RGc/Q0+HDFrHrizJGVpjnTZ1yS5TNNjFlklw==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.41.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.41.1.tgz", + "integrity": "sha512-oIE6M8WC9ma6xYqjvPhzZYk6NbobIURvP/lEbh7FWplcMO6gn7MM2yHKA1eC/GvYwzNKK/1LYgqzdkZ8YFxR8g==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.41.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.41.1.tgz", + "integrity": "sha512-cWBOvayNvA+SyeQMp79BHPK8ws6sHSsYnK5zDcsC3Hsxr1dgTABKjMnMslPq1DvZIp6uO7kIWhiGwaTdR4Og9A==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.41.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.41.1.tgz", + "integrity": "sha512-y5CbN44M+pUCdGDlZFzGGBSKCA4A/J2ZH4edTYSSxFg7ce1Xt3GtydbVKWLlzL+INfFIZAEg1ZV6hh9+QQf9YQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.41.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.41.1.tgz", + "integrity": "sha512-lZkCxIrjlJlMt1dLO/FbpZbzt6J/A8p4DnqzSa4PWqPEUUUnzXLeki/iyPLfV0BmHItlYgHUqJe+3KiyydmiNQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.41.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.41.1.tgz", + "integrity": "sha512-+psFT9+pIh2iuGsxFYYa/LhS5MFKmuivRsx9iPJWNSGbh2XVEjk90fmpUEjCnILPEPJnikAU6SFDiEUyOv90Pg==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.41.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.41.1.tgz", + "integrity": "sha512-Wq2zpapRYLfi4aKxf2Xff0tN+7slj2d4R87WEzqw7ZLsVvO5zwYCIuEGSZYiK41+GlwUo1HiR+GdkLEJnCKTCw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@types/babel__core": { + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", + "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", + "dev": true, + "dependencies": { + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7", + "@types/babel__generator": "*", + "@types/babel__template": "*", + "@types/babel__traverse": "*" + } + }, + "node_modules/@types/babel__generator": { + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.27.0.tgz", + "integrity": "sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==", + "dev": true, + "dependencies": { + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__template": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", + "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", + "dev": true, + "dependencies": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__traverse": { + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.7.tgz", + "integrity": "sha512-dkO5fhS7+/oos4ciWxyEyjWe48zmG6wbCheo/G2ZnHx4fs3EU6YC6UM8rk56gAjNJ9P3MTH2jo5jb92/K6wbng==", + "dev": true, + "dependencies": { + "@babel/types": "^7.20.7" + } + }, + "node_modules/@types/estree": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", + "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", + "dev": true + }, + "node_modules/@types/json-schema": { + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", + "dev": true + }, + "node_modules/@types/react": { + "version": "19.1.6", + "resolved": "https://registry.npmjs.org/@types/react/-/react-19.1.6.tgz", + "integrity": "sha512-JeG0rEWak0N6Itr6QUx+X60uQmN+5t3j9r/OVDtWzFXKaj6kD1BwJzOksD0FF6iWxZlbE1kB0q9vtnU2ekqa1Q==", + "dev": true, + "dependencies": { + "csstype": "^3.0.2" + } + }, + "node_modules/@types/react-dom": { + "version": "19.1.6", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.1.6.tgz", + "integrity": "sha512-4hOiT/dwO8Ko0gV1m/TJZYk3y0KBnY9vzDh7W+DH17b2HFSOGgdj33dhihPeuy3l0q23+4e+hoXHV6hCC4dCXw==", + "dev": true, + "peerDependencies": { + "@types/react": "^19.0.0" + } + }, + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "8.33.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.33.1.tgz", + "integrity": "sha512-TDCXj+YxLgtvxvFlAvpoRv9MAncDLBV2oT9Bd7YBGC/b/sEURoOYuIwLI99rjWOfY3QtDzO+mk0n4AmdFExW8A==", + "dev": true, + "dependencies": { + "@eslint-community/regexpp": "^4.10.0", + "@typescript-eslint/scope-manager": "8.33.1", + "@typescript-eslint/type-utils": "8.33.1", + "@typescript-eslint/utils": "8.33.1", + "@typescript-eslint/visitor-keys": "8.33.1", + "graphemer": "^1.4.0", + "ignore": "^7.0.0", + "natural-compare": "^1.4.0", + "ts-api-utils": "^2.1.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^8.33.1", + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <5.9.0" + } + }, + "node_modules/@typescript-eslint/eslint-plugin/node_modules/ignore": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz", + "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/@typescript-eslint/parser": { + "version": "8.33.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.33.1.tgz", + "integrity": "sha512-qwxv6dq682yVvgKKp2qWwLgRbscDAYktPptK4JPojCwwi3R9cwrvIxS4lvBpzmcqzR4bdn54Z0IG1uHFskW4dA==", + "dev": true, + "dependencies": { + "@typescript-eslint/scope-manager": "8.33.1", + "@typescript-eslint/types": "8.33.1", + "@typescript-eslint/typescript-estree": "8.33.1", + "@typescript-eslint/visitor-keys": "8.33.1", + "debug": "^4.3.4" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <5.9.0" + } + }, + "node_modules/@typescript-eslint/project-service": { + "version": "8.33.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.33.1.tgz", + "integrity": "sha512-DZR0efeNklDIHHGRpMpR5gJITQpu6tLr9lDJnKdONTC7vvzOlLAG/wcfxcdxEWrbiZApcoBCzXqU/Z458Za5Iw==", + "dev": true, + "dependencies": { + "@typescript-eslint/tsconfig-utils": "^8.33.1", + "@typescript-eslint/types": "^8.33.1", + "debug": "^4.3.4" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <5.9.0" + } + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "8.33.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.33.1.tgz", + "integrity": "sha512-dM4UBtgmzHR9bS0Rv09JST0RcHYearoEoo3pG5B6GoTR9XcyeqX87FEhPo+5kTvVfKCvfHaHrcgeJQc6mrDKrA==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "8.33.1", + "@typescript-eslint/visitor-keys": "8.33.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/tsconfig-utils": { + "version": "8.33.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.33.1.tgz", + "integrity": "sha512-STAQsGYbHCF0/e+ShUQ4EatXQ7ceh3fBCXkNU7/MZVKulrlq1usH7t2FhxvCpuCi5O5oi1vmVaAjrGeL71OK1g==", + "dev": true, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <5.9.0" + } + }, + "node_modules/@typescript-eslint/type-utils": { + "version": "8.33.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.33.1.tgz", + "integrity": "sha512-1cG37d9xOkhlykom55WVwG2QRNC7YXlxMaMzqw2uPeJixBFfKWZgaP/hjAObqMN/u3fr5BrTwTnc31/L9jQ2ww==", + "dev": true, + "dependencies": { + "@typescript-eslint/typescript-estree": "8.33.1", + "@typescript-eslint/utils": "8.33.1", + "debug": "^4.3.4", + "ts-api-utils": "^2.1.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <5.9.0" + } + }, + "node_modules/@typescript-eslint/types": { + "version": "8.33.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.33.1.tgz", + "integrity": "sha512-xid1WfizGhy/TKMTwhtVOgalHwPtV8T32MS9MaH50Cwvz6x6YqRIPdD2WvW0XaqOzTV9p5xdLY0h/ZusU5Lokg==", + "dev": true, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "8.33.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.33.1.tgz", + "integrity": "sha512-+s9LYcT8LWjdYWu7IWs7FvUxpQ/DGkdjZeE/GGulHvv8rvYwQvVaUZ6DE+j5x/prADUgSbbCWZ2nPI3usuVeOA==", + "dev": true, + "dependencies": { + "@typescript-eslint/project-service": "8.33.1", + "@typescript-eslint/tsconfig-utils": "8.33.1", + "@typescript-eslint/types": "8.33.1", + "@typescript-eslint/visitor-keys": "8.33.1", + "debug": "^4.3.4", + "fast-glob": "^3.3.2", + "is-glob": "^4.0.3", + "minimatch": "^9.0.4", + "semver": "^7.6.0", + "ts-api-utils": "^2.1.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <5.9.0" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/semver": { + "version": "7.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", + "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@typescript-eslint/utils": { + "version": "8.33.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.33.1.tgz", + "integrity": "sha512-52HaBiEQUaRYqAXpfzWSR2U3gxk92Kw006+xZpElaPMg3C4PgM+A5LqwoQI1f9E5aZ/qlxAZxzm42WX+vn92SQ==", + "dev": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.7.0", + "@typescript-eslint/scope-manager": "8.33.1", + "@typescript-eslint/types": "8.33.1", + "@typescript-eslint/typescript-estree": "8.33.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <5.9.0" + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "8.33.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.33.1.tgz", + "integrity": "sha512-3i8NrFcZeeDHJ+7ZUuDkGT+UHq+XoFGsymNK2jZCOHcfEzRQ0BdpRtdpSx/Iyf3MHLWIcLS0COuOPibKQboIiQ==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "8.33.1", + "eslint-visitor-keys": "^4.2.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@vitejs/plugin-react": { + "version": "4.5.1", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.5.1.tgz", + "integrity": "sha512-uPZBqSI0YD4lpkIru6M35sIfylLGTyhGHvDZbNLuMA73lMlwJKz5xweH7FajfcCAc2HnINciejA9qTz0dr0M7A==", + "dev": true, + "dependencies": { + "@babel/core": "^7.26.10", + "@babel/plugin-transform-react-jsx-self": "^7.25.9", + "@babel/plugin-transform-react-jsx-source": "^7.25.9", + "@rolldown/pluginutils": "1.0.0-beta.9", + "@types/babel__core": "^7.20.5", + "react-refresh": "^0.17.0" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "peerDependencies": { + "vite": "^4.2.0 || ^5.0.0 || ^6.0.0" + } + }, + "node_modules/acorn": { + "version": "8.14.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.1.tgz", + "integrity": "sha512-OvQ/2pUDKmgfCg++xsTX1wGxfTaszcHVcTctW4UJB4hibJx2HXxxO5UmVgyjMa+ZDsiaf5wWLXYpRWMmBI0QHg==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true + }, + "node_modules/bootstrap": { + "version": "5.3.6", + "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-5.3.6.tgz", + "integrity": "sha512-jX0GAcRzvdwISuvArXn3m7KZscWWFAf1MKBcnzaN02qWMb3jpMoUX4/qgeiGzqyIb4ojulRzs89UCUmGcFSzTA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/twbs" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/bootstrap" + } + ], + "peerDependencies": { + "@popperjs/core": "^2.11.8" + } + }, + "node_modules/bootstrap-icons": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/bootstrap-icons/-/bootstrap-icons-1.13.1.tgz", + "integrity": "sha512-ijombt4v6bv5CLeXvRWKy7CuM3TRTuPEuGaGKvTV5cz65rQSY8RQ2JcHt6b90cBBAC7s8fsf2EkQDldzCoXUjw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/twbs" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/bootstrap" + } + ] + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "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==", + "dev": true, + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browserslist": { + "version": "4.25.0", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.25.0.tgz", + "integrity": "sha512-PJ8gYKeS5e/whHBh8xrwYK+dAvEj7JXtz6uTucnMRB8OiGTsKccFekoRrjajPBHV8oOY+2tI4uxeceSimKwMFA==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "caniuse-lite": "^1.0.30001718", + "electron-to-chromium": "^1.5.160", + "node-releases": "^2.0.19", + "update-browserslist-db": "^1.1.3" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001721", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001721.tgz", + "integrity": "sha512-cOuvmUVtKrtEaoKiO0rSc29jcjwMwX5tOHDy4MgVFEWiUXj4uBMJkwI8MDySkgXidpMiHUcviogAvFi4pA2hDQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ] + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true + }, + "node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true + }, + "node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "dev": true, + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/csstype": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", + "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==", + "dev": true + }, + "node_modules/debug": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz", + "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==", + "dev": true, + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true + }, + "node_modules/electron-to-chromium": { + "version": "1.5.165", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.165.tgz", + "integrity": "sha512-naiMx1Z6Nb2TxPU6fiFrUrDTjyPMLdTtaOd2oLmG8zVSg2hCWGkhPyxwk+qRmZ1ytwVqUv0u7ZcDA5+ALhaUtw==", + "dev": true + }, + "node_modules/esbuild": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.5.tgz", + "integrity": "sha512-P8OtKZRv/5J5hhz0cUAdu/cLuPIKXpQl1R9pZtvmHWQvrAUVd0UNIPT4IB4W3rNOqVO0rlqHmCIbSwxh/c9yUQ==", + "dev": true, + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.25.5", + "@esbuild/android-arm": "0.25.5", + "@esbuild/android-arm64": "0.25.5", + "@esbuild/android-x64": "0.25.5", + "@esbuild/darwin-arm64": "0.25.5", + "@esbuild/darwin-x64": "0.25.5", + "@esbuild/freebsd-arm64": "0.25.5", + "@esbuild/freebsd-x64": "0.25.5", + "@esbuild/linux-arm": "0.25.5", + "@esbuild/linux-arm64": "0.25.5", + "@esbuild/linux-ia32": "0.25.5", + "@esbuild/linux-loong64": "0.25.5", + "@esbuild/linux-mips64el": "0.25.5", + "@esbuild/linux-ppc64": "0.25.5", + "@esbuild/linux-riscv64": "0.25.5", + "@esbuild/linux-s390x": "0.25.5", + "@esbuild/linux-x64": "0.25.5", + "@esbuild/netbsd-arm64": "0.25.5", + "@esbuild/netbsd-x64": "0.25.5", + "@esbuild/openbsd-arm64": "0.25.5", + "@esbuild/openbsd-x64": "0.25.5", + "@esbuild/sunos-x64": "0.25.5", + "@esbuild/win32-arm64": "0.25.5", + "@esbuild/win32-ia32": "0.25.5", + "@esbuild/win32-x64": "0.25.5" + } + }, + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint": { + "version": "9.28.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.28.0.tgz", + "integrity": "sha512-ocgh41VhRlf9+fVpe7QKzwLj9c92fDiqOj8Y3Sd4/ZmVA4Btx4PlUYPq4pp9JDyupkf1upbEXecxL2mwNV7jPQ==", + "dev": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.12.1", + "@eslint/config-array": "^0.20.0", + "@eslint/config-helpers": "^0.2.1", + "@eslint/core": "^0.14.0", + "@eslint/eslintrc": "^3.3.1", + "@eslint/js": "9.28.0", + "@eslint/plugin-kit": "^0.3.1", + "@humanfs/node": "^0.16.6", + "@humanwhocodes/module-importer": "^1.0.1", + "@humanwhocodes/retry": "^0.4.2", + "@types/estree": "^1.0.6", + "@types/json-schema": "^7.0.15", + "ajv": "^6.12.4", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.6", + "debug": "^4.3.2", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^8.3.0", + "eslint-visitor-keys": "^4.2.0", + "espree": "^10.3.0", + "esquery": "^1.5.0", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^8.0.0", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://eslint.org/donate" + }, + "peerDependencies": { + "jiti": "*" + }, + "peerDependenciesMeta": { + "jiti": { + "optional": true + } + } + }, + "node_modules/eslint-plugin-react-hooks": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-5.2.0.tgz", + "integrity": "sha512-+f15FfK64YQwZdJNELETdn5ibXEUQmW1DZL6KXhNnc2heoy/sg9VJJeT7n8TlMWouzWqSWavFkIhHyIbIAEapg==", + "dev": true, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0" + } + }, + "node_modules/eslint-plugin-react-refresh": { + "version": "0.4.20", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-refresh/-/eslint-plugin-react-refresh-0.4.20.tgz", + "integrity": "sha512-XpbHQ2q5gUF8BGOX4dHe+71qoirYMhApEPZ7sfhF/dNnOF1UXnCMGZf79SFTBO7Bz5YEIT4TMieSlJBWhP9WBA==", + "dev": true, + "peerDependencies": { + "eslint": ">=8.40" + } + }, + "node_modules/eslint-scope": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.3.0.tgz", + "integrity": "sha512-pUNxi75F8MJ/GdeKtVLSbYg4ZI34J6C0C7sbL4YOp2exGwen7ZsuBqKzUhXd0qMQ362yET3z+uPwKeg/0C2XCQ==", + "dev": true, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz", + "integrity": "sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==", + "dev": true, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/espree": { + "version": "10.3.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-10.3.0.tgz", + "integrity": "sha512-0QYC8b24HWY8zjRnDTL6RiHfDbAWn63qb4LMj1Z4b076A4une81+z03Kg7l7mn/48PUTqoLptSXez8oknU8Clg==", + "dev": true, + "dependencies": { + "acorn": "^8.14.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^4.2.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/esquery": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz", + "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==", + "dev": true, + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true + }, + "node_modules/fast-glob": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", + "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", + "dev": true, + "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.8" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-glob/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==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true + }, + "node_modules/fastq": { + "version": "1.19.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.19.1.tgz", + "integrity": "sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==", + "dev": true, + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/file-entry-cache": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", + "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", + "dev": true, + "dependencies": { + "flat-cache": "^4.0.0" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "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==", + "dev": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/flat-cache": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", + "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", + "dev": true, + "dependencies": { + "flatted": "^3.2.9", + "keyv": "^4.5.4" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/flatted": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.3.tgz", + "integrity": "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==", + "dev": 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==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/globals": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-16.2.0.tgz", + "integrity": "sha512-O+7l9tPdHCU320IigZZPj5zmRCFG9xHmx9cU8FqU2Rp+JN714seHV+2S9+JslCpY4gJwU2vOGox0wzgae/MCEg==", + "dev": true, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/graphemer": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", + "dev": true + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/ignore": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/import-fresh": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", + "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", + "dev": true, + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true + }, + "node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsesc": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", + "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", + "dev": true, + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": true + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dev": true + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true, + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "dev": true, + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true + }, + "node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/micromatch": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "dev": true, + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true + }, + "node_modules/nanoid": { + "version": "3.3.11", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", + "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", + "dev": true, + "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/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true + }, + "node_modules/node-releases": { + "version": "2.0.19", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.19.tgz", + "integrity": "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==", + "dev": true + }, + "node_modules/optionator": { + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", + "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", + "dev": true, + "dependencies": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.5" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "dev": true + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/postcss": { + "version": "8.5.4", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.4.tgz", + "integrity": "sha512-QSa9EBe+uwlGTFmHsPKokv3B/oEMQZxfqW0QqNCyhpa6mB1afzulwn8hihglqAb2pOw+BJgNlmXQ8la2VeHB7w==", + "dev": true, + "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.11", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "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==", + "dev": true, + "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/react": { + "version": "19.1.0", + "resolved": "https://registry.npmjs.org/react/-/react-19.1.0.tgz", + "integrity": "sha512-FS+XFBNvn3GTAWq26joslQgWNoFu08F4kl0J4CgdNKADkdSGXQyTCnKteIAJy96Br6YbpEU1LSzV5dYtjMkMDg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-dom": { + "version": "19.1.0", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.1.0.tgz", + "integrity": "sha512-Xs1hdnE+DyKgeHJeJznQmYMIBG3TKIHJJT95Q58nHLSrElKlGQqDTR2HQ9fx5CN/Gk6Vh/kupBTDLU11/nDk/g==", + "dependencies": { + "scheduler": "^0.26.0" + }, + "peerDependencies": { + "react": "^19.1.0" + } + }, + "node_modules/react-refresh": { + "version": "0.17.0", + "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.17.0.tgz", + "integrity": "sha512-z6F7K9bV85EfseRCp2bzrpyQ0Gkw1uLoCel9XBVWPg/TjRj94SkJzUTGfOa4bs7iJvBWtQG0Wq7wnI0syw3EBQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/reusify": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", + "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", + "dev": true, + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rollup": { + "version": "4.41.1", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.41.1.tgz", + "integrity": "sha512-cPmwD3FnFv8rKMBc1MxWCwVQFxwf1JEmSX3iQXrRVVG15zerAIXRjMFVWnd5Q5QvgKF7Aj+5ykXFhUl+QGnyOw==", + "dev": true, + "dependencies": { + "@types/estree": "1.0.7" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.41.1", + "@rollup/rollup-android-arm64": "4.41.1", + "@rollup/rollup-darwin-arm64": "4.41.1", + "@rollup/rollup-darwin-x64": "4.41.1", + "@rollup/rollup-freebsd-arm64": "4.41.1", + "@rollup/rollup-freebsd-x64": "4.41.1", + "@rollup/rollup-linux-arm-gnueabihf": "4.41.1", + "@rollup/rollup-linux-arm-musleabihf": "4.41.1", + "@rollup/rollup-linux-arm64-gnu": "4.41.1", + "@rollup/rollup-linux-arm64-musl": "4.41.1", + "@rollup/rollup-linux-loongarch64-gnu": "4.41.1", + "@rollup/rollup-linux-powerpc64le-gnu": "4.41.1", + "@rollup/rollup-linux-riscv64-gnu": "4.41.1", + "@rollup/rollup-linux-riscv64-musl": "4.41.1", + "@rollup/rollup-linux-s390x-gnu": "4.41.1", + "@rollup/rollup-linux-x64-gnu": "4.41.1", + "@rollup/rollup-linux-x64-musl": "4.41.1", + "@rollup/rollup-win32-arm64-msvc": "4.41.1", + "@rollup/rollup-win32-ia32-msvc": "4.41.1", + "@rollup/rollup-win32-x64-msvc": "4.41.1", + "fsevents": "~2.3.2" + } + }, + "node_modules/rollup/node_modules/@types/estree": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.7.tgz", + "integrity": "sha512-w28IoSUCJpidD/TGviZwwMJckNESJZXFu7NBZ5YJ4mEUnNraUn9Pm8HSZm/jDF1pDWYKspWE7oVphigUPRakIQ==", + "dev": true + }, + "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==", + "dev": true, + "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/scheduler": { + "version": "0.26.0", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.26.0.tgz", + "integrity": "sha512-NlHwttCI/l5gCPR3D1nNXtWABUmBwvZpEQiD4IXSbIDq8BzLIK/7Ir5gTFSGZDUu37K5cMNp0hFtzO38sC7gWA==" + }, + "node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/tinyglobby": { + "version": "0.2.14", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.14.tgz", + "integrity": "sha512-tX5e7OM1HnYr2+a2C/4V0htOcSQcoSTH9KgJnVvNm5zm/cyEWKJ7j7YutsH9CxMdtOkkLFy2AHrMci9IM8IPZQ==", + "dev": true, + "dependencies": { + "fdir": "^6.4.4", + "picomatch": "^4.0.2" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "node_modules/tinyglobby/node_modules/fdir": { + "version": "6.4.5", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.4.5.tgz", + "integrity": "sha512-4BG7puHpVsIYxZUbiUE3RqGloLaSSwzYie5jvasC4LWuBWzZawynvYouhjbQKw2JuIGYdm0DzIxl8iVidKlUEw==", + "dev": true, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/tinyglobby/node_modules/picomatch": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", + "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "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==", + "dev": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/ts-api-utils": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.1.0.tgz", + "integrity": "sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ==", + "dev": true, + "engines": { + "node": ">=18.12" + }, + "peerDependencies": { + "typescript": ">=4.8.4" + } + }, + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/typescript": { + "version": "5.8.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.8.3.tgz", + "integrity": "sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==", + "dev": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/typescript-eslint": { + "version": "8.33.1", + "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.33.1.tgz", + "integrity": "sha512-AgRnV4sKkWOiZ0Kjbnf5ytTJXMUZQ0qhSVdQtDNYLPLnjsATEYhaO94GlRQwi4t4gO8FfjM6NnikHeKjUm8D7A==", + "dev": true, + "dependencies": { + "@typescript-eslint/eslint-plugin": "8.33.1", + "@typescript-eslint/parser": "8.33.1", + "@typescript-eslint/utils": "8.33.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <5.9.0" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.3.tgz", + "integrity": "sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "escalade": "^3.2.0", + "picocolors": "^1.1.1" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/vite": { + "version": "6.3.5", + "resolved": "https://registry.npmjs.org/vite/-/vite-6.3.5.tgz", + "integrity": "sha512-cZn6NDFE7wdTpINgs++ZJ4N49W2vRp8LCKrn3Ob1kYNtOo21vfDoaV5GzBfLU4MovSAB8uNRm4jgzVQZ+mBzPQ==", + "dev": true, + "dependencies": { + "esbuild": "^0.25.0", + "fdir": "^6.4.4", + "picomatch": "^4.0.2", + "postcss": "^8.5.3", + "rollup": "^4.34.9", + "tinyglobby": "^0.2.13" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^18.0.0 || ^20.0.0 || >=22.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", + "jiti": ">=1.21.0", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "sass-embedded": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.16.0", + "tsx": "^4.8.1", + "yaml": "^2.4.2" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "jiti": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "optional": true + } + } + }, + "node_modules/vite/node_modules/fdir": { + "version": "6.4.5", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.4.5.tgz", + "integrity": "sha512-4BG7puHpVsIYxZUbiUE3RqGloLaSSwzYie5jvasC4LWuBWzZawynvYouhjbQKw2JuIGYdm0DzIxl8iVidKlUEw==", + "dev": true, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/vite/node_modules/picomatch": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", + "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/word-wrap": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + } + } +} diff --git a/Anul 3/Semestrul 2/Licenta/Practical/src/FrontEndAdmin/package.json b/Anul 3/Semestrul 2/Licenta/Practical/src/FrontEndAdmin/package.json new file mode 100644 index 0000000..3949908 --- /dev/null +++ b/Anul 3/Semestrul 2/Licenta/Practical/src/FrontEndAdmin/package.json @@ -0,0 +1,31 @@ +{ + "name": "frontendadmin", + "private": true, + "version": "0.0.0", + "type": "module", + "scripts": { + "dev": "vite", + "build": "tsc -b && vite build", + "lint": "eslint .", + "preview": "vite preview" + }, + "dependencies": { + "bootstrap": "^5.3.6", + "bootstrap-icons": "^1.13.1", + "react": "^19.1.0", + "react-dom": "^19.1.0" + }, + "devDependencies": { + "@eslint/js": "^9.25.0", + "@types/react": "^19.1.2", + "@types/react-dom": "^19.1.2", + "@vitejs/plugin-react": "^4.4.1", + "eslint": "^9.25.0", + "eslint-plugin-react-hooks": "^5.2.0", + "eslint-plugin-react-refresh": "^0.4.19", + "globals": "^16.0.0", + "typescript": "~5.8.3", + "typescript-eslint": "^8.30.1", + "vite": "^6.3.5" + } +} diff --git a/Anul 3/Semestrul 2/Licenta/Practical/src/FrontEndAdmin/public copy/vite.svg b/Anul 3/Semestrul 2/Licenta/Practical/src/FrontEndAdmin/public copy/vite.svg new file mode 100644 index 0000000..e7b8dfb --- /dev/null +++ b/Anul 3/Semestrul 2/Licenta/Practical/src/FrontEndAdmin/public copy/vite.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/Anul 3/Semestrul 2/Licenta/Practical/src/FrontEndAdmin/public/vite.svg b/Anul 3/Semestrul 2/Licenta/Practical/src/FrontEndAdmin/public/vite.svg new file mode 100644 index 0000000..e7b8dfb --- /dev/null +++ b/Anul 3/Semestrul 2/Licenta/Practical/src/FrontEndAdmin/public/vite.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/Anul 3/Semestrul 2/Licenta/Practical/src/FrontEndAdmin/src/App.css b/Anul 3/Semestrul 2/Licenta/Practical/src/FrontEndAdmin/src/App.css new file mode 100644 index 0000000..2339378 --- /dev/null +++ b/Anul 3/Semestrul 2/Licenta/Practical/src/FrontEndAdmin/src/App.css @@ -0,0 +1,64 @@ +#root { + max-width: 1280px; + margin: 0 auto; + padding: 2rem; + text-align: center; + width: 100%; +} + +#root, html, body { + height: 100%; + margin: 0; + padding: 0; +} +#root { + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + min-height: 100vh; + width: 100%; +} + +html, body { + margin: 0; + padding: 0; + font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell, 'Open Sans', 'Helvetica Neue', sans-serif; + color: #333; +} + +.logo { + height: 6em; + padding: 1.5em; + will-change: filter; + transition: filter 300ms; +} +.logo:hover { + filter: drop-shadow(0 0 2em #646cffaa); +} +.logo.react:hover { + filter: drop-shadow(0 0 2em #61dafbaa); +} + +@keyframes logo-spin { + from { + transform: rotate(0deg); + } + to { + transform: rotate(360deg); + } +} + +@media (prefers-reduced-motion: no-preference) { + a:nth-of-type(2) .logo { + animation: logo-spin infinite 20s linear; + } +} + +.card { + padding: 2em; +} + +.read-the-docs { + color: #888; +} diff --git a/Anul 3/Semestrul 2/Licenta/Practical/src/FrontEndAdmin/src/App.tsx b/Anul 3/Semestrul 2/Licenta/Practical/src/FrontEndAdmin/src/App.tsx new file mode 100644 index 0000000..dcb1dc3 --- /dev/null +++ b/Anul 3/Semestrul 2/Licenta/Practical/src/FrontEndAdmin/src/App.tsx @@ -0,0 +1,107 @@ +import { useState, useEffect, useCallback } from "react"; +import type { Product } from "./models/Product"; +import * as api from "./services/api"; +import { ProductList } from "./components/ProductList"; +import { ProductForm } from "./components/ProductForm"; +import { LoadingSpinner } from "./components/LoadingSpinner"; +import { ErrorMessage } from "./components/ErrorMessage"; + +// These imports assume you've run: npm install bootstrap bootstrap-icons +import "bootstrap/dist/css/bootstrap.min.css"; +import "bootstrap-icons/font/bootstrap-icons.css"; + +// Inject global styles for a better look +const GlobalStyleInjector = () => ( + +); + +type View = "list" | "add" | "edit"; + +function App() { + const [products, setProducts] = useState([]); + const [productToEdit, setProductToEdit] = useState(null); + const [currentView, setCurrentView] = useState("list"); + const [isLoading, setIsLoading] = useState(true); + const [error, setError] = useState(null); + + const fetchProducts = useCallback(async () => { + try { + setIsLoading(true); + setError(null); + const data = await api.getProducts(); + setProducts(data); + } catch (e) { + setError(e instanceof Error ? e.message : "An unknown error occurred."); + } finally { + setIsLoading(false); + } + }, []); + + useEffect(() => { + if (currentView === "list") { + fetchProducts(); + } + }, [currentView, fetchProducts]); + + const handleGoToAdd = () => setCurrentView("add"); + const handleGoToEdit = (product: Product) => { + setProductToEdit(product); + setCurrentView("edit"); + }; + const handleReturnToList = () => { + setProductToEdit(null); + setCurrentView("list"); + }; + + const handleDelete = async (id: number) => { + if (window.confirm("Are you sure you want to delete this product?")) { + try { + await api.deleteProduct(id); + await fetchProducts(); // Refresh list + } catch (e) { + alert( + e instanceof Error + ? e.message + : "An unknown error occurred while deleting." + ); + } + } + }; + + const renderContent = () => { + if (isLoading) return ; + if (error) return ; + + return ( + + ); + }; + + return ( + <> + +
+
+

Inventory Dashboard

+
+
+ {currentView === "list" && renderContent()} + {(currentView === "add" || currentView === "edit") && ( + + )} +
+
+ + ); +} + +export default App; diff --git a/Anul 3/Semestrul 2/Licenta/Practical/src/FrontEndAdmin/src/assets/react.svg b/Anul 3/Semestrul 2/Licenta/Practical/src/FrontEndAdmin/src/assets/react.svg new file mode 100644 index 0000000..6c87de9 --- /dev/null +++ b/Anul 3/Semestrul 2/Licenta/Practical/src/FrontEndAdmin/src/assets/react.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/Anul 3/Semestrul 2/Licenta/Practical/src/FrontEndAdmin/src/components/ErrorMessage.tsx b/Anul 3/Semestrul 2/Licenta/Practical/src/FrontEndAdmin/src/components/ErrorMessage.tsx new file mode 100644 index 0000000..f1ac48e --- /dev/null +++ b/Anul 3/Semestrul 2/Licenta/Practical/src/FrontEndAdmin/src/components/ErrorMessage.tsx @@ -0,0 +1,12 @@ +import React from "react"; + +interface ErrorMessageProps { + message: string; +} + +export const ErrorMessage: React.FC = ({ message }) => ( +
+ +
{message}
+
+); diff --git a/Anul 3/Semestrul 2/Licenta/Practical/src/FrontEndAdmin/src/components/LoadingSpinner.tsx b/Anul 3/Semestrul 2/Licenta/Practical/src/FrontEndAdmin/src/components/LoadingSpinner.tsx new file mode 100644 index 0000000..7d4c0c2 --- /dev/null +++ b/Anul 3/Semestrul 2/Licenta/Practical/src/FrontEndAdmin/src/components/LoadingSpinner.tsx @@ -0,0 +1,9 @@ +import React from "react"; + +export const LoadingSpinner: React.FC = () => ( +
+
+ Loading... +
+
+); diff --git a/Anul 3/Semestrul 2/Licenta/Practical/src/FrontEndAdmin/src/components/ProductForm.tsx b/Anul 3/Semestrul 2/Licenta/Practical/src/FrontEndAdmin/src/components/ProductForm.tsx new file mode 100644 index 0000000..32ab082 --- /dev/null +++ b/Anul 3/Semestrul 2/Licenta/Practical/src/FrontEndAdmin/src/components/ProductForm.tsx @@ -0,0 +1,145 @@ +import React, { useState, useEffect } from "react"; +import type { Product } from "../models/Product"; +import * as api from "../services/api"; + +interface ProductFormProps { + productToEdit: Product | null; + onSuccess: () => void; + onCancel: () => void; +} + +export const ProductForm: React.FC = ({ + productToEdit, + onSuccess, + onCancel, +}) => { + const initialFormState: Omit = { + name: "", + description: "", + price: 0, + photoUrl: "", + quantity: 0, + }; + const [product, setProduct] = useState(initialFormState); + const isEditing = productToEdit !== null; + + useEffect(() => { + setProduct(productToEdit || initialFormState); + }, [productToEdit]); + + const handleChange = ( + e: React.ChangeEvent + ) => { + const { name, value } = e.target; + setProduct((prev) => ({ + ...prev, + [name]: name === "price" || name === "quantity" ? Number(value) : value, + })); + }; + + const handleSubmit = async (e: React.FormEvent) => { + e.preventDefault(); + try { + if (isEditing && productToEdit) { + await api.updateProduct(productToEdit.id, product as Product); + } else { + await api.createProduct(product); + } + onSuccess(); + } catch (error) { + console.error("Failed to save product:", error); + alert( + error instanceof Error ? error.message : "An unknown error occurred." + ); + } + }; + + return ( +
+
+

+ {isEditing ? `Edit: ${productToEdit?.name}` : "Create New Product"} +

+
+
+
+
+ + +
+
+ +