From df7e0fe4f5a866e4dc0d7d62902be57f8ad49f36 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rapha=C3=ABl=20Hertzog?= Date: Wed, 6 Nov 2019 19:11:51 +0100 Subject: [PATCH] Switch the default plymouth theme to the new one --- Plymouth-Theme/kali-2019/kali.plymouth | 8 - Plymouth-Theme/kali-2019/kali.script | 158 --- Plymouth-Theme/kali/background.png | Bin 95930 -> 0 bytes Plymouth-Theme/kali/debian_logo.png | Bin 4369 -> 0 bytes Plymouth-Theme/kali/debian_logo16.png | Bin 4342 -> 0 bytes .../kali-logo-container.png | Bin .../{kali-2019 => kali}/kali-logo-fade.png | Bin .../{kali-2019 => kali}/kali-logo.png | Bin Plymouth-Theme/kali/kali.plymouth | 2 +- Plymouth-Theme/kali/kali.script | 1182 ++--------------- .../{kali-2019 => kali}/outline.png | Bin .../{kali-2019 => kali}/password-dot.png | Bin .../{kali-2019 => kali}/password-field.png | Bin Plymouth-Theme/kali/password_dot.png | Bin 324 -> 0 bytes Plymouth-Theme/kali/password_dot16.png | Bin 285 -> 0 bytes Plymouth-Theme/kali/password_field.png | Bin 1214 -> 0 bytes Plymouth-Theme/kali/password_field16.png | Bin 230 -> 0 bytes Plymouth-Theme/kali/progress_dot_off.png | Bin 265 -> 0 bytes Plymouth-Theme/kali/progress_dot_off16.png | Bin 167 -> 0 bytes Plymouth-Theme/kali/progress_dot_on.png | Bin 331 -> 0 bytes Plymouth-Theme/kali/progress_dot_on16.png | Bin 331 -> 0 bytes 21 files changed, 128 insertions(+), 1222 deletions(-) delete mode 100644 Plymouth-Theme/kali-2019/kali.plymouth delete mode 100644 Plymouth-Theme/kali-2019/kali.script delete mode 100644 Plymouth-Theme/kali/background.png delete mode 100644 Plymouth-Theme/kali/debian_logo.png delete mode 100644 Plymouth-Theme/kali/debian_logo16.png rename Plymouth-Theme/{kali-2019 => kali}/kali-logo-container.png (100%) rename Plymouth-Theme/{kali-2019 => kali}/kali-logo-fade.png (100%) rename Plymouth-Theme/{kali-2019 => kali}/kali-logo.png (100%) rename Plymouth-Theme/{kali-2019 => kali}/outline.png (100%) rename Plymouth-Theme/{kali-2019 => kali}/password-dot.png (100%) rename Plymouth-Theme/{kali-2019 => kali}/password-field.png (100%) delete mode 100644 Plymouth-Theme/kali/password_dot.png delete mode 100644 Plymouth-Theme/kali/password_dot16.png delete mode 100644 Plymouth-Theme/kali/password_field.png delete mode 100644 Plymouth-Theme/kali/password_field16.png delete mode 100644 Plymouth-Theme/kali/progress_dot_off.png delete mode 100644 Plymouth-Theme/kali/progress_dot_off16.png delete mode 100644 Plymouth-Theme/kali/progress_dot_on.png delete mode 100644 Plymouth-Theme/kali/progress_dot_on16.png diff --git a/Plymouth-Theme/kali-2019/kali.plymouth b/Plymouth-Theme/kali-2019/kali.plymouth deleted file mode 100644 index 3678fcb8..00000000 --- a/Plymouth-Theme/kali-2019/kali.plymouth +++ /dev/null @@ -1,8 +0,0 @@ -[Plymouth Theme] -Name=Kali -Description=Kali plymouth theme -ModuleName=script - -[script] -ImageDir=/usr/share/plymouth/themes/kali-2019 -ScriptFile=/usr/share/plymouth/themes/kali-2019/kali.script diff --git a/Plymouth-Theme/kali-2019/kali.script b/Plymouth-Theme/kali-2019/kali.script deleted file mode 100644 index cd28da0f..00000000 --- a/Plymouth-Theme/kali-2019/kali.script +++ /dev/null @@ -1,158 +0,0 @@ -LOGO_RIGHT_OFFSET_RATIO = -0.13; -LOGO_TOP_OFFSET_RATIO = -0.07; - -MAX_PASSWORD_LENGTH = 16; - -X_CENTER = Window.GetWidth() / 2; -Y_CENTER = Window.GetHeight() / 2; - -status = "normal"; - -Window.SetBackgroundTopColor(0, 0, 0); -Window.SetBackgroundBottomColor(0, 0, 0); - -/* Images */ -container.image = Image("kali-logo-container.png"); -logo.image = Image("kali-logo.png"); -outline.image = Image("outline.png"); -fade.image = Image("kali-logo-fade.png"); -passwordDot.image = Image("password-dot.png"); - -// Kali logo can't be aligned by its natural center but by the circle center -// formed inside its body curve. This can be easily calculated by the offset -// ratio defined before. -logo.rightOffset = logo.image.GetWidth() * LOGO_RIGHT_OFFSET_RATIO; -logo.topOffset = logo.image.GetHeight() * LOGO_TOP_OFFSET_RATIO; - -fun centerKaliLogo (image, zIndex) { - sprite = Sprite(image); - sprite.SetX(X_CENTER - image.GetWidth() / 2 + logo.rightOffset); - sprite.SetY(Y_CENTER - image.GetHeight() / 2 + logo.topOffset); - sprite.SetZ(zIndex); - sprite.SetOpacity(0); - return sprite; -} - -/* Kali logo sprites */ -logo.sprite = centerKaliLogo(logo.image, 4); -fade.sprite = centerKaliLogo(fade.image, 3); -container.sprite = centerKaliLogo(container.image, 2); -outline.sprite = centerKaliLogo(outline.image, 1); - -fun showKaliLogo () { - logo.sprite.SetOpacity(1); - fade.sprite.SetOpacity(0.5); -} - -/* -------------------------------- Message -------------------------------- */ -fun displayMessageCallback (text) { - prompt.image = Image.Text(text, 1, 1, 1); - prompt.sprite = Sprite(prompt.image); - prompt.sprite.SetPosition( - X_CENTER - prompt.image.GetWidth() / 2, - container.sprite.GetY() + container.image.GetHeight() + 50, - 10000 - ); - global.prompt = prompt; -} - -Plymouth.SetMessageFunction(displayMessageCallback); - -/* ---------------------------- Password Dialog ---------------------------- */ -fun passwordDialogSetup () { - passwordField.image = Image("password-field.png"); - passwordField.sprite = Sprite(passwordField.image); - passwordField.y = container.sprite.GetY() + container.image.GetHeight(); - passwordField.x = X_CENTER - passwordField.image.GetWidth() / 2; - passwordField.z = 5; - passwordField.sprite.SetX(passwordField.x); - passwordField.sprite.SetY(passwordField.y); - passwordField.sprite.SetZ(passwordField.z); - global.passwordField = passwordField; - showKaliLogo(); -} - -fun setPasswordDialogOpacity (opacity) { - passwordField.sprite.SetOpacity(opacity); - - for (i = 0; passwordField.bullets[i]; i++) - passwordField.bullets[i].sprite.SetOpacity(opacity); -} - -fun passwordDialogCallback (prompt, bullets) { - global.status = "password"; - - if (!global.passwordField) - passwordDialogSetup(); - else - setPasswordDialogOpacity(1); - - displayMessageCallback(prompt); - - bulletWidth = passwordDot.image.GetWidth(); - - for (i = 0; - passwordField.bullets[i] || i < bullets && i < MAX_PASSWORD_LENGTH; - i++) { - if (!passwordField.bullets[i]) { - passwordField.bullets[i].sprite = Sprite(passwordDot.image); - passwordField.bullets[i].sprite.SetX(passwordField.x - + (i + 1) * bulletWidth); - passwordField.bullets[i].sprite.SetY(passwordField.y); - passwordField.bullets[i].sprite.SetZ(passwordField.z); - } - - if (i < bullets) - passwordField.bullets[i].sprite.SetOpacity(1); - else - passwordField.bullets[i].sprite.SetOpacity(0); - } -} - -Plymouth.SetDisplayPasswordFunction(passwordDialogCallback); - -fun displayNormalLogoCallback () { - global.status = "normal"; - if (global.passwordField) - setPasswordDialogOpacity(0); - prompt.SetOpacity(0); - showKaliLogo(); -} - -Plymouth.SetDisplayNormalFunction(displayNormalLogoCallback); -Plymouth.SetQuitFunction(displayNormalLogoCallback); - - -if (Plymouth.GetMode() == "boot") { - outline.movementRange = - container.image.GetHeight() - outline.image.GetHeight(); - outline.initialPosition = container.sprite.GetY() + outline.movementRange; - outline.sprite.SetY(outline.initialPosition); - - container.sprite.SetOpacity(1); - outline.sprite.SetOpacity(1); - - fun bootProgressCallback (duration, progress) { - if (global.status != "normal") return; - if (progress < 0.1) - logo.sprite.SetOpacity(progress / 0.1); - else if (progress < 0.9) { - relativeProgress = (progress - 0.1) / 0.8; - outline.sprite.SetY(outline.initialPosition - - outline.movementRange * relativeProgress); - if (progress > 0.8 && progress < 0.85) { - relativeProgress = (progress - 0.8) / 0.05; - fade.sprite.SetOpacity(relativeProgress); - } else if (progress > 0.85) { - relativeProgress = (progress - 0.85) / 0.05; - fade.sprite.SetOpacity(1 - relativeProgress); - } - } else { - opacity = (1 - progress) / 0.1; - logo.sprite.SetOpacity(opacity); - } - } - - Plymouth.SetBootProgressFunction(bootProgressCallback); -} - diff --git a/Plymouth-Theme/kali/background.png b/Plymouth-Theme/kali/background.png deleted file mode 100644 index dab1486c10129e85c80b2ecd6e32214d2f81b811..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 95930 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
8ZK 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 Y0G8W+u+~1FtpET307*qoM6N<$f)ej^+5i9m diff --git a/Plymouth-Theme/kali/debian_logo.png b/Plymouth-Theme/kali/debian_logo.png deleted file mode 100644 index 5289d3e89254fc5de74b9b31632f091e2371e9e9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4369 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 LNkvXXu0mjfJoFx~ diff --git a/Plymouth-Theme/kali/debian_logo16.png b/Plymouth-Theme/kali/debian_logo16.png deleted file mode 100644 index 65686a8abfc588327552d5eddb42ad286087a823..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4342 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 z -# -# Based on the example provided with the "script plugin" written by: -# Charlie Brej -# +LOGO_RIGHT_OFFSET_RATIO = -0.13; +LOGO_TOP_OFFSET_RATIO = -0.07; -# Set the wallpaper: -# The wallpaper section below is from the spacefun plymouth theme -# Copyright 2010 Aurélien COUDERC +MAX_PASSWORD_LENGTH = 16; -bg_image = Image("background.png"); - -# Compute screen/image ratio and scale the background accordingly -window_max_width = Window.GetX() * 2 + Window.GetWidth(); -window_max_height = Window.GetY() * 2 + Window.GetHeight(); -screen_ratio = window_max_width / window_max_height; -bg_image_ratio = bg_image.GetWidth() / bg_image.GetHeight(); -if (screen_ratio > bg_image_ratio) - bg_scale_factor = window_max_width / bg_image.GetWidth(); -else - bg_scale_factor = window_max_height / bg_image.GetHeight(); -scaled_bg_image = bg_image.Scale(bg_image.GetWidth() * bg_scale_factor, - bg_image.GetHeight() * bg_scale_factor); - -# Display background -bg_sprite = Sprite(scaled_bg_image); -bg_sprite.SetPosition(Window.GetX() + Window.GetWidth() / 2 - scaled_bg_image.GetWidth() / 2, - Window.GetY() + Window.GetHeight() / 2 - scaled_bg_image.GetHeight() / 2, - -10000); - - - -# Set the text colour in (rgb / 256) -text_colour.red = 0.0; -text_colour.green = 0.0; -text_colour.blue = 0.0; - -# Tinted text #988592 -tinted_text_colour.red = 0.0; -tinted_text_colour.green = 0.0; -tinted_text_colour.blue = 0.0; - -# Action Text - #ffffff - RGB 255 255 255 -action_text_colour.red = 1.0; -action_text_colour.green = 1.0; -action_text_colour.blue = 1.0; - -# Orange - #ff4012 - RGB 255 64 18 -debugsprite = Sprite(); -debugsprite_bottom = Sprite(); -debugsprite_medium = Sprite(); - -# are we currently prompting for a password? -prompt_active = 0; - -# General purpose function to create text -fun WriteText (text, colour) { - image = Image.Text (text, colour.red, colour.green, colour.blue); - return image; -} - -fun ImageToText (text) { - image = WriteText (text, text_colour); - return image; -} - -fun ImageToTintedText (text) { - image = WriteText (text, tinted_text_colour); - return image; -} - -fun ImageToActionText (text) { - image = WriteText (text, action_text_colour); - return image; -} - -fun Debug(text) { - debugsprite.SetImage(ImageToText (text)); -} - -fun DebugBottom(text) { - debugsprite_bottom.SetImage(ImageToText (text)); - debugsprite_bottom.SetPosition(0, (Window.GetHeight (0) - 20), 1); -} - -fun DebugMedium(text) { - debugsprite_medium.SetImage(ImageToText (text)); - debugsprite_medium.SetPosition(0, (Window.GetHeight (0) - 60), 1); -} - -fun TextYOffset() { - local.y; - local.text_height; - local.min_height; - - # Put the 1st line below the logo + some spacing - y = logo.y + logo.height + (progress_indicator.bullet_height * 7 ); # + logo_spacing; - - text_height = first_line_height * 7.5; - - min_height = Window.GetHeight(); - if (y + text_height > min_height) - y = min_height - text_height; - - if (y < progress_indicator.y + progress_indicator.height) - return progress_indicator.y + progress_indicator.height; - return y; -} - -#------------------------------String functions------------------------------- - -# This is the equivalent for strstr() -fun StringString(string, substring) { - start = 0; - while (String(string).CharAt (start)) { - walk = 0; - while (String(substring).CharAt (walk) == String(string).CharAt (start + walk) ) { - walk++; - if (!String(substring).CharAt (walk)) return start; - } - start++; - } - - return NULL; -} - -fun StringLength (string) { - index = 0; - while (String(string).CharAt(index)) index++; - return index; -} - -fun StringCopy (source, beginning, end) { - local.destination = ""; - for (index = beginning; ( ( (end == NULL) || (index <= end) ) && (String(source).CharAt(index)) ); index++) { - local.destination += String(source).CharAt(index); - } - - return local.destination; -} - -fun StringReplace (source, pattern, replacement) { - local.found = StringString(source, pattern); - if (local.found == NULL) - return source; - - local.new_string = StringCopy (source, 0, local.found - 1) + - replacement + - StringCopy (source, local.found + StringLength(pattern), NULL); - - return local.new_string; -} - -# it makes sense to use it only for -# numbers up to 100 -fun StringToInteger (str) { - int = -1; - for (i=0; i<=100; i++) { - if (i+"" == str) { - int = i; - break; - } - } - return int; -} - -#----------------------------------------------------------------------------- -# Previous background colour -# #300a24 --> 0.19, 0.04, 0.14 -# New background colour -# #2c001e --> 0.16, 0.00, 0.12 -# -Window.SetBackgroundTopColor (0.39, 0.43, 0.51); # Nice colour on top of the screen fading to -Window.SetBackgroundBottomColor (0.39, 0.43, 0.51); # an equally nice colour on the bottom - -bits_per_pixel = Window.GetBitsPerPixel (); -if (bits_per_pixel == 4) { - logo_filename = "debian_logo16.png"; - progress_dot_off_filename = "progress_dot_off16.png"; - progress_dot_on_filename = "progress_dot_on16.png"; - password_dot_filename = "password_dot.png"; - password_field_filename = "password_field16.png"; -} else { - logo_filename = "debian_logo.png"; - progress_dot_off_filename = "progress_dot_off.png"; - progress_dot_on_filename = "progress_dot_on.png"; - password_dot_filename = "password_dot.png"; - password_field_filename = "password_field.png"; -} - -logo.image = Image (logo_filename); -logo.sprite = Sprite (); -logo.sprite.SetImage (logo.image); -logo.width = logo.image.GetWidth (); -logo.height = logo.image.GetHeight (); -logo.x = Window.GetX () + Window.GetWidth () / 2 - logo.width / 2; -logo.y = Window.GetY () + Window.GetHeight () / 2 - logo.height; -logo.z = 1000; -logo.sprite.SetX (logo.x); -logo.sprite.SetY (logo.y); -logo.sprite.SetZ (logo.z); -logo.sprite.SetOpacity (1); - -# Spacing below the logo - in pixels -logo_spacing = logo.height * 4; - -message_notification[0].image = ImageToTintedText (""); -message_notification[1].image = ImageToTintedText (""); -fsck_notification.image = ImageToActionText (""); +X_CENTER = Window.GetWidth() / 2; +Y_CENTER = Window.GetHeight() / 2; status = "normal"; -progress_indicator.bullet_off = Image (progress_dot_off_filename); -progress_indicator.bullet_on = Image (progress_dot_on_filename); -progress_indicator.bullet_width = progress_indicator.bullet_off.GetWidth (); -progress_indicator.bullet_height = progress_indicator.bullet_off.GetHeight (); -progress_indicator.bullet_hspacing = progress_indicator.bullet_width * 1.1; -progress_indicator.width = progress_indicator.bullet_width * 5; -progress_indicator.height = progress_indicator.bullet_height; -progress_indicator.y = logo.y + logo.height + (logo.height / 4); -progress_indicator.x = Window.GetX () + Window.GetWidth () / 2 - progress_indicator.width / 2; # logo.x + 26; +Window.SetBackgroundTopColor(0, 0, 0); +Window.SetBackgroundBottomColor(0, 0, 0); -# use a fixed string with ascending and descending stems to calibrate the -# bounding box for the first message, so the messages below don't move up -# and down according to *their* height. -first_line_height = ImageToTintedText ("AfpqtM").GetHeight(); +/* Images */ +container.image = Image("kali-logo-container.png"); +logo.image = Image("kali-logo.png"); +outline.image = Image("outline.png"); +fade.image = Image("kali-logo-fade.png"); +passwordDot.image = Image("password-dot.png"); -# if the user has a 640x480 or 800x600 display, we can't quite fit everything -# (including passphrase prompts) with the target spacing, so scoot the text up -# a bit if needed. -top_of_the_text = TextYOffset(); +// Kali logo can't be aligned by its natural center but by the circle center +// formed inside its body curve. This can be easily calculated by the offset +// ratio defined before. +logo.rightOffset = logo.image.GetWidth() * LOGO_RIGHT_OFFSET_RATIO; +logo.topOffset = logo.image.GetHeight() * LOGO_TOP_OFFSET_RATIO; -#-----------------------------------------Logo functions------------------------------ - -# Call this when updating the screen -fun draw_logo () { - logo.sprite.SetX (logo.x); - logo.sprite.SetY (logo.y); - logo.sprite.SetZ (logo.z); - logo.sprite.SetOpacity (1); +fun centerKaliLogo (image, zIndex) { + sprite = Sprite(image); + sprite.SetX(X_CENTER - image.GetWidth() / 2 + logo.rightOffset); + sprite.SetY(Y_CENTER - image.GetHeight() / 2 + logo.topOffset); + sprite.SetZ(zIndex); + sprite.SetOpacity(0); + return sprite; } +/* Kali logo sprites */ +logo.sprite = centerKaliLogo(logo.image, 4); +fade.sprite = centerKaliLogo(fade.image, 3); +container.sprite = centerKaliLogo(container.image, 2); +outline.sprite = centerKaliLogo(outline.image, 1); -#-----------------------------------------Progress Indicator-------------------------- -fun set_progress_indicator () { - - - # Here we assume that we can store half bullets on each half of the screen - # together with some spacing - local.x = progress_indicator.x; - - for (index = 0; index <= 4; index++) { - # Set the "off" bullets - progress_indicator.bullets_off[index].sprite = Sprite (progress_indicator.bullet_off); - progress_indicator.bullets_off[index].sprite.SetPosition (local.x, progress_indicator.y, 1000); - progress_indicator.bullets_off[index].x = local.x; - progress_indicator.bullets_off[index].y = progress_indicator.y; - progress_indicator.bullets_off[index].sprite.SetOpacity (1); - - #local.debug_medium_string = "Progress indicator " + index + ": x = " + progress_indicator.bullets_off[index].x + - # ", y = " + progress_indicator.bullets_off[index].y + ", logo width = " + logo.width + - # ", logo height = " + logo.height + " " + screen_width + " " + screen_height; - # - #(index % 2) && DebugMedium (local.debug_medium_string) || DebugBottom (local.debug_medium_string); - - # Set the "on" bullets on top of the "off" bullets and make them transparent - progress_indicator.bullets_on[index].sprite = Sprite (progress_indicator.bullet_on); - progress_indicator.bullets_on[index].x = progress_indicator.bullets_off[index].x; - progress_indicator.bullets_on[index].y = progress_indicator.bullets_off[index].y; - progress_indicator.bullets_on[index].sprite.SetPosition (progress_indicator.bullets_on[index].x, progress_indicator.bullets_on[index].y, 10000); - - progress_indicator.bullets_on[index].sprite.SetOpacity (0); - - local.x += progress_indicator.bullet_hspacing; - } - #local.debug_string = "Progress indicator: x1 = " + progress_indicator.x + ", x2 = " + local.x + ", y = " + progress_indicator.y + - # ", x logo = " + logo.x + ", y logo = " + logo.y + ", indicator width = " + progress_indicator.width; - #Debug(progress_indicator.bullets_off[0].x); +fun showKaliLogo () { + logo.sprite.SetOpacity(1); + fade.sprite.SetOpacity(0.5); } - -# We have 2 bullets, one on top of the other: -# The white one is on top of the red one and the former should -# slowly fade so as to get a nice transition effect. -fun switch_on_bullet (bullets_off, bullets_on, bullet_number, opacity) { - local.x = bullets_on[bullet_number].x; - local.y = bullets_on[bullet_number].y; - local.z = bullets_on[bullet_number].z; - - # Hide the bullets which are off - bullets_off[bullet_number].sprite.SetOpacity (0); - - # Show the bullets which are on - bullets_on[bullet_number].sprite.SetPosition (local.x, local.y, local.z); - bullets_on[bullet_number].sprite.SetOpacity (opacity); - - # Bump the number of times we have switched on bullets - global.times_bullets_switched++; +/* -------------------------------- Message -------------------------------- */ +fun displayMessageCallback (text) { + prompt.image = Image.Text(text, 1, 1, 1); + prompt.sprite = Sprite(prompt.image); + prompt.sprite.SetPosition( + X_CENTER - prompt.image.GetWidth() / 2, + container.sprite.GetY() + container.image.GetHeight() + 50, + 10000 + ); + global.prompt = prompt; } -fun switch_off_bullets () { - # Debug("Switching off progress indicator"); - - set_progress_indicator (); - global.times_bullets_switched = 0; - global.on_off = 1; +Plymouth.SetMessageFunction(displayMessageCallback); + +/* ---------------------------- Password Dialog ---------------------------- */ +fun passwordDialogSetup () { + passwordField.image = Image("password-field.png"); + passwordField.sprite = Sprite(passwordField.image); + passwordField.y = container.sprite.GetY() + container.image.GetHeight(); + passwordField.x = X_CENTER - passwordField.image.GetWidth() / 2; + passwordField.z = 5; + passwordField.sprite.SetX(passwordField.x); + passwordField.sprite.SetY(passwordField.y); + passwordField.sprite.SetZ(passwordField.z); + global.passwordField = passwordField; + showKaliLogo(); } -# This is something that we can call when we exit -fun switch_on_bullets () { - # Debug("Switching off progress indicator"); - if (!global.progress_indicator.bullets_on) set_progress_indicator (); - local = global.progress_indicator; +fun setPasswordDialogOpacity (opacity) { + passwordField.sprite.SetOpacity(opacity); - for (index = 0; bullets_on[index]; index++) { - switch_on_bullet (bullets_off, bullets_on, index, 1.0); - } + for (i = 0; passwordField.bullets[i]; i++) + passwordField.bullets[i].sprite.SetOpacity(opacity); } +fun passwordDialogCallback (prompt, bullets) { + global.status = "password"; -# Implement in boot progress callback -fun animate_progress_indicator (progress, time) { - if (global.progress_time == NULL) { - global.progress_time = progress; #time; - switch_off_bullets (); + if (!global.passwordField) + passwordDialogSetup(); + else + setPasswordDialogOpacity(1); + + displayMessageCallback(prompt); + + bulletWidth = passwordDot.image.GetWidth(); + + for (i = 0; + passwordField.bullets[i] || i < bullets && i < MAX_PASSWORD_LENGTH; + i++) { + if (!passwordField.bullets[i]) { + passwordField.bullets[i].sprite = Sprite(passwordDot.image); + passwordField.bullets[i].sprite.SetX(passwordField.x + + (i + 1) * bulletWidth); + passwordField.bullets[i].sprite.SetY(passwordField.y); + passwordField.bullets[i].sprite.SetZ(passwordField.z); } -# Debug ("progress = " + progress + ", time = " + time + " times switched = " + global.times_bullets_switched + " on_off " + global.on_off); - -# if (global.times_bullets_switched == NULL) -# global.times_bullets_switched = 5; - -# if (global.on_off == NULL) -# global.on_off = 0; - - if ((progress - global.progress_time) >= 1.0) { - global.progress_time = progress; - - if (global.times_bullets_switched == 5) { - # Change which bullets are switched on - # and which ones are switched off - global.on_off = !global.on_off; - global.times_bullets_switched = 0; - } - - if (global.on_off) { - switch_on_bullet (progress_indicator.bullets_off, progress_indicator.bullets_on, - global.times_bullets_switched, 1.0); - } - else { - switch_on_bullet (progress_indicator.bullets_on, progress_indicator.bullets_off, - global.times_bullets_switched, 1.0); - } - } - - - # Start setting bullets to "on" with translucency -# for (index = 0; index <= 5; index++) { -# opacity = 0.0; -# while (opacity <= 1.0) { -# switch_on_bullet (progress_indicator.bullets_off, progress_indicator.bullets_on, -# index, opacity); -# opacity += 0.1; -# } -# } -} - - -#-----------------------------------------Label utility functions--------------------- - -# label should be either a string or NULL -# Images for n lines will be created and returned as items of the -# message_label array -# -fun get_message_label (label, is_fake, is_action_line) { - # Debug("Get Label position"); - local.message_label; - - if (is_fake) - # Create a fake label so as to get the y coordinate of - # a standard-length label. - local.message_image = ImageToTintedText ("This is a fake message"); + if (i < bullets) + passwordField.bullets[i].sprite.SetOpacity(1); else - local.message_image = (is_action_line) && ImageToActionText (label) || ImageToTintedText (label); - - message_label.width = message_image.GetWidth (); - message_label.height = message_image.GetHeight (); + passwordField.bullets[i].sprite.SetOpacity(0); + } +} - # Center the line horizontally - message_label.x = Window.GetX () + Window.GetWidth () / 2 - message_label.width / 2; +Plymouth.SetDisplayPasswordFunction(passwordDialogCallback); - message_label.y = top_of_the_text; +fun displayNormalLogoCallback () { + global.status = "normal"; + if (global.passwordField) + setPasswordDialogOpacity(0); + prompt.SetOpacity(0); + showKaliLogo(); +} - # Put the 2nd line below the fsck line - if (is_action_line) { - local.fsck_label.y = message_label.y + (first_line_height + first_line_height / 2); - message_label.y = local.fsck_label.y + (first_line_height * 2); +Plymouth.SetDisplayNormalFunction(displayNormalLogoCallback); +Plymouth.SetQuitFunction(displayNormalLogoCallback); + + +if (Plymouth.GetMode() == "boot") { + outline.movementRange = + container.image.GetHeight() - outline.image.GetHeight(); + outline.initialPosition = container.sprite.GetY() + outline.movementRange; + outline.sprite.SetY(outline.initialPosition); + + container.sprite.SetOpacity(1); + outline.sprite.SetOpacity(1); + + fun bootProgressCallback (duration, progress) { + if (global.status != "normal") return; + if (progress < 0.1) + logo.sprite.SetOpacity(progress / 0.1); + else if (progress < 0.9) { + relativeProgress = (progress - 0.1) / 0.8; + outline.sprite.SetY(outline.initialPosition + - outline.movementRange * relativeProgress); + if (progress > 0.8 && progress < 0.85) { + relativeProgress = (progress - 0.8) / 0.05; + fade.sprite.SetOpacity(relativeProgress); + } else if (progress > 0.85) { + relativeProgress = (progress - 0.85) / 0.05; + fade.sprite.SetOpacity(1 - relativeProgress); + } + } else { + opacity = (1 - progress) / 0.1; + logo.sprite.SetOpacity(opacity); } + } - # Debug("action label x = " + message_label.x + " y = " + message_label.y ); - -# message_debug = "msg_x = " + message_label.x + " msg_y = " + message_label.y + -# "msg_width = " + message_label.width + " msg_height = " + -# message_label.height + " message = " + label; -# Debug(message_debug); - - return message_label; - + Plymouth.SetBootProgressFunction(bootProgressCallback); } -# Create an fsck label and/or get its position -fun get_fsck_label (label, is_fake) { - # Debug("Get Label position"); - local.fsck_label = global.progress_label; - - if (is_fake) - fsck_label.image = ImageToTintedText ("This is a fake message"); - else - fsck_label.image = ImageToTintedText (label); - - fsck_label.width = fsck_label.image.GetWidth (); - fsck_label.height = fsck_label.image.GetHeight (); - - # Centre the label horizontally - fsck_label.x = Window.GetX () + Window.GetWidth () / 2 - fsck_label.width / 2; - - local.first_label = get_message_label (label, 1, 0); - - # Place the label below the 1st message line - fsck_label.y = local.first_label.y + local.first_label.height + (local.first_label.height / 2); - -# message_debug = "msg_x = " + fsck_label.x + " msg_y = " + fsck_label.y + -# "msg_width = " + fsck_label.width + " msg_height = " + -# fsck_label.height + " message = " + label; -# Debug(message_debug); - - return fsck_label; -} - -#-----------------------------------------Message stuff -------------------------------- -# - -# Set up a message label -# -# NOTE: this is called when doing something like 'plymouth message "hello world"' -# -fun setup_message (message_text, x, y, z, index) { - # Debug("Message setup"); - global.message_notification[index].image = (index) && ImageToActionText (message_text) || ImageToTintedText (message_text); - - # Set up the text message, if any - message_notification[index].x = x; - message_notification[index].y = y; - message_notification[index].z = z; - - message_notification[index].sprite = Sprite (); - message_notification[index].sprite.SetImage (message_notification[index].image); - message_notification[index].sprite.SetX (message_notification[index].x); - message_notification[index].sprite.SetY (message_notification[index].y); - message_notification[index].sprite.SetZ (message_notification[index].z); - -} - -fun show_message (index) { - if (global.message_notification[index].sprite) global.message_notification[index].sprite.SetOpacity(1); -} - -fun hide_message (index) { - if (global.message_notification[index].sprite) global.message_notification[index].sprite.SetOpacity(0); -} - - - - -# the callback function is called when new message should be displayed. -# First arg is message to display. -fun message_callback (message) -{ - # Debug("Message callback"); - is_fake = 0; - if (!message || (message == "")) is_fake = 1; - - local.substring = "keys:"; - - # Look for the "keys:" prefix - local.keys = StringString(message, local.substring); - - local.is_action_line = (keys != NULL); - #Debug("keys " + local.keys + " substring length = " + StringLength(local.substring)); - - # Get the message without the "keys:" prefix - if (keys != NULL) - message = StringCopy (message, keys + StringLength(local.substring), NULL); - - local.label.is_fake = is_fake; - label = get_message_label(message, is_fake, is_action_line); - label.z = 10000; - - setup_message (message, label.x, label.y, label.z, is_action_line); - if (prompt_active && local.is_action_line) - hide_message (is_action_line); - else - show_message (is_action_line); - -} - - -#-----------------------------------------Display Password stuff ----------------------- -# - -fun password_dialogue_setup (message_label) { - # Debug("Password dialog setup"); - - local.entry; - local.bullet_image; - - bullet_image = Image (password_dot_filename); - entry.image = Image (password_field_filename); - - # Hide the normal labels - prompt_active = 1; - if (message_notification[1].sprite) hide_message (1); - - # Set the prompt label - label = get_message_label(message_label, 0, 1); - label.z = 10000; - - setup_message (message_label, label.x, label.y, label.z, 2); - show_message (2); - - # Set up the text entry which contains the bullets - entry.sprite = Sprite (); - entry.sprite.SetImage (entry.image); - - # Centre the box horizontally - entry.x = Window.GetX () + Window.GetWidth () / 2 - entry.image.GetWidth () / 2; - - # Put the entry below the second label. - entry.y = message_notification[2].y + label.height; - - #Debug ("entry x = " + entry.x + ", y = " + entry.y); - entry.z = 10000; - entry.sprite.SetX (entry.x); - entry.sprite.SetY (entry.y); - entry.sprite.SetZ (entry.z); - - global.password_dialogue = local; -} - -fun password_dialogue_opacity (opacity) { - # Debug("Password dialog opacity"); - global.password_dialogue.opacity = opacity; - local = global.password_dialogue; - - # You can make the box translucent with a float - # entry.sprite.SetOpacity (0.3); - entry.sprite.SetOpacity (opacity); - label.sprite.SetOpacity (opacity); - - if (bullets) { - for (index = 0; bullets[index]; index++) { - bullets[index].sprite.SetOpacity (opacity); - } - } -} - - -# The callback function is called when the display should display a password dialogue. -# First arg is prompt string, the second is the number of bullets. -fun display_password_callback (prompt, bullets) { - # Debug("Password dialog setup"); - - global.status = "password"; - if (!global.password_dialogue) password_dialogue_setup(prompt); - password_dialogue_opacity (1); - bullet_width = password_dialogue.bullet_image.GetWidth(); - bullet_y = password_dialogue.entry.y + - password_dialogue.entry.image.GetHeight () / 2 - - password_dialogue.bullet_image.GetHeight () / 2; - margin = bullet_width; - spaces = Math.Int( (password_dialogue.entry.image.GetWidth () - (margin * 2)) / (bullet_width / 2 ) ); - #Debug ("spaces = " + spaces + ", bullets = " + bullets); - bullets_area.width = margin + spaces * (bullet_width / 2); - bullets_area.x = Window.GetX () + Window.GetWidth () / 2 - bullets_area.width / 2; - #DebugBottom ("pwd_entry x = " + password_dialogue.entry.x + ", bullets_area.x = " + bullets_area.x + ", bullets_area.width = " + bullets_area.width); - if (bullets > spaces) - bullets = spaces; - for (index = 0; password_dialogue.bullets[index] || index < bullets; index++){ - if (!password_dialogue.bullets[index]) { - password_dialogue.bullets[index].sprite = Sprite (); - password_dialogue.bullets[index].sprite.SetImage (password_dialogue.bullet_image); - password_dialogue.bullets[index].x = bullets_area.x + # password_dialogue.entry.x + margin + - index * bullet_width / 2; - password_dialogue.bullets[index].sprite.SetX (password_dialogue.bullets[index].x); - password_dialogue.bullets[index].y = bullet_y; - password_dialogue.bullets[index].sprite.SetY (password_dialogue.bullets[index].y); - password_dialogue.bullets[index].z = password_dialogue.entry.z + 1; - password_dialogue.bullets[index].sprite.SetZ (password_dialogue.bullets[index].z); - } - - password_dialogue.bullets[index].sprite.SetOpacity (0); - - if (index < bullets) { - password_dialogue.bullets[index].sprite.SetOpacity (1); - } - } -} - -Plymouth.SetDisplayPasswordFunction (display_password_callback); - -Plymouth.SetMessageFunction (message_callback); - -Plymouth.SetBootProgressFunction (animate_progress_indicator); - -# Plymouth.SetBootProgressFunction: the callback function is called with two numbers, the progress (between 0 and 1) and the time spent booting so far -# Plymouth.SetRootMountedFunction: the callback function is called when a new root is mounted -# Plymouth.SetKeyboardInputFunction: the callback function is called with a string containing a new character entered on the keyboard - -#----------------------------------------- FSCK Counter -------------------------------- - -# Initialise the counter -fun init_fsck_count () { - # The number of fsck checks in this cycle - global.counter.total = 0; - # The number of fsck checks already performed + the current one - global.counter.current = 1; - # The previous fsck - global.counter.last = 0; -} - -# Increase the total counter -fun increase_fsck_count () { - global.counter.total++; -} - -fun increase_current_fsck_count () { - global.counter.last = global.counter.current++; -} - -# Clear the counter -fun clear_fsck_count () { - global.counter = NULL; - init_fsck_count (); -} - -#----------------------------------------- Progress Label ------------------------------ - - -# Change the opacity level of a progress label -# -# opacity = 1 -> show -# opacity = 0 -> hide -# opacity = 0.3 (or any other float) -> translucent -# -fun set_progress_label_opacity (opacity) { - # the label - progress_label.sprite.SetOpacity (opacity); - - # Make the slot available again when hiding the bar - # So that another bar can take its place - if (opacity == 0) { - progress_label.is_available = 1; - progress_label.device = ""; - } -} - -# Set up a new Progress Bar -# -# TODO: Make it possible to reuse (rather than recreate) a bar -# if .is_available = 1. Ideally this would just reset the -# label, the associated -# device and the image size of the sprite. - -fun init_progress_label (device, status_string) { - # Make the slot unavailable - global.progress_label.is_available = 0; - progress_label.progress = 0; - progress_label.device = device; - progress_label.status_string = status_string; -} - -# See if the progress label is keeping track of the fsck -# of "device" -# -fun device_has_progress_label (device) { - #DebugBottom ("label device = " + progress_label.device + " checking device " + device); - return (progress_label.device == device); -} - -# Update the Progress bar which corresponds to index -# -fun update_progress_label (progress) { - # If progress is NULL then we just refresh the label. - # This happens when only counter.total has changed. - if (progress != NULL) { - progress_label.progress = progress; - - #Debug("device " + progress_label.device + " progress " + progress); - - # If progress >= 100% hide the label and make it available again - if (progress >= 100) { - set_progress_label_opacity (0); - - # See if we any other fsck check is complete - # and, if so, hide the progress bars and the labels - on_fsck_completed (); - - return 0; - } - } - # Update progress label here - # - # FIXME: the queue logic from this theme should really be moved into mountall - # instead of using string replacement to deal with localised strings. - label = StringReplace (progress_label.status_string[0], "%1$d", global.counter.current); - label = StringReplace (label, "%2$d", global.counter.total); - label = StringReplace (label, "%3$d", progress_label.progress); - label = StringReplace (label, "%%", "%"); - - progress_label = get_fsck_label (label, 0); - #progress_label.progress = progress; - - progress_label.sprite = Sprite (progress_label.image); - - # Set up the bar - progress_label.sprite.SetPosition(progress_label.x, progress_label.y, 1); - - set_progress_label_opacity (1); - -} - -# Refresh the label so as to update counters -fun refresh_progress_label () { - update_progress_label (NULL); -} - -#----------------------------------------- FSCK Queue ---------------------------------- - -# Initialise the fsck queue -fun init_queue () { - global.fsck_queue[0].device; - global.fsck_queue[0].progress; - global.fsck_queue.counter = 0; - global.fsck_queue.biggest_item = 0; -} - -fun clear_queue () { - global.fsck_queue = NULL; - init_queue (); -} - -# Return either the device index in the queue or -1 -fun queue_look_up_by_device (device) { - for (i=0; i <= fsck_queue.biggest_item; i++) { - if ((fsck_queue[i]) && (fsck_queue[i].device == device)) - return i; - } - return -1; -} - -# Keep track of an fsck process in the queue -fun add_fsck_to_queue (device, progress) { - # Look for an empty slot in the queue - for (i=0; global.fsck_queue[i].device; i++) { - continue; - } - local.index = i; - - # Set device and progress - global.fsck_queue[local.index].device = device; - global.fsck_queue[local.index].progress = progress; - - # Increase the queue counter - global.fsck_queue.counter++; - - # Update the max index of the array for iterations - if (local.index > global.fsck_queue.biggest_item) - global.fsck_queue.biggest_item = local.index; - - #DebugMedium ("Adding " + device + " at " + local.index); -} - -fun is_queue_empty () { - return (fsck_queue.counter == 0); -} - -fun is_progress_label_available () { - return (progress_label.is_available == 1); -} - - -# This should cover the case in which the fsck checks in -# the queue are completed before the ones showed in the -# progress label -fun on_queued_fsck_completed () { - if (!is_queue_empty ()) - return; - - # Hide the extra label, if any - #if (progress_bar.extra_label.sprite) - # progress_bar.extra_label.sprite.SetOpacity(0); -} - -fun remove_fsck_from_queue (index) { - # Free memory which was previously allocated for - # device and progress - global.fsck_queue[index].device = NULL; - global.fsck_queue[index].progress = NULL; - - # Decrease the queue counter - global.fsck_queue.counter--; - - # See if there are other processes in the queue - # if not, clear the extra_label - on_queued_fsck_completed (); -} - -fun on_fsck_completed () { - # We have moved on to tracking the next fsck - increase_current_fsck_count (); - - if (!is_progress_label_available ()) - return; - - if (!is_queue_empty ()) - return; - - # Hide the progress label - if (progress_label.sprite) - progress_label.sprite.SetOpacity (0); - - # Clear the queue - clear_queue (); - - # Clear the fsck counter - clear_fsck_count (); -} - -# Update an fsck process that we keep track of in the queue -fun update_progress_in_queue (index, device, progress) { - # If the fsck is complete, remove it from the queue - if (progress >= 100) { - remove_fsck_from_queue (index); - on_queued_fsck_completed (); - return; - } - - global.fsck_queue[index].device = device; - global.fsck_queue[index].progress = progress; - -} - -# TODO: Move it to some function -# Create an empty queue -#init_queue (); - - -#----------------------------------------- FSCK Functions ------------------------------ - - -# Either add a new bar for fsck checks or update an existing bar -# -# NOTE: no more than "progress_bar.max_number" bars are allowed -# -fun fsck_check (device, progress, status_string) { - - # The 1st time this will take place - if (!global.progress_label) { - # Increase the fsck counter - increase_fsck_count (); - - # Set up a new label for the check - init_progress_label (device, status_string); - update_progress_label (progress); - - return; - } - - - if (device_has_progress_label (device)) { - # Update the progress of the existing label - update_progress_label (progress); - } - else { - # See if there's already a slot in the queue for the device - local.queue_device_index = queue_look_up_by_device(device); - - # See if the progress_label is available - if (progress_label.is_available) { - -# local.my_string = "available index " + local.available_index + " progress_bar counter is " + progress_bar.counter; -# Debug(local.my_string); - - - # If the fsck check for the device was in the queue, then - # remove it from the queue - if (local.queue_device_index >= 0) { - remove_fsck_from_queue (index); - } - else { - # Increase the fsck counter - increase_fsck_count (); - } - -# local.my_string += local.message; - #Debug("setting new label for device " + device + " progress " + progress); - - # Set up a new label for the check - init_progress_label (device, status_string); - update_progress_label (progress); - - } - # If the progress_label is not available - else { - - # If the fsck check for the device is already in the queue - # just update its progress in the queue - if (local.queue_device_index >= 0) { - #DebugMedium("Updating queue at " + local.queue_device_index + " for device " + device); - update_progress_in_queue (local.queue_device_index, device, progress); - } - # Otherwise add the check to the queue - else { - #DebugMedium("Adding device " + device + " to queue at " + local.queue_device_index); - add_fsck_to_queue (device, progress); - - # Increase the fsck counter - increase_fsck_count (); - - refresh_progress_label (); - } - - } - } - -# if (!is_queue_empty ()) { -# DebugBottom("Extra label for "+ device); - #} -# else { -# DebugBottom("No extra label for " + device + ". 1st Device in the queue "+ fsck_queue[0].device + " counter = " + global.fsck_queue.counter); -# } -} - - -#-----------------------------------------Update Status stuff -------------------------- -# -# The update_status_callback is what we can use to pass plymouth whatever we want so -# as to make use of features which are available only in this program (as opposed to -# being available for any theme for the script plugin). -# -# Example: -# -# Thanks to the current implementation, some scripts can call "plymouth --update=fsck:sda1:40" -# and this program will know that 1) we're performing and fsck check, 2) we're checking sda1, -# 3) the program should set the label progress to 40% -# -# Other features can be easily added by parsing the string that we pass plymouth with "--update" -# -fun update_status_callback (status) { -# Debug(status); - if (!status) return; - - string_it = 0; - update_strings[string_it] = ""; - - for (i=0; (String(status).CharAt(i) != ""); i++) { - local.temp_char = String(status).CharAt(i); - if (temp_char != ":") - update_strings[string_it] += temp_char; - else - update_strings[++string_it] = ""; - } - -# my_string = update_strings[0] + " " + update_strings[1] + " " + update_strings[2]; -# Debug(my_string); - # Let's assume that we're dealing with these strings fsck:sda1:40 - if ((string_it >= 2) && (update_strings[0] == "fsck")) { - - device = update_strings[1]; - progress = update_strings[2]; - status_string[0] = update_strings[3]; # "Checking disk %1$d of %2$d (%3$d %% complete)" - if (!status_string[0]) - status_string[0] = "Checking disk %1$d of %2$d (%3$d %% complete)"; - - if ((device != "") && (progress != "")) { - progress = StringToInteger (progress); - - # Make sure that the fsck_queue is initialised - if (!global.fsck_queue) - init_queue (); - - # Make sure that the fsck counter is initialised - if (!global.counter) - init_fsck_count (); - -# if (!global.progress_bar.extra_label.sprite) -# create_extra_fsck_label (); - - # Keep track of the fsck check - fsck_check (device, progress, status_string); - } - - } - -} -Plymouth.SetUpdateStatusFunction (update_status_callback); - -#-----------------------------------------Display Question stuff ----------------------- -# -# TODO: Implement this if needed -# -# The callback function is called when the display should display a question dialogue. -# First arg is prompt string, the second is the entry contents. -#fun display_question_callback (prompt_string, entry_contents) -#{ -# time++; -#} -# -#Plymouth.SetDisplayQuestionFunction (display_question_callback); - -#-----------------------------------------Refresh stuff -------------------------------- -# -# Calling Plymouth.SetRefreshFunction with a function will set that function to be -# called up to 50 times every second, e.g. -# -# NOTE: if a refresh function is not set, Plymouth doesn't seem to be able to update -# the screen correctly -# -fun refresh_callback () -{ - draw_logo (); -} -Plymouth.SetRefreshFunction (refresh_callback); - - -#-----------------------------------------Display Normal stuff ----------------------- -# -# The callback function is called when the display should return to normal -fun display_normal_callback () -{ - global.status = "normal"; - if (global.password_dialogue) { - password_dialogue_opacity (0); - global.password_dialogue = NULL; - if (message_notification[2].sprite) hide_message(2); - prompt_active = 0; - } - - if (message_notification[1].sprite) show_message (1); - - -} - -Plymouth.SetDisplayNormalFunction (display_normal_callback); - - -#----------------------------------------- Quit -------------------------------- - -# TODO: Maybe we should also hide any other dialog -# Show the logo and make the progress indicator look full when on exit -fun quit_callback () -{ - logo.sprite.SetOpacity (1); - switch_on_bullets (); -} - -Plymouth.SetQuitFunction(quit_callback); diff --git a/Plymouth-Theme/kali-2019/outline.png b/Plymouth-Theme/kali/outline.png similarity index 100% rename from Plymouth-Theme/kali-2019/outline.png rename to Plymouth-Theme/kali/outline.png diff --git a/Plymouth-Theme/kali-2019/password-dot.png b/Plymouth-Theme/kali/password-dot.png similarity index 100% rename from Plymouth-Theme/kali-2019/password-dot.png rename to Plymouth-Theme/kali/password-dot.png diff --git a/Plymouth-Theme/kali-2019/password-field.png b/Plymouth-Theme/kali/password-field.png similarity index 100% rename from Plymouth-Theme/kali-2019/password-field.png rename to Plymouth-Theme/kali/password-field.png diff --git a/Plymouth-Theme/kali/password_dot.png b/Plymouth-Theme/kali/password_dot.png deleted file mode 100644 index 7dd7413375dde415dda9292e8224a2f2a9c4f280..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 324 zcmeAS@N?(olHy`uVBq!ia0vp^q9Dw{1|(OCFP#RY*pj^6T^Rm@;DWu&Cj&(|3p^r= z85p>QL70(Y)*K0-AbW|YuPgf<4lyPX=V*urDv~DkUR0{QR40!I+Kn)StKYjH?RHS+u7gK(n_kU z((Z12DE+9vxvyQMRph>X{%WiGnVBAiO>FELr+$C-;XYurWy zEsk@ReQ5E%(=HNkKPhRC%dA+LMETh(KE!-7ej@*{?wInj8}qX3qdrxpUf8y(*kj{i z)_2c(owjFeaXZcDHM43G5dZ)H diff --git a/Plymouth-Theme/kali/password_dot16.png b/Plymouth-Theme/kali/password_dot16.png deleted file mode 100644 index 991a5864923357d53acfc631f8f19b5bdc142faf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 285 zcmeAS@N?(olHy`uVBq!ia0vp^q9Dw{0wkH`a%F)OQ#4gC<%p&S{dxCdIlkc`WwK|)PU%S*q>)my<-Muu1 zAv0>b*8B;Q3qP%%d~Xq#-pvhZPVwy~vQ#4gF&b2S$+!RLTbsT*& z>@5;JIwgfC2u@CtIxm#}_fg-oGxL}`Yo-LMZ#w%)vPgM)r8kRFIO{IGrdeBZR#f}{ bVE)A@yk4*VT#bV*(B%xCu6{1-oD!M<`MY8c diff --git a/Plymouth-Theme/kali/password_field.png b/Plymouth-Theme/kali/password_field.png deleted file mode 100644 index 4c0b93e32a140d5649bb1ecfe6f0fcedb70e3385..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1214 zcmeAS@N?(olHy`uVBq!ia0y~yVB`g|^*Gpoq*1Jo3Xoz;@^*J&_z!{$_AZ|c6yYrJ zh%9Dc;1&j9Muu5)B!GhKC7!;n>~}cCm^k^@U3Ndfz`)||>EaktaqI2fgV{2vGRHnX z|GsbY=FP@8b0)EE^mOQ6$ko+!Fd=KjjeFG}B)-0p*U;FyU|Lhvg(mi+8B#?VZar~9)wYxt)TDjqO%>(x`v7(uWr+=?aPhg#{`F=f>n#J&@H{RPakaX%a8(I|Lu9rj?;^vVwvG^`B(3Bw zoztHV-n^;6Ud8Zh9e<^4U)9ow?2C(2t9BLFR#v{d_V#u$H#fJ|%&btaDQk0%uI0Qa z5ws{LQf$-q?d{dy_r3nRb8qdGWtofbzwh2Iw2{GQ@7oJ`+D2DjmMjYo4@wFmBo;> zc5VERkUEow=j(ff1?Rdu-n>}c-yL8e=2GIBssFw4wxH6l`qljRn3R%CIyx>YD7iIv zNbrI=P>M*g7fam_?^0B%a#Wc9`@wn>tz*p{HKD54q9Y>grNkUml|=J}1sNMO3>nsR zNH8pmi@0)In0djPDVl9J0|GuCpWLA~^V%(yz}4-Wbe8CNU+0K+UtAO~a%{$*2R9uv zeLh}^ivDm-&{rj2B>%iM*&=iQ zy5NfZR>XRz4tg9T7;<%Pcu=&&$5|?9rpDnQp$PpR!%NvEFFI?YE~6->Xo*i^y5?o>bO7N}9MkEaad633i5A3`q>Zo)X6bcgvb?<ENqaWdX}AHi^`|gJ9=3}=+84_i7u7zD ZPfMCT!Hh?67O5}D^2Q9H6k|z{UoeBivm0q3PLj8~3quF1tOt<8S>O>_%)r1c48n{Iv*t(u1=&kH zeO=k_aELJ)%RTO47Xk_ec)B=-L>zv5!%*;mfdI3kIAemx%s-!xKRG3_rsA8xn-y0i zF4Joi-^2if|Tq zL>4nJa0`PlBg3pY5H=O_B(81Lgr?|tS6TMg{FDBIEGl9emlvLtJy)sIle1h zAm&W0O|xzKdxb9=PVCQkoOb=Zm3PIfaA_p(VSlxgH9HF8UQAcKebr~evHdQ&+!+m0 z9tRji6udtPt-n>Vh4Gz(^mCps2be3~iuIl_y&zRSKZB{_mY#R$9kV&h3M@K(-(8l< z^e*W*F=OW;neT7<^fR}_HrU0~l}BCM_F%$&`xJluIg_!@hljQC0!qCAg>j6?;;1OBOz`!jG!i)^F=12eq*-JcqUD@xji3ypC z=SJ8uMi(9*s#rB@CXfelF{r5}E)k CGAGpl diff --git a/Plymouth-Theme/kali/progress_dot_on.png b/Plymouth-Theme/kali/progress_dot_on.png deleted file mode 100644 index 59c1d0549c5903b2d967a2d69123bb8f777d8328..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 331 zcmeAS@N?(olHy`uVBq!ia0vp^q9Dw{1|(OCFP#RY*pj^6T^Ldr@)?>Joi-^2if|Tq zL>4nJa0`PlBg3pY5H=O_B(81LPpjChaF>pLN`2J978NlzrC{2i`h}&*vELk z(=J;Cu7#OQEv<4D2lZoM>uIa1nU8MRE;~xDadLa>=yx zpXaw5pWc%9oxf(Q=)QyhEJ`Y;c~@He(3p2>Ra``-9G{iP3nf<@dlLp*nMW!$>p5dg zY%CY{C(E?HZ-10DZ=TqV1AN;q9@CP0^oQ+h|BSj`L%oe{rFYzI<}DMN=4Za$&Ueds zw|xKV-Rmpdj>(=YY+M}@rhj?C+GVXmliww<_RmJoi-^2if|Tq zL>4nJa0`PlBg3pY5H=O_B(81LYAD?4^D~$g>HDdIEGl9etTu37qg?lv5)b7 zr(L!PTnjUqT3Y2Q5Y#=jH~#^%On8gU^p#&YbG8I-IMLLa;3DvFi{u&}aUs^g<&tUX zKhJMBKD{OHJAchq(R~O1S(H>x^RBe`p)v2&shI$*@O7FPa%v&Zj&Ch(ho$r?O zZu$PzyVqB^9g{s**tj|*O#kwNwaZ$CCcjHy?Vqt^(=44Y{>&2!d+)H!@qGDz+OMM* Z$|ti~$6hxJ{|xjagQu&X%Q~loCIFRRevkkF