From 4e34d62cf2c2ae709756e0f37aeafe680e265a91 Mon Sep 17 00:00:00 2001 From: Vaishnavi Date: Mon, 25 May 2020 21:58:32 +0530 Subject: Create theorem.py --- .../Critical Points/theorem.py | 55 ++++++++++++++++++++++ 1 file changed, 55 insertions(+) create mode 100644 FSF-2020/approximations-and-optimizations/Critical Points/theorem.py (limited to 'FSF-2020/approximations-and-optimizations') diff --git a/FSF-2020/approximations-and-optimizations/Critical Points/theorem.py b/FSF-2020/approximations-and-optimizations/Critical Points/theorem.py new file mode 100644 index 0000000..6889a52 --- /dev/null +++ b/FSF-2020/approximations-and-optimizations/Critical Points/theorem.py @@ -0,0 +1,55 @@ +from manimlib.imports import* + +class TheoremAnimation(ThreeDScene): + def construct(self): + + axes = ThreeDAxes() + + #----parabola: x**2+y**2 + parabola1 = ParametricSurface( + lambda u, v: np.array([ + u, + v, + u**2+v**2 + ]),v_min=-1,v_max=1,u_min=-1,u_max=1,checkerboard_colors=[TEAL_E], + resolution=(20, 20)).scale(1) + + #----parabola: -x**2-y**2 + parabola2 = ParametricSurface( + lambda u, v: np.array([ + u, + v, + -u**2-v**2 + ]),v_min=-1,v_max=1,u_min=-1,u_max=1,checkerboard_colors=[PURPLE_E,PURPLE_E], + resolution=(20, 20)).scale(1) + + self.set_camera_orientation(phi=75 * DEGREES) + self.begin_ambient_camera_rotation(rate=0.4) + + d = Dot(np.array([0,0,0]), color = '#800000') #---- critical point + r = Rectangle(fill_color= '#C0C0C0',fill_opacity =0.3).move_to(ORIGIN) #----tangent plane + + parabola1_text = TextMobject("Maximum with horizontal tangent plane").scale(0.7).to_corner(UL) + + parabola2_text = TextMobject("Minimum with horizontal tangent plane").scale(0.7).to_corner(UL) + + self.add(axes) + self.add_fixed_in_frame_mobjects(parabola2_text) + self.wait(1) + self.play(Write(parabola1)) + self.wait(1) + self.play(ShowCreation(d)) + self.wait(1) + self.play(ShowCreation(r)) + self.wait(2) + self.play(FadeOut(parabola2_text),FadeOut(parabola1),FadeOut(r),FadeOut(d)) + + self.wait(1) + self.add_fixed_in_frame_mobjects(parabola1_text) + self.wait(1) + self.play(Write(parabola2)) + self.wait(1) + self.play(ShowCreation(d)) + self.wait(1) + self.play(ShowCreation(r)) + self.wait(2) -- cgit From a943082849ca96f6b0ffd7f33f919161b8bd828b Mon Sep 17 00:00:00 2001 From: Vaishnavi Date: Mon, 25 May 2020 22:27:58 +0530 Subject: Update theorem.py --- .../Critical Points/theorem.py | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) (limited to 'FSF-2020/approximations-and-optimizations') diff --git a/FSF-2020/approximations-and-optimizations/Critical Points/theorem.py b/FSF-2020/approximations-and-optimizations/Critical Points/theorem.py index 6889a52..7c82aa9 100644 --- a/FSF-2020/approximations-and-optimizations/Critical Points/theorem.py +++ b/FSF-2020/approximations-and-optimizations/Critical Points/theorem.py @@ -11,8 +11,8 @@ class TheoremAnimation(ThreeDScene): u, v, u**2+v**2 - ]),v_min=-1,v_max=1,u_min=-1,u_max=1,checkerboard_colors=[TEAL_E], - resolution=(20, 20)).scale(1) + ]),v_min = -1, v_max = 1, u_min = -1, u_max = 1, checkerboard_colors = [TEAL_E], + resolution = (20, 20)).scale(1) #----parabola: -x**2-y**2 parabola2 = ParametricSurface( @@ -20,14 +20,14 @@ class TheoremAnimation(ThreeDScene): u, v, -u**2-v**2 - ]),v_min=-1,v_max=1,u_min=-1,u_max=1,checkerboard_colors=[PURPLE_E,PURPLE_E], - resolution=(20, 20)).scale(1) + ]),v_min = -1, v_max = 1, u_min = -1, u_max = 1, checkerboard_colors = [PURPLE_E,PURPLE_E], + resolution = (20, 20)).scale(1) - self.set_camera_orientation(phi=75 * DEGREES) - self.begin_ambient_camera_rotation(rate=0.4) + self.set_camera_orientation(phi = 75 * DEGREES) + self.begin_ambient_camera_rotation(rate = 0.4) d = Dot(np.array([0,0,0]), color = '#800000') #---- critical point - r = Rectangle(fill_color= '#C0C0C0',fill_opacity =0.3).move_to(ORIGIN) #----tangent plane + r = Rectangle(fill_color = '#C0C0C0',fill_opacity = 0.3).move_to(ORIGIN) #----tangent plane parabola1_text = TextMobject("Maximum with horizontal tangent plane").scale(0.7).to_corner(UL) -- cgit From 4319bd86cbce60580c118fd95aacc9ae4430ff5d Mon Sep 17 00:00:00 2001 From: Vaishnavi Date: Mon, 25 May 2020 22:30:42 +0530 Subject: Create example.py --- .../Critical Points/example.py | 33 ++++++++++++++++++++++ 1 file changed, 33 insertions(+) create mode 100644 FSF-2020/approximations-and-optimizations/Critical Points/example.py (limited to 'FSF-2020/approximations-and-optimizations') diff --git a/FSF-2020/approximations-and-optimizations/Critical Points/example.py b/FSF-2020/approximations-and-optimizations/Critical Points/example.py new file mode 100644 index 0000000..0ff4c15 --- /dev/null +++ b/FSF-2020/approximations-and-optimizations/Critical Points/example.py @@ -0,0 +1,33 @@ +from manimlib.imports import* + +class ExampleAnimation(ThreeDScene): + def construct(self): + axes = ThreeDAxes() + + #----f(x,y) = (y-x)(1-2x-3y) + e = ParametricSurface( + lambda u, v: np.array([ + u, + v, + (v-u)*(1-2*u-3*v) + ]),v_min = -1, v_max = 1, u_min = -1, u_max = 1, checkerboard_colors = [PURPLE_D, PURPLE_E], + resolution=(20, 20)).scale(1) + + self.set_camera_orientation(phi = 35 * DEGREES, theta = -40* DEGREES) + + f_text = TextMobject("$f(x,y) = (y-x)(1-2x-3y)$").to_corner(UL) + d = Dot(np.array([0,0,0]), color = '#800000') #---- Critical Point + d_text = TextMobject("$(0.2,0.2)$",color = '#DC143C').scale(0.5).shift(0.2*UP) #----x = 0.2, y = 0.2 + r_text = TextMobject("Critical Point",color = '#00FFFF').shift(0.3*DOWN).scale(0.6) + + self.add_fixed_in_frame_mobjects(f_text) + self.wait(2) + self.add(axes) + self.play(Write(e)) + self.wait(2) + self.play(ShowCreation(d)) + self.wait(1) + self.add_fixed_in_frame_mobjects(d_text) + self.wait(1) + self.add_fixed_in_frame_mobjects(r_text) + self.wait(3) -- cgit From 9ddec26eb2dfbc1b0a9d595d43e36727b7431304 Mon Sep 17 00:00:00 2001 From: Vaishnavi Date: Mon, 25 May 2020 22:31:32 +0530 Subject: Update example.py --- FSF-2020/approximations-and-optimizations/Critical Points/example.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'FSF-2020/approximations-and-optimizations') diff --git a/FSF-2020/approximations-and-optimizations/Critical Points/example.py b/FSF-2020/approximations-and-optimizations/Critical Points/example.py index 0ff4c15..46c8bd9 100644 --- a/FSF-2020/approximations-and-optimizations/Critical Points/example.py +++ b/FSF-2020/approximations-and-optimizations/Critical Points/example.py @@ -13,7 +13,7 @@ class ExampleAnimation(ThreeDScene): ]),v_min = -1, v_max = 1, u_min = -1, u_max = 1, checkerboard_colors = [PURPLE_D, PURPLE_E], resolution=(20, 20)).scale(1) - self.set_camera_orientation(phi = 35 * DEGREES, theta = -40* DEGREES) + self.set_camera_orientation(phi = 35 * DEGREES, theta = -40 * DEGREES) f_text = TextMobject("$f(x,y) = (y-x)(1-2x-3y)$").to_corner(UL) d = Dot(np.array([0,0,0]), color = '#800000') #---- Critical Point -- cgit From 7f48f12dccac8b709a4e5cf77267d189d828e816 Mon Sep 17 00:00:00 2001 From: Vaishnavi Date: Mon, 25 May 2020 23:25:16 +0530 Subject: Create types_of_cp.py --- .../Critical Points/types_of_cp.py | 69 ++++++++++++++++++++++ 1 file changed, 69 insertions(+) create mode 100644 FSF-2020/approximations-and-optimizations/Critical Points/types_of_cp.py (limited to 'FSF-2020/approximations-and-optimizations') diff --git a/FSF-2020/approximations-and-optimizations/Critical Points/types_of_cp.py b/FSF-2020/approximations-and-optimizations/Critical Points/types_of_cp.py new file mode 100644 index 0000000..49f083f --- /dev/null +++ b/FSF-2020/approximations-and-optimizations/Critical Points/types_of_cp.py @@ -0,0 +1,69 @@ +from manimlib.imports import * + +class TypescpAnimation(ThreeDScene): + def construct(self): + axes = ThreeDAxes() + + r_text = TextMobject("Relative Maxima at ORIGIN",color ='#87CEFA') + f_text = TextMobject("$f(x,y) = -x^2-y^2$").to_corner(UL) + + #----graph of first function f(x,y) = -x**2-y**2 + f = ParametricSurface( + lambda u, v: np.array([ + u, + v, + -u**2-v**2 + ]),v_min = -1, v_max = 1, u_min = -1, u_max = 1, checkerboard_colors = [YELLOW_D, YELLOW_E], + resolution = (20, 20)).scale(1) + + r2_text = TextMobject("Saddle Point at ORIGIN",color ='#87CEFA') + f2_text = TextMobject("$f(x,y) = -x^2+y^2$").to_corner(UL) + + #----graph of second function f(x,y) = -x**2+y**2 + f2 = ParametricSurface( + lambda u, v: np.array([ + u, + v, + -u**2+v**2 + ]),v_min = -1, v_max = 1, u_min = -1, u_max = 1, checkerboard_colors = [RED_D, RED_E], + resolution = (20, 20)).scale(1) + + r3_text = TextMobject("Relative Minima at ORIGIN",color ='#87CEFA') + f3_text = TextMobject("$f(x,y) = x^2+y^2$").to_corner(UL) + + #----graph of third function f(x,y) = x**2+y**2 + f3 = ParametricSurface( + lambda u, v: np.array([ + u, + v, + u**2+v**2 + ]),v_min = -1, v_max = 1, u_min = -1, u_max = 1, checkerboard_colors = [GREEN_D, GREEN_E], + resolution = (20, 20)).scale(1) + + self.set_camera_orientation(phi = 75 * DEGREES, theta = -45 * DEGREES ) + + self.add_fixed_in_frame_mobjects(r_text) + self.wait(1) + self.play(FadeOut(r_text)) + self.add(axes) + self.play(Write(f)) + self.add_fixed_in_frame_mobjects(f_text) + self.wait(2) + self.play(FadeOut(axes),FadeOut(f),FadeOut(f_text)) + + self.add_fixed_in_frame_mobjects(r2_text) + self.wait(1) + self.play(FadeOut(r2_text)) + self.add(axes) + self.play(Write(f2)) + self.add_fixed_in_frame_mobjects(f2_text) + self.wait(2) + self.play(FadeOut(axes),FadeOut(f2),FadeOut(f2_text)) + + self.add_fixed_in_frame_mobjects(r3_text) + self.wait(1) + self.play(FadeOut(r3_text)) + self.add(axes) + self.play(Write(f3)) + self.add_fixed_in_frame_mobjects(f3_text) + self.wait(2) -- cgit From 4e48a333ce9387cbd951e1ef108b9dc0281874da Mon Sep 17 00:00:00 2001 From: Vaishnavi Date: Tue, 26 May 2020 03:08:42 +0530 Subject: Update types_of_cp.py --- .../Critical Points/types_of_cp.py | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) (limited to 'FSF-2020/approximations-and-optimizations') diff --git a/FSF-2020/approximations-and-optimizations/Critical Points/types_of_cp.py b/FSF-2020/approximations-and-optimizations/Critical Points/types_of_cp.py index 49f083f..f9055e6 100644 --- a/FSF-2020/approximations-and-optimizations/Critical Points/types_of_cp.py +++ b/FSF-2020/approximations-and-optimizations/Critical Points/types_of_cp.py @@ -4,7 +4,7 @@ class TypescpAnimation(ThreeDScene): def construct(self): axes = ThreeDAxes() - r_text = TextMobject("Relative Maxima at ORIGIN",color ='#87CEFA') + r_text = TextMobject("Relative Maximum at ORIGIN",color ='#87CEFA') f_text = TextMobject("$f(x,y) = -x^2-y^2$").to_corner(UL) #----graph of first function f(x,y) = -x**2-y**2 @@ -28,7 +28,7 @@ class TypescpAnimation(ThreeDScene): ]),v_min = -1, v_max = 1, u_min = -1, u_max = 1, checkerboard_colors = [RED_D, RED_E], resolution = (20, 20)).scale(1) - r3_text = TextMobject("Relative Minima at ORIGIN",color ='#87CEFA') + r3_text = TextMobject("Relative Minimum at ORIGIN",color ='#87CEFA') f3_text = TextMobject("$f(x,y) = x^2+y^2$").to_corner(UL) #----graph of third function f(x,y) = x**2+y**2 @@ -41,29 +41,30 @@ class TypescpAnimation(ThreeDScene): resolution = (20, 20)).scale(1) self.set_camera_orientation(phi = 75 * DEGREES, theta = -45 * DEGREES ) + d = Dot(np.array([0,0,0]), color = '#800000') #---- critical point self.add_fixed_in_frame_mobjects(r_text) self.wait(1) self.play(FadeOut(r_text)) self.add(axes) - self.play(Write(f)) + self.play(Write(f),Write(d)) self.add_fixed_in_frame_mobjects(f_text) self.wait(2) - self.play(FadeOut(axes),FadeOut(f),FadeOut(f_text)) + self.play(FadeOut(axes),FadeOut(f),FadeOut(f_text),FadeOut(d)) self.add_fixed_in_frame_mobjects(r2_text) self.wait(1) self.play(FadeOut(r2_text)) self.add(axes) - self.play(Write(f2)) + self.play(Write(f2),Write(d)) self.add_fixed_in_frame_mobjects(f2_text) self.wait(2) - self.play(FadeOut(axes),FadeOut(f2),FadeOut(f2_text)) + self.play(FadeOut(axes),FadeOut(f2),FadeOut(f2_text),FadeOut(d)) self.add_fixed_in_frame_mobjects(r3_text) self.wait(1) self.play(FadeOut(r3_text)) self.add(axes) - self.play(Write(f3)) + self.play(Write(f3),Write(d)) self.add_fixed_in_frame_mobjects(f3_text) self.wait(2) -- cgit From 42c96d26831f9b99a3f01e52e6a51b3cdce4ceb5 Mon Sep 17 00:00:00 2001 From: Vaishnavi Date: Tue, 26 May 2020 03:10:09 +0530 Subject: Update example.py --- .../Critical Points/example.py | 62 +++++++++++++++++----- 1 file changed, 49 insertions(+), 13 deletions(-) (limited to 'FSF-2020/approximations-and-optimizations') diff --git a/FSF-2020/approximations-and-optimizations/Critical Points/example.py b/FSF-2020/approximations-and-optimizations/Critical Points/example.py index 46c8bd9..bdbb6ed 100644 --- a/FSF-2020/approximations-and-optimizations/Critical Points/example.py +++ b/FSF-2020/approximations-and-optimizations/Critical Points/example.py @@ -4,30 +4,66 @@ class ExampleAnimation(ThreeDScene): def construct(self): axes = ThreeDAxes() + f_text = TextMobject("$f(x,y) = (y-x)(1-2x-3y)$").to_corner(UL) + d = Dot(np.array([0,0,0]), color = '#800000') #---- Critical Point + d_text = TextMobject("$(0.2,0.2)$",color = '#DC143C').scale(0.5).shift(0.2*UP) #----x = 0.2, y = 0.2 + r_text=TextMobject("Critical Point",color = '#00FFFF').shift(0.3*DOWN).scale(0.6) + #----f(x,y) = (y-x)(1-2x-3y) - e = ParametricSurface( + f = ParametricSurface( lambda u, v: np.array([ u, v, (v-u)*(1-2*u-3*v) ]),v_min = -1, v_max = 1, u_min = -1, u_max = 1, checkerboard_colors = [PURPLE_D, PURPLE_E], - resolution=(20, 20)).scale(1) - - self.set_camera_orientation(phi = 35 * DEGREES, theta = -40 * DEGREES) + resolution=(20, 20)).scale(1) - f_text = TextMobject("$f(x,y) = (y-x)(1-2x-3y)$").to_corner(UL) - d = Dot(np.array([0,0,0]), color = '#800000') #---- Critical Point - d_text = TextMobject("$(0.2,0.2)$",color = '#DC143C').scale(0.5).shift(0.2*UP) #----x = 0.2, y = 0.2 - r_text = TextMobject("Critical Point",color = '#00FFFF').shift(0.3*DOWN).scale(0.6) + fx_text = TextMobject("$\\frac{\\partial f}{\\partial x} = 4x-1+y$").to_corner(UL) + + #----fx = 4x-1+y + fx = ParametricSurface( + lambda u, v: np.array([ + u, + v, + 4*u-1+v + ]),v_min = -1, v_max = 1, u_min = -1, u_max = 1, checkerboard_colors = [BLUE_D, BLUE_E], + resolution = (20, 20)).scale(1) + + fy_text = TextMobject("$\\frac{\\partial f}{\\partial y} = -6y+1+x$").to_corner(UL) + + #----fy = -6y+1+x + fy = ParametricSurface( + lambda u, v: np.array([ + u, + v, + -6*v+1+u + ]),v_min = -1, v_max = 1, u_min = -1, u_max = 1, checkerboard_colors = [RED_D, RED_E], + resolution = (20, 20)).scale(1) + + self.set_camera_orientation(phi = 75 * DEGREES) + self.begin_ambient_camera_rotation(rate=0.2) + + group1 = VGroup(axes,f,d,d_text,r_text,f_text) + group2 = VGroup(axes,fx,fx_text) self.add_fixed_in_frame_mobjects(f_text) - self.wait(2) + self.wait(1) self.add(axes) - self.play(Write(e)) - self.wait(2) - self.play(ShowCreation(d)) + self.play(Write(f),Write(d)) self.wait(1) self.add_fixed_in_frame_mobjects(d_text) self.wait(1) self.add_fixed_in_frame_mobjects(r_text) - self.wait(3) + self.wait(2) + self.play(FadeOut(group1)) + self.wait(1) + self.add_fixed_in_frame_mobjects(fx_text) + self.add(axes) + self.play(Write(fx)) + self.wait(2) + self.play(FadeOut(group2)) + self.wait(1) + self.add_fixed_in_frame_mobjects(fy_text) + self.add(axes) + self.play(Write(fy)) + self.wait(2) -- cgit From c09da0b478863bfcfa05ce0a687717cbbc3445aa Mon Sep 17 00:00:00 2001 From: Vaishnavi Date: Tue, 26 May 2020 03:23:18 +0530 Subject: Update example.py --- .../Critical Points/example.py | 41 ++-------------------- 1 file changed, 2 insertions(+), 39 deletions(-) (limited to 'FSF-2020/approximations-and-optimizations') diff --git a/FSF-2020/approximations-and-optimizations/Critical Points/example.py b/FSF-2020/approximations-and-optimizations/Critical Points/example.py index bdbb6ed..3a41be7 100644 --- a/FSF-2020/approximations-and-optimizations/Critical Points/example.py +++ b/FSF-2020/approximations-and-optimizations/Critical Points/example.py @@ -18,33 +18,8 @@ class ExampleAnimation(ThreeDScene): ]),v_min = -1, v_max = 1, u_min = -1, u_max = 1, checkerboard_colors = [PURPLE_D, PURPLE_E], resolution=(20, 20)).scale(1) - fx_text = TextMobject("$\\frac{\\partial f}{\\partial x} = 4x-1+y$").to_corner(UL) - - #----fx = 4x-1+y - fx = ParametricSurface( - lambda u, v: np.array([ - u, - v, - 4*u-1+v - ]),v_min = -1, v_max = 1, u_min = -1, u_max = 1, checkerboard_colors = [BLUE_D, BLUE_E], - resolution = (20, 20)).scale(1) - - fy_text = TextMobject("$\\frac{\\partial f}{\\partial y} = -6y+1+x$").to_corner(UL) - - #----fy = -6y+1+x - fy = ParametricSurface( - lambda u, v: np.array([ - u, - v, - -6*v+1+u - ]),v_min = -1, v_max = 1, u_min = -1, u_max = 1, checkerboard_colors = [RED_D, RED_E], - resolution = (20, 20)).scale(1) - self.set_camera_orientation(phi = 75 * DEGREES) - self.begin_ambient_camera_rotation(rate=0.2) - - group1 = VGroup(axes,f,d,d_text,r_text,f_text) - group2 = VGroup(axes,fx,fx_text) + self.begin_ambient_camera_rotation(rate=0.5) self.add_fixed_in_frame_mobjects(f_text) self.wait(1) @@ -54,16 +29,4 @@ class ExampleAnimation(ThreeDScene): self.add_fixed_in_frame_mobjects(d_text) self.wait(1) self.add_fixed_in_frame_mobjects(r_text) - self.wait(2) - self.play(FadeOut(group1)) - self.wait(1) - self.add_fixed_in_frame_mobjects(fx_text) - self.add(axes) - self.play(Write(fx)) - self.wait(2) - self.play(FadeOut(group2)) - self.wait(1) - self.add_fixed_in_frame_mobjects(fy_text) - self.add(axes) - self.play(Write(fy)) - self.wait(2) + self.wait(3) -- cgit From 36e188e464bc8a3604702dee24be038be6785bb3 Mon Sep 17 00:00:00 2001 From: Vaishnavi Date: Tue, 26 May 2020 10:32:47 +0530 Subject: Create motivation.py --- .../Critical Points/motivation.py | 30 ++++++++++++++++++++++ 1 file changed, 30 insertions(+) create mode 100644 FSF-2020/approximations-and-optimizations/Critical Points/motivation.py (limited to 'FSF-2020/approximations-and-optimizations') diff --git a/FSF-2020/approximations-and-optimizations/Critical Points/motivation.py b/FSF-2020/approximations-and-optimizations/Critical Points/motivation.py new file mode 100644 index 0000000..27354ef --- /dev/null +++ b/FSF-2020/approximations-and-optimizations/Critical Points/motivation.py @@ -0,0 +1,30 @@ +from manimlib.imports import* + +class MotivationAnimation(Scene): + def construct(self): + + r = Rectangle(height = 7,breadth = 2,color = BLUE, fill_opacity = 0.3).scale(0.6) #----metal strip + b = Brace(r,UP) + r_text = TextMobject("$x$ metres",color = YELLOW).shift(3*UP) + m_text = TextMobject("Metal Strip").shift(3*DOWN) + a = Arc(radius=2).rotate(1).shift(LEFT+0.5*UP) + a2 = Arc(radius=2).rotate(5).shift(0.7*LEFT+0.9*UP).scale(0.2) + START = [1,0,0] + END = [0,3,0] + l = Line(START,END,color = RED).shift(0.9*DOWN) + a2_text = TextMobject("$\\theta$",color = PINK).shift(1.6*UP+0.4*RIGHT) + + group1 = VGroup(r_text,b,a,l,a2,a2_text) + f_text = TextMobject("$A = f(x,\\theta)$").shift(2*DOWN) + + ring = Annulus(inner_radius = 0.7, outer_radius = 1, color = BLUE) #--bent metal strip + + self.play(Write(r)) + self.wait(1) + self.play(ShowCreation(m_text)) + self.wait(1) + self.play(Write(group1)) + self.wait(2) + self.play(FadeOut(group1)) + self.wait(1) + self.play(ReplacementTransform(r,ring),ShowCreation(f_text)) -- cgit