Showing preview only (4,181K chars total). Download the full file or copy to clipboard to get everything.
Repository: DosX-dev/DosX-dev.github.io
Branch: main
Commit: 7ae5ef5d9f78
Files: 161
Total size: 3.8 MB
Directory structure:
gitextract_gxavh5fc/
├── .gitattributes
├── 404.html
├── 404.md
├── CNAME
├── README.md
├── app.fingerprint.js
├── app.js
├── app.modern.css
├── app.modern.fingerprint.css
├── axiom/
│ ├── application_data/
│ │ ├── system/
│ │ │ ├── kernel/
│ │ │ │ ├── core/
│ │ │ │ │ └── bootmgr.js
│ │ │ │ ├── environment.js
│ │ │ │ ├── fsio/
│ │ │ │ │ ├── fs.compression.js
│ │ │ │ │ ├── fs.input.js
│ │ │ │ │ └── fs.output.js
│ │ │ │ ├── virtualcpu.interruptions.js
│ │ │ │ └── virtualcpu.js
│ │ │ ├── uiapps/
│ │ │ │ └── core.ui-notepad.js
│ │ │ └── vm/
│ │ │ ├── container.js
│ │ │ ├── container.memguard.js
│ │ │ ├── emulator.instructions.js
│ │ │ └── emulator.js
│ │ └── webui/
│ │ ├── app.manifest.js
│ │ └── app.styles.css
│ └── index.html
├── dosx-files/
│ ├── 1
│ ├── spoof-me.txt
│ ├── vavilonp-red.txt
│ └── x-crpt-lic.txt
├── global/
│ └── dark-blue-md.css
├── gui/
│ ├── index.html
│ └── new/
│ └── index.html
├── index.html
├── legacy_tandem/
│ └── viewer/
│ ├── app/
│ │ ├── code/
│ │ │ ├── app.toolbox.events.js
│ │ │ ├── app.toolbox.modal.js
│ │ │ ├── app.toolbox.navigation.js
│ │ │ ├── app.viewer.init.js
│ │ │ ├── app.viewer.js
│ │ │ ├── app.viewer.loader.js
│ │ │ ├── app.viewer.mobile.js
│ │ │ └── no-toolbox-viewer/
│ │ │ ├── index.init.js
│ │ │ ├── index.loader.js
│ │ │ └── index.state.js
│ │ └── styles/
│ │ ├── default.app-base.css
│ │ ├── default.app-modal-dialogs.css
│ │ ├── default.app-viewer-mobile.css
│ │ ├── default.app-viewer-no-toolbox.css
│ │ ├── default.app-viewer.css
│ │ └── default.css
│ ├── home/
│ │ └── index.html
│ ├── index.db.js
│ ├── index.html
│ ├── no-toolbox-viewer/
│ │ └── index.html
│ └── works/
│ ├── example-astra/
│ │ ├── css/
│ │ │ └── style.css
│ │ ├── index.html
│ │ └── js/
│ │ └── main.js
│ ├── example-cakes/
│ │ └── index.html
│ ├── example-designer/
│ │ └── index.html
│ ├── example-florist/
│ │ └── index.html
│ ├── example-jstd/
│ │ ├── 404.html
│ │ ├── app/
│ │ │ ├── i18n.js
│ │ │ └── main.js
│ │ ├── download/
│ │ │ └── index.html
│ │ ├── en/
│ │ │ └── index.html
│ │ ├── index.html
│ │ ├── ru/
│ │ │ └── index.html
│ │ └── styles/
│ │ └── main.css
│ ├── example-lawyer/
│ │ └── index.html
│ ├── example-nightclub/
│ │ └── index.html
│ ├── example-pcbuilder/
│ │ ├── css/
│ │ │ └── style.css
│ │ ├── index.html
│ │ └── js/
│ │ ├── components.js
│ │ └── main.js
│ └── example-vpn/
│ └── index.html
├── libs/
│ ├── index.html
│ ├── packages/
│ │ └── libsc-in-v3.txt
│ ├── server.js
│ └── ultra-hash-v3.4.js
├── mov/
│ ├── @my-profile-test/
│ │ ├── index.html
│ │ ├── script.js
│ │ └── style.css
│ ├── css/
│ │ ├── animate.css
│ │ ├── default-skin/
│ │ │ └── default-skin.css
│ │ ├── jquery.mCustomScrollbar.css
│ │ ├── photoswipe.css
│ │ ├── style-map-variant.css
│ │ └── vegas.css
│ ├── fonts/
│ │ └── FontAwesome.otf
│ ├── html-guard-config.js
│ ├── index.html
│ └── js/
│ ├── build-src.cmd
│ ├── contact-me.js
│ ├── debug.cmd
│ ├── jquery.mCustomScrollbar.js
│ ├── jquery.mousewheel.js
│ ├── main.js
│ ├── modernizr.custom.js
│ ├── mov.js
│ ├── photoswipe-ui-default.js
│ ├── photoswipe.js
│ ├── placeholder.js
│ ├── src_mov.js
│ ├── vegas-youtube-mobile.js
│ └── vegas.js
├── mvn/
│ └── index.html
├── old-website/
│ ├── 404.html
│ ├── index.html
│ └── res/
│ └── site.html
├── robots.txt
├── ru/
│ └── csharp_с_нуля__курс_для_тех_кто_не_понимает_но_хочет_понять/
│ └── index.html
├── safenova/
│ ├── .server.ps1
│ ├── css/
│ │ └── app.css
│ ├── index.html
│ └── js/
│ ├── constants.js
│ ├── crypto.js
│ ├── db.js
│ ├── desktop.js
│ ├── fileops.js
│ ├── home.js
│ ├── main.js
│ ├── state.js
│ └── vfs.js
├── scripts/
│ ├── net8/
│ │ ├── win-debug.txt
│ │ └── win-release.txt
│ ├── net9/
│ │ ├── win-debug.txt
│ │ └── win-release.txt
│ └── www/
│ └── js-daemon.js
├── server-0/
│ └── antropove.ru/
│ ├── browserconfig.xml
│ ├── index.html
│ ├── manifest.json
│ ├── robots.txt
│ ├── script.js
│ ├── script.resources.js
│ ├── site.webmanifest
│ ├── sitemap.xml
│ └── style.css
├── tanki-online-unoff-client/
│ └── TapkiOnline/
│ ├── app/
│ │ └── entry.js
│ └── welcome/
│ ├── captcha.html
│ ├── index.html
│ ├── index_birth.html
│ ├── index_old.html
│ └── menu.html
├── terminal/
│ ├── index.htm
│ ├── modules/
│ │ ├── app.js
│ │ ├── context.js
│ │ ├── fp-api.js
│ │ ├── io-fs.js
│ │ └── manifest.js
│ └── styles/
│ ├── global.css
│ └── themes/
│ ├── cherry.css
│ ├── dark.css
│ ├── hacker.css
│ └── light.css
├── testpool/
│ ├── Import.js
│ ├── demo-apps/
│ │ ├── app1/
│ │ │ ├── index.html
│ │ │ └── memworker.js
│ │ └── ezmath/
│ │ └── index.html
│ └── index.html
├── tor-detector.html
├── xss/
│ └── index.html
├── xxx/
│ └── index.html
└── yandex_d246819e88468b42.html
================================================
FILE CONTENTS
================================================
================================================
FILE: .gitattributes
================================================
*.* linguist-detectable=false
================================================
FILE: 404.html
================================================
<h2>Wrong address! LOL.</h2>
================================================
FILE: 404.md
================================================
-------
permalink: /404.html
-------
================================================
FILE: CNAME
================================================
dosx.su
================================================
FILE: README.md
================================================
## https://dosx.su/
================================================
FILE: app.fingerprint.js
================================================
/**
* Fingerprint Component
* Collects and displays browser & system information
*/
class Fingerprint {
constructor() {
this.output = document.getElementById('fingerprint-output');
this.toolbarButtons = document.querySelectorAll('.toolbar-button');
this.windowControls = {
minimize: document.querySelector('.window-control.minimize'),
maximize: document.querySelector('.window-control.maximize'),
close: document.querySelector('.window-control.close')
};
// Add flag to track loading state
this.isLoading = false;
this.initEventListeners();
this.generateFingerprint();
}
initEventListeners() {
// Toolbar buttons functionality
this.toolbarButtons.forEach(button => {
button.addEventListener('click', () => {
// Check if the system is in loading process
// If so, don't react to the click
if (this.isLoading) {
return;
}
this.toolbarButtons.forEach(b => b.classList.remove('active'));
button.classList.add('active');
// Switch view based on active tab
const view = button.textContent.toLowerCase();
this.showView(view);
});
});
// Window controls are disabled
// We keep the controls for visual design but remove functionality
if (this.windowControls.minimize) {
this.windowControls.minimize.style.cursor = 'default';
}
if (this.windowControls.maximize) {
this.windowControls.maximize.style.cursor = 'default';
}
if (this.windowControls.close) {
this.windowControls.close.style.cursor = 'default';
}
}
showView(view) {
if (!this.output) return;
// Set loading flag
this.isLoading = true;
// Clear current content
this.output.innerHTML = '';
// Show loading animation
this.showLoading();
// Simulate loading delay for better UX
setTimeout(() => {
switch(view) {
case 'overview':
this.renderOverview();
break;
case 'browser':
this.renderBrowserInfo();
break;
case 'system':
this.renderSystemInfo();
break;
default:
this.renderOverview();
}
// Reset loading flag after rendering completes
this.isLoading = false;
}, 800);
}
showLoading() {
this.output.innerHTML = `
<div class="loading-scanner">
<div class="scanner-animation"></div>
<div class="scanner-text">Scanning your device...</div>
</div>
`;
}
generateFingerprint() {
// Set loading flag during initial initialization
this.isLoading = true;
// Simulate initial delay for better UX
setTimeout(() => {
this.renderOverview();
// Reset loading flag after initialization completes
this.isLoading = false;
}, 1500);
}
renderOverview() {
if (!this.output) return;
const userAgent = navigator.userAgent;
const browserInfo = this.getBrowserInfo(userAgent);
const hashedFingerprint = this.generateHashedFingerprint();
const suspicionInfo = this.analyzeUserAgentSuspicion();
const suspicionClass = `suspicion-${suspicionInfo.level.toLowerCase()}`;
const featureSupport = this.generateFeatureSupport();
// Determine color and class for browser feature support
let supportClass;
if (featureSupport.percentage >= 80) {
supportClass = 'support-high';
} else if (featureSupport.percentage >= 60) {
supportClass = 'support-medium';
} else {
supportClass = 'support-low';
}
const html = `
<div class="fingerprint-section-title">Device Overview</div>
<div class="fingerprint-card main-fp">
<div class="fingerprint-hash">${hashedFingerprint}</div>
<div class="device-type-icon ${this.getDeviceType().toLowerCase()}"></div>
</div>
<div class="fingerprint-card feature-support-card ${supportClass}">
<div class="card-title">
<div class="card-icon feature"></div>
Browser Feature Support
</div>
<div class="card-content">
<div class="support-meter">
<div class="support-meter-fill" style="width: ${featureSupport.percentage}%;"></div>
<div class="support-meter-text">${featureSupport.percentage}%</div>
</div>
<div class="info-row">
<span class="info-label">Supported Features:</span>
<span class="info-value">${featureSupport.supported} of ${featureSupport.total}</span>
</div>
</div>
</div>
<div class="suspicion-card ${suspicionClass}">
<div class="suspicion-header">
<div class="suspicion-title">User Agent Suspicion Level</div>
<div class="suspicion-badge">${suspicionInfo.level}</div>
</div>
<div class="suspicion-content">
<ul>
${suspicionInfo.reasons.length > 0 ?
suspicionInfo.reasons.map(reason => `<li>${reason}</li>`).join('') :
'<li>No suspicious patterns detected</li>'}
</ul>
</div>
</div>
<div class="fingerprint-grid">
<div class="fingerprint-card">
<div class="card-title">
<div class="card-icon browser"></div>
Browser
</div>
<div class="card-content">
<div class="info-row">
<span class="info-label">Name:</span>
<span class="info-value">${browserInfo.browser}</span>
</div>
<div class="info-row">
<span class="info-label">Version:</span>
<span class="info-value">${browserInfo.version}</span>
</div>
<div class="info-row">
<span class="info-label">Engine:</span>
<span class="info-value">${this.getBrowserEngine()}</span>
</div>
<div class="info-row">
<span class="info-label">Canvas ID:</span>
<span class="info-value">${this.getCanvasFingerprint()}</span>
</div>
</div>
</div>
<div class="fingerprint-card">
<div class="card-title">
<div class="card-icon os"></div>
Operating System
</div>
<div class="card-content">
<div class="info-row">
<span class="info-label">OS:</span>
<span class="info-value">${browserInfo.os}</span>
</div>
<div class="info-row">
<span class="info-label">Platform:</span>
<span class="info-value">${navigator.platform}</span>
</div>
<div class="info-row">
<span class="info-label">CPU Cores:</span>
<span class="info-value">${navigator.hardwareConcurrency || 'N/A'}</span>
</div>
<div class="info-row">
<span class="info-label">Architecture:</span>
<span class="info-value">${this.getArchitecture()}</span>
</div>
</div>
</div>
<div class="fingerprint-card">
<div class="card-title">
<div class="card-icon display"></div>
Display
</div>
<div class="card-content">
<div class="info-row">
<span class="info-label">Resolution:</span>
<span class="info-value">${window.screen.width}x${window.screen.height}</span>
</div>
<div class="info-row">
<span class="info-label">Pixel Ratio:</span>
<span class="info-value">${window.devicePixelRatio.toFixed(2)}</span>
</div>
<div class="info-row">
<span class="info-label">Color Depth:</span>
<span class="info-value">${window.screen.colorDepth}-bit</span>
</div>
<div class="info-row">
<span class="info-label">Color Scheme:</span>
<span class="info-value">${this.getPreferredColorScheme()}</span>
</div>
</div>
</div>
<div class="fingerprint-card">
<div class="card-title">
<div class="card-icon privacy"></div>
Privacy
</div>
<div class="card-content">
<div class="info-row">
<span class="info-label">Cookies:</span>
<span class="info-value">${navigator.cookieEnabled ? 'Enabled' : 'Disabled'}</span>
</div>
<div class="info-row">
<span class="info-label">Do Not Track:</span>
<span class="info-value">${this.getDNTStatus()}</span>
</div>
<div class="info-row">
<span class="info-label">Incognito:</span>
<span class="info-value">${this.isIncognitoMode() ? 'Likely Yes' : 'Likely No'}</span>
</div>
<div class="info-row">
<span class="info-label">Touch Input:</span>
<span class="info-value">${this.detectTouchEmulation()}</span>
</div>
</div>
</div>
</div>
<div class="fingerprint-additional-section">
<div class="fingerprint-section-title">Regional & Timezone Data</div>
<div class="fingerprint-card language-card">
<div class="card-title">
<div class="card-icon language"></div>
Languages
</div>
<div class="card-content">
${Object.entries(this.getLanguageInfo()).map(([key, value]) => `
<div class="info-row">
<span class="info-label">${key}:</span>
<span class="info-value">${value}</span>
</div>
`).join('')}
</div>
</div>
<div class="fingerprint-card timezone-card">
<div class="card-title">
<div class="card-icon timezone"></div>
Timezone
</div>
<div class="card-content">
${Object.entries(this.getDetailedTimezoneInfo()).map(([key, value]) => `
<div class="info-row">
<span class="info-label">${key}:</span>
<span class="info-value">${value}</span>
</div>
`).join('')}
</div>
</div>
</div>
<div class="fingerprint-section-title">API Capabilities</div>
<div class="fingerprint-card api-support-card">
<div class="card-title">
<div class="card-icon capabilities"></div>
Supported Browser APIs
</div>
<div class="api-capabilities-grid">
<div class="api-item ${this.getAvailableAPIs().Bluetooth ? 'supported' : 'unsupported'}">
<div class="api-icon bluetooth-icon"></div>
<div class="api-name">Bluetooth</div>
</div>
<div class="api-item ${this.getAvailableAPIs().Geolocation ? 'supported' : 'unsupported'}">
<div class="api-icon geo-icon"></div>
<div class="api-name">Geolocation</div>
</div>
<div class="api-item ${this.getAvailableAPIs().WebRTC ? 'supported' : 'unsupported'}">
<div class="api-icon rtc-icon"></div>
<div class="api-name">WebRTC</div>
</div>
<div class="api-item ${this.getAvailableAPIs()['Credential Management'] ? 'supported' : 'unsupported'}">
<div class="api-icon credential-icon"></div>
<div class="api-name">Credential Mgmt</div>
</div>
<div class="api-item ${this.getAvailableAPIs().USB ? 'supported' : 'unsupported'}">
<div class="api-icon usb-icon"></div>
<div class="api-name">USB</div>
</div>
<div class="api-item ${this.getAvailableAPIs().Serial ? 'supported' : 'unsupported'}">
<div class="api-icon serial-icon"></div>
<div class="api-name">Serial</div>
</div>
<div class="api-item ${this.getAvailableAPIs().GamePads ? 'supported' : 'unsupported'}">
<div class="api-icon gamepad-icon"></div>
<div class="api-name">GamePads</div>
</div>
<div class="api-item ${this.getAvailableAPIs().Vibration ? 'supported' : 'unsupported'}">
<div class="api-icon vibration-icon"></div>
<div class="api-name">Vibration</div>
</div>
<div class="api-item ${this.getAvailableAPIs()['Payment Request'] ? 'supported' : 'unsupported'}">
<div class="api-icon payment-icon"></div>
<div class="api-name">Payment Request</div>
</div>
<div class="api-item ${this.getAvailableAPIs()['Web Share'] ? 'supported' : 'unsupported'}">
<div class="api-icon share-icon"></div>
<div class="api-name">Web Share</div>
</div>
<div class="api-item ${this.getAvailableAPIs()['Push API'] ? 'supported' : 'unsupported'}">
<div class="api-icon push-icon"></div>
<div class="api-name">Push API</div>
</div>
<div class="api-item ${this.getAvailableAPIs().Notifications ? 'supported' : 'unsupported'}">
<div class="api-icon notifications-icon"></div>
<div class="api-name">Notifications</div>
</div>
<div class="api-item ${this.getAvailableAPIs()['Media Devices'] ? 'supported' : 'unsupported'}">
<div class="api-icon media-icon"></div>
<div class="api-name">Media Devices</div>
</div>
<div class="api-item ${this.getAvailableAPIs()['Speech Recognition'] ? 'supported' : 'unsupported'}">
<div class="api-icon speech-icon"></div>
<div class="api-name">Speech Recognition</div>
</div>
<div class="api-item ${this.getAvailableAPIs()['Web Workers'] ? 'supported' : 'unsupported'}">
<div class="api-icon worker-icon"></div>
<div class="api-name">Web Workers</div>
</div>
<div class="api-item ${this.getAvailableAPIs()['Service Workers'] ? 'supported' : 'unsupported'}">
<div class="api-icon service-icon"></div>
<div class="api-name">Service Workers</div>
</div>
<div class="api-item ${this.getAvailableAPIs().WebGL ? 'supported' : 'unsupported'}">
<div class="api-icon webgl-icon"></div>
<div class="api-name">WebGL</div>
</div>
<div class="api-item ${this.getAvailableAPIs().WebGL2 ? 'supported' : 'unsupported'}">
<div class="api-icon webgl2-icon"></div>
<div class="api-name">WebGL2</div>
</div>
<div class="api-item ${this.getAvailableAPIs().WebVR ? 'supported' : 'unsupported'}">
<div class="api-icon webvr-icon"></div>
<div class="api-name">WebVR</div>
</div>
<div class="api-item ${this.getAvailableAPIs().WebXR ? 'supported' : 'unsupported'}">
<div class="api-icon webxr-icon"></div>
<div class="api-name">WebXR</div>
</div>
<div class="api-item ${this.getAvailableAPIs()['Web Audio'] ? 'supported' : 'unsupported'}">
<div class="api-icon audio-icon"></div>
<div class="api-name">Audio API</div>
</div>
</div>
</div>
<div class="fingerprint-footer">
<div class="fingerprint-note">Your browser supports ${this.generateFeatureSupport().supported} out of ${this.generateFeatureSupport().total} modern web features and APIs.</div>
</div>
`;
this.output.innerHTML = html;
}
renderBrowserInfo() {
if (!this.output) return;
const userAgent = navigator.userAgent;
const browserInfo = this.getBrowserInfo(userAgent);
const html = `
<div class="fingerprint-section-title">Browser Information</div>
<div class="browser-header">
<div class="browser-icon ${browserInfo.browser.toLowerCase().replace(' ', '-')}"></div>
<div class="browser-title">
<div class="browser-name">${browserInfo.browser}</div>
<div class="browser-version">Version ${browserInfo.version}</div>
</div>
</div>
<div class="fingerprint-details-section">
<div class="details-title">Core Information</div>
<div class="details-grid">
<div class="details-item">
<div class="details-label">User Agent</div>
<div class="details-value code-block">${userAgent}</div>
</div>
<div class="details-item">
<div class="details-label">Engine</div>
<div class="details-value">${this.getBrowserEngine()}</div>
</div>
<div class="details-item">
<div class="details-label">Language</div>
<div class="details-value">${navigator.language || 'N/A'}</div>
</div>
<div class="details-item">
<div class="details-label">Languages</div>
<div class="details-value">${navigator.languages ? navigator.languages.join(', ') : 'N/A'}</div>
</div>
</div>
</div>
<div class="fingerprint-details-section">
<div class="details-title">Features & Capabilities</div>
<div class="support-summary">
<div class="support-meter">
<div class="support-meter-fill" style="width: ${this.generateFeatureSupport().percentage}%;"></div>
<div class="support-meter-text">${this.generateFeatureSupport().percentage}% Supported</div>
</div>
<div class="support-stats">
<div class="info-row">
<span class="info-label">Supported Features:</span>
<span class="info-value">${this.generateFeatureSupport().supported} of ${this.generateFeatureSupport().total}</span>
</div>
</div>
</div>
<div class="features-grid">
${this.generateFeaturesList()}
</div>
</div>
<div class="fingerprint-details-section">
<div class="details-title">Storage Information</div>
<div class="details-grid">
<div class="details-item">
<div class="details-label">Cookies Enabled</div>
<div class="details-value">${navigator.cookieEnabled ? 'Yes' : 'No'}</div>
</div>
<div class="details-item">
<div class="details-label">Local Storage</div>
<div class="details-value">${typeof window.localStorage !== 'undefined' ? 'Available' : 'Not Available'}</div>
</div>
<div class="details-item">
<div class="details-label">Session Storage</div>
<div class="details-value">${typeof window.sessionStorage !== 'undefined' ? 'Available' : 'Not Available'}</div>
</div>
<div class="details-item">
<div class="details-label">IndexedDB</div>
<div class="details-value">${typeof window.indexedDB !== 'undefined' ? 'Available' : 'Not Available'}</div>
</div>
</div>
</div>
`;
this.output.innerHTML = html;
}
renderSystemInfo() {
if (!this.output) return;
const browserInfo = this.getBrowserInfo(navigator.userAgent);
const gpuInfo = this.getGPUInfo();
const html = `
<div class="fingerprint-section-title">System Information</div>
<div class="system-header">
<div class="system-icon ${browserInfo.os.toLowerCase().replace(' ', '-')}"></div>
<div class="system-title">
<div class="system-name">${browserInfo.os}</div>
<div class="system-arch">${navigator.platform}</div>
</div>
</div>
<div class="fingerprint-details-section">
<div class="details-title">Hardware Information</div>
<div class="details-grid">
<div class="details-item">
<div class="details-label">CPU Cores detected</div>
<div class="details-value">${navigator.hardwareConcurrency || 'N/A'}</div>
</div>
<div class="details-item">
<div class="details-label">Memory (approx.)</div>
<div class="details-value">${this.getApproximateMemory()}</div>
</div>
<div class="details-item">
<div class="details-label">Battery Status</div>
<div class="details-value">${this.getBatteryInfo()}</div>
</div>
<div class="details-item">
<div class="details-label">Device Type</div>
<div class="details-value">${this.getDeviceType()}</div>
</div>
<div class="details-item">
<div class="details-label">Touch Points</div>
<div class="details-value">${navigator.maxTouchPoints || 0}</div>
</div>
<div class="details-item">
<div class="details-label">Architecture</div>
<div class="details-value">${this.getArchitecture()}</div>
</div>
</div>
</div>
<div class="fingerprint-details-section">
<div class="details-title">GPU Information</div>
<div class="details-grid">
<div class="details-item">
<div class="details-label">GPU Vendor</div>
<div class="details-value">${gpuInfo.vendor || 'Unknown'}</div>
</div>
<div class="details-item">
<div class="details-label">GPU Renderer</div>
<div class="details-value">${gpuInfo.renderer || 'Unknown'}</div>
</div>
<div class="details-item">
<div class="details-label">WebGL Version</div>
<div class="details-value">${gpuInfo.version || 'N/A'}</div>
</div>
<div class="details-item">
<div class="details-label">WebGL2 Support</div>
<div class="details-value">${this.hasWebGL2() ? 'Yes' : 'No'}</div>
</div>
${gpuInfo.details ? `
<div class="details-item">
<div class="details-label">GLSL Version</div>
<div class="details-value">${gpuInfo.details['GLSL Version'] || 'N/A'}</div>
</div>
<div class="details-item">
<div class="details-label">Max Texture Size</div>
<div class="details-value">${gpuInfo.details['Max Texture Size'] || 'N/A'}</div>
</div>
<div class="details-item">
<div class="details-label">Max Viewport Dims</div>
<div class="details-value">${gpuInfo.details['Max Viewport Dims'] || 'N/A'}</div>
</div>
<div class="details-item">
<div class="details-label">Max Renderbuffer Size</div>
<div class="details-value">${gpuInfo.details['Max Renderbuffer Size'] || 'N/A'}</div>
</div>
` : ''}
</div>
${gpuInfo.details && gpuInfo.details['Key Extensions'] ? `
<div class="extensions-list">
<div class="extensions-title">WebGL Extensions</div>
<div class="extensions-value code-block">${gpuInfo.details['Key Extensions']}</div>
</div>
` : ''}
</div>
<div class="fingerprint-details-section">
<div class="details-title">Display Information</div>
<div class="details-grid">
<div class="details-item">
<div class="details-label">Screen Resolution</div>
<div class="details-value">${window.screen.width}x${window.screen.height}</div>
</div>
<div class="details-item">
<div class="details-label">Available Resolution</div>
<div class="details-value">${window.screen.availWidth}x${window.screen.availHeight}</div>
</div>
<div class="details-item">
<div class="details-label">Viewport Size</div>
<div class="details-value">${window.innerWidth}x${window.innerHeight}</div>
</div>
<div class="details-item">
<div class="details-label">Pixel Ratio</div>
<div class="details-value">${window.devicePixelRatio.toFixed(2)}</div>
</div>
<div class="details-item">
<div class="details-label">Color Depth</div>
<div class="details-value">${window.screen.colorDepth}-bit</div>
</div>
<div class="details-item">
<div class="details-label">Preferred Color Scheme</div>
<div class="details-value">${this.getPreferredColorScheme()}</div>
</div>
</div>
</div>
<div class="fingerprint-details-section">
<div class="details-title">Time & Location</div>
<div class="details-grid">
<div class="details-item">
<div class="details-label">Time Zone</div>
<div class="details-value">${Intl.DateTimeFormat().resolvedOptions().timeZone}</div>
</div>
<div class="details-item">
<div class="details-label">Time Zone Offset</div>
<div class="details-value">UTC ${this.getTimezoneOffsetString()}</div>
</div>
<div class="details-item">
<div class="details-label">Date Format</div>
<div class="details-value">${new Intl.DateTimeFormat().format(new Date())}</div>
</div>
<div class="details-item">
<div class="details-label">Number Format</div>
<div class="details-value">${new Intl.NumberFormat().format(1234567.89)}</div>
</div>
</div>
</div>
`;
this.output.innerHTML = html;
}
// Network section has been removed
// Helper methods
getBrowserInfo(userAgent) {
const ua = userAgent.toLowerCase();
let browser, version, os;
// Detect browser and version
if (ua.indexOf('edge') !== -1) {
browser = 'Microsoft Edge';
version = ua.match(/edge\/(\d+(\.\d+)?)/i)?.[1] || 'Unknown';
} else if (ua.indexOf('edg') !== -1) {
browser = 'Microsoft Edge';
version = ua.match(/edg\/(\d+(\.\d+)?)/i)?.[1] || 'Unknown';
} else if (ua.indexOf('chrome') !== -1) {
browser = 'Chrome';
version = ua.match(/chrome\/(\d+(\.\d+)?)/i)?.[1] || 'Unknown';
} else if (ua.indexOf('safari') !== -1) {
browser = 'Safari';
version = ua.match(/version\/(\d+(\.\d+)?)/i)?.[1] || 'Unknown';
} else if (ua.indexOf('firefox') !== -1) {
browser = 'Firefox';
version = ua.match(/firefox\/(\d+(\.\d+)?)/i)?.[1] || 'Unknown';
} else if (ua.indexOf('msie') !== -1 || ua.indexOf('trident') !== -1) {
browser = 'Internet Explorer';
version = ua.match(/(?:msie |rv:)(\d+(\.\d+)?)/i)?.[1] || 'Unknown';
} else if (ua.indexOf('opera') !== -1 || ua.indexOf('opr') !== -1) {
browser = 'Opera';
version = ua.match(/(?:opera|opr)\/(\d+(\.\d+)?)/i)?.[1] || 'Unknown';
} else {
browser = 'Unknown Browser';
version = 'Unknown';
}
// Detect OS
if (ua.indexOf('windows') !== -1) {
os = 'Windows';
if (ua.indexOf('windows nt 10') !== -1) os = 'Windows 10';
else if (ua.indexOf('windows nt 6.3') !== -1) os = 'Windows 8.1';
else if (ua.indexOf('windows nt 6.2') !== -1) os = 'Windows 8';
else if (ua.indexOf('windows nt 6.1') !== -1) os = 'Windows 7';
} else if (ua.indexOf('macintosh') !== -1 || ua.indexOf('mac os x') !== -1) {
os = 'macOS';
const macOSMatch = ua.match(/mac os x (\d+[._]\d+([._]\d+)?)/i);
if (macOSMatch) {
const versionStr = macOSMatch[1].replace(/_/g, '.');
if (parseInt(versionStr) >= 10.16 || parseInt(versionStr) >= 11) {
os = 'macOS Big Sur or newer';
} else if (versionStr.startsWith('10.15')) {
os = 'macOS Catalina';
} else if (versionStr.startsWith('10.14')) {
os = 'macOS Mojave';
}
}
} else if (ua.indexOf('android') !== -1) {
os = 'Android';
const match = ua.match(/android\s([0-9.]*)/i);
if (match) os = `Android ${match[1]}`;
} else if (ua.indexOf('ios') !== -1 || ua.indexOf('iphone') !== -1 || ua.indexOf('ipad') !== -1) {
os = 'iOS';
const match = ua.match(/os\s([0-9_]*)/i);
if (match) os = `iOS ${match[1].replace(/_/g, '.')}`;
} else if (ua.indexOf('linux') !== -1) {
os = 'Linux';
} else {
os = 'Unknown OS';
}
return { browser, version, os };
}
getBrowserEngine() {
const ua = navigator.userAgent.toLowerCase();
if (ua.indexOf('webkit') !== -1) {
if (ua.indexOf('chrome') !== -1) {
return 'Blink';
}
return 'WebKit';
} else if (ua.indexOf('gecko') !== -1 && ua.indexOf('firefox') !== -1) {
return 'Gecko';
} else if (ua.indexOf('trident') !== -1 || ua.indexOf('msie') !== -1) {
return 'Trident';
} else if (ua.indexOf('edg') !== -1) {
return 'EdgeHTML';
}
return 'Unknown';
}
getDeviceType() {
const ua = navigator.userAgent.toLowerCase();
if (/(tablet|ipad|playbook|silk)|(android(?!.*mobi))/i.test(ua)) {
return 'Tablet';
} else if (/mobile|android|iphone|ipod|blackberry|opera mini|iemobile/i.test(ua)) {
return 'Mobile';
}
return 'Desktop';
}
isIncognitoMode() {
// Very basic detection, not foolproof
try {
localStorage.setItem('test', 'test');
localStorage.removeItem('test');
return false;
} catch (e) {
return true;
}
}
getApproximateMemory() {
if (navigator.deviceMemory) {
return `${navigator.deviceMemory} GB`;
}
const cores = navigator.hardwareConcurrency || 2;
// Very rough estimate based on CPU cores
if (cores <= 2) return '2-4 GB (estimate)';
if (cores <= 4) return '4-8 GB (estimate)';
if (cores <= 8) return '8-16 GB (estimate)';
return '16+ GB (estimate)';
}
getTimezoneOffsetString() {
const offset = new Date().getTimezoneOffset();
const hours = Math.abs(Math.floor(offset / 60));
const minutes = Math.abs(offset % 60);
const sign = offset < 0 ? '+' : '-';
return `${sign}${hours.toString().padStart(2, '0')}:${minutes.toString().padStart(2, '0')}`;
}
getConnectionType() {
if ('connection' in navigator) {
const conn = navigator.connection;
if (conn && conn.effectiveType) {
return conn.effectiveType.toUpperCase();
}
}
return 'Unknown';
}
getDownlinkSpeed() {
if ('connection' in navigator) {
const conn = navigator.connection;
if (conn && conn.downlink) {
return `${conn.downlink} Mbps`;
}
}
return 'Unknown';
}
getRTT() {
if ('connection' in navigator) {
const conn = navigator.connection;
if (conn && conn.rtt) {
return `${conn.rtt} ms`;
}
}
return 'Unknown';
}
getDataSaver() {
if ('connection' in navigator) {
const conn = navigator.connection;
if (conn && 'saveData' in conn) {
return conn.saveData ? 'Enabled' : 'Disabled';
}
}
return 'Unknown';
}
getGPUInfo() {
try {
const canvas = document.createElement('canvas');
const gl = canvas.getContext('webgl') || canvas.getContext('experimental-webgl');
if (!gl) {
return { vendor: 'Not available', renderer: 'Not available', version: 'Not available' };
}
const debugInfo = gl.getExtension('WEBGL_debug_renderer_info');
// Get WebGL capabilities
const maxTextureSize = gl.getParameter(gl.MAX_TEXTURE_SIZE);
const maxViewportDims = gl.getParameter(gl.MAX_VIEWPORT_DIMS);
const maxRenderbufferSize = gl.getParameter(gl.MAX_RENDERBUFFER_SIZE);
// Get WebGL version and GLSL version
const glVersion = gl.getParameter(gl.VERSION);
const glslVersion = gl.getParameter(gl.SHADING_LANGUAGE_VERSION);
// Get supported extensions
const extensions = gl.getSupportedExtensions();
const keyExtensions = extensions.filter(ext =>
ext.includes('OES_texture_float') ||
ext.includes('WEBGL_depth_texture') ||
ext.includes('WEBGL_compressed_texture') ||
ext.includes('ANGLE') ||
ext.includes('OES_standard_derivatives')
);
if (debugInfo) {
return {
vendor: gl.getParameter(debugInfo.UNMASKED_VENDOR_WEBGL) || 'Unknown',
renderer: gl.getParameter(debugInfo.UNMASKED_RENDERER_WEBGL) || 'Unknown',
version: glVersion || 'Unknown',
details: {
'Vendor': gl.getParameter(debugInfo.UNMASKED_VENDOR_WEBGL) || 'Unknown',
'Renderer': gl.getParameter(debugInfo.UNMASKED_RENDERER_WEBGL) || 'Unknown',
'WebGL Version': glVersion || 'Unknown',
'GLSL Version': glslVersion || 'Unknown',
'Max Texture Size': `${maxTextureSize}px`,
'Max Viewport Dims': maxViewportDims ? `${maxViewportDims[0]}x${maxViewportDims[1]}px` : 'N/A',
'Max Renderbuffer Size': `${maxRenderbufferSize}px`,
'WebGL2 Support': this.hasWebGL2() ? 'Yes' : 'No',
'Key Extensions': keyExtensions.length > 0 ? keyExtensions.join(', ') : 'None detected'
}
};
} else {
return {
vendor: gl.getParameter(gl.VENDOR) || 'Unknown',
renderer: gl.getParameter(gl.RENDERER) || 'Unknown',
version: glVersion || 'Unknown',
details: {
'Vendor': gl.getParameter(gl.VENDOR) || 'Unknown',
'Renderer': gl.getParameter(gl.RENDERER) || 'Unknown',
'WebGL Version': glVersion || 'Unknown',
'GLSL Version': glslVersion || 'Unknown',
'Max Texture Size': `${maxTextureSize}px`,
'Max Viewport Dims': maxViewportDims ? `${maxViewportDims[0]}x${maxViewportDims[1]}px` : 'N/A',
'Max Renderbuffer Size': `${maxRenderbufferSize}px`,
'WebGL2 Support': this.hasWebGL2() ? 'Yes' : 'No',
'Key Extensions': keyExtensions.length > 0 ? keyExtensions.join(', ') : 'None detected'
}
};
}
} catch (e) {
return { vendor: 'Error', renderer: 'Error', version: 'Error' };
}
}
// Get detailed hardware info
getHardwareInfo() {
let hardwareInfo = {};
// Get CPU cores (logical processors)
if (navigator.hardwareConcurrency) {
hardwareInfo['CPU Cores'] = navigator.hardwareConcurrency;
}
// Get device memory if available
if (navigator.deviceMemory) {
hardwareInfo['Device Memory'] = `${navigator.deviceMemory} GB`;
} else {
hardwareInfo['Approx. Memory'] = this.getApproximateMemory();
}
// Add battery information
const batteryInfo = this.getBatteryInfo();
if (batteryInfo !== 'N/A') {
hardwareInfo['Battery Status'] = batteryInfo;
}
// Add architecture information
const arch = this.getArchitecture();
if (arch !== 'Unknown') {
hardwareInfo['Architecture'] = arch;
}
return hardwareInfo;
}
hasWebGL2() {
try {
const canvas = document.createElement('canvas');
return !!canvas.getContext('webgl2');
} catch (e) {
return false;
}
}
getArchitecture() {
const ua = navigator.userAgent.toLowerCase();
if (ua.indexOf('arm') !== -1 || ua.indexOf('aarch64') !== -1) {
return 'ARM';
} else if (ua.indexOf('x86_64') !== -1 || ua.indexOf('x64') !== -1 || ua.indexOf('wow64') !== -1) {
return 'x86_64';
} else if (ua.indexOf('x86') !== -1 || ua.indexOf('i386') !== -1 || ua.indexOf('i686') !== -1) {
return 'x86';
} else if (ua.indexOf('ppc') !== -1 || ua.indexOf('powerpc') !== -1) {
return 'PowerPC';
}
// Try to infer from platform if possible
const platform = navigator.platform || '';
if (platform.indexOf('Win64') !== -1 || platform.indexOf('x64') !== -1) {
return 'x86_64';
} else if (platform.indexOf('Win32') !== -1 || platform.indexOf('x86') !== -1) {
// Could be 64-bit running in 32-bit mode too
return navigator.userAgent.indexOf('WOW64') !== -1 ? 'x86_64' : 'x86';
} else if (platform.indexOf('MacIntel') !== -1) {
// Could be Intel or ARM on newer Macs
if (ua.indexOf('mac os x') !== -1 && ('ontouchend' in document)) {
return 'ARM (Apple Silicon)';
}
return 'x86_64';
} else if (platform.indexOf('Linux arm') !== -1) {
return 'ARM';
} else if (platform.indexOf('Linux') !== -1) {
return navigator.hardwareConcurrency > 8 ? 'x86_64' : 'x86';
}
return 'Unknown';
}
getBatteryInfo() {
if ('getBattery' in navigator) {
try {
// This is async, but we can't use async methods here
// Just return a placeholder and the actual battery status
// should be updated asynchronously
navigator.getBattery().then(battery => {
const percentage = Math.round(battery.level * 100);
const charging = battery.charging ? 'Charging' : 'Not charging';
const batteryElement = document.querySelector('.battery-status');
if (batteryElement) {
batteryElement.textContent = `${percentage}% (${charging})`;
}
}).catch(() => {});
return '<span class="battery-status">Checking...</span>';
} catch (e) {
return 'Not available';
}
}
return 'Not available';
}
getPreferredColorScheme() {
if (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches) {
return 'Dark';
} else if (window.matchMedia && window.matchMedia('(prefers-color-scheme: light)').matches) {
return 'Light';
}
return 'No preference';
}
// Get browser language information
getLanguageInfo() {
let langInfo = {};
if (navigator.languages && navigator.languages.length) {
langInfo['Preferred Languages'] = navigator.languages.join(', ');
}
if (navigator.language) {
langInfo['Primary Language'] = navigator.language;
}
return langInfo;
}
// Check availability of specific APIs
getAvailableAPIs() {
const apis = {
'Bluetooth': 'bluetooth' in navigator,
'Geolocation': 'geolocation' in navigator,
'WebRTC': 'RTCPeerConnection' in window,
'Credential Mgmt': 'credentials' in navigator,
'USB': 'usb' in navigator,
'Serial': 'serial' in navigator,
'GamePads': 'getGamepads' in navigator,
'Vibration': 'vibrate' in navigator,
'Payment Request': 'PaymentRequest' in window,
'Web Share': 'share' in navigator,
'Push API': 'PushManager' in window,
'Notifications': 'Notification' in window,
'Media Devices': 'mediaDevices' in navigator,
'Speech Recognition': 'SpeechRecognition' in window || 'webkitSpeechRecognition' in window,
'Web Workers': 'Worker' in window,
'Service Workers': 'serviceWorker' in navigator,
'WebGL': !!window.WebGLRenderingContext,
'WebGL2': !!window.WebGL2RenderingContext,
'WebVR': 'getVRDisplays' in navigator,
'WebXR': 'xr' in navigator,
'Audio API': 'AudioContext' in window || 'webkitAudioContext' in window,
};
return apis;
}
// Detailed timezone information
getDetailedTimezoneInfo() {
const tzInfo = {};
const date = new Date();
tzInfo['Timezone Offset'] = this.getTimezoneOffsetString();
tzInfo['Timezone Name'] = Intl.DateTimeFormat().resolvedOptions().timeZone || 'Unknown';
tzInfo['DST Active'] = this.isDSTActive();
tzInfo['Current Time'] = date.toLocaleTimeString();
tzInfo['Current Date'] = date.toLocaleDateString();
return tzInfo;
}
// Check if Daylight Saving Time is active
isDSTActive() {
const date = new Date();
const jan = new Date(date.getFullYear(), 0, 1);
const jul = new Date(date.getFullYear(), 6, 1);
return Math.max(jan.getTimezoneOffset(), jul.getTimezoneOffset()) > date.getTimezoneOffset();
}
// Get information about installed fonts
getInstalledFonts() {
const baseFonts = ['monospace', 'sans-serif', 'serif'];
const testString = 'mmmmmmmmmmlli';
const testSize = '72px';
const h = document.createElement('span');
h.style.fontSize = testSize;
h.style.position = 'absolute';
h.style.left = '-9999px';
h.style.visibility = 'hidden';
h.textContent = testString;
document.body.appendChild(h);
const baseFontWidths = {};
baseFonts.forEach(baseFont => {
h.style.fontFamily = baseFont;
baseFontWidths[baseFont] = h.offsetWidth;
});
const fontCheckList = [
'Arial', 'Arial Black', 'Arial Narrow', 'Arial Rounded MT Bold', 'Courier New',
'Calibri', 'Cambria', 'Cambria Math', 'Comic Sans MS', 'Candara', 'Consolas',
'Constantia', 'Georgia', 'Garamond', 'Impact', 'Lucida Console', 'Lucida Sans Unicode',
'Microsoft Sans Serif', 'Palatino Linotype', 'Segoe UI', 'Tahoma', 'Times New Roman',
'Trebuchet MS', 'Verdana', 'Helvetica', 'Times', 'Courier'
];
const detectedFonts = [];
fontCheckList.forEach(font => {
let detected = false;
for (const baseFont of baseFonts) {
h.style.fontFamily = `'${font}',${baseFont}`;
if (h.offsetWidth !== baseFontWidths[baseFont]) {
detected = true;
break;
}
}
if (detected) {
detectedFonts.push(font);
}
});
document.body.removeChild(h);
return detectedFonts.slice(0, 10);
}
// Get Canvas fingerprint
getCanvasFingerprint() {
try {
const canvas = document.createElement('canvas');
canvas.width = 200;
canvas.height = 50;
const ctx = canvas.getContext('2d');
// Text with gradient
const gradient = ctx.createLinearGradient(0, 0, canvas.width, 0);
gradient.addColorStop(0, "#FF4500");
gradient.addColorStop(0.5, "#00CC00");
gradient.addColorStop(1, "#0000FF");
ctx.fillStyle = gradient;
ctx.font = '18px Arial';
ctx.textBaseline = 'top';
ctx.fillText('Canvas Fingerprint', 2, 2);
// Smiley face
ctx.fillStyle = '#FFD700';
ctx.beginPath();
ctx.arc(150, 25, 15, 0, Math.PI * 2, true);
ctx.fill();
ctx.lineWidth = 2;
ctx.strokeStyle = '#000000';
ctx.stroke();
// Eyes
ctx.fillStyle = '#000000';
ctx.beginPath();
ctx.arc(145, 20, 2, 0, Math.PI * 2, true);
ctx.fill();
ctx.beginPath();
ctx.arc(155, 20, 2, 0, Math.PI * 2, true);
ctx.fill();
// Smile
ctx.beginPath();
ctx.arc(150, 25, 10, 0, Math.PI, false);
ctx.stroke();
// Hash the data for result
const dataUrl = canvas.toDataURL();
let hash = 0;
for (let i = 0; i < dataUrl.length; i++) {
hash = ((hash << 5) - hash) + dataUrl.charCodeAt(i);
hash = hash & hash;
}
return hash.toString(36).substring(0, 8);
} catch (e) {
return 'Canvas not supported';
}
}
// Detect DNT (Do Not Track) headers
getDNTStatus() {
if (navigator.doNotTrack) {
return navigator.doNotTrack;
} else if (navigator.msDoNotTrack) {
return navigator.msDoNotTrack;
} else if (window.doNotTrack) {
return window.doNotTrack;
}
return 'Not set';
}
// Check for touch input emulation
detectTouchEmulation() {
const maxTouchPoints = navigator.maxTouchPoints || 0;
const hasTouchSupport = 'ontouchstart' in window || maxTouchPoints > 0;
const hasCoarsePointer = window.matchMedia?.('(pointer: coarse)').matches;
const hasFinePointer = window.matchMedia?.('(pointer: fine)').matches;
if (hasTouchSupport && hasFinePointer && !hasCoarsePointer) {
return 'Possible touch emulation';
} else if (hasTouchSupport && hasCoarsePointer) {
return 'Genuine touch device';
} else if (!hasTouchSupport && hasFinePointer) {
return 'Non-touch device';
}
return 'Unknown';
}
// Analyze browser headers for suspicious patterns
analyzeUserAgentSuspicion() {
const ua = navigator.userAgent.toLowerCase();
let suspicionScore = 0;
let suspicionReasons = [];
// Проверка несоответствий в user agent
if (ua.includes('firefox') && ua.includes('chrome')) {
suspicionScore += 50;
suspicionReasons.push('Mixed browser identifiers');
}
if (ua.includes('android') && ua.includes('iphone')) {
suspicionScore += 50;
suspicionReasons.push('Mixed platform identifiers');
}
// Проверка на автоматические инструменты и ботов
const botPatterns = ['bot', 'crawler', 'spider', 'headless', 'puppeteer', 'phantomjs', 'selenium', 'webdriver'];
for (const pattern of botPatterns) {
if (ua.includes(pattern)) {
suspicionScore += 30;
suspicionReasons.push(`Bot signature detected: ${pattern}`);
break;
}
}
// Проверка несоответствия между JavaScript и User-Agent
const platform = navigator.platform.toLowerCase();
if (ua.includes('windows') && !platform.includes('win')) {
suspicionScore += 25;
suspicionReasons.push('OS mismatch between UA and platform');
}
if (ua.includes('mac') && !platform.includes('mac')) {
suspicionScore += 25;
suspicionReasons.push('OS mismatch between UA and platform');
}
// Проверка на Headless браузеры
if (navigator.plugins.length === 0 && !ua.includes('mobile')) {
suspicionScore += 15;
suspicionReasons.push('No plugins detected (possible headless browser)');
}
// Проверка на VPN или прокси по таймзоне
const userTimezone = Intl.DateTimeFormat().resolvedOptions().timeZone || '';
const userLanguage = (navigator.language || '').substring(0, 2).toLowerCase();
// Check for mismatch between language and timezone
const timezoneMap = {
'ru': ['Europe/Moscow', 'Asia/Yekaterinburg', 'Asia/Omsk', 'Asia/Krasnoyarsk', 'Asia/Irkutsk', 'Asia/Yakutsk', 'Asia/Vladivostok', 'Asia/Magadan', 'Asia/Kamchatka'],
'en': ['America/New_York', 'America/Chicago', 'America/Denver', 'America/Los_Angeles', 'Europe/London'],
'de': ['Europe/Berlin', 'Europe/Vienna'],
'fr': ['Europe/Paris'],
'es': ['Europe/Madrid', 'America/Mexico_City'],
'it': ['Europe/Rome'],
'ja': ['Asia/Tokyo'],
'zh': ['Asia/Shanghai', 'Asia/Hong_Kong', 'Asia/Taipei'],
'ko': ['Asia/Seoul']
};
if (userLanguage && userTimezone && timezoneMap[userLanguage]) {
const expectedTimezones = timezoneMap[userLanguage];
if (!expectedTimezones.some(tz => userTimezone.includes(tz))) {
suspicionScore += 20;
suspicionReasons.push('Timezone/language mismatch (possible VPN)');
}
}
// Определение уровня подозрительности
let suspicionLevel;
if (suspicionScore >= 50) {
suspicionLevel = 'High';
} else if (suspicionScore >= 20) {
suspicionLevel = 'Medium';
} else if (suspicionScore > 0) {
suspicionLevel = 'Low';
} else {
suspicionLevel = 'None';
}
return {
score: suspicionScore,
level: suspicionLevel,
reasons: suspicionReasons.length > 0 ? suspicionReasons : ['No suspicious patterns detected']
};
}
generateHashedFingerprint() {
// Комбинируем все доступные данные для максимальной уникальности отпечатка
const userAgent = navigator.userAgent;
const screenInfo = `${screen.width}x${screen.height}x${screen.colorDepth}`;
const timeZone = Intl.DateTimeFormat().resolvedOptions().timeZone || '';
const timeZoneOffset = new Date().getTimezoneOffset();
const isDST = this.isDSTActive();
const languages = navigator.languages ? navigator.languages.join(',') : navigator.language;
const hardwareConcurrency = navigator.hardwareConcurrency || '';
const deviceMemory = navigator.deviceMemory || '';
const platform = navigator.platform;
const doNotTrack = this.getDNTStatus();
const touchEmulation = this.detectTouchEmulation();
const canvasHash = this.getCanvasFingerprint();
const availableAPIsCount = Object.values(this.getAvailableAPIs()).filter(Boolean).length;
const suspicionInfo = this.analyzeUserAgentSuspicion();
const touchPoints = navigator.maxTouchPoints || 0;
const pixelRatio = window.devicePixelRatio || 1;
const colorScheme = this.getPreferredColorScheme();
// Собираем плагины если они доступны
const plugins = Array.from(navigator.plugins || [])
.map(p => `${p.name}:${p.filename}:${p.description}`)
.sort()
.join('|');
// Шрифты, установленные на устройстве
const fonts = this.getInstalledFonts().join(',');
// Сочетаем всё в один длинный уникальный компонент с разделителями
const components = [
userAgent,
screenInfo,
timeZone,
timeZoneOffset,
isDST,
languages,
hardwareConcurrency,
deviceMemory,
platform,
doNotTrack,
touchEmulation,
canvasHash,
availableAPIsCount,
suspicionInfo.level,
touchPoints,
pixelRatio,
colorScheme,
plugins,
fonts
].join('###');
// Используем более сложную хеш-функцию
let hash = 0;
for (let i = 0; i < components.length; i++) {
const char = components.charCodeAt(i);
hash = ((hash << 5) - hash) + char;
hash = hash & hash; // Конвертируем в 32-битное целое
// Дополнительное перемешивание битов для лучшей уникальности
if (i % 10 === 0) {
hash = ((hash << 7) ^ (hash >> 3)) + i;
}
}
// Конвертируем в шестнадцатеричное представление с гарантированной длиной
const hexHash = Math.abs(hash).toString(16).padStart(8, '0').toUpperCase();
// Add suspicion code to the hash
const suspicionPrefix = suspicionInfo.level.charAt(0).toUpperCase();
// Create formatted fingerprint identifier
return `${suspicionPrefix}|${hexHash.substring(0, 4)}-${hexHash.substring(4, 8)}-${Date.now().toString(36).slice(-4)}`;
}
generateFeatureSupport() {
// Measure support for modern web standards in the user's browser
const features = {
// Web APIs
fetch: typeof fetch !== 'undefined',
serviceWorker: 'serviceWorker' in navigator,
webWorkers: typeof Worker !== 'undefined',
webAssembly: typeof WebAssembly !== 'undefined',
indexedDB: 'indexedDB' in window || 'webkitIndexedDB' in window,
localStorage: 'localStorage' in window,
sessionStorage: 'sessionStorage' in window,
// Media and Graphics
webGL: this.hasWebGL2(),
webRTC: 'RTCPeerConnection' in window || 'webkitRTCPeerConnection' in window,
webAudio: typeof AudioContext !== 'undefined' || typeof webkitAudioContext !== 'undefined',
webSpeech: 'SpeechRecognition' in window || 'webkitSpeechRecognition' in window,
videoCapture: 'mediaDevices' in navigator && 'getUserMedia' in navigator.mediaDevices,
mediaRecorder: typeof MediaRecorder !== 'undefined',
// Advanced Graphics
webVR: 'getVRDisplays' in navigator,
webXR: 'xr' in navigator,
webGPU: 'gpu' in navigator,
webAnimations: 'Animation' in window && 'KeyframeEffect' in window,
canvas: !!document.createElement('canvas').getContext,
canvasWebGL: !!document.createElement('canvas').getContext('webgl'),
// Modern JavaScript
promises: typeof Promise !== 'undefined',
asyncAwait: (function() { try { eval('async function test() {}'); return true; } catch (e) { return false; } })(),
classes: (function() { try { eval('class Test {}'); return true; } catch (e) { return false; } })(),
generators: (function() { try { eval('function* test() {}'); return true; } catch (e) { return false; } })(),
// CSS Features
gridLayout: (function() {
const el = document.createElement('div');
return 'grid' in el.style || 'msGrid' in el.style;
})(),
flexbox: (function() {
const el = document.createElement('div');
return 'flexBasis' in el.style || 'webkitFlexBasis' in el.style;
})(),
cssVariables: (function() {
return window.CSS && CSS.supports && CSS.supports('--a', '0');
})(),
// Advanced Features
bluetooth: 'bluetooth' in navigator,
usb: 'usb' in navigator,
serial: 'serial' in navigator,
geolocation: 'geolocation' in navigator,
notifications: 'Notification' in window,
paymentRequest: 'PaymentRequest' in window,
credentials: 'credentials' in navigator,
batteryAPI: 'getBattery' in navigator,
webShare: 'share' in navigator,
// Security Features
https: window.location.protocol === 'https:',
securityPolicies: 'securitypolicyviolation' in window,
crossOriginIsolation: window.crossOriginIsolated === true,
permissions: 'permissions' in navigator
};
// Calculate the percentage of supported features
const supportedCount = Object.values(features).filter(Boolean).length;
const totalFeatures = Object.keys(features).length;
const supportPercentage = Math.round((supportedCount / totalFeatures) * 100);
return {
features: features,
supported: supportedCount,
total: totalFeatures,
percentage: supportPercentage,
categorized: {
basicAPIs: ['fetch', 'serviceWorker', 'webWorkers', 'indexedDB', 'localStorage', 'sessionStorage'],
mediaGraphics: ['webGL', 'webRTC', 'webAudio', 'webSpeech', 'videoCapture', 'mediaRecorder'],
advancedGraphics: ['webVR', 'webXR', 'webGPU', 'webAnimations', 'canvas', 'canvasWebGL'],
modernJS: ['promises', 'asyncAwait', 'classes', 'generators'],
cssFeatures: ['gridLayout', 'flexbox', 'cssVariables'],
advancedAPIs: ['bluetooth', 'usb', 'serial', 'geolocation', 'notifications', 'paymentRequest', 'credentials', 'batteryAPI', 'webShare'],
security: ['https', 'securityPolicies', 'crossOriginIsolation', 'permissions']
}
};
}
generateFeaturesList() {
const featureSupport = this.generateFeatureSupport();
const allFeatures = [];
// Collect all categories and their functions
const categories = {
'Basic Web APIs': featureSupport.categorized.basicAPIs,
'Media & Graphics': featureSupport.categorized.mediaGraphics,
'Advanced Graphics': featureSupport.categorized.advancedGraphics,
'Modern JavaScript': featureSupport.categorized.modernJS,
'CSS Features': featureSupport.categorized.cssFeatures,
'Advanced APIs': featureSupport.categorized.advancedAPIs,
'Security': featureSupport.categorized.security
};
// Create HTML for all categories and their functions
let html = '';
Object.entries(categories).forEach(([categoryName, featureList]) => {
html += `<div class="feature-category">
<div class="category-title">${categoryName}</div>
<div class="category-features">`;
featureList.forEach(featureName => {
const supported = featureSupport.features[featureName];
const displayName = featureName
.replace(/([A-Z])/g, ' $1') // Add spaces before capital letters
.replace(/^./, str => str.toUpperCase()) // Capitalize first letter
.replace(/Webgl/g, 'WebGL')
.replace(/Webgpu/g, 'WebGPU')
.replace(/Webvr/g, 'WebVR')
.replace(/Webxr/g, 'WebXR')
.replace(/Webrtc/g, 'WebRTC')
.replace(/Api/g, 'API')
.replace(/Css/g, 'CSS')
.replace(/Https/g, 'HTTPS')
.replace(/Db/g, 'DB');
html += `
<div class="feature-item ${supported ? 'supported' : 'not-supported'}">
<div class="feature-status-icon"></div>
<div class="feature-name">${displayName}</div>
<div class="feature-status">${supported ? 'Available' : 'Not Available'}</div>
</div>`;
});
html += `</div></div>`;
});
return html;
}
}
// Initialize Fingerprint component when DOM is ready
document.addEventListener('DOMContentLoaded', () => {
new Fingerprint();
});
================================================
FILE: app.js
================================================
// Управление предупреждающим попапом
const initWarningPopup = () => {
const warningPopup = document.getElementById('warning-popup');
const closeButton = document.getElementById('close-warning');
const userLang = navigator.language || navigator.userLanguage;
// Показываем предупреждение только для русскоязычных пользователей и если оно не было закрыто ранее
const isPopupDismissed = localStorage.getItem('warning-dismissed') === 'true';
if ((userLang === "ru" || userLang.startsWith("ru-")) && !isPopupDismissed) {
if (warningPopup) warningPopup.classList.remove('hidden');
}
// Обработчик для кнопки закрытия
if (closeButton) {
closeButton.addEventListener('click', () => {
warningPopup.classList.add('hidden');
localStorage.setItem('warning-dismissed', 'true');
});
}
};
// Вызываем функцию при загрузке страницы
initWarningPopup();
console.log("Hello from DosX Portfolio!");
// Theme Management
function loadTheme() {
// Make sure body doesn't have any theme modes first to avoid conflicts
document.body.classList.remove('light-mode', 'dark-mode');
// Get saved theme or default to light
const savedTheme = localStorage.getItem('theme') || 'light';
// Add appropriate class
document.body.classList.add(savedTheme + '-mode');
// Add loaded class for smooth page appearance
setTimeout(() => {
document.body.classList.add('loaded');
}, 100);
// Update DOM elements with class-based theme visibility
const lightOnlyElements = document.querySelectorAll('.light-only');
const darkOnlyElements = document.querySelectorAll('.dark-only');
if (savedTheme === 'light') {
lightOnlyElements.forEach(el => el.style.display = '');
darkOnlyElements.forEach(el => el.style.display = 'none');
} else {
lightOnlyElements.forEach(el => el.style.display = 'none');
darkOnlyElements.forEach(el => el.style.display = '');
}
// Force browser repaint to ensure all theme-specific elements are correctly shown
document.body.style.display = 'none';
setTimeout(() => {
document.body.style.display = '';
}, 5);
}
function toggleTheme() {
const isLightMode = document.body.classList.contains('light-mode');
// Remove current theme
document.body.classList.remove('light-mode', 'dark-mode');
// Add new theme
const newTheme = isLightMode ? 'dark' : 'light';
document.body.classList.add(newTheme + '-mode');
// Save the preference
localStorage.setItem('theme', newTheme);
// Update DOM elements with class-based theme visibility
const lightOnlyElements = document.querySelectorAll('.light-only');
const darkOnlyElements = document.querySelectorAll('.dark-only');
if (newTheme === 'light') {
lightOnlyElements.forEach(el => el.style.display = '');
darkOnlyElements.forEach(el => el.style.display = 'none');
} else {
lightOnlyElements.forEach(el => el.style.display = 'none');
darkOnlyElements.forEach(el => el.style.display = '');
}
}
// Random Slogan with Typing Effect
function setRandomSlogan() {
const sloganElement = document.getElementById('random-slogan');
if (!sloganElement) return;
const slogans = [
"Hard work will help pass the time.",
"I'm #404 and distant like Jupiter.",
"Syntax errors build character.",
"Attack, Defend, Anticipate!",
"There is no spoon.",
"The cake is a lie.",
];
const randomSlogan = slogans[Math.floor(Math.random() * slogans.length)];
// Typing effect
let index = 0;
sloganElement.textContent = "";
function typeCharacter() {
if (index < randomSlogan.length) {
sloganElement.textContent += randomSlogan.charAt(index);
index++;
setTimeout(typeCharacter, 50);
}
}
typeCharacter();
}
function setEmailAddress() {
const mailElement = document.getElementById('mail');
if (!mailElement) return;
const emailParts = [
["collab"].join(''),
String.fromCharCode(64),
['\u006b\u0061\u0079', '-', '\u0073\u006f\u0066\u0074\u0077\u0061\u0072\u0065', '.', '\u0072\u0075'].join('')
];
mailElement.textContent = emailParts.join('');
mailElement.addEventListener('click', function (e) {
e.preventDefault();
const emailAddress = emailParts.join('');
// Use modern Clipboard API
navigator.clipboard.writeText(emailAddress).then(() => {
// Show confirmation that email was copied
const originalText = mailElement.textContent;
mailElement.textContent = 'Email copied!';
mailElement.style.color = '#4CAF50';
setTimeout(() => {
mailElement.textContent = originalText;
mailElement.style.color = '';
// Open email client after a short delay
window.location.href = 'mailto:' + emailAddress;
}, 1500);
}).catch(error => {
console.error('Failed to copy email:', error);
// Fallback to direct mail client open if clipboard fails
window.location.href = 'mailto:' + emailAddress;
});
});
// Add pointer cursor style to indicate clickability
mailElement.style.cursor = 'pointer';
}
// Set current year
function setYear() {
const yearElement = document.getElementById('year');
if (!yearElement) return;
yearElement.textContent = new Date().getFullYear();
}
// GitHub API Configuration
const GITHUB_API_URL = "https://api.github.com/users/DosX-dev/repos";
const STORAGE_KEY = "dosx_repos";
const LAST_FETCH_KEY = "dosx_last_fetch";
const PER_PAGE = 100;
const CACHE_VALIDITY_DURATION = 60 * 60 * 1000; // 1 hour in milliseconds
// Fetch repositories from GitHub API
async function fetchRepositories() {
const loadingElement = document.getElementById("loading");
try {
let allRepos = [];
let page = 1;
while (true) {
const response = await fetch(`${GITHUB_API_URL}?per_page=${PER_PAGE}&page=${page}`, {
headers: {
"Accept": "application/vnd.github.v3+json",
"User-Agent": "DosX-Portfolio-Website"
}
});
if (!response.ok) {
throw new Error(`GitHub API error: ${response.status} ${response.statusText}`);
}
const repos = await response.json();
if (repos.length === 0) {
break;
}
allRepos = allRepos.concat(repos);
page++;
}
// Save to localStorage cache
localStorage.setItem(STORAGE_KEY, JSON.stringify(allRepos));
localStorage.setItem(LAST_FETCH_KEY, Date.now().toString());
return allRepos;
} catch (error) {
console.error("Error fetching repositories:", error);
if (loadingElement) {
loadingElement.innerHTML = `
<p class="error-message">Failed to load repositories. ${error.message}</p>
`;
}
return null;
}
}
// Check if repository meets display criteria
function shouldDisplayRepository(repo) {
return !repo.fork && repo.topics?.length > 0 && repo.description?.length > 0;
}
// Generate category icons based on repository
function getCategoryIcon(condition, iconName, titleName) {
const title = titleName || iconName;
// Преобразуем названия в понятные категории
const displayNames = {
'game': 'Games',
'virus': 'Malware',
'learn': 'Learning',
'web': 'Web',
'leaf': 'Optimizers',
'database': 'Data Tools',
'shield': 'Protections',
'sdk': 'Libraries'
};
const displayTitle = displayNames[iconName] || title;
return condition ? `<img src="res/${iconName}-new.svg" alt="${displayTitle}" title="${displayTitle}" class="category-icon">` : '';
}
function getCategoryIcons(repo) {
const repoDescLower = repo.description ? repo.description.toLowerCase() : "";
const repoNameLower = repo.name.toLowerCase();
return getCategoryIcon(repo.topics.includes("game") || repoNameLower.includes("game"), "game", "Games") +
getCategoryIcon(repo.topics.includes("malware") ||
repo.topics.includes("stub") ||
repoDescLower.includes("malware") ||
repoDescLower.includes("bypass") ||
repoDescLower.includes("virus") ||
repoDescLower.includes("spyware") ||
repoDescLower.includes("ransomware") ||
repoDescLower.includes("rootkit") ||
repoDescLower.includes("keylogger") ||
repoDescLower.includes("clipper") ||
repoDescLower.includes("crack") ||
repoDescLower.includes("backdoor") ||
repoDescLower.includes("trojan"), "virus", "Security") +
getCategoryIcon(repo.topics.includes("example") ||
repo.topics.includes("learning") ||
repoDescLower.includes("example of") ||
repoDescLower.includes("learn") ||
repoDescLower.includes("study") ||
repoDescLower.includes("tutorial"), "learn", "Learning") +
getCategoryIcon(repo.topics.includes("web") ||
repoDescLower.includes("web-") ||
repoDescLower.includes("html") ||
repoDescLower.includes("css"), "web", "Web") +
getCategoryIcon(repo.topics.includes("optimizer") ||
repoDescLower.includes("cleanup") ||
repoDescLower.includes("clean up") ||
repoDescLower.includes("optimization") ||
repoDescLower.includes("optimize "), "leaf", "Optimizers") +
getCategoryIcon(repo.topics.includes("sorter") ||
repo.topics.includes("detector") ||
repo.topics.includes("scanner") ||
repoDescLower.includes("sort") ||
repoDescLower.includes(" collection") ||
repoDescLower.includes("database") ||
repoNameLower.includes("identifier"), "database", "Data Tools") +
getCategoryIcon(repo.topics.includes("protection") ||
repoDescLower.includes("protect") ||
repoDescLower.includes("obfuscat"), "shield", "Protections") +
getCategoryIcon(repo.topics.includes("library") ||
repoDescLower.includes("library") ||
repoDescLower.includes("sdk") ||
repoNameLower.includes(".js"), "sdk", "Libraries");
}
// Global variable to store repository data
let globalRepositories = [];
let currentFilter = "all";
let currentSort = "stars";
let searchQuery = "";
// Display repositories in the UI
function displayRepositories(repositories) {
const reposContainer = document.getElementById("repositories");
const loadingElement = document.getElementById("loading");
if (!reposContainer) return;
// Hide loading indicator
if (loadingElement) {
loadingElement.style.display = "none";
}
// Filter out repositories that don't meet criteria
globalRepositories = repositories.filter(shouldDisplayRepository);
if (globalRepositories.length === 0) {
reposContainer.innerHTML = `<div class="no-repos">No public repositories found.</div>`;
return;
}
// Mark top 3 repositories based on stars
// This adds a rank property that will be used for displaying badges
const topRepos = [...globalRepositories].sort((a, b) => b.stargazers_count - a.stargazers_count).slice(0, 3);
globalRepositories.forEach(repo => {
const topIndex = topRepos.findIndex(topRepo => topRepo.id === repo.id);
if (topIndex !== -1) {
repo.rank = topIndex + 1; // Rank 1, 2, or 3
}
});
// Apply initial sort (stars high to low by default)
applyFiltersAndSort();
}
// Filter and sort repositories based on current criteria
function applyFiltersAndSort() {
const reposContainer = document.getElementById("repositories");
if (!reposContainer) return;
// Clear existing content
reposContainer.innerHTML = "";
// Apply category filter
let filteredRepos = [...globalRepositories];
if (currentFilter !== "all") {
filteredRepos = filteredRepos.filter(repo => {
const repoDescLower = repo.description ? repo.description.toLowerCase() : "";
const repoNameLower = repo.name.toLowerCase();
switch (currentFilter) {
case "game":
return repo.topics.includes("game") ||
repoNameLower.includes("game");
case "malware":
return repo.topics.includes("malware") ||
repo.topics.includes("stub") ||
repoDescLower.includes("malware") ||
repoDescLower.includes("bypass") ||
repoDescLower.includes("virus") ||
repoDescLower.includes("spyware") ||
repoDescLower.includes("ransomware") ||
repoDescLower.includes("rootkit") ||
repoDescLower.includes("keylogger") ||
repoDescLower.includes("clipper") ||
repoDescLower.includes("crack") ||
repoDescLower.includes("backdoor") ||
repoDescLower.includes("trojan");
case "web":
return repo.topics.includes("web") ||
repoDescLower.includes("web-") ||
repoDescLower.includes("html") ||
repoDescLower.includes("css");
case "learning":
return repo.topics.includes("example") ||
repo.topics.includes("learning") ||
repoDescLower.includes("example of") ||
repoDescLower.includes("learn") ||
repoDescLower.includes("study") ||
repoDescLower.includes("tutorial");
case "optimizer":
return repo.topics.includes("optimizer") ||
repoDescLower.includes("cleanup") ||
repoDescLower.includes("clean up") ||
repoDescLower.includes("optimization") ||
repoDescLower.includes("optimize ");
case "database":
return repo.topics.includes("sorter") ||
repo.topics.includes("detector") ||
repo.topics.includes("scanner") ||
repoDescLower.includes("sort") ||
repoDescLower.includes(" collection") ||
repoDescLower.includes("database") ||
repoNameLower.includes("identifier");
case "protection":
return repo.topics.includes("protection") ||
repoDescLower.includes("protect") ||
repoDescLower.includes("obfuscat");
case "library":
return repo.topics.includes("library") ||
repoDescLower.includes("library") ||
repoDescLower.includes("sdk") ||
repoNameLower.includes(".js");
default:
return true;
}
});
}
// Apply search filter if there's a query
if (searchQuery.trim() !== "") {
const query = searchQuery.trim().toLowerCase();
filteredRepos = filteredRepos.filter(repo => {
return repo.name.toLowerCase().includes(query) ||
repo.description.toLowerCase().includes(query) ||
(repo.topics && repo.topics.some(topic => topic.toLowerCase().includes(query)));
});
}
// Apply sort
switch (currentSort) {
case "stars":
filteredRepos.sort((a, b) => b.stargazers_count - a.stargazers_count);
break;
case "stars-asc":
filteredRepos.sort((a, b) => a.stargazers_count - b.stargazers_count);
break;
case "forks":
filteredRepos.sort((a, b) => b.forks_count - a.forks_count);
break;
case "forks-asc":
filteredRepos.sort((a, b) => a.forks_count - b.forks_count);
break;
case "name":
filteredRepos.sort((a, b) => a.name.localeCompare(b.name));
break;
case "name-desc":
filteredRepos.sort((a, b) => b.name.localeCompare(a.name));
break;
}
// Show "no results" message if needed
if (filteredRepos.length === 0) {
reposContainer.innerHTML = `<div class="no-repos">No repositories found matching your criteria.</div>`;
return;
}
// Функция для определения класса описания на основе длины текста
function getDescriptionClass(description) {
if (!description) return 'medium-text';
const length = description.length;
if (length < 80) {
return 'short-text';
} else if (length > 250) {
return 'long-text';
} else {
return 'medium-text';
}
}
// Generate HTML for each repository
filteredRepos.forEach((repo, index) => {
const repoElement = document.createElement("div");
repoElement.className = "project-card";
repoElement.style.animationDelay = `${index * 50}ms`;
repoElement.onclick = () => window.open(repo.html_url, "_blank");
const categoryIcons = getCategoryIcons(repo);
const isCrownRepo = index === 0 && currentSort === "stars" && currentFilter === "all" && searchQuery === "";
const crownIcon = isCrownRepo ? `<img src="res/crown-new.svg" alt="Featured" title="Featured Repository">` : '';
const isPodiumRepo = index < 3 && currentSort === "stars" && currentFilter === "all" && searchQuery === "";
// Определяем класс для размера текста описания
const descriptionClass = getDescriptionClass(repo.description);
repoElement.innerHTML = `
${repo.rank ? `<div class="rank-badge rank-${repo.rank}" title="${repo.rank === 1 ? 'Top Repository' : (repo.rank === 2 ? 'Second Best Repository' : 'Third Best Repository')}">${repo.rank}</div>` : ''}
<div class="project-header">
<h3 class="project-title">
${repo.name}
${categoryIcons}
${isPodiumRepo ? (index === 0 ? crownIcon : '') : ''}
</h3>
</div>
<div class="project-body">
<p class="project-description ${descriptionClass}">${repo.description}</p>
<div class="project-stats">
<div class="stat">
<img src="res/star-new.svg" alt="Stars">
<span>${repo.stargazers_count}</span>
</div>
<div class="stat">
<img src="res/fork-new2.svg" alt="Forks">
<span>${repo.forks_count}</span>
</div>
</div>
</div>
`;
reposContainer.appendChild(repoElement);
});
}
// Load repositories from cache or fetch from API
async function loadRepositories() {
const loadingElement = document.getElementById("loading");
const reposContainer = document.getElementById("repositories");
if (!reposContainer) return;
// Try to get repos from cache
const lastFetch = localStorage.getItem(LAST_FETCH_KEY);
const cachedRepos = localStorage.getItem(STORAGE_KEY);
const now = Date.now();
// If we have valid cache, use it
if (lastFetch && cachedRepos) {
const cacheAge = now - parseInt(lastFetch);
if (cacheAge < CACHE_VALIDITY_DURATION) {
console.log("Using cached repositories");
displayRepositories(JSON.parse(cachedRepos));
return;
}
}
// Otherwise fetch from API
console.log("Fetching repositories from GitHub");
// Show loading indicator
if (loadingElement) {
loadingElement.style.display = "flex";
}
const repos = await fetchRepositories();
if (repos) {
displayRepositories(repos);
}
}
// Setup event listeners for filtering and sorting
function setupEventListeners() {
// Category filters
const categoryFilters = document.querySelectorAll('.category-filter');
categoryFilters.forEach(filter => {
filter.addEventListener('click', () => {
// Remove active class from all filters
categoryFilters.forEach(f => f.classList.remove('active'));
// Add active class to clicked filter
filter.classList.add('active');
// Update current filter
currentFilter = filter.getAttribute('data-category');
// Apply filters
applyFiltersAndSort();
});
});
// Sort functionality is now handled by the custom select dropdown
// through setupCustomSelect() function
// Search input
const searchInput = document.getElementById('search-input');
if (searchInput) {
// Debounce function to prevent too many filter operations while typing
let debounceTimeout;
searchInput.addEventListener('input', () => {
clearTimeout(debounceTimeout);
debounceTimeout = setTimeout(() => {
searchQuery = searchInput.value;
applyFiltersAndSort();
}, 300); // 300ms debounce delay
});
}
}
// Initialize the page
// Function to handle custom select dropdown
function setupCustomSelect() {
const customSelect = document.querySelector('.custom-select');
const selectSelected = document.querySelector('.select-selected');
const selectItems = document.querySelector('.select-items');
const selectOptions = document.querySelectorAll('.select-option');
// Toggle dropdown when clicking on the selected item
if (selectSelected) {
selectSelected.addEventListener('click', function (e) {
e.stopPropagation();
customSelect.classList.toggle('select-arrow-active');
selectItems.classList.toggle('select-hide');
});
}
// Close dropdown when clicking outside
document.addEventListener('click', function () {
if (customSelect) {
customSelect.classList.remove('select-arrow-active');
selectItems.classList.add('select-hide');
}
});
// Handle option selection
selectOptions.forEach(option => {
option.addEventListener('click', function () {
// Update the selected text
if (selectSelected) {
selectSelected.textContent = this.textContent;
}
// Update active class
selectOptions.forEach(opt => opt.classList.remove('select-active'));
this.classList.add('select-active');
// Set the current sort value and update display
currentSort = this.getAttribute('data-value');
applyFiltersAndSort();
// Close the dropdown
if (selectItems) {
selectItems.classList.add('select-hide');
customSelect.classList.remove('select-arrow-active');
}
});
});
}
// Terminal functionality is now in app.terminal.js
// The globalRepositories variable is declared earlier in the code
document.addEventListener("DOMContentLoaded", function () {
loadTheme();
setRandomSlogan();
setEmailAddress();
setYear();
loadRepositories();
setupEventListeners();
setupCustomSelect();
// Terminal initialization is now in app.terminal.js
});
================================================
FILE: app.modern.css
================================================
:root {
--font-sans: 'Inter', system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif;
/* Light mode colors - менее фиолетовые, более голубые */
--bg-light: #ffffff;
--text-light: #111827;
--text-muted-light: #4a5568;
--primary-light: #2563eb;
--secondary-light: #0284c7;
--accent-light: #0891b2;
--border-light: #e2e8f0;
--card-bg-light: #ffffff;
--card-hover-light: #f1f5f9;
/* Dark mode colors - более глубокий и насыщенный темный фон */
--bg-dark: #0a0f1a;
--text-dark: #f8fafc;
--text-muted-dark: #94a3b8;
--primary-dark: #60a5fa;
--secondary-dark: #38bdf8;
--accent-dark: #a78bfa;
--border-dark: #1e293b;
--card-bg-dark: #141b2b;
--card-hover-dark: #1e2a45;
/* Градиенты с менее фиолетовыми значениями */
--gradient-1-light: rgba(14, 165, 233, 0.2);
--gradient-2-light: rgba(56, 189, 248, 0.2);
--gradient-3-light: rgba(2, 132, 199, 0.2);
--gradient-4-light: rgba(3, 105, 161, 0.2);
/* Тёмный градиент с более насыщенными тонами */
--gradient-1-dark: rgba(30, 64, 175, 0.25);
--gradient-2-dark: rgba(67, 56, 202, 0.25);
--gradient-3-dark: rgba(109, 40, 217, 0.25);
--gradient-4-dark: rgba(12, 74, 110, 0.25);
/* Scrollbar Colors */
--scrollbar-track-light: #f1f5f9;
--scrollbar-thumb-light: #cbd5e1;
--scrollbar-thumb-hover-light: var(--primary-light);
--scrollbar-track-dark: #0f172a;
--scrollbar-thumb-dark: #334155;
--scrollbar-thumb-hover-dark: var(--primary-dark);
/* SVG Filter colors */
--svg-filter-light: invert(39%) sepia(70%) saturate(6486%) hue-rotate(214deg) brightness(97%) contrast(101%); /* Primary Blue */
--svg-filter-dark: invert(62%) sepia(14%) saturate(5486%) hue-rotate(195deg) brightness(103%) contrast(100%); /* Light Blue */
--svg-filter-hover-light: invert(41%) sepia(87%) saturate(1817%) hue-rotate(201deg) brightness(98%) contrast(94%);
--svg-filter-hover-dark: invert(73%) sepia(61%) saturate(1371%) hue-rotate(185deg) brightness(103%) contrast(106%);
}
/* Base Styles */
* {
margin: 0;
padding: 0;
box-sizing: border-box;
}
/* Custom Scrollbar Styles */
/* Для Webkit (Chrome, Safari, новые версии Edge) */
.light-mode::-webkit-scrollbar {
width: 12px;
height: 12px;
}
.light-mode::-webkit-scrollbar-track {
background: var(--scrollbar-track-light);
border-radius: 8px;
}
.light-mode::-webkit-scrollbar-thumb {
background-color: var(--scrollbar-thumb-light);
border-radius: 8px;
border: 3px solid var(--scrollbar-track-light);
}
.light-mode::-webkit-scrollbar-thumb:hover {
background-color: var(--scrollbar-thumb-hover-light);
}
.dark-mode::-webkit-scrollbar {
width: 12px;
height: 12px;
}
.dark-mode::-webkit-scrollbar-track {
background: var(--scrollbar-track-dark);
border-radius: 8px;
}
.dark-mode::-webkit-scrollbar-thumb {
background-color: var(--scrollbar-thumb-dark);
border-radius: 8px;
border: 3px solid var(--scrollbar-track-dark);
}
.dark-mode::-webkit-scrollbar-thumb:hover {
background-color: var(--scrollbar-thumb-hover-dark);
}
/* Для Firefox */
* {
scrollbar-width: thin;
}
.light-mode {
scrollbar-color: var(--scrollbar-thumb-light) var(--scrollbar-track-light);
}
.dark-mode {
scrollbar-color: var(--scrollbar-thumb-dark) var(--scrollbar-track-dark);
}
/* Theme-specific visibility */
.light-mode .dark-only {
display: none !important;
}
.dark-mode .light-only {
display: none !important;
}
html {
font-size: 16px;
scroll-behavior: smooth;
}
body {
font-family: var(--font-sans);
line-height: 1.6;
transition: background-color 0.5s ease, color 0.5s ease, opacity 1s ease-in-out;
position: relative;
overflow-x: hidden;
opacity: 0; /* Начальное состояние - непрозрачность 0 */
}
body.loaded {
opacity: 1; /* Конечное состояние - полностью видимый */
}
/* Enhanced transitions for all elements */
* {
transition: background-color 0.5s ease,
color 0.5s ease,
border-color 0.5s ease,
box-shadow 0.5s ease,
transform 0.3s ease,
fill 0.5s ease;
}
/* Animated background */
body::before {
content: '';
position: fixed;
top: 0;
left: 0;
width: 100%;
height: 100%;
z-index: -1;
opacity: 1; /* Увеличена непрозрачность для большей заметности */
transition: opacity 0.5s ease;
}
body.light-mode {
background-color: var(--bg-light);
color: var(--text-light);
}
body.light-mode::before {
background: radial-gradient(
circle at 30% 40%,
var(--gradient-1-light) 0%,
var(--gradient-2-light) 30%,
var(--gradient-3-light) 60%,
var(--gradient-4-light) 100%
);
background-size: 300% 300%;
animation: gradient 15s ease-in-out infinite;
filter: blur(80px); /* Добавляем сильное размытие для плавности */
}
body.dark-mode {
background-color: var(--bg-dark);
color: var(--text-dark);
}
body.dark-mode::before {
background: radial-gradient(
circle at 40% 50%,
var(--gradient-1-dark) 0%,
var(--gradient-2-dark) 30%,
var(--gradient-3-dark) 60%,
var(--gradient-4-dark) 100%
);
background-size: 300% 300%;
animation: gradient 15s ease-in-out infinite;
filter: blur(80px); /* Добавляем сильное размытие для плавности */
}
@keyframes gradient {
0% {
background-position: 0% 50%;
}
25% {
background-position: 50% 100%;
}
50% {
background-position: 100% 50%;
}
75% {
background-position: 50% 0%;
}
100% {
background-position: 0% 50%;
}
}
img {
max-width: 100%;
height: auto;
user-select: none;
-webkit-user-drag: none;
}
.container {
width: 100%;
max-width: 1200px;
margin: 0 auto;
padding: 0 1.5rem;
}
.hidden {
display: none;
}
/* Warning Popup */
.warning-popup {
position: fixed;
left: 1.5rem;
bottom: 1.5rem;
max-width: 400px;
width: 95%;
z-index: 1000;
border-radius: 12px;
box-shadow: 0 10px 25px rgba(0, 0, 0, 0.2);
overflow: hidden;
opacity: 0;
transform: translateY(20px);
transition: opacity 0.5s ease, transform 0.5s ease;
backdrop-filter: blur(8px);
animation: slideInUp 0.5s forwards;
}
@keyframes slideInUp {
from {
opacity: 0;
transform: translateY(40px);
}
to {
opacity: 1;
transform: translateY(0);
}
}
.warning-popup.hidden {
transform: translateY(100px);
opacity: 0;
pointer-events: none;
visibility: hidden;
}
.warning-content {
display: flex;
align-items: flex-start;
position: relative;
padding: 1.25rem;
border-radius: 12px;
backdrop-filter: blur(8px);
font-weight: 500;
letter-spacing: 0.01em;
}
.light-mode .warning-content {
background: rgba(254, 226, 226, 0.9);
border: 1px solid rgba(239, 68, 68, 0.3);
color: #991b1b;
}
.dark-mode .warning-content {
background: rgba(127, 29, 29, 0.85);
border: 1px solid rgba(248, 113, 113, 0.4);
color: #fecaca;
}
.warning-icon {
flex-shrink: 0;
font-size: 1.2rem;
margin-right: 0.75rem;
margin-top: 0.2rem;
}
.warning-popup p {
flex: 1;
font-size: 0.9rem;
line-height: 1.5;
margin: 0;
}
.close-warning {
position: absolute;
top: 0.75rem;
right: 0.75rem;
background: transparent;
border: none;
width: 24px;
height: 24px;
border-radius: 50%;
display: flex;
align-items: center;
justify-content: center;
cursor: pointer;
transition: background-color 0.3s;
}
.light-mode .close-warning {
color: #991b1b;
}
.light-mode .close-warning:hover {
background-color: rgba(239, 68, 68, 0.2);
}
.dark-mode .close-warning {
color: #fecaca;
}
.dark-mode .close-warning:hover {
background-color: rgba(248, 113, 113, 0.2);
}
/* Header */
header {
padding: 1.5rem 0;
position: relative;
}
.theme-toggle {
position: absolute;
top: 1.5rem;
right: 1.5rem;
width: 3.5rem;
height: 3.5rem;
display: flex;
align-items: center;
justify-content: center;
cursor: pointer;
border-radius: 9999px;
background-color: transparent;
transition: all 0.3s ease;
border: 1px solid transparent;
z-index: 100;
}
.theme-toggle:active {
transform: scale(0.92);
transition: transform 0.1s ease;
}
.light-mode .theme-toggle {
border-color: rgba(226, 232, 240, 0.8);
}
.dark-mode .theme-toggle {
border-color: rgba(45, 55, 72, 0.8);
}
.light-mode .theme-toggle:hover {
background-color: var(--card-hover-light);
}
.dark-mode .theme-toggle:hover {
background-color: var(--card-hover-dark);
}
.toggle-icon {
width: 1.5rem;
height: 1.5rem;
position: relative;
display: flex;
align-items: center;
justify-content: center;
}
.toggle-icon svg {
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
width: 100%;
height: 100%;
transition: opacity 0.3s ease, transform 0.3s ease;
}
.light-mode .sun-icon {
opacity: 1;
transform: translate(-50%, -50%) rotate(0deg);
}
.light-mode .moon-icon {
opacity: 0;
transform: translate(-50%, -50%) rotate(90deg);
}
.dark-mode .sun-icon {
opacity: 0;
transform: translate(-50%, -50%) rotate(-90deg);
}
.dark-mode .moon-icon {
opacity: 1;
transform: translate(-50%, -50%) rotate(0deg);
}
.light-mode .toggle-icon svg {
color: var(--text-light);
}
.dark-mode .toggle-icon svg {
color: var(--text-dark);
}
/* Theme-specific image visibility */
.light-only {
display: block;
}
.dark-only {
display: none;
}
.dark-mode .light-only {
display: none;
}
.dark-mode .dark-only {
display: block;
}
/* Hero Section */
.hero {
min-height: 100vh;
display: flex;
align-items: center;
justify-content: center;
position: relative;
padding: 1rem 0;
}
.hero-content {
max-width: 1000px;
margin: 0 auto;
display: flex;
align-items: center;
gap: 3rem;
padding: 2rem 0;
}
.scroll-indicator {
position: absolute;
bottom: 2rem;
left: 50%;
transform: translateX(-50%);
display: flex;
flex-direction: column;
align-items: center;
animation: bounce 2s infinite;
opacity: 0.75;
cursor: pointer;
transition: opacity 0.3s ease;
}
.scroll-indicator:hover {
opacity: 1;
}
.scroll-arrow {
width: 24px;
height: 24px;
position: relative;
margin-bottom: 5px;
}
.scroll-arrow:before,
.scroll-arrow:after {
content: '';
position: absolute;
top: 0;
width: 15px;
height: 3px;
border-radius: 3px;
background: var(--primary-light);
transition: all 0.3s ease;
}
.scroll-arrow:before {
right: 50%;
transform: rotate(45deg);
transform-origin: 100% 50%;
}
.scroll-arrow:after {
left: 50%;
transform: rotate(-45deg);
transform-origin: 0% 50%;
}
.dark-mode .scroll-arrow:before,
.dark-mode .scroll-arrow:after {
background: var(--primary-dark);
}
.scroll-indicator:hover .scroll-arrow:before,
.scroll-indicator:hover .scroll-arrow:after {
width: 18px;
}
@keyframes bounce {
0%, 20%, 50%, 80%, 100% {
transform: translateY(0);
}
40% {
transform: translateY(-10px);
}
60% {
transform: translateY(-5px);
}
}
.profile-container {
flex: 0 0 auto;
display: flex;
flex-direction: column;
align-items: center;
}
.profile-info {
flex: 1 1 auto;
text-align: left;
display: flex;
flex-direction: column;
}
.profile-image {
position: relative;
margin-bottom: 0.5rem;
}
.avatar {
width: 180px;
height: 180px;
border-radius: 50%;
object-fit: cover;
border: 2px solid;
box-shadow: 0 5px 15px rgba(0, 0, 0, 0.1);
}
.about-bio {
line-height: 1.6;
font-size: 1.1rem;
margin-top: 1rem;
}
.light-mode .avatar {
border-color: var(--primary-light);
}
.dark-mode .avatar {
border-color: var(--primary-dark);
}
.name {
font-size: 2.5rem;
font-weight: 700;
margin-bottom: 0.5rem;
display: flex;
align-items: center;
gap: 0.5rem;
}
.verified-badge {
display: inline-flex;
align-items: center;
}
.verified-icon {
width: 24px;
height: 24px;
}
.light-mode .verified-icon-path {
fill: url(#verifiedGradientLight);
}
.dark-mode .verified-path {
fill: #78a9ff; /* Более светлый голубой цвет для темного режима */
}
.slogan {
font-size: 1.25rem;
color: var(--text-muted-light);
min-height: 2rem;
margin-bottom: 1.5rem;
font-style: italic;
animation: fadeIn 0.8s ease-out;
position: relative;
}
.slogan::after {
content: '';
position: absolute;
left: 0;
bottom: -0.75rem;
width: 5rem;
height: 3px;
background: linear-gradient(to right, var(--primary-light), rgba(99, 179, 237, 0.3));
border-radius: 3px;
}
.dark-mode .slogan {
color: var(--text-muted-dark);
}
.dark-mode .slogan::after {
background: linear-gradient(to right, var(--primary-dark), rgba(99, 179, 237, 0.1));
}
/* Section Styles */
section {
padding: 5rem 0;
position: relative;
}
/* Наклонные переходы между секциями */
section.slant-after {
padding-bottom: 8rem;
}
section.slant-before {
padding-top: 8rem;
}
section.slant-after::after,
section.slant-before::before {
content: '';
position: absolute;
left: 0;
width: 100%;
height: 4rem;
background: inherit;
z-index: 1;
}
section.slant-after::after {
bottom: 0;
transform: skewY(-1deg);
transform-origin: 100% 100%;
}
section.slant-before::before {
top: 0;
transform: skewY(-1deg);
transform-origin: 0 0;
}
.light-mode section:nth-child(even) {
background-color: var(--card-bg-light);
}
.dark-mode section:nth-child(even) {
background-color: var(--card-bg-dark);
}
.section-title {
font-size: 2rem;
text-align: center;
margin-bottom: 2.5rem;
position: relative;
padding-bottom: 1rem;
}
.section-title::after {
content: '';
position: absolute;
bottom: 0;
left: 50%;
transform: translateX(-50%);
width: 60px;
height: 3px;
}
.light-mode .section-title::after {
background-color: var(--primary-light);
}
.dark-mode .section-title::after {
background-color: var(--primary-dark);
}
/* About Section */
.about-content {
max-width: 800px;
margin: 0 auto;
font-size: 1.125rem;
text-align: center;
}
.inline-icon {
width: 1em;
height: 1em;
vertical-align: middle;
}
/* Expertise Area Styles */
.expertise-grid {
display: flex;
flex-direction: column;
gap: 2rem;
max-width: 1100px;
margin: 0 auto;
}
.expertise-row {
display: flex;
gap: 1.5rem;
justify-content: center;
flex-wrap: wrap;
}
.expertise-box {
background-color: rgba(255, 255, 255, 0.5);
box-shadow: 0 8px 30px rgba(0, 0, 0, 0.06);
border-radius: 16px;
padding: 2rem 1.5rem;
flex: 1;
min-width: 280px;
max-width: 350px;
text-align: center;
transition: all 0.4s cubic-bezier(0.175, 0.885, 0.32, 1.275);
position: relative;
overflow: hidden;
border: 1px solid rgba(226, 232, 240, 0.8);
}
.expertise-box::before {
content: '';
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
background: linear-gradient(135deg,
rgba(99, 179, 237, 0.1),
rgba(99, 102, 241, 0.05),
rgba(168, 85, 247, 0.05));
opacity: 0;
z-index: 0;
transition: opacity 0.4s ease;
pointer-events: none; /* Убираем перехват событий */
}
.expertise-box:hover {
transform: translateY(-10px);
box-shadow: 0 15px 35px rgba(0, 0, 0, 0.1);
}
.expertise-box:hover::before {
opacity: 1;
}
.dark-mode .expertise-box {
background-color: rgba(30, 41, 59, 0.7);
border: 1px solid rgba(51, 65, 85, 0.8);
box-shadow: 0 8px 30px rgba(0, 0, 0, 0.15);
}
.dark-mode .expertise-box::before {
background: linear-gradient(135deg,
rgba(37, 99, 235, 0.1),
rgba(79, 70, 229, 0.05),
rgba(124, 58, 237, 0.05));
}
.dark-mode .expertise-box:hover {
box-shadow: 0 15px 35px rgba(0, 0, 0, 0.3);
}
.expertise-icon {
width: 60px;
height: 60px;
background-color: rgba(236, 244, 255, 0.8);
border-radius: 12px;
display: flex;
align-items: center;
justify-content: center;
margin: 0 auto 1.25rem;
position: relative;
z-index: 1;
transition: all 0.3s ease;
}
.expertise-icon svg,
.expertise-icon img {
width: 32px;
height: 32px;
transition: all 0.3s ease;
position: relative;
z-index: 10;
display: block;
pointer-events: none; /* Убираем перехват событий для самих SVG */
filter: var(--svg-filter-light); /* Фильтр для SVG изображений в светлой теме */
}
.expertise-icon svg {
stroke: var(--primary-light);
fill: none;
}
.expertise-box:hover .expertise-icon {
transform: scale(1.1);
background-color: rgba(224, 236, 255, 0.9);
}
.expertise-box:hover .expertise-icon svg {
stroke: var(--primary-hover-light);
}
.expertise-box:hover .expertise-icon img {
transform: scale(1.15);
opacity: 1; /* Гарантируем непрозрачность при наведении */
}
.dark-mode .expertise-icon {
background-color: rgba(17, 24, 39, 0.7);
}
.dark-mode .expertise-icon svg {
stroke: var(--primary-dark);
}
.dark-mode .expertise-box:hover .expertise-icon {
background-color: rgba(17, 24, 39, 0.9);
}
.dark-mode .expertise-box:hover .expertise-icon svg {
stroke: var(--primary-hover-dark);
opacity: 1; /* Гарантируем непрозрачность при наведении в темной теме */
fill: none; /* Делаем fill прозрачным и в темной теме */
}
.dark-mode .expertise-icon img {
filter: var(--svg-filter-dark); /* Применяем фильтр для темной темы */
}
.dark-mode .expertise-box:hover .expertise-icon img {
filter: var(--svg-filter-hover-dark); /* Фильтр при наведении в темной теме */
}
.light-mode .expertise-box:hover .expertise-icon img {
filter: var(--svg-filter-hover-light); /* Фильтр при наведении в светлой теме */
}
.expertise-box h3 {
font-size: 1.25rem;
font-weight: 600;
margin-bottom: 0.75rem;
position: relative;
z-index: 1;
}
.expertise-box p {
color: var(--text-muted-light);
font-size: 0.95rem;
line-height: 1.6;
max-width: 280px;
margin: 0 auto;
position: relative;
z-index: 1;
}
.dark-mode .expertise-box p {
color: var(--text-muted-dark);
}
/* Contact Section */
.contact-grid {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));
gap: 2rem;
margin-top: 2rem;
}
.contact-item {
display: flex;
align-items: center;
gap: 1rem;
padding: 1.5rem;
border-radius: 0.5rem;
transition: transform 0.2s ease, box-shadow 0.2s ease;
position: relative;
}
.light-mode .contact-item {
background-color: var(--card-bg-light);
box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);
}
.dark-mode .contact-item {
background-color: var(--card-bg-dark);
box-shadow: 0 1px 3px rgba(0, 0, 0, 0.2);
}
.contact-item:hover {
transform: translateY(-5px);
}
.light-mode .contact-item:hover {
box-shadow: 0 10px 15px -3px rgba(0, 0, 0, 0.1), 0 4px 6px -2px rgba(0, 0, 0, 0.05);
}
.dark-mode .contact-item:hover {
box-shadow: 0 10px 15px -3px rgba(0, 0, 0, 0.25), 0 4px 6px -2px rgba(0, 0, 0, 0.1);
}
.contact-icon {
width: 52px;
height: 52px;
border-radius: 50%;
display: flex;
align-items: center;
justify-content: center;
margin-right: 1.25rem;
position: relative;
overflow: hidden;
transition: all 0.4s cubic-bezier(0.175, 0.885, 0.32, 1.275);
}
.contact-icon::before {
content: '';
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
background: radial-gradient(circle at center, rgba(255, 255, 255, 0.15), transparent);
opacity: 0;
transition: opacity 0.3s ease;
}
.contact-item:hover .contact-icon::before {
opacity: 1;
}
.light-mode .contact-icon {
background-color: #f0f9ff;
box-shadow: 0 6px 12px -2px rgba(0, 0, 0, 0.1), 0 3px 6px -3px rgba(0, 0, 0, 0.05);
border: 2px solid rgba(226, 232, 240, 0.8);
}
.dark-mode .contact-icon {
background-color: rgba(17, 24, 39, 0.7);
box-shadow: 0 6px 12px -2px rgba(0, 0, 0, 0.3), 0 3px 6px -3px rgba(0, 0, 0, 0.2);
border: 2px solid rgba(45, 55, 72, 0.8);
}
.contact-item:hover .contact-icon {
transform: scale(1.1);
}
.light-mode .contact-item:hover .contact-icon {
box-shadow: 0 10px 15px -3px rgba(0, 0, 0, 0.1), 0 4px 6px -2px rgba(0, 0, 0, 0.05);
border-color: rgba(99, 179, 237, 0.5);
}
.dark-mode .contact-item:hover .contact-icon {
box-shadow: 0 10px 15px -3px rgba(0, 0, 0, 0.4), 0 4px 6px -2px rgba(0, 0, 0, 0.25);
border-color: rgba(66, 153, 225, 0.6);
}
.contact-icon img,
.contact-icon svg {
width: 26px;
height: 26px;
transition: transform 0.4s cubic-bezier(0.68, -0.6, 0.32, 1.6);
}
.contact-item:hover .contact-icon img,
.contact-item:hover .contact-icon svg {
transform: scale(1.2);
}
/* SVG Theme Adaptation */
.light-mode .github-path {
fill: url(#githubGradientLight);
}
.dark-mode .github-path {
fill: url(#githubGradientDark);
}
.contact-info h3 {
font-size: 1.125rem;
margin-bottom: 0.25rem;
}
.contact-link {
text-decoration: none;
font-family: 'Consolas', 'Liberation Mono', monospace;
}
.light-mode .contact-link {
color: var(--primary-light);
position: relative;
text-decoration: none;
}
.dark-mode .contact-link {
color: var(--primary-dark);
position: relative;
text-decoration: none;
}
.contact-link::after {
content: '';
position: absolute;
width: 100%;
height: 2px;
bottom: -2px;
left: 0;
background: currentColor;
transform: scaleX(0);
transform-origin: right;
transition: transform 0.3s ease;
}
.contact-link:hover::after {
transform: scaleX(1);
transform-origin: left;
}
/* Projects Section */
.filters-container {
margin-bottom: 2.5rem;
display: flex;
flex-direction: column;
gap: 1.25rem;
animation: fadeIn 0.8s ease both;
}
@keyframes fadeIn {
from {
opacity: 0;
transform: translateY(-10px);
}
to {
opacity: 1;
transform: translateY(0);
}
}
.search-container {
width: 100%;
margin-bottom: 1rem;
position: relative;
}
.search-container::before {
content: "🔍";
position: absolute;
left: 1rem;
top: 50%;
transform: translateY(-50%);
opacity: 0.5;
font-size: 1rem;
z-index: 1;
}
.search-input {
width: 100%;
padding: 0.9rem 1rem 0.9rem 2.75rem;
font-size: 1rem;
border-radius: 0.75rem;
border: 2px solid;
transition: all 0.3s ease;
}
.light-mode .search-input {
border-color: var(--border-light);
background-color: #fff;
color: var(--text-light);
}
.dark-mode .search-input {
border-color: var(--border-dark);
background-color: rgba(45, 55, 72, 0.3);
color: var(--text-dark);
}
.search-input:focus {
outline: none;
transform: translateY(-2px);
}
.light-mode .search-input:focus {
border-color: var(--primary-light);
box-shadow: 0 8px 15px -3px rgba(0, 0, 0, 0.1);
}
.dark-mode .search-input:focus {
border-color: var(--primary-dark);
box-shadow: 0 8px 15px -3px rgba(0, 0, 0, 0.3);
}
.sort-container {
display: flex;
align-items: center;
gap: 1rem;
margin-bottom: 1rem;
background: linear-gradient(to right, transparent, rgba(99, 179, 237, 0.05), transparent);
padding: 0.6rem 1rem;
border-radius: 0.75rem;
border: 1px solid;
}
.light-mode .sort-container {
border-color: rgba(99, 179, 237, 0.2);
}
.dark-mode .sort-container {
border-color: rgba(99, 179, 237, 0.2);
}
.sort-container label {
font-weight: 600;
letter-spacing: 0.02em;
}
/* Custom Select styling */
.custom-select {
position: relative;
flex: 1;
}
.select-selected {
padding: 0.6rem 1rem;
border-radius: 0.5rem;
border: 2px solid;
background-color: transparent;
font-size: 0.95rem;
font-weight: 500;
cursor: pointer;
transition: all 0.3s ease;
position: relative;
display: flex;
align-items: center;
justify-content: space-between;
padding-right: 2.5rem;
}
.select-selected:after {
content: '';
position: absolute;
right: 10px;
top: 50%;
transform: translateY(-50%);
width: 0;
height: 0;
border-left: 6px solid transparent;
border-right: 6px solid transparent;
border-top: 6px solid currentColor;
transition: transform 0.3s ease;
}
.custom-select.select-arrow-active .select-selected:after {
transform: translateY(-50%) rotate(180deg);
}
.select-items {
position: absolute;
top: 100%;
left: 0;
right: 0;
z-index: 99;
margin-top: 5px;
border-radius: 0.5rem;
overflow: hidden;
box-shadow: 0 10px 25px rgba(0, 0, 0, 0.2);
opacity: 0;
transform: translateY(-10px);
transition: opacity 0.3s ease, transform 0.3s ease;
pointer-events: none;
}
.select-arrow-active .select-items {
opacity: 1;
transform: translateY(0);
pointer-events: all;
}
.select-hide {
opacity: 0;
transform: translateY(-10px);
pointer-events: none;
}
.select-option {
padding: 0.7rem 1rem;
cursor: pointer;
font-size: 0.95rem;
transition: all 0.2s ease;
}
.select-selected:hover {
transform: translateY(-2px);
}
.light-mode .select-selected {
border-color: var(--border-light);
color: var(--text-light);
background-color: rgba(255, 255, 255, 0.5);
}
.dark-mode .select-selected {
border-color: var(--border-dark);
color: var(--text-dark);
background-color: rgba(45, 55, 72, 0.3);
}
.light-mode .select-items {
background-color: #ffffff;
border: 1px solid var(--border-light);
}
.dark-mode .select-items {
background-color: var(--card-bg-dark);
border: 1px solid var(--border-dark);
}
.light-mode .select-option:hover:not(.select-active) {
background-color: var(--card-hover-light);
}
.dark-mode .select-option:hover:not(.select-active) {
background-color: var(--card-hover-dark);
}
.light-mode .select-active {
background-color: var(--primary-light);
color: white;
}
.dark-mode .select-active {
background-color: var(--primary-dark);
color: white;
}
.category-filters {
display: flex;
flex-wrap: wrap;
gap: 0.75rem;
margin-bottom: 1rem;
}
.category-filter {
padding: 0.6rem 1.2rem;
border-radius: 9999px;
font-size: 0.95rem;
font-weight: 600;
border: 2px solid;
cursor: pointer;
transition: all 0.3s ease;
position: relative;
overflow: hidden;
display: flex;
align-items: center;
gap: 0.5rem;
}
.category-filter svg,
.category-filter .category-icon {
width: 16px;
height: 16px;
flex-shrink: 0;
transition: transform 0.3s ease;
}
.category-filter:hover svg,
.category-filter:hover .category-icon {
transform: scale(1.2);
}
.category-filter::before {
content: '';
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
background: linear-gradient(to right, transparent, rgba(255, 255, 255, 0.1), transparent);
transform: translateX(-100%);
transition: transform 0.6s ease;
}
.category-filter:hover::before {
transform: translateX(100%);
}
.light-mode .category-filter {
border-color: var(--border-light);
background-color: #f0f5ff;
color: var(--text-muted-light);
box-shadow: 0 1px 3px rgba(0, 0, 0, 0.05);
font-weight: 500;
}
.dark-mode .category-filter {
border-color: var(--border-dark);
background-color: rgba(45, 55, 72, 0.3);
color: var(--text-muted-dark);
}
.light-mode .category-filter.active {
background-color: var(--primary-light);
border-color: var(--primary-light);
color: white;
box-shadow: 0 5px 15px -3px rgba(67, 97, 238, 0.4);
transform: translateY(-2px);
font-weight: 600;
}
.dark-mode .category-filter.active {
background-color: var(--primary-dark);
border-color: var(--primary-dark);
color: white;
box-shadow: 0 5px 15px -3px rgba(99, 179, 237, 0.3);
transform: translateY(-2px);
}
/* Make SVG and icons white when category is active */
.category-filter.active svg {
stroke: white;
}
.category-filter.active img.category-icon {
filter: brightness(0) invert(1);
}
.light-mode .category-filter:hover:not(.active) {
background-color: #e2ecff;
transform: translateY(-2px);
box-shadow: 0 5px 10px -3px rgba(67, 97, 238, 0.15);
border-color: rgba(67, 97, 238, 0.3);
}
.dark-mode .category-filter:hover:not(.active) {
background-color: var(--card-hover-dark);
transform: translateY(-2px);
box-shadow: 0 5px 10px -3px rgba(0, 0, 0, 0.3);
}
.loading-container {
text-align: center;
padding: 3rem 0;
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
height: 300px;
transition: opacity 0.3s ease;
}
.loading-spinner {
display: inline-block;
width: 60px;
height: 60px;
border: 4px solid;
border-radius: 50%;
margin-bottom: 1.5rem;
animation: spin 1.2s cubic-bezier(0.5, 0.1, 0.5, 0.9) infinite;
box-shadow: 0 5px 15px -5px rgba(0, 0, 0, 0.1);
}
.light-mode .loading-spinner {
border-color: rgba(49, 130, 206, 0.15);
border-top-color: var(--primary-light);
background: linear-gradient(to right, rgba(255, 255, 255, 0.5), rgba(240, 249, 255, 0.5));
}
.dark-mode .loading-spinner {
border-color: rgba(99, 179, 237, 0.15);
border-top-color: var(--primary-dark);
background: linear-gradient(to right, rgba(30, 41, 59, 0.5), rgba(15, 23, 42, 0.5));
}
.loading-container p {
font-size: 1.1rem;
font-weight: 500;
opacity: 0.8;
max-width: 80%;
margin: 0 auto;
}
.error-message {
display: flex;
align-items: center;
justify-content: center;
padding: 2rem;
border-radius: 1rem;
width: 100%;
max-width: 600px;
margin: 0 auto;
box-shadow: 0 10px 15px -3px rgba(0, 0, 0, 0.1);
gap: 1.5rem;
text-align: left;
}
.error-message svg {
color: #E53E3E;
flex-shrink: 0;
}
.error-message h3 {
margin-bottom: 0.5rem;
font-size: 1.2rem;
}
.error-message p {
margin-bottom: 1rem;
opacity: 0.8;
}
.retry-button {
display: inline-flex;
align-items: center;
gap: 0.5rem;
padding: 0.5rem 1rem;
border-radius: 0.5rem;
border: none;
background-color: var(--primary-light);
color: white;
font-weight: 600;
cursor: pointer;
transition: all 0.3s ease;
}
.retry-button:hover {
transform: translateY(-2px);
box-shadow: 0 5px 10px rgba(0, 0, 0, 0.1);
}
.dark-mode .retry-button {
background-color: var(--primary-dark);
}
.light-mode .error-message {
background-color: #FFF5F5;
border: 1px solid #FED7D7;
}
.dark-mode .error-message {
background-color: rgba(254, 215, 215, 0.1);
border: 1px solid rgba(254, 215, 215, 0.2);
}
@keyframes spin {
to {
transform: rotate(360deg);
}
}
.projects-grid {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(340px, 1fr));
gap: 2rem;
}
.project-card {
border-radius: 0.75rem;
overflow: hidden;
transition: all 0.4s cubic-bezier(0.175, 0.885, 0.32, 1.275);
cursor: pointer;
transform-origin: center;
position: relative;
opacity: 0;
transform: translateY(30px);
animation: fadeInUp 0.8s cubic-bezier(0.23, 1, 0.32, 1) forwards;
border: 2px solid transparent;
display: flex;
flex-direction: column;
}
.project-card:nth-child(-n+3) {
position: relative;
border-width: 2px;
box-shadow: 0 20px 30px -8px rgba(0, 0, 0, 0.12), 0 10px 20px -5px rgba(0, 0, 0, 0.1);
transform: scale(1.03);
z-index: 1;
transition: all 0.5s cubic-bezier(0.175, 0.885, 0.32, 1.275);
}
.project-card:nth-child(1) {
transform: scale(1.05);
z-index: 3;
}
/* Rank badges for top repositories */
.rank-badge {
position: absolute;
top: 10px;
right: 10px;
width: 26px;
height: 26px;
border-radius: 50%;
display: flex;
align-items: center;
justify-content: center;
font-weight: 700;
font-size: 0.85rem;
line-height: 1;
z-index: 5;
cursor: pointer;
transition: all 0.3s cubic-bezier(0.175, 0.885, 0.32, 1.275);
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.15);
border: 1px solid rgba(255, 255, 255, 0.3);
}
.project-card:hover .rank-badge {
transform: scale(1.15) rotate(0deg);
box-shadow: 0 3px 6px rgba(0, 0, 0, 0.2);
}
/* Gold medal style */
.rank-1 {
background: linear-gradient(135deg, #ffd700, #ffb347);
color: #704900;
box-shadow: 0 2px 6px rgba(255, 215, 0, 0.3);
}
/* Silver medal style */
.rank-2 {
background: linear-gradient(135deg, #e0e0e0, #c0c0c0);
color: #444;
box-shadow: 0 2px 6px rgba(192, 192, 192, 0.3);
}
/* Bronze medal style */
.rank-3 {
background: linear-gradient(135deg, #cd7f32, #b08d57);
color: #fff;
box-shadow: 0 2px 6px rgba(205, 127, 50, 0.3);
}
.project-card:nth-child(1) {
transform: scale(1.05);
z-index: 3;
}
.project-card:nth-child(2) {
transform: scale(1.04);
z-index: 2;
}
.light-mode .project-card:nth-child(-n+3) {
border-color: var(--primary-light);
background-image: radial-gradient(circle at top right, rgba(236, 254, 255, 0.7), transparent 80%);
}
.light-mode .project-card:nth-child(1)::before {
content: '';
position: absolute;
top: -10px;
left: -10px;
right: -10px;
bottom: -10px;
background: linear-gradient(135deg, var(--primary-light), transparent);
border-radius: 1rem;
opacity: 0.1;
z-index: -1;
pointer-events: none;
}
.dark-mode .project-card:nth-child(-n+3) {
border-color: var(--primary-dark);
background-image: radial-gradient(circle at top right, rgba(36, 42, 54, 0.8), transparent 80%);
}
.dark-mode .project-card:nth-child(1)::before {
content: '';
position: absolute;
top: -10px;
left: -10px;
right: -10px;
bottom: -10px;
background: linear-gradient(135deg, var(--primary-dark), transparent);
border-radius: 1rem;
opacity: 0.15;
z-index: -1;
pointer-events: none;
}
@keyframes fadeInUp {
0% {
opacity: 0;
transform: translateY(30px);
}
60% {
opacity: 1;
}
100% {
opacity: 1;
transform: translateY(0);
}
}
.light-mode .project-card {
background-color: #ffffff;
box-shadow: 0 10px 15px -3px rgba(0, 0, 0, 0.08), 0 4px 6px -2px rgba(0, 0, 0, 0.05);
border-color: rgba(226, 232, 240, 0.8);
}
.dark-mode .project-card {
background-color: var(--card-bg-dark);
box-shadow: 0 10px 15px -3px rgba(0, 0, 0, 0.3), 0 4px 6px -2px rgba(0, 0, 0, 0.15);
border-color: rgba(45, 55, 72, 0.8);
}
.project-card:hover {
transform: translateY(-12px) scale(1.03);
}
.project-card:nth-child(1):hover {
transform: translateY(-12px) scale(1.05);
}
.project-card:nth-child(2):hover {
transform: translateY(-12px) scale(1.04);
}
.project-card:nth-child(3):hover {
transform: translateY(-12px) scale(1.03);
}
.light-mode .project-card:hover {
box-shadow: 0 25px 30px -5px rgba(0, 0, 0, 0.1), 0 10px 20px -5px rgba(0, 0, 0, 0.07);
border-color: rgba(99, 179, 237, 0.4);
background-image: radial-gradient(circle at top right, rgba(236, 254, 255, 0.8), transparent 70%);
}
.dark-mode .project-card:hover {
box-shadow: 0 25px 30px -5px rgba(0, 0, 0, 0.4), 0 10px 20px -5px rgba(0, 0, 0, 0.25);
border-color: rgba(66, 153, 225, 0.5);
background-image: radial-gradient(circle at top right, rgba(26, 32, 44, 0.8), transparent 70%);
}
.project-header {
padding: 1.25rem 1.5rem;
border-bottom: 1px solid;
position: relative;
overflow: hidden;
}
.project-header::after {
content: '';
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
background: linear-gradient(to right, transparent, rgba(99, 179, 237, 0.05), transparent);
transform: translateX(-100%);
transition: transform 1s ease;
}
.project-card:hover .project-header::after {
transform: translateX(100%);
}
.light-mode .project-header {
border-bottom-color: var(--border-light);
background-color: rgba(247, 250, 252, 0.5);
}
.dark-mode .project-header {
border-bottom-color: var(--border-dark);
background-color: rgba(45, 55, 72, 0.5);
}
.project-title {
font-size: 1.25rem;
font-weight: 600;
margin-bottom: 0.5rem;
display: flex;
align-items: center;
flex-wrap: wrap;
gap: 0.5rem;
}
.project-title img {
width: 20px;
height: 20px;
filter: drop-shadow(0 1px 2px rgba(0, 0, 0, 0.1));
transition: all 0.3s ease;
}
.project-card:hover .project-title img {
transform: scale(1.15);
filter: drop-shadow(0 2px 4px rgba(0, 0, 0, 0.15));
}
.project-body {
padding: 1.75rem;
position: relative;
z-index: 1;
display: flex;
flex-direction: column;
flex-grow: 1;
}
.project-body::before {
content: '';
position: absolute;
top: 0;
left: 0;
right: 0;
bottom: 0;
background: linear-gradient(135deg, rgba(255, 255, 255, 0.03), transparent);
z-index: -1;
opacity: 0;
transition: opacity 0.4s ease;
}
.project-card:hover .project-body::before {
opacity: 1;
}
.project-description {
line-height: 1.6;
margin-bottom: 1.75rem;
transition: all 0.3s ease;
flex-grow: 1;
}
/* Адаптивный размер шрифта в зависимости от длины описания */
.project-description.short-text {
font-size: 1.125rem; /* Больший шрифт для короткого текста */
}
.project-description.medium-text {
font-size: 1rem; /* Стандартный размер для среднего текста */
}
.project-description.long-text {
font-size: 0.9375rem; /* Меньший размер для длинного текста */
}
.light-mode .project-description {
color: var(--text-muted-light);
}
.dark-mode .project-description {
color: var(--text-muted-dark);
}
.project-card:hover .project-description {
color: var(--text-light);
}
.dark-mode .project-card:hover .project-description {
color: var(--text-dark);
}
.project-stats {
display: flex;
align-items: center;
gap: 2rem;
font-size: 0.95rem;
padding-top: 0.75rem;
border-top: 1px dashed;
transition: all 0.3s ease;
}
.light-mode .project-stats {
border-color: rgba(226, 232, 240, 0.7);
}
.dark-mode .project-stats {
border-color: rgba(74, 85, 104, 0.4);
}
.stat {
display: flex;
align-items: center;
gap: 0.5rem;
font-weight: 600;
transition: transform 0.3s ease;
}
.project-card:hover .stat {
transform: scale(1.08);
}
.stat img {
width: 20px;
height: 20px;
filter: drop-shadow(0 1px 2px rgba(0, 0, 0, 0.1));
transition: transform 0.3s ease;
}
.stat:hover img {
transform: scale(1.15);
}
.error-message {
text-align: center;
padding: 3rem 0;
color: #e53e3e;
}
.no-repos {
text-align: center;
padding: 3rem 0;
}
.light-mode .no-repos {
color: var(--text-muted-light);
}
.dark-mode .no-repos {
color: var(--text-muted-dark);
}
/* Terminal Section */
.terminal-section {
padding: 4rem 0;
background-color: #121212;
}
.light-mode .terminal-section {
background-color: #f0f0f0;
}
.dark-mode .terminal-section {
background-color: #1a1a1a;
}
.light-mode .section-title {
color: #2d3748;
}
.dark-mode .section-title {
color: #e2e8f0;
}
.terminal-container {
max-width: 900px;
margin: 0 auto;
border-radius: 8px;
overflow: hidden;
box-shadow: 0 15px 25px rgba(0, 0, 0, 0.4);
backdrop-filter: blur(5px);
transform: translateY(0);
transition: all 0.3s ease;
position: relative;
}
.terminal-container:hover {
transform: translateY(-5px);
box-shadow: 0 20px 30px rgba(0, 0, 0, 0.5);
}
.terminal-container.minimized {
box-shadow: 0 5px 15px rgba(0, 0, 0, 0.3);
}
.terminal-container.minimized:hover {
transform: translateY(-3px);
}
.terminal-container.maximized {
max-width: 100%;
width: 100%;
height: auto;
border-radius: 0;
transform: none !important;
}
.terminal-header {
background: linear-gradient(to right, #323232, #222222);
padding: 10px 15px;
display: flex;
justify-content: space-between;
align-items: center;
border-bottom: 1px solid #444;
}
.terminal-title {
color: #ddd;
font-size: 0.9rem;
font-weight: 500;
font-family: 'Consolas', 'Liberation Mono', monospace;
user-select: none;
}
.terminal-controls {
display: flex;
gap: 8px;
}
.terminal-control {
width: 12px;
height: 12px;
border-radius: 50%;
cursor: pointer;
position: relative;
}
.terminal-control.close {
background-color: #ff5f56;
}
.terminal-control.minimize {
background-color: #ffbd2e;
}
.terminal-control.maximize {
background-color: #27c93f;
}
.terminal-window {
background-color: #1e1e1e;
color: #f0f0f0;
padding: 15px;
height: 350px;
overflow-y: auto;
font-family: 'Consolas', 'Liberation Mono', monospace;
font-size: 0.95rem;
line-height: 1.5;
position: relative;
scrollbar-width: thin;
scrollbar-color: #666 #1e1e1e;
cursor: default;
user-select: text;
}
.terminal-window::-webkit-scrollbar {
width: 8px;
}
.terminal-window::-webkit-scrollbar-track {
background: #1e1e1e;
}
.terminal-window::-webkit-scrollbar-thumb {
background-color: #666;
border-radius: 20px;
border: 2px solid #1e1e1e;
}
.terminal-output {
margin-bottom: 15px;
}
.terminal-input-line {
display: flex;
align-items: center;
margin-top: 10px;
}
.terminal-prompt {
color: #4CAF50;
margin-right: 8px;
user-select: none;
}
/* Стиль выделения текста в терминале */
.terminal-window::selection,
.terminal-window *::selection {
background-color: rgba(79, 134, 198, 0.6);
color: #ffffff;
}
.terminal-window::-moz-selection,
.terminal-window *::-moz-selection {
background-color: rgba(79, 134, 198, 0.6);
color: #ffffff;
}
#terminal-input {
background: transparent;
border: none;
color: #fff;
flex: 1;
font-family: inherit;
font-size: inherit;
outline: none;
caret-color: #fff;
padding: 0;
margin: 0;
position: relative;
box-sizing: border-box;
}
.terminal-output-line {
margin-bottom: 8px;
word-wrap: break-word;
animation: fadeIn 0.1s;
}
.terminal-command {
color: #4CAF50;
}
.terminal-response {
color: #E0E0E0;
}
.terminal-error {
color: #ff5f56;
}
.terminal-success {
color: #2ecc71;
}
.terminal-warning {
color: #f39c12;
}
.terminal-help {
color: #3498db;
}
.terminal-highlight {
color: #9b59b6;
}
.terminal-link {
color: #3498db;
text-decoration: underline;
cursor: pointer;
transition: color 0.2s ease;
}
.terminal-link:hover {
color: #2980b9;
text-decoration: underline;
}
.terminal-ascii-art {
color: #e74c3c;
white-space: pre;
font-family: monospace;
line-height: 1.2;
}
.terminal-blink {
animation: blink 1s step-end infinite;
}
@keyframes blink {
0%, 100% {
opacity: 1;
}
50% {
opacity: 0;
}
}
@keyframes glitch {
0% {
transform: translate(0);
}
20% {
transform: translate(-2px, 2px);
}
40% {
transform: translate(-2px, -2px);
}
60% {
transform: translate(2px, 2px);
}
80% {
transform: translate(2px, -2px);
}
100% {
transform: translate(0);
}
}
.terminal-glitch {
position: relative;
animation: glitch 0.3s infinite;
display: inline-block;
}
/* Footer */
footer {
background-color: #1a202c;
color: #a0aec0;
padding: 1.5rem 0;
text-align: center;
font-size: 0.875rem;
}
.light-mode footer {
background-color: #f7fafc;
color: #4a5568;
border-top: 1px solid var(--border-light);
}
.dark-mode footer {
background-color: #171923;
color: #a0aec0;
border-top: 1px solid var(--border-dark);
}
/* Media Queries */
@media (max-width: 768px) {
html {
font-size: 14px;
}
.hero {
padding: 2rem 0 3rem;
}
.hero-content {
flex-direction: column;
gap: 1.5rem;
align-items: center;
}
.profile-container {
margin-bottom: 0;
}
.profile-info {
text-align: center;
}
.avatar {
width: 150px;
height: 150px;
}
.name {
font-size: 2rem;
justify-content: center;
}
.section-title {
font-size: 1.75rem;
}
.projects-grid {
grid-template-columns: 1fr;
}
}
@media (max-width: 480px) {
.hero {
padding: 1.5rem 0 2.5rem;
}
.avatar {
width: 120px;
height: 120px;
}
.name {
font-size: 1.75rem;
}
.about-bio {
font-size: 1rem;
}
.contact-grid {
grid-template-columns: 1fr;
}
.contact-item {
padding: 1rem;
}
.terminal-window {
height: 200px;
padding: 10px;
}
.terminal-title {
font-size: 0.8rem;
}
.terminal-control {
width: 10px;
height: 10px;
}
}
================================================
FILE: app.modern.fingerprint.css
================================================
/* Fingerprint Window Styles */
.fingerprint-section {
padding: 4rem 0;
}
.fingerprint-container {
width: 100%;
max-width: 1000px;
margin: 0 auto;
border-radius: 0.5rem;
overflow: hidden;
box-shadow: 0 10px 25px -5px rgba(0, 0, 0, 0.2), 0 5px 10px -5px rgba(0, 0, 0, 0.1);
display: flex;
flex-direction: column;
transition: all 0.3s cubic-bezier(0.17, 0.67, 0.83, 0.67);
}
.light-mode .fingerprint-container {
background-color: #f8fafc;
border: 1px solid #e2e8f0;
}
.dark-mode .fingerprint-container {
background-color: #1e293b;
border: 1px solid #334155;
}
.fingerprint-container.maximized {
position: fixed;
top: 10%;
left: 5%;
width: 90%;
height: 80%;
z-index: 100;
max-width: none;
}
.fingerprint-header {
display: flex;
justify-content: space-between;
align-items: center;
padding: 0.75rem 1rem;
border-bottom: 1px solid;
}
.light-mode .fingerprint-header {
background: linear-gradient(to bottom, #f0f9ff, #e6f7ff);
border-bottom-color: #e2e8f0;
}
.dark-mode .fingerprint-header {
background: linear-gradient(to bottom, #1e293b, #0f172a);
border-bottom-color: #334155;
}
.fingerprint-title {
font-family: 'Consolas', 'Liberation Mono', monospace;
font-size: 0.9rem;
font-weight: 500;
display: flex;
align-items: center;
gap: 0.5rem;
}
.fingerprint-title .windows-icon {
width: 16px;
height: 16px;
}
.window-controls {
display: flex;
gap: 0.5rem;
}
.window-control {
width: 12px;
height: 12px;
border-radius: 50%;
cursor: pointer;
transition: all 0.2s ease;
}
.window-control.minimize {
background-color: #ffbd2e;
}
.window-control.maximize {
background-color: #28c940;
}
.window-control.close {
background-color: #ff5f56;
}
.window-control:hover {
filter: brightness(1.1);
}
.fingerprint-window {
flex: 1;
overflow: hidden;
transition: all 0.3s ease;
}
.fingerprint-window.minimized {
height: 0;
}
.fingerprint-toolbar {
display: flex;
padding: 0.5rem;
gap: 0.25rem;
border-bottom: 1px solid;
}
.light-mode .fingerprint-toolbar {
background-color: #edf2f7;
border-bottom-color: #e2e8f0;
}
.dark-mode .fingerprint-toolbar {
background-color: #1a202c;
border-bottom-color: #2d3748;
}
.toolbar-button {
padding: 0.5rem 1rem;
font-size: 0.9rem;
border-radius: 0.25rem;
cursor: pointer;
transition: all 0.2s ease;
}
.light-mode .toolbar-button {
color: #1a202c;
}
.dark-mode .toolbar-button {
color: #e2e8f0;
}
.light-mode .toolbar-button:hover:not(.active) {
background-color: #e2e8f0;
}
.dark-mode .toolbar-button:hover:not(.active) {
background-color: #2d3748;
}
.light-mode .toolbar-button.active {
background-color: #4299e1;
color: white;
font-weight: 500;
}
.dark-mode .toolbar-button.active {
background-color: #4299e1;
color: white;
font-weight: 500;
}
.fingerprint-content {
padding: 1.5rem;
height: 600px; /* Фиксированная высота для стабильности */
overflow-y: auto;
}
/* Loading scanner animation */
.loading-scanner {
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
padding: 3rem 0;
}
.scanner-animation {
width: 100px;
height: 100px;
margin-bottom: 1.5rem;
background-image: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" width="100" height="100" viewBox="0 0 24 24" fill="none" stroke="%234299e1" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><rect x="3" y="3" width="18" height="18" rx="2"/><path d="M8 10V8h2"/><path d="M8 14v2h2"/><path d="M16 10V8h-2"/><path d="M16 14v2h-2"/><line x1="3" y1="12" x2="21" y2="12"/><line x1="12" y1="3" x2="12" y2="21"/></svg>');
background-size: contain;
background-repeat: no-repeat;
background-position: center;
animation: scan 2s infinite ease-in-out;
}
@keyframes scan {
0% {
transform: scale(1);
opacity: 0.5;
}
50% {
transform: scale(1.1);
opacity: 1;
}
100% {
transform: scale(1);
opacity: 0.5;
}
}
.scanner-text {
font-size: 1.1rem;
font-weight: 500;
margin-top: 1rem;
}
/* Fingerprint Data Display */
.fingerprint-section-title {
font-size: 1.5rem;
font-weight: 600;
margin-bottom: 1.5rem;
text-align: center;
}
.fingerprint-card {
background-color: rgba(255, 255, 255, 0.05);
border-radius: 0.5rem;
padding: 1.25rem;
margin-bottom: 1.5rem;
border: 1px solid;
}
.light-mode .fingerprint-card {
background-color: white;
border-color: #e2e8f0;
box-shadow: 0 2px 10px rgba(0, 0, 0, 0.05);
}
.dark-mode .fingerprint-card {
background-color: #1a202c;
border-color: #2d3748;
box-shadow: 0 2px 10px rgba(0, 0, 0, 0.2);
}
.fingerprint-card.main-fp {
display: flex;
align-items: center;
justify-content: space-between;
padding: 1.5rem;
}
.fingerprint-hash {
font-family: 'Consolas', 'Liberation Mono', monospace;
font-size: 1.2rem;
letter-spacing: 0.05rem;
padding: 0.75rem 1rem;
background-color: rgba(0, 0, 0, 0.05);
border-radius: 0.5rem;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
max-width: 80%;
}
.light-mode .fingerprint-hash {
background-color: #edf2f7;
color: #2d3748;
}
.dark-mode .fingerprint-hash {
background-color: #2d3748;
color: #e2e8f0;
}
.device-type-icon {
width: 48px;
height: 48px;
background-size: contain;
background-repeat: no-repeat;
background-position: center;
}
.device-type-icon.desktop {
background-image: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="%234299e1" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><rect x="2" y="3" width="20" height="14" rx="2"/><line x1="8" y1="21" x2="16" y2="21"/><line x1="12" y1="17" x2="12" y2="21"/></svg>');
}
.device-type-icon.mobile {
background-image: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="%234299e1" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><rect x="7" y="4" width="10" height="16" rx="2" ry="2"/><path d="M12 18h.01"/></svg>');
}
.device-type-icon.tablet {
background-image: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="%234299e1" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><rect x="4" y="2" width="16" height="20" rx="2" ry="2"/><line x1="12" y1="18" x2="12" y2="18.01"/></svg>');
}
.fingerprint-grid {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));
gap: 1.5rem;
margin-bottom: 1.5rem;
}
.card-title {
font-size: 1.1rem;
font-weight: 600;
margin-bottom: 1rem;
padding-bottom: 0.5rem;
border-bottom: 1px solid;
display: flex;
align-items: center;
gap: 0.5rem;
}
.light-mode .card-title {
border-bottom-color: #edf2f7;
}
.dark-mode .card-title {
border-bottom-color: #2d3748;
}
.card-icon {
width: 20px;
height: 20px;
background-size: contain;
background-repeat: no-repeat;
background-position: center;
}
.card-icon.browser {
background-image: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="%234299e1" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="12" r="10"/><line x1="2" y1="12" x2="22" y2="12"/><path d="M12 2a15.3 15.3 0 0 1 4 10 15.3 15.3 0 0 1-4 10 15.3 15.3 0 0 1-4-10 15.3 15.3 0 0 1 4-10z"/></svg>');
}
.card-icon.os {
background-image: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="%234299e1" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><rect x="4" y="4" width="16" height="16" rx="2" ry="2"/><rect x="9" y="9" width="6" height="6"/><line x1="9" y1="2" x2="9" y2="4"/><line x1="15" y1="2" x2="15" y2="4"/><line x1="9" y1="20" x2="9" y2="22"/><line x1="15" y1="20" x2="15" y2="22"/><line x1="20" y1="9" x2="22" y2="9"/><line x1="20" y1="14" x2="22" y2="14"/><line x1="2" y1="9" x2="4" y2="9"/><line x1="2" y1="14" x2="4" y2="14"/></svg>');
}
.card-icon.display {
background-image: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="%234299e1" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><rect x="2" y="3" width="20" height="14" rx="2" ry="2"/><line x1="8" y1="21" x2="16" y2="21"/><line x1="12" y1="17" x2="12" y2="21"/></svg>');
}
.card-icon.privacy {
background-image: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="%234299e1" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M12 22s8-4 8-10V5l-8-3-8 3v7c0 6 8 10 8 10z"/></svg>');
}
.info-row {
display: flex;
justify-content: space-between;
padding: 0.5rem 0;
font-size: 0.95rem;
}
.info-row:not(:last-child) {
border-bottom: 1px solid;
}
.light-mode .info-row:not(:last-child) {
border-bottom-color: #f7fafc;
}
.dark-mode .info-row:not(:last-child) {
border-bottom-color: #2c3950;
}
.info-label {
font-weight: 500;
opacity: 0.8;
}
.info-value {
font-family: 'Consolas', 'Liberation Mono', monospace;
}
.fingerprint-footer {
margin-top: 2rem;
text-align: center;
}
.uniqueness-meter {
margin-bottom: 1rem;
}
.meter-label {
font-size: 1rem;
font-weight: 500;
margin-bottom: 0.5rem;
}
.meter-bar {
height: 8px;
background-color: rgba(0, 0, 0, 0.1);
border-radius: 4px;
overflow: hidden;
width: 100%;
max-width: 400px;
margin: 0 auto 0.5rem;
}
.meter-fill {
height: 100%;
background: linear-gradient(to right, #38b2ac, #4299e1);
border-radius: 4px;
}
.meter-value {
font-size: 0.9rem;
font-weight: 600;
color: #4299e1;
}
.fingerprint-note {
font-size: 0.9rem;
opacity: 0.8;
max-width: 600px;
margin: 0 auto;
}
/* Browser Information Tab */
.browser-header,
.system-header,
.network-header {
display: flex;
align-items: center;
gap: 1.5rem;
margin-bottom: 2rem;
padding: 1.5rem;
border-radius: 0.5rem;
}
.light-mode .browser-header,
.light-mode .system-header,
.light-mode .network-header {
background-color: white;
border: 1px solid #e2e8f0;
box-shadow: 0 2px 10px rgba(0, 0, 0, 0.05);
}
.dark-mode .browser-header,
.dark-mode .system-header,
.dark-mode .network-header {
background-color: #1a202c;
border: 1px solid #2d3748;
box-shadow: 0 2px 10px rgba(0, 0, 0, 0.2);
}
.browser-icon,
.system-icon,
.network-icon {
width: 48px;
height: 48px;
background-size: contain;
background-repeat: no-repeat;
background-position: center;
}
/* Default browser icon */
.browser-icon {
background-image: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="%234299e1" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="12" r="10"/><line x1="2" y1="12" x2="22" y2="12"/><path d="M12 2a15.3 15.3 0 0 1 4 10 15.3 15.3 0 0 1-4 10 15.3 15.3 0 0 1-4-10 15.3 15.3 0 0 1 4-10z"/></svg>');
}
.browser-icon.chrome {
background-image: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><path fill="%234299e1" d="M12 20.1c-4.47 0-8.1-3.63-8.1-8.1S7.53 3.9 12 3.9s8.1 3.63 8.1 8.1-3.63 8.1-8.1 8.1zm0-18C6.48 2.1 2.1 6.48 2.1 12c0 5.52 4.38 9.9 9.9 9.9 5.52 0 9.9-4.38 9.9-9.9 0-5.52-4.38-9.9-9.9-9.9zm0 16.2c-3.42 0-6.2-2.78-6.2-6.2s2.78-6.2 6.2-6.2 6.2 2.78 6.2 6.2-2.78 6.2-6.2 6.2zm0-10.7c-2.48 0-4.5 2.02-4.5 4.5s2.02 4.5 4.5 4.5 4.5-2.02 4.5-4.5-2.02-4.5-4.5-4.5z"/></svg>');
}
.browser-icon.firefox {
background-image: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><path fill="%234299e1" d="M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm0 18c-4.41 0-8-3.59-8-8s3.59-8 8-8 8 3.59 8 8-3.59 8-8 8zm-5.5-2.5l7.51-3.49L17.5 6.5 9.99 9.99 6.5 17.5zm5.5-6.6a1.1 1.1 0 1 0 0-2.2 1.1 1.1 0 0 0 0 2.2z"/></svg>');
}
.system-icon {
background-image: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="%234299e1" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><rect x="4" y="4" width="16" height="16" rx="2" ry="2"/><rect x="9" y="9" width="6" height="6"/><line x1="9" y1="2" x2="9" y2="4"/><line x1="15" y1="2" x2="15" y2="4"/><line x1="9" y1="20" x2="9" y2="22"/><line x1="15" y1="20" x2="15" y2="22"/><line x1="20" y1="9" x2="22" y2="9"/><line x1="20" y1="14" x2="22" y2="14"/><line x1="2" y1="9" x2="4" y2="9"/><line x1="2" y1="14" x2="4" y2="14"/></svg>');
}
.fingerprint-details-section {
margin-bottom: 2rem;
padding: 1.5rem;
border-radius: 0.5rem;
}
.light-mode .fingerprint-details-section {
background-color: white;
border: 1px solid #e2e8f0;
box-shadow: 0 2px 10px rgba(0, 0, 0, 0.05);
}
.dark-mode .fingerprint-details-section {
background-color: #1a202c;
border: 1px solid #2d3748;
box-shadow: 0 2px 10px rgba(0, 0, 0, 0.2);
}
.details-title {
font-size: 1.2rem;
font-weight: 600;
margin-bottom: 1rem;
padding-bottom: 0.5rem;
border-bottom: 1px solid;
}
.light-mode .details-title {
border-bottom-color: #edf2f7;
}
.dark-mode .details-title {
border-bottom-color: #2d3748;
}
.details-grid {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
gap: 1rem;
}
.details-grid .full-width {
grid-column: 1 / -1;
}
/* Feature Support Styles */
.support-meter {
height: 12px;
background-color: rgba(0, 0, 0, 0.1);
border-radius: 6px;
margin: 1rem 0;
position: relative;
overflow: hidden;
}
.dark-mode .support-meter {
background-color: rgba(255, 255, 255, 0.1);
}
.support-meter-fill {
height: 100%;
border-radius: 6px;
transition: width 1s cubic-bezier(0.22, 1, 0.36, 1);
background-color: #10b981; /* Green */
}
.support-meter-text {
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
font-weight: bold;
font-size: 0.8rem;
color: rgba(0, 0, 0, 0.7);
text-shadow: 0 0 2px rgba(255, 255, 255, 0.5);
}
.dark-mode .support-meter-text {
color: rgba(255, 255, 255, 0.9);
text-shadow: 0 0 2px rgba(0, 0, 0, 0.5);
}
/* === Feature Category Styling === */
.feature-category {
margin-bottom: 2.5rem;
}
.category-title {
font-weight: 600;
font-size: 1.15rem;
margin-bottom: 1.25rem;
padding-bottom: 0.5rem;
border-bottom: 1px solid;
position: relative;
}
.light-mode .category-title {
border-color: rgba(0, 0, 0, 0.08);
color: #1e293b;
}
.dark-mode .category-title {
border-color: rgba(255, 255, 255, 0.08);
color: #f1f5f9;
}
.category-features {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(220px, 1fr));
gap: 1rem;
}
/* === Feature Item Cards === */
.feature-item {
position: relative;
display: flex;
flex-direction: column;
align-items: center;
text-align: center;
padding: 1.75rem 1rem;
border-radius: 0.75rem;
transition: all 0.3s ease;
border: 1px solid transparent;
height: 100%;
}
.light-mode .feature-item {
background-color: rgba(249, 250, 251, 0.8);
box-shadow: 0 1px 3px rgba(0, 0, 0, 0.05);
}
.dark-mode .feature-item {
background-color: rgba(17, 24, 39, 0.6);
box-shadow: 0 1px 3px rgba(0, 0, 0, 0.2);
}
.light-mode .feature-item:hover {
background-color: rgba(255, 255, 255, 1);
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.08);
transform: translateY(-3px);
}
.dark-mode .feature-item:hover {
background-color: rgba(17, 24, 39, 0.8);
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.25);
transform: translateY(-3px);
}
.light-mode .feature-item.supported {
border-color: rgba(16, 185, 129, 0.15);
}
.light-mode .feature-item.not-supported {
border-color: rgba(239, 68, 68, 0.15);
}
.dark-mode .feature-item.supported {
border-color: rgba(16, 185, 129, 0.2);
}
.dark-mode .feature-item.not-supported {
border-color: rgba(239, 68, 68, 0.2);
}
/* === Feature Status Indicator === */
.feature-status-icon {
width: 40px;
height: 40px;
border-radius: 50%;
margin-bottom: 1.25rem;
display: flex;
align-items: center;
justify-content: center;
position: relative;
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.15);
transition: all 0.3s ease;
}
.feature-item.supported .feature-status-icon {
background-color: #10b981;
border: 1px solid rgba(16, 185, 129, 0.6);
}
.feature-item.not-supported .feature-status-icon {
background-color: #ef4444;
border: 1px solid rgba(239, 68, 68, 0.6);
}
.feature-item.supported .feature-status-icon::before {
content: '✓';
color: white;
font-size: 1.25rem;
font-weight: bold;
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
text-shadow: 0 1px 2px rgba(0, 0, 0, 0.2);
}
.feature-item.not-supported .feature-status-icon::before {
content: '×';
color: white;
font-size: 1.75rem;
font-weight: bold;
position: absolute;
top: 47%;
left: 50%;
transform: translate(-50%, -50%);
text-shadow: 0 1px 2px rgba(0, 0, 0, 0.2);
}
.feature-name {
font-size: 1rem;
font-weight: 500;
margin-bottom: 0.75rem;
line-height: 1.4;
}
.feature-status {
font-size: 0.875rem;
padding: 0.35rem 0.75rem;
border-radius: 20px;
font-weight: 500;
margin-top: auto;
}
.feature-item.supported .feature-status {
background-color: rgba(16, 185, 129, 0.1);
color: #10b981;
border: 1px solid rgba(16, 185, 129, 0.3);
}
.feature-item.not-supported .feature-status {
background-color: rgba(239, 68, 68, 0.1);
color: #ef4444;
border: 1px solid rgba(239, 68, 68, 0.3);
}
.dark-mode .feature-item.supported .feature-status {
background-color: rgba(16, 185, 129, 0.2);
color: #34d399;
border-color: rgba(16, 185, 129, 0.4);
}
.dark-mode .feature-item.not-supported .feature-status {
background-color: rgba(239, 68, 68, 0.2);
color: #f87171;
border-color: rgba(239, 68, 68, 0.4);
}
/* === Suspicion Level Card === */
.suspicion-card {
background-color: rgba(17, 24, 39, 0.5);
border-radius: 12px;
padding: 20px;
margin-bottom: 2rem;
border-left: 4px solid;
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);
}
.light-mode .suspicion-card {
background-color: rgba(249, 250, 251, 0.8);
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.06);
}
.suspicion-none {
border-color: #10b981;
}
.suspicion-low {
border-color: #60a5fa;
}
.suspicion-medium {
border-color: #f59e0b;
}
.suspicion-high {
border-color: #ef4444;
}
.suspicion-header {
display: flex;
align-items: center;
justify-content: space-between;
margin-bottom: 15px;
}
.suspicion-title {
font-size: 1.1rem;
font-weight: 600;
}
.suspicion-badge {
display: inline-block;
padding: 5px 12px;
border-radius: 20px;
font-size: 0.875rem;
font-weight: 500;
}
.suspicion-none .suspicion-badge {
background-color: rgba(16, 185, 129, 0.15);
color: #10b981;
border: 1px solid rgba(16, 185, 129, 0.3);
}
.suspicion-low .suspicion-badge {
background-color: rgba(96, 165, 250, 0.15);
color: #3b82f6;
border: 1px solid rgba(96, 165, 250, 0.3);
}
.suspicion-medium .suspicion-badge {
background-color: rgba(245, 158, 11, 0.15);
color: #f59e0b;
border: 1px solid rgba(245, 158, 11, 0.3);
}
.suspicion-high .suspicion-badge {
background-color: rgba(239, 68, 68, 0.15);
color: #ef4444;
border: 1px solid rgba(239, 68, 68, 0.3);
}
.dark-mode .suspicion-none .suspicion-badge {
background-color: rgba(16, 185, 129, 0.2);
color: #34d399;
border-color: rgba(16, 185, 129, 0.4);
}
.dark-mode .suspicion-low .suspicion-badge {
background-color: rgba(96, 165, 250, 0.2);
color: #60a5fa;
border-color: rgba(96, 165, 250, 0.4);
}
.dark-mode .suspicion-medium .suspicion-badge {
background-color: rgba(245, 158, 11, 0.2);
color: #fbbf24;
border-color: rgba(245, 158, 11, 0.4);
}
.dark-mode .suspicion-high .suspicion-badge {
background-color: rgba(239, 68, 68, 0.2);
color: #f87171;
border-color: rgba(239, 68, 68, 0.4);
}
.suspicion-content ul {
list-style-type: none;
padding-left: 0;
margin: 0;
}
.suspicion-content li {
position: relative;
padding: 8px 0 8px 22px;
font-size: 0.95rem;
}
.suspicion-content li:before {
content: "•";
position: absolute;
left: 8px;
color: #60a5fa;
font-weight: bold;
}
.light-mode .suspicion-content li:before {
color: #3b82f6;
}
.dark-mode .suspicion-content li:before {
color: #60a5fa;
}
/* === Responsive Styles === */
@media (max-width: 768px) {
.fingerprint-card.main-fp {
flex-direction: column;
gap: 1rem;
text-align: center;
}
.fingerprint-hash {
max-width: 100%;
}
.fingerprint-grid {
grid-template-columns: 1fr;
}
.browser-header,
.system-header,
.network-header {
flex-direction: column;
text-align: center;
gap: 1rem;
}
.browser-title,
.system-title,
.network-title {
width: 100%;
}
.details-grid {
grid-template-columns: 1fr;
}
.category-features {
grid-template-columns: 1fr;
}
.suspicion-header {
flex-direction: column;
align-items: flex-start;
gap: 10px;
}
.suspicion-badge {
margin-top: 5px;
}
}
/* === API Support Grid === */
.api-capabilities-grid {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(140px, 1fr));
gap: 1.25rem;
margin-top: 1.5rem;
}
.api-item {
position: relative;
padding: 1.5rem 1rem;
border-radius: 12px;
display: flex;
flex-direction: column;
align-items: center;
text-align: center;
transition: transform 0.2s ease, box-shadow 0.2s ease;
overflow: hidden;
transform-origin: center;
will-change: transform, box-shadow;
}
.api-item::before {
content: '';
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
z-index: -1;
opacity: 0.1;
transition: opacity 0.2s ease;
will-change: opacity;
}
.api-item.supported::before {
background: linear-gradient(135deg, #34d399 0%, #10b981 100%);
}
.api-item.unsupported::before {
background: linear-gradient(135deg, #f87171 0%, #ef4444 100%);
opacity: 0.05;
}
.light-mode .api-item {
background: #ffffff;
box-shadow: 0 2px 10px rgba(0, 0, 0, 0.05);
border: 1px solid rgba(0, 0, 0, 0.06);
}
.dark-mode .api-item {
background: rgba(30, 41, 59, 0.5);
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.2);
border: 1px solid rgba(255, 255, 255, 0.05);
}
.api-item:hover {
transform: translateY(-3px);
box-shadow: 0 5px 15px rgba(0, 0, 0, 0.1);
z-index: 1;
}
.api-item.supported:hover::before {
opacity: 0.15;
}
.api-item.unsupported:hover::before {
opacity: 0.08;
}
.dark-mode .api-item:hover {
box-shadow: 0 5px 15px rgba(0, 0, 0, 0.25);
}
.api-item:hover .api-icon {
transform: scale(1.1);
}
.api-item.supported {
border-top: 3px solid #10b981;
}
.api-item.unsupported {
border-top: 3px solid #ef4444;
}
.api-icon {
width: 32px;
height: 32px;
margin-bottom: 0.75rem;
position: relative;
display: flex;
align-items: center;
justify-content: center;
transition: transform 0.2s ease;
will-change: transform;
}
.api-icon::before {
content: '';
position: absolute;
width: 100%;
height: 100%;
background-position: center;
background-repeat: no-repeat;
background-size: contain;
opacity: 0.85;
}
.api-item.supported .api-icon::before {
filter: grayscale(0%);
}
.api-item.unsupported .api-icon::before {
filter: grayscale(100%);
opacity: 0.5;
}
.api-name {
font-size: 0.875rem;
font-weight: 600;
color: inherit;
}
.api-item.supported .api-name {
color: #10b981;
}
.api-item.unsupported .api-name {
color: #9ca3af;
}
.dark-mode .api-item.supported .api-name {
color: #34d399;
}
.dark-mode .api-item.unsupported .api-name {
color: #6b7280;
}
/* API Icons */
.bluetooth-icon::before { content: "🔵"; }
.geo-icon::before { content: "📍"; }
.rtc-icon::before { content: "📱"; }
.credential-icon::before { content: "🔑"; }
.usb-icon::before { content: "🔌"; }
.serial-icon::before { content: "🔄"; }
.gamepad-icon::before { content: "🎮"; }
.vibration-icon::before { content: "📳"; }
.payment-icon::before { content: "💳"; }
.share-icon::before { content: "📤"; }
.push-icon::before { content: "🔔"; }
.notifications-icon::before { content: "📢"; }
.media-icon::before { content: "📷"; }
.speech-icon::before { content: "🎤"; }
.worker-icon::before { content: "⚙️"; }
.service-icon::before { content: "🔨"; }
.webgl-icon::before { content: "🎨"; }
.webgl2-icon::before { content: "🖼️"; }
.webvr-icon::before { content: "👓"; }
.webxr-icon::before { content: "🥽"; }
.audio-icon::before { content: "🔊"; }
/* Supporting styles */
.api-support-card {
overflow: visible;
}
@media (max-width: 768px) {
.api-capabilities-grid {
grid-template-columns: repeat(auto-fill, minmax(120px, 1fr));
gap: 1rem;
}
.api-item {
padding: 1.25rem 0.75rem;
}
}
================================================
FILE: axiom/application_data/system/kernel/core/bootmgr.js
================================================
/**
* Axiom Boot Manager
* Handles system initialization and boot sequence
*/
class BootManager {
constructor() {
this.bootStage = 0;
this.bootMessages = [];
this.startTime = performance.now();
this.colors = {
ok: 'output-success',
info: 'output-info',
warn: 'output-warning',
error: 'output-error'
};
// Real system parameters (emulated, not simulated!)
this.realMemorySize = this.detectRealMemory();
this.realCores = navigator.hardwareConcurrency || 2;
this.realPlatform = this.detectPlatform();
}
detectRealMemory() {
// Try to get real device memory
if (navigator.deviceMemory) {
return navigator.deviceMemory * 1024; // GB to MB
}
// Fallback: estimate from performance.memory API
if (performance.memory) {
const jsHeapLimit = performance.memory.jsHeapSizeLimit;
const jsHeapUsed = performance.memory.usedJSHeapSize;
// Estimate: JS heap is typically 25-30% of total RAM
const estimatedRAM = Math.floor(jsHeapLimit / 1024 / 1024 * 3.5);
return Math.min(estimatedRAM, 128); // Cap at 128MB for VM
}
// Check if running in ServiceWorker/limited context
if (typeof WorkerGlobalScope !== 'undefined' && self instanceof WorkerGlobalScope) {
return 64; // Conservative for workers
}
return 128; // Default fallback
}
detectPlatform() {
const ua = navigator.userAgent;
const platform = navigator.platform;
// Detect OS
let os = 'Unknown Host';
let arch = 'x86_64';
if (ua.includes('Win')) {
os = 'Windows Host';
if (ua.includes('Win64') || ua.includes('x64')) arch = 'x86_64';
else if (ua.includes('ARM')) arch = 'arm64';
} else if (ua.includes('Mac')) {
os = 'macOS Host';
if (ua.includes('Intel')) arch = 'x86_64';
else if (ua.includes('ARM') || platform.includes('arm')) arch = 'arm64';
} else if (ua.includes('Linux')) {
os = 'Unix Host';
arch = platform.includes('arm') ? 'arm64' : 'x86_64';
} else if (ua.includes('Android')) {
os = 'Android Host';
arch = ua.includes('arm64') ? 'arm64' : 'arm';
} else if (ua.includes('iPhone') || ua.includes('iPad')) {
os = 'iOS Host';
arch = 'arm64';
}
// Detect screen info for more context
const screenInfo = {
width: screen.width,
height: screen.height,
colorDepth: screen.colorDepth,
pixelRatio: window.devicePixelRatio || 1
};
return { os, arch, screen: screenInfo };
}
detectGPU() {
try {
const canvas = document.createElement('canvas');
const gl = canvas.getContext('webgl') || canvas.getContext('experimental-webgl');
if (!gl) return { vendor: 'Unknown', renderer: 'Software Rendering' };
const debugInfo = gl.getExtension('WEBGL_debug_renderer_info');
if (debugInfo) {
return {
vendor: gl.getParameter(debugInfo.UNMASKED_VENDOR_WEBGL) || 'Unknown',
renderer: gl.getParameter(debugInfo.UNMASKED_RENDERER_WEBGL) || 'Unknown'
};
}
return {
vendor: gl.getParameter(gl.VENDOR) || 'Unknown',
renderer: gl.getParameter(gl.RENDERER) || 'Unknown'
};
} catch (e) {
return { vendor: 'Unknown', renderer: 'Software Rendering' };
}
}
async detectBattery() {
try {
if ('getBattery' in navigator) {
const battery = await navigator.getBattery();
return {
charging: battery.charging,
level: Math.round(battery.level * 100),
chargingTime: battery.chargingTime,
dischargingTime: battery.dischargingTime
};
}
} catch (e) {
// Battery API not available
}
return null;
}
toHex(num, padding = 16) {
return '0x' + num.toString(16).padStart(padding, '0');
}
formatMemRange(start, end) {
return `[mem ${this.toHex(start)}-${this.toHex(end)}]`;
}
async initialize() {
// Kernel banner
this.log(`[${this.formatTime()}] Booting Axiom OS (Kernel 6.2.0-axiom)`, 'boot-message');
this.log(`[${this.formatTime()}] Command line: BOOT_IMAGE=/boot/axiom-vmlinuz root=/dev/sda1 ro quiet splash`, 'boot-message');
this.log(`[${this.formatTime()}] Kernel command line: BOOT_IMAGE=/boot/axiom-vmlinuz root=/dev/sda1 ro quiet splash`, 'boot-message');
await this.stage1_EarlyBoot();
await this.stage2_HardwareDetection();
await this.stage3_CPUInitialization();
await this.stage4_MemoryInitialization();
await this.stage5_StorageInitialization();
await this.stage6_FileSystemInitialization();
await this.stage7_DeviceInitialization();
await this.stage8_NetworkInitialization();
await this.stage9_EnvironmentSetup();
await this.stage10_VMInitialization();
await this.stage11_ServicesStart();
await this.stage12_SystemReady();
// Save boot log to /var/log/boot.log
await this.saveBootLog();
// Задержка и очистка консоли
await this.sleep(100);
if (typeof window.axiomTerminal !== 'undefined') {
window.axiomTerminal.clear();
}
// Финальный вывод (LTS = Long-Term Support - версия с долгосрочной поддержкой)
this.log(`Axiom OS 1.0.0 LTS`, 'output-success');
this.log('', 'boot-message');
return true;
}
async saveBootLog() {
try {
// Ensure /var/log directory exists
if (!window.axiomContainer.exists('/var')) {
window.axiomContainer.createDirectory('/var', true);
}
if (!window.axiomContainer.exists('/var/log')) {
window.axiomContainer.createDirectory('/var/log', true);
}
// Format boot log with timestamp
const timestamp = new Date().toISOString();
const header = `=== Axiom OS Boot Log ===\nBoot Time: ${timestamp}\nKernel: 6.2.0-axiom\n\n`;
const logContent = header + this.bootMessages.join('\n') + '\n';
// Overwrite boot.log with current boot sequence
window.axiomContainer.writeFile('/var/log/boot.log', logContent);
} catch (e) {
// Silently fail if filesystem not ready
console.warn('Failed to save boot log:', e);
}
}
async stage1_EarlyBoot() {
this.log(`[${this.formatTime()}] Early boot initialization`, 'boot-message');
this.log(`[${this.formatTime()}] BIOS-provided physical RAM map:`, 'boot-message');
// Calculate real memory addresses based on detected memory
const memSizeMB = this.realMemorySize;
const memBytes = memSizeMB * 1024 * 1024;
// BIOS reserved area (standard)
const biosLowEnd = 0x9fbff;
const biosHighStart = 0x100000;
const memEnd = memBytes - 1;
this.log(`[${this.formatTime()}] BIOS-e820: ${this.formatMemRange(0, biosLowEnd)} usable`, 'boot-message');
this.log(`[${this.formatTime()}] BIOS-e820: ${this.formatMemRange(biosHighStart, memEnd)} usable`, 'boot-message');
this.log(`[${this.formatTime()}] DMI: Axiom Virtual Platform 1.0`, 'boot-message');
this.log(`[${this.formatTime()}] Hypervisor detected: Browser VM`, 'boot-message');
// Reserved regions
this.log(`[${this.formatTime()}] e820: update ${this.formatMemRange(0, 0xfff)} usable ==> reserved`, 'boot-message');
this.log(`[${this.formatTime()}] e820: remove ${this.formatMemRange(0xa0000, 0xfffff)} usable`, 'boot-message');
// Calculate page frame numbers
const lastPfn = Math.floor(memBytes / 4096);
const maxArchPfn = 0x400000000; // x86_64 maximum
this.log(`[${this.formatTime()}] last_pfn = ${this.toHex(lastPfn, 4)} max_arch_pfn = ${this.toHex(maxArchPfn, 8)}`, 'boot-message');
this.log(`[${this.formatTime()}] MTRR default type: uncachable`, 'boot-message');
this.log(`[${this.formatTime()}] MTRR fixed ranges enabled:`, 'boot-message');
await this.sleep(80);
}
async stage2_HardwareDetection() {
this.log(`[${this.formatTime()}] Initializing hardware abstraction layer...`, 'boot-message');
// Real browser/hardware info
const cores = this.realCores;
const memoryGB = this.realMemorySize >= 1024 ? `${(this.realMemorySize / 1024).toFixed(1)}GB` : `${this.realMemorySize}MB`;
const platform = navigator.platform;
this.log(`[${this.formatTime()}] DMI: ${platform} ${this.realPlatform.os}`, 'boot-message');
this.log(`[${this.formatTime()}] Detected ${cores} logical processors`, 'boot-message');
this.log(`[${this.formatTime()}] Memory: ${memoryGB} available`, 'boot-message');
// x86/FPU features (check real browser capabilities)
const hasWasm = typeof WebAssembly !== 'undefined';
const hasSharedArrayBuffer = typeof SharedArrayBuffer !== 'undefined';
this.log(`[${this.formatTime()}] x86/fpu: Supporting XSAVE feature 0x001: 'x87 floating point registers'`, 'boot-message');
this.log(`[${this.formatTime()}] x86/fpu: Supporting XSAVE feature 0x002: 'SSE registers'`, 'boot-message');
this.log(`[${this.formatTime()}] x86/fpu: Supporting XSAVE feature 0x004: 'AVX registers'`, 'boot-message');
if (hasWasm) {
this.log(`[${this.formatTime()}] WebAssembly: supported (SIMD available)`, 'boot-message');
}
// GPU detection
const gpu = this.detectGPU();
this.log(`[${this.formatTime()}] pci 0000:00:02.0: VGA compatible controller: ${gpu.vendor}`, 'boot-message');
this.log(`[${this.formatTime()}] pci 0000:00:02.0: ${gpu.renderer}`, 'boot-message');
// Screen information
this.log(`[${this.formatTime()}] fb0: ${this.realPlatform.screen.width}x${this.realPlatform.screen.height}x${this.realPlatform.screen.colorDepth} (display framebuffer)`, 'boot-message');
// ACPI addresses (standard x86 locations)
const pmTimerPort = 0x608;
const localApicAddr = 0xfee00000;
this.log(`[${this.formatTime()}] ACPI: PM-Timer IO Port: ${this.toHex(pmTimerPort, 3)}`, 'boot-message');
this.log(`[${this.formatTime()}] ACPI: Local APIC address ${this.toHex(localApicAddr, 8)}`, 'boot-message');
await this.sleep(80);
}
async stage3_CPUInitialization() {
if (typeof VirtualCPU === 'undefined') {
this.printFail('CPU initialization failed: VirtualCPU not found');
throw new Error('VirtualCPU not found');
}
window.axiomCPU = new VirtualCPU();
await window.axiomCPU.initialize();
const cpuInfo = window.axiomCPU.getCPUInfo();
// Calculate cache sizes based on core count (realistic scaling)
const l1CachePerCore = 32; // KB
const l2CachePerCore = 256; // KB
const l3CacheTotal = cpuInfo.cores * 2048; // 2MB per core for L3
const totalL1 = l1CachePerCore * cpuInfo.cores;
const totalL2 = l2CachePerCore * cpuInfo.cores;
this.log(`[${this.formatTime()}] smpboot: Allowing ${cpuInfo.cores} CPUs, 0 hotplug CPUs`, 'boot-message');
this.log(`[${this.formatTime()}] setup_percpu: NR_CPUS:${cpuInfo.cores * 2} nr_cpumask_bits:${cpuInfo.cores} nr_cpu_ids:${cpuInfo.cores} nr_node_ids:1`, 'boot-message');
this.log(`[${this.formatTime()}] CPU: ${cpuInfo.name}`, 'boot-message');
this.log(`[${this.formatTime()}] CPU: ${cpuInfo.cores} cores, ${cpuInfo.threads} threads @ ${cpuInfo.clockSpeed}MHz`, 'boot-message');
this.log(`[${this.formatTime()}] CPU: Physical Processor ID: 0`, 'boot-message');
this.log(`[${this.formatTime()}] CPU: Processor Core ID: 0`, 'boot-message');
this.log(`[${this.formatTime()}] CPU: Features - SSE SSE2 SSE3 SSE4.1 SSE4.2 AVX AVX2 FMA3`, 'boot-message');
this.log(`[${this.formatTime()}] CPU: L1 Cache: ${l1CachePerCore}KB/core (${totalL1}KB total), L2 Cache: ${l2CachePerCore}KB/core (${totalL2}KB total), L3 Cache: ${l3CacheTotal}KB`, 'boot-message');
this.log(`[${this.formatTime()}] mce: CPU supports ${cpuInfo.cores} MCE banks`, 'boot-message');
this.log(`[${this.formatTime()}] Performance Events: Virtual PMU driver`, 'boot-message');
this.printOK('CPU initialization');
await this.sleep(80);
}
async stage4_MemoryInitialization() {
if (typeof MemoryGuard === 'undefined') {
this.printFail('Memory initialization failed');
throw new Error('MemoryGuard not found');
}
window.axiomMemory = new MemoryGuard();
await window.axiomMemory.initialize();
const memInfo = window.axiomMemory.getMemoryInfo();
const totalPages = (memInfo.total * 1024) / 4;
const freePages = (memInfo.available * 1024) / 4;
const kernelCodePages = Math.floor(totalPages * 0.15);
const reservedPages = Math.floor(totalPages * 0.1);
const dataPages = Math.floor(totalPages * 0.6);
const initPages = Math.floor(totalPages * 0.05);
this.log(`[${this.formatTime()}] Memory: ${memInfo.total}MB total, ${memInfo.available}MB available`, 'boot-message');
this.log(`[${this.formatTime()}] Memory: ${totalPages}K/${totalPages}K available (${kernelCodePages}K kernel code, ${reservedPages}K reserved, ${dataPages}K data, ${initPages}K init)`, 'boot-message');
this.log(`[${this.formatTime()}] Memory: Page size 4096 bytes`, 'boot-message');
this.log(`[${this.formatTime()}] Kernel/User page tables isolation: enabled`, 'boot-message');
this.log(`[${this.formatTime()}] Memory: Using ${memInfo.total}MB for main memory`, 'boot-message');
// Calculate zone ranges based on real memory
const dmaEnd = 0xffffff; // 16MB DMA limit (standard)
const dma32Start = 0x1000000;
const totalMemBytes = memInfo.total * 1024 * 1024;
const dma32End = Math.min(totalMemBytes - 1, 0xffffffff); // 4GB limit for DMA32
this.log(`[${this.formatTime()}] Zone ranges:`, 'boot-message');
this.log(`[${this.formatTime()}] DMA ${this.formatMemRange(0x1000, dmaEnd)}`, 'boot-message');
this.log(`[${this.formatTime()}] DMA32 ${this.formatMemRange(dma32Start, dma32End)}`, 'boot-message');
if (totalMemBytes > 0x100000000) {
// If memory exceeds 4GB, show Normal zone
this.log(`[${this.formatTime()}] Normal ${this.formatMemRange(0x100000000, totalMemBytes - 1)}`, 'boot-message');
} else {
this.log(`[${this.formatTime()}] Normal empty`, 'boot-message');
}
this.printOK('Memory initialization');
await this.sleep(80);
}
async stage5_StorageInitialization() {
// Real localStorage info
let storageUsed = 0, storageTotal = 5 * 1024 * 1024;
try {
const estimate = await navigator.storage?.estimate();
if (estimate) {
storageUsed = estimate.usage || 0;
storageTotal = estimate.quota || storageTotal;
}
} catch (e) {
// Fallback to localStorage check
const test = localStorage.getItem('axiom_fs') || '';
storageUsed = new Blob([test]).size;
}
const usedMB = (storageUsed / (1024 * 1024)).toFixed(2);
const totalMB = (storageTotal / (1024 * 1024)).toFixed(2);
const usedPercent = ((storageUsed / storageTotal) * 100).toFixed(1);
// Calculate partition info based on real storage
const sectorSize = 512; // bytes
const totalSectors = Math.floor(storageTotal / sectorSize);
const partitionStart = 2048; // standard partition start (1MB alignment)
const partitionSize = totalSectors - partitionStart;
this.log(`[${this.formatTime()}] Storage: Probing for storage devices...`, 'boot-message');
this.log(`[${this.formatTime()}] Storage: localStorage backend detected`, 'boot-message');
this.log(`[${this.formatTime()}] Storage: LZ-based compression enabled (space saving)`, 'boot-message');
this.log(`[${this.formatTime()}] Storage: sda: Virtual Disk (${totalMB}MB)`, 'boot-message');
this.log(`[${this.formatTime()}] Storage: sda: ${usedMB}MB used / ${totalMB}MB total (${usedPercent}% used)`, 'boot-message');
this.log(`[${this.formatTime()}] Storage: sda1: partition 1 start=${partitionStart} size=${partitionSize} sectors`, 'boot-message');
this.log(`[${this.formatTime()}] SCSI subsystem initialized`, 'boot-message');
this.printOK('Storage subsystem');
await this.sleep(80);
}
async stage6_FileSystemInitialization() {
if (typeof FileSystemInput === 'undefined' || typeof FileSystemOutput === 'undefined') {
this.printFail('File system initialization failed');
throw new Error('File System modules not found');
}
window.axiomFS = {
input: new FileSystemInput(),
output: new FileSystemOutput()
};
await window.axiomFS.input.initialize();
await window.axiomFS.output.initialize();
if (typeof VMContainer === 'undefined') {
throw new Error('VMContainer not found');
}
window.axiomContainer = new VMContainer();
await window.axiomContainer.initialize();
// Calculate kernel memory usage based on actual allocated memory
const memInfo = window.axiomMemory.getMemoryInfo();
const unusedKernelMem = Math.floor(memInfo.total * 0.02); // 2% unused kernel memory
const roDataSize = Math.floor(memInfo.total * 0.12); // 12% for read-only data
const unusedImageMem = Math.floor(memInfo.total * 0.015); // 1.5% unused image
this.log(`[${this.formatTime()}] VFS: Disk quotas dquot_6.6.0`, 'boot-message');
this.log(`[${this.formatTime()}] VFS: Mounted root (localStorage) filesystem readonly on device 8:1`, 'boot-message');
this.log(`[${this.formatTime()}] VFS: File descriptors: stdin(0), stdout(1), stderr(2)`, 'boot-message');
this.log(`[${this.formatTime()}] devtmpfs: mounted`, 'boot-message');
this.log(`[${this.formatTime()}] Freeing unused kernel memory: ${unusedKernelMem}K`, 'boot-message');
this.log(`[${this.formatTime()}] Write protecting the kernel read-only data: ${roDataSize}k`, 'boot-message');
this.log(`[${this.formatTime()}] Freeing unused kernel image memory: ${unusedImageMem}K`, 'boot-message');
this.log(`[${this.formatTime()}] EXT4-fs (sda1): mounted filesystem with ordered data mode`, 'boot-message');
this.printOK('File system mounted');
await this.sleep(80);
}
async stage7_DeviceInitialization() {
this.log(`[${this.formatTime()}] input: Virtual Keyboard as /devices/platform/i8042/input/input0`, 'boot-message');
this.log(`[${this.formatTime()}] input: Virtual Mouse as /devices/platform/i8042/input/input1`, 'boot-message');
// Battery info (if available)
const battery = await this.detectBattery();
if (battery) {
const status = battery.charging ? 'Charging' : 'Discharging';
this.log(`[${this.formatTime()}] ACPI: Battery [BAT0] (battery, ${status}, ${battery.level}%)`, 'boot-message');
if (battery.charging && battery.chargingTime !== Infinity) {
const timeMin = Math.floor(battery.chargingTime / 60);
this.log(`[${this.formatTime()}] ACPI: AC Adapter [AC0] (on-line, full charge in ${timeMin}min)`, 'boot-message');
}
}
this.log(`[${this.formatTime()}] rtc_cmos 00:00: RTC can wake from S4`, 'boot-message');
this.log(`[${this.formatTime()}] rtc_cmos 00:00: registered as rtc0`, 'boot-message');
this.log(`[${this.formatTime()}] Serial: 8250/16550 driver, 4 ports, IRQ sharing enabled`, 'boot-message');
this.printOK('Device initialization');
await this.sleep(80);
}
async stage8_NetworkInitialization() {
// Real network info
const online = navigator.onLine;
const connection = navigator.connection || navigator.mozConnection || navigator.webkitConnection;
const effectiveType = connection?.effectiveType || 'unknown';
const downlink = connection?.downlink || 0;
const saveData = connection?.saveData || false;
this.log(`[${this.formatTime()}] e1000: Intel(R) PRO/1000 Network Driver`, 'boot-message');
this.log(`[${this.formatTime()}] e1000: eth0 NIC Link is ${online ? 'Up' : 'Down'}`, 'boot-message');
if (online && connection) {
const speedMbps = downlink > 0 ? downlink.toFixed(1) : 'unknown';
this.log(`[${this.formatTime()}] e1000: eth0: ${effectiveType} connection (${speedMbps}Mbps)`, 'boot-message');
if (connection.rtt) {
this.log(`[${this.formatTime()}] e1000: eth0: RTT ~${connection.rtt}ms`, 'boot-message');
}
if (saveData) {
this.log(`[${this.formatTime()}] e1000: eth0: Data saver mode enabled`, 'boot-message');
}
}
this.log(`[${this.formatTime()}] IPv6: ADDRCONF(NETDEV_CHANGE): eth0: link becomes ready`, 'boot-message');
this.printOK('Network configuration');
await this.sleep(80);
}
async stage9_EnvironmentSetup() {
if (typeof Environment === 'undefined') {
this.printFail('Environment setup failed');
throw new Error('Environment not found');
}
window.axiomEnv = new Environment();
await window.axiomEnv.initialize();
this.log(`[${this.formatTime()}] systemd[1]: systemd 252.5-2 running in system mode`, 'boot-message');
this.log(`[${this.formatTime()}] systemd[1]: Detected virtualization browser`, 'boot-message');
this.log(`[${this.formatTime()}] systemd[1]: Detected architecture x86-64`, 'boot-message');
this.log(`[${this.formatTime()}] systemd[1]: Hostname set to <axiom-vm>`, 'boot-message');
this.log(`[${this.formatTime()}] systemd[1]: Loading environment variables`, 'boot-message');
this.log(`[${this.formatTime()}] systemd[1]: Set environment USER=${window.axiomEnv.get('USER')}`, 'boot-message');
this.log(`[${this.formatTime()}] systemd[1]: Set environment HOME=${window.axiomEnv.get('HOME')}`, 'boot-message');
this.log(`[${this.formatTime()}] systemd[1]: Set environment PATH=${window.axiomEnv.get('PATH')}`, 'boot-message');
this.log(`[${this.formatTime()}] systemd[1]: Set environment SHELL=${window.axiomEnv.get('SHELL')}`, 'boot-message');
this.printOK('Environment configuration');
await this.sleep(80);
}
async stage10_VMInitialization() {
if (typeof VMEmulator === 'undefined') {
this.printFail('VM initialization failed');
throw new Error('VM modules not found');
}
window.axiomVM = new VMEmulator();
await window.axiomVM.initialize();
this.log(`[${this.formatTime()}] kvm: VM support detected`, 'boot-message');
this.log(`[${this.formatTime()}] kvm: DosX virtual machine initialized`, 'boot-message');
this.log(`[${this.formatTime()}] kvm: Instruction set loaded (x86-64 compatible)`, 'boot-message');
this.log(`[${this.formatTime()}] kvm: 64-bit syscall interface ready`, 'boot-message');
this.log(`[${this.formatTime()}] kvm: Virtualization features enabled`, 'boot-message');
this.printOK('Virtual machine');
await this.sleep(80);
}
async stage11_ServicesStart() {
this.log(`[${this.formatTime()}] systemd[1]: Starting system services...`, 'boot-message');
this.log(`[${this.formatTime()}] systemd[1]: Started Dispatch Password Requests to Console`, 'boot-message');
this.printOK('systemd-tmpfiles-setup-dev.service - Create Static Device Nodes');
this.printOK('systemd-journald.service - Journal Service');
this.printOK('systemd-udevd.service - Rule-based Manager for Device Events');
this.printOK('systemd-timesyncd.service - Network Time Synchronization');
this.printOK('systemd-logind.service - User Login Management');
this.printOK('dbus.service - D-Bus System Message Bus');
this.printOK('axiom-terminal.service - Axiom Terminal Service');
this.printOK('axiom-shell.service - Axiom Shell');
await this.sleep(80);
}
async stage12_SystemReady() {
this.printOK('Reached target Basic System');
this.printOK('Reached target Network');
this.printOK('Reached target Multi-User System');
this.printOK('Reached target Graphical Interface');
this.log(`[${this.formatTime()}] systemd[1]: Startup finished in ${((performance.now() - this.startTime) / 1000).toFixed(2)}s (kernel) + ${((performance.now() - this.startTime) / 1000 * 0.3).toFixed(2)}s (userspace) = ${((performance.now() - this.startTime) / 1000 * 1.3).toFixed(2)}s`, 'boot-message');
await this.sleep(80);
}
formatTime() {
const seconds = (performance.now() - this.startTime) / 1000;
return seconds.toFixed(6).padStart(10, ' ');
}
printOK(message) {
this.log(`[${this.formatTime()}] [ OK ] ${message}`, 'output-success');
}
printFail(message) {
this.log(`[${this.formatTime()}] [FAILED] ${message}`, 'output-error');
}
log(message, className = 'boot-message') {
this.bootMessages.push(message);
if (typeof window.axiomTerminal !== 'undefined') {
window.axiomTerminal.printLine(message, className);
}
}
sleep(ms) {
return new Promise(resolve => setTimeout(resolve, ms));
}
getBootMessages() {
return this.bootMessages;
}
}
// Export for global access
window.BootManager = BootManager;
================================================
FILE: axiom/application_data/system/kernel/environment.js
================================================
/**
* Axiom Environment Manager
* Manages environment variables and system configuration
*/
class Environment {
constructor() {
this.variables = new Map();
this.defaultVariables = {
'USER': 'root',
'HOME': '/root',
'PATH': '/bin:/usr/bin:/usr/local/bin',
'SHELL': '/bin/axiom',
'PWD': '/root',
'OLDPWD': '/root',
'TERM': 'axiom-256color',
'LANG': 'en_US.UTF-8',
'EDITOR': 'vi',
'HOSTNAME': 'axiom',
'LOGNAME': 'root',
'PS1': 'root@axiom:~$'
};
}
async initialize() {
// Load default variables
for (const [key, value] of Object.entries(this.defaultVariables)) {
this.variables.set(key, value);
}
// Try to load from localStorage
try {
const stored = localStorage.getItem('axiom_env');
if (stored) {
const parsed = JSON.parse(stored);
for (const [key, value] of Object.entries(parsed)) {
this.variables.set(key, value);
}
}
} catch (e) {
console.warn('Failed to load environment from storage:', e);
}
return true;
}
get(key) {
return this.variables.get(key) || '';
}
set(key, value) {
this.variables.set(key, String(value));
this.save();
}
unset(key) {
this.variables.delete(key);
this.save();
}
has(key) {
return this.variables.has(key);
}
list() {
const result = {};
for (const [key, value] of this.variables.entries()) {
result[key] = value;
}
return result;
}
expand(str) {
// Expand environment variables in string
// Supports $VAR and ${VAR} syntax
return str.replace(/\$\{([^}]+)\}|\$([A-Z_][A-Z0-9_]*)/g, (match, braced, simple) => {
const varName = braced || simple;
return this.get(varName) || match;
});
}
updatePWD(newPath) {
const oldPwd = this.get('PWD');
this.set('OLDPWD', oldPwd);
this.set('PWD', newPath);
this.updatePrompt();
}
updatePrompt() {
const user = this.get('USER');
const hostname = this.get('HOSTNAME');
const pwd = this.get('PWD');
const home = this.get('HOME');
// Replace home directory with ~
let displayPath = pwd;
if (pwd === home) {
displayPath = '~';
} else if (pwd.startsWith(home + '/')) {
displayPath = '~' + pwd.substring(home.length);
}
const prompt = `${user}@${hostname}:${displayPath}$`;
this.set('PS1', prompt);
// Update UI prompt
if (typeof window.axiomTerminal !== 'undefined') {
window.axiomTerminal.updatePrompt(prompt);
}
}
save() {
try {
const obj = {};
for (const [key, value] of this.variables.entries()) {
obj[key] = value;
}
localStorage.setItem('axiom_env', JSON.stringify(obj));
} catch (e) {
console.warn('Failed to save environment:', e);
}
}
reset() {
this.variables.clear();
for (const [key, value] of Object.entries(this.defaultVariables)) {
this.variables.set(key, value);
}
this.save();
}
}
// Export for global access
window.Environment = Environment;
================================================
FILE: axiom/application_data/system/kernel/fsio/fs.compression.js
================================================
/**
* File System Compression Module
* Uses LZ-based compression to reduce localStorage usage
*
* Algorithm: Simple LZ77 with UTF-16 encoding
* Compression ratio: ~40-60% for text data
* Performance: Fast compression/decompression
*/
class FSCompression {
constructor() {
this.enabled = true;
this.compressionRatio = 0;
}
/**
* Compress string data using LZ-based algorithm
* @param {string} data - Uncompressed data
* @returns {string} Compressed data with marker
*/
compress(data) {
if (!this.enabled || !data) return data;
try {
const compressed = this._lzCompress(data);
// Add marker to identify compressed data
const marked = '__COMPRESSED__' + compressed;
// Calculate compression ratio
const originalSize = new Blob([data]).size;
const compressedSize = new Blob([marked]).size;
this.compressionRatio = ((1 - compressedSize / originalSize) * 100).toFixed(1);
return marked;
} catch (e) {
console.warn('Compression failed, using uncompressed data:', e);
return data;
}
}
/**
* Decompress string data
* @param {string} data - Compressed or uncompressed data
* @returns {string} Decompressed data
*/
decompress(data) {
if (!this.enabled || !data) return data;
// Check if data is compressed
if (!data.startsWith('__COMPRESSED__')) {
return data; // Not compressed, return as-is
}
try {
const compressed = data.substring(14); // Remove marker
return this._lzDecompress(compressed);
} catch (e) {
console.warn('Decompression failed:', e);
return data;
}
}
/**
* Get compression statistics
*/
getStats() {
return {
enabled: this.enabled,
lastCompressionRatio: this.compressionRatio,
algorithm: 'LZ77 (UTF-16)'
};
}
/**
* Simple LZ77 compression using UTF-16 encoding
*/
_lzCompress(input) {
const dict = {};
let data = input.split('');
let out = [];
let currChar;
let phrase = data[0];
let code = 256;
for (let i = 1; i < data.length; i++) {
currChar = data[i];
if (dict[phrase + currChar] != null) {
phrase += currChar;
} else {
out.push(phrase.length > 1 ? dict[phrase] : phrase.charCodeAt(0));
dict[phrase + currChar] = code;
code++;
phrase = currChar;
}
}
out.push(phrase.length > 1 ? dict[phrase] : phrase.charCodeAt(0));
// Convert to string
let result = '';
for (let i = 0; i < out.length; i++) {
result += String.fromCharCode(out[i]);
}
return result;
}
/**
* Simple LZ77 decompression
*/
_lzDecompress(compressed) {
const dict = {};
let data = compressed.split('');
let currChar = data[0];
let oldPhrase = currChar;
let out = [currChar];
let code = 256;
let phrase;
for (let i = 1; i < data.length; i++) {
const currCode = data[i].charCodeAt(0);
if (currCode < 256) {
phrase = data[i];
} else {
phrase = dict[currCode] ? dict[currCode] : (oldPhrase + currChar);
}
out.push(phrase);
currChar = phrase.charAt(0);
dict[code] = oldPhrase + currChar;
code++;
oldPhrase = phrase;
}
return out.join('');
}
}
// Export for global access
window.FSCompression = FSCompression;
================================================
FILE: axiom/application_data/system/kernel/fsio/fs.input.js
================================================
/**
* Axiom File System Input Handler
* Manages file reading and input operations
*/
class FileSystemInput {
constructor() {
this.fileDescriptors = new Map();
this.nextFD = 3; // 0=stdin, 1=stdout, 2=stderr
this.openFiles = new Map();
// Standard file descriptors
this.STDIN = 0;
this.STDOUT = 1;
this.STDERR = 2;
}
async initialize() {
// Initialize standard file descriptors
this.fileDescriptors.set(this.STDIN, {
gitextract_gxavh5fc/ ├── .gitattributes ├── 404.html ├── 404.md ├── CNAME ├── README.md ├── app.fingerprint.js ├── app.js ├── app.modern.css ├── app.modern.fingerprint.css ├── axiom/ │ ├── application_data/ │ │ ├── system/ │ │ │ ├── kernel/ │ │ │ │ ├── core/ │ │ │ │ │ └── bootmgr.js │ │ │ │ ├── environment.js │ │ │ │ ├── fsio/ │ │ │ │ │ ├── fs.compression.js │ │ │ │ │ ├── fs.input.js │ │ │ │ │ └── fs.output.js │ │ │ │ ├── virtualcpu.interruptions.js │ │ │ │ └── virtualcpu.js │ │ │ ├── uiapps/ │ │ │ │ └── core.ui-notepad.js │ │ │ └── vm/ │ │ │ ├── container.js │ │ │ ├── container.memguard.js │ │ │ ├── emulator.instructions.js │ │ │ └── emulator.js │ │ └── webui/ │ │ ├── app.manifest.js │ │ └── app.styles.css │ └── index.html ├── dosx-files/ │ ├── 1 │ ├── spoof-me.txt │ ├── vavilonp-red.txt │ └── x-crpt-lic.txt ├── global/ │ └── dark-blue-md.css ├── gui/ │ ├── index.html │ └── new/ │ └── index.html ├── index.html ├── legacy_tandem/ │ └── viewer/ │ ├── app/ │ │ ├── code/ │ │ │ ├── app.toolbox.events.js │ │ │ ├── app.toolbox.modal.js │ │ │ ├── app.toolbox.navigation.js │ │ │ ├── app.viewer.init.js │ │ │ ├── app.viewer.js │ │ │ ├── app.viewer.loader.js │ │ │ ├── app.viewer.mobile.js │ │ │ └── no-toolbox-viewer/ │ │ │ ├── index.init.js │ │ │ ├── index.loader.js │ │ │ └── index.state.js │ │ └── styles/ │ │ ├── default.app-base.css │ │ ├── default.app-modal-dialogs.css │ │ ├── default.app-viewer-mobile.css │ │ ├── default.app-viewer-no-toolbox.css │ │ ├── default.app-viewer.css │ │ └── default.css │ ├── home/ │ │ └── index.html │ ├── index.db.js │ ├── index.html │ ├── no-toolbox-viewer/ │ │ └── index.html │ └── works/ │ ├── example-astra/ │ │ ├── css/ │ │ │ └── style.css │ │ ├── index.html │ │ └── js/ │ │ └── main.js │ ├── example-cakes/ │ │ └── index.html │ ├── example-designer/ │ │ └── index.html │ ├── example-florist/ │ │ └── index.html │ ├── example-jstd/ │ │ ├── 404.html │ │ ├── app/ │ │ │ ├── i18n.js │ │ │ └── main.js │ │ ├── download/ │ │ │ └── index.html │ │ ├── en/ │ │ │ └── index.html │ │ ├── index.html │ │ ├── ru/ │ │ │ └── index.html │ │ └── styles/ │ │ └── main.css │ ├── example-lawyer/ │ │ └── index.html │ ├── example-nightclub/ │ │ └── index.html │ ├── example-pcbuilder/ │ │ ├── css/ │ │ │ └── style.css │ │ ├── index.html │ │ └── js/ │ │ ├── components.js │ │ └── main.js │ └── example-vpn/ │ └── index.html ├── libs/ │ ├── index.html │ ├── packages/ │ │ └── libsc-in-v3.txt │ ├── server.js │ └── ultra-hash-v3.4.js ├── mov/ │ ├── @my-profile-test/ │ │ ├── index.html │ │ ├── script.js │ │ └── style.css │ ├── css/ │ │ ├── animate.css │ │ ├── default-skin/ │ │ │ └── default-skin.css │ │ ├── jquery.mCustomScrollbar.css │ │ ├── photoswipe.css │ │ ├── style-map-variant.css │ │ └── vegas.css │ ├── fonts/ │ │ └── FontAwesome.otf │ ├── html-guard-config.js │ ├── index.html │ └── js/ │ ├── build-src.cmd │ ├── contact-me.js │ ├── debug.cmd │ ├── jquery.mCustomScrollbar.js │ ├── jquery.mousewheel.js │ ├── main.js │ ├── modernizr.custom.js │ ├── mov.js │ ├── photoswipe-ui-default.js │ ├── photoswipe.js │ ├── placeholder.js │ ├── src_mov.js │ ├── vegas-youtube-mobile.js │ └── vegas.js ├── mvn/ │ └── index.html ├── old-website/ │ ├── 404.html │ ├── index.html │ └── res/ │ └── site.html ├── robots.txt ├── ru/ │ └── csharp_с_нуля__курс_для_тех_кто_не_понимает_но_хочет_понять/ │ └── index.html ├── safenova/ │ ├── .server.ps1 │ ├── css/ │ │ └── app.css │ ├── index.html │ └── js/ │ ├── constants.js │ ├── crypto.js │ ├── db.js │ ├── desktop.js │ ├── fileops.js │ ├── home.js │ ├── main.js │ ├── state.js │ └── vfs.js ├── scripts/ │ ├── net8/ │ │ ├── win-debug.txt │ │ └── win-release.txt │ ├── net9/ │ │ ├── win-debug.txt │ │ └── win-release.txt │ └── www/ │ └── js-daemon.js ├── server-0/ │ └── antropove.ru/ │ ├── browserconfig.xml │ ├── index.html │ ├── manifest.json │ ├── robots.txt │ ├── script.js │ ├── script.resources.js │ ├── site.webmanifest │ ├── sitemap.xml │ └── style.css ├── tanki-online-unoff-client/ │ └── TapkiOnline/ │ ├── app/ │ │ └── entry.js │ └── welcome/ │ ├── captcha.html │ ├── index.html │ ├── index_birth.html │ ├── index_old.html │ └── menu.html ├── terminal/ │ ├── index.htm │ ├── modules/ │ │ ├── app.js │ │ ├── context.js │ │ ├── fp-api.js │ │ ├── io-fs.js │ │ └── manifest.js │ └── styles/ │ ├── global.css │ └── themes/ │ ├── cherry.css │ ├── dark.css │ ├── hacker.css │ └── light.css ├── testpool/ │ ├── Import.js │ ├── demo-apps/ │ │ ├── app1/ │ │ │ ├── index.html │ │ │ └── memworker.js │ │ └── ezmath/ │ │ └── index.html │ └── index.html ├── tor-detector.html ├── xss/ │ └── index.html ├── xxx/ │ └── index.html └── yandex_d246819e88468b42.html
SYMBOL INDEX (854 symbols across 58 files)
FILE: app.fingerprint.js
class Fingerprint (line 5) | class Fingerprint {
method constructor (line 6) | constructor() {
method initEventListeners (line 22) | initEventListeners() {
method showView (line 56) | showView(view) {
method showLoading (line 89) | showLoading() {
method generateFingerprint (line 98) | generateFingerprint() {
method renderOverview (line 110) | renderOverview() {
method renderBrowserInfo (line 405) | renderBrowserInfo() {
method renderSystemInfo (line 489) | renderSystemInfo() {
method getBrowserInfo (line 641) | getBrowserInfo(userAgent) {
method getBrowserEngine (line 709) | getBrowserEngine() {
method getDeviceType (line 728) | getDeviceType() {
method isIncognitoMode (line 740) | isIncognitoMode() {
method getApproximateMemory (line 751) | getApproximateMemory() {
method getTimezoneOffsetString (line 765) | getTimezoneOffsetString() {
method getConnectionType (line 774) | getConnectionType() {
method getDownlinkSpeed (line 784) | getDownlinkSpeed() {
method getRTT (line 794) | getRTT() {
method getDataSaver (line 804) | getDataSaver() {
method getGPUInfo (line 814) | getGPUInfo() {
method getHardwareInfo (line 885) | getHardwareInfo() {
method hasWebGL2 (line 915) | hasWebGL2() {
method getArchitecture (line 924) | getArchitecture() {
method getBatteryInfo (line 959) | getBatteryInfo() {
method getPreferredColorScheme (line 983) | getPreferredColorScheme() {
method getLanguageInfo (line 993) | getLanguageInfo() {
method getAvailableAPIs (line 1008) | getAvailableAPIs() {
method getDetailedTimezoneInfo (line 1037) | getDetailedTimezoneInfo() {
method isDSTActive (line 1051) | isDSTActive() {
method getInstalledFonts (line 1060) | getInstalledFonts() {
method getCanvasFingerprint (line 1106) | getCanvasFingerprint() {
method getDNTStatus (line 1160) | getDNTStatus() {
method detectTouchEmulation (line 1172) | detectTouchEmulation() {
method analyzeUserAgentSuspicion (line 1190) | analyzeUserAgentSuspicion() {
method generateHashedFingerprint (line 1278) | generateHashedFingerprint() {
method generateFeatureSupport (line 1353) | generateFeatureSupport() {
method generateFeaturesList (line 1440) | generateFeaturesList() {
FILE: app.js
function loadTheme (line 29) | function loadTheme() {
function toggleTheme (line 63) | function toggleTheme() {
function setRandomSlogan (line 90) | function setRandomSlogan() {
function setEmailAddress (line 120) | function setEmailAddress() {
function setYear (line 163) | function setYear() {
constant GITHUB_API_URL (line 171) | const GITHUB_API_URL = "https://api.github.com/users/DosX-dev/repos";
constant STORAGE_KEY (line 172) | const STORAGE_KEY = "dosx_repos";
constant LAST_FETCH_KEY (line 173) | const LAST_FETCH_KEY = "dosx_last_fetch";
constant PER_PAGE (line 174) | const PER_PAGE = 100;
constant CACHE_VALIDITY_DURATION (line 175) | const CACHE_VALIDITY_DURATION = 60 * 60 * 1000;
function fetchRepositories (line 178) | async function fetchRepositories() {
function shouldDisplayRepository (line 226) | function shouldDisplayRepository(repo) {
function getCategoryIcon (line 231) | function getCategoryIcon(condition, iconName, titleName) {
function getCategoryIcons (line 249) | function getCategoryIcons(repo) {
function displayRepositories (line 305) | function displayRepositories(repositories) {
function applyFiltersAndSort (line 339) | function applyFiltersAndSort() {
function loadRepositories (line 511) | async function loadRepositories() {
function setupEventListeners (line 549) | function setupEventListeners() {
function setupCustomSelect (line 588) | function setupCustomSelect() {
FILE: axiom/application_data/system/kernel/core/bootmgr.js
class BootManager (line 6) | class BootManager {
method constructor (line 7) | constructor() {
method detectRealMemory (line 24) | detectRealMemory() {
method detectPlatform (line 44) | detectPlatform() {
method detectGPU (line 82) | detectGPU() {
method detectBattery (line 105) | async detectBattery() {
method toHex (line 122) | toHex(num, padding = 16) {
method formatMemRange (line 126) | formatMemRange(start, end) {
method initialize (line 130) | async initialize() {
method saveBootLog (line 165) | async saveBootLog() {
method stage1_EarlyBoot (line 188) | async stage1_EarlyBoot() {
method stage2_HardwareDetection (line 220) | async stage2_HardwareDetection() {
method stage3_CPUInitialization (line 262) | async stage3_CPUInitialization() {
method stage4_MemoryInitialization (line 296) | async stage4_MemoryInitialization() {
method stage5_StorageInitialization (line 341) | async stage5_StorageInitialization() {
method stage6_FileSystemInitialization (line 378) | async stage6_FileSystemInitialization() {
method stage7_DeviceInitialization (line 418) | async stage7_DeviceInitialization() {
method stage8_NetworkInitialization (line 441) | async stage8_NetworkInitialization() {
method stage9_EnvironmentSetup (line 467) | async stage9_EnvironmentSetup() {
method stage10_VMInitialization (line 490) | async stage10_VMInitialization() {
method stage11_ServicesStart (line 509) | async stage11_ServicesStart() {
method stage12_SystemReady (line 524) | async stage12_SystemReady() {
method formatTime (line 534) | formatTime() {
method printOK (line 539) | printOK(message) {
method printFail (line 543) | printFail(message) {
method log (line 547) | log(message, className = 'boot-message') {
method sleep (line 555) | sleep(ms) {
method getBootMessages (line 559) | getBootMessages() {
FILE: axiom/application_data/system/kernel/environment.js
class Environment (line 6) | class Environment {
method constructor (line 7) | constructor() {
method initialize (line 25) | async initialize() {
method get (line 47) | get(key) {
method set (line 51) | set(key, value) {
method unset (line 56) | unset(key) {
method has (line 61) | has(key) {
method list (line 65) | list() {
method expand (line 73) | expand(str) {
method updatePWD (line 82) | updatePWD(newPath) {
method updatePrompt (line 89) | updatePrompt() {
method save (line 112) | save() {
method reset (line 124) | reset() {
FILE: axiom/application_data/system/kernel/fsio/fs.compression.js
class FSCompression (line 10) | class FSCompression {
method constructor (line 11) | constructor() {
method compress (line 21) | compress(data) {
method decompress (line 47) | decompress(data) {
method getStats (line 67) | getStats() {
method _lzCompress (line 78) | _lzCompress(input) {
method _lzDecompress (line 112) | _lzDecompress(compressed) {
FILE: axiom/application_data/system/kernel/fsio/fs.input.js
class FileSystemInput (line 6) | class FileSystemInput {
method constructor (line 7) | constructor() {
method initialize (line 18) | async initialize() {
method open (line 44) | open(path, mode = 'r') {
method close (line 65) | close(fd) {
method read (line 81) | read(fd, length = -1) {
method readLine (line 106) | readLine(fd) {
method readLines (line 128) | readLines(fd) {
method seek (line 138) | seek(fd, position, whence = 'SEEK_SET') {
method tell (line 163) | tell(fd) {
method flush (line 171) | flush(fd) {
method isEOF (line 185) | isEOF(fd) {
method getDescriptor (line 193) | getDescriptor(fd) {
method listOpenFiles (line 197) | listOpenFiles() {
method closeAll (line 212) | closeAll() {
FILE: axiom/application_data/system/kernel/fsio/fs.output.js
class FileSystemOutput (line 6) | class FileSystemOutput {
method constructor (line 7) | constructor() {
method initialize (line 12) | async initialize() {
method write (line 20) | write(fd, data) {
method writeLine (line 53) | writeLine(fd, data) {
method writeLines (line 57) | writeLines(fd, lines) {
method flush (line 65) | flush(fd) {
method truncate (line 69) | truncate(fd, length = 0) {
method redirectOutput (line 95) | redirectOutput(sourceFd, targetPath) {
method pipe (line 116) | pipe(sourceFd, targetFd) {
method setBuffer (line 134) | setBuffer(fd, bufferSize) {
method bufferedWrite (line 146) | bufferedWrite(fd, data) {
method flushBuffer (line 166) | flushBuffer(fd) {
method clearBuffer (line 183) | clearBuffer(fd) {
method writeToStdout (line 190) | writeToStdout(data) {
method writeToStderr (line 196) | writeToStderr(data) {
FILE: axiom/application_data/system/kernel/virtualcpu.interruptions.js
class InterruptHandler (line 6) | class InterruptHandler {
method constructor (line 7) | constructor() {
method initialize (line 39) | async initialize() {
method registerHandler (line 53) | registerHandler(interruptNumber, handler) {
method unregisterHandler (line 60) | unregisterHandler(interruptNumber) {
method handleInterrupt (line 64) | async handleInterrupt(interruptNumber, data = null) {
method handleDivideByZero (line 82) | async handleDivideByZero(data) {
method handleInvalidOpcode (line 90) | async handleInvalidOpcode(data) {
method handleGeneralProtection (line 98) | async handleGeneralProtection(data) {
method handlePageFault (line 106) | async handlePageFault(data) {
method handleSyscall (line 114) | async handleSyscall(data) {
method handleTimer (line 122) | async handleTimer(data) {
method handleKeyboard (line 128) | async handleKeyboard(data) {
method handleStorage (line 137) | async handleStorage(data) {
method queueInterrupt (line 146) | queueInterrupt(interruptNumber, data = null) {
method processQueue (line 154) | async processQueue() {
method clearQueue (line 161) | clearQueue() {
method getQueueLength (line 165) | getQueueLength() {
FILE: axiom/application_data/system/kernel/virtualcpu.js
class VirtualCPU (line 6) | class VirtualCPU {
method constructor (line 7) | constructor() {
method initialize (line 46) | async initialize() {
method initializeRegisters (line 61) | initializeRegisters() {
method getCPUInfo (line 78) | getCPUInfo() {
method getState (line 82) | getState() {
method getCounters (line 86) | getCounters() {
method execute (line 91) | async execute(instruction) {
method processInstruction (line 119) | async processInstruction(instruction, worker) {
method findAvailableWorker (line 146) | findAvailableWorker() {
method simulateCycle (line 150) | async simulateCycle(cycles) {
method execMOV (line 159) | execMOV(instruction, worker) {
method execADD (line 165) | execADD(instruction, worker) {
method execSUB (line 173) | execSUB(instruction, worker) {
method execMUL (line 181) | execMUL(instruction, worker) {
method execDIV (line 189) | execDIV(instruction, worker) {
method execJMP (line 200) | execJMP(instruction, worker) {
method execCMP (line 206) | execCMP(instruction, worker) {
method updateFlags (line 213) | updateFlags(worker, result) {
method raiseInterrupt (line 226) | raiseInterrupt(interruptNumber, data = null) {
method halt (line 237) | halt() {
method reset (line 242) | reset() {
FILE: axiom/application_data/system/uiapps/core.ui-notepad.js
class UINotepad (line 14) | class UINotepad {
method constructor (line 15) | constructor(terminal) {
method open (line 26) | async open(filename) {
method enterEditorMode (line 46) | enterEditorMode(filename, content, fileExists) {
method exitEditorMode (line 261) | exitEditorMode(editor) {
method isActive (line 288) | isActive() {
FILE: axiom/application_data/system/vm/container.js
class VMContainer (line 6) | class VMContainer {
method constructor (line 7) | constructor() {
method initialize (line 15) | async initialize() {
method initializeDefaultFS (line 32) | initializeDefaultFS() {
method createDirectory (line 60) | createDirectory(path, skipSave = false, depth = 0) {
method removeDirectory (line 104) | removeDirectory(path) {
method writeFile (line 127) | writeFile(path, content, append = false) {
method readFile (line 178) | readFile(path) {
method deleteFile (line 193) | deleteFile(path) {
method exists (line 210) | exists(path) {
method getFile (line 215) | getFile(path) {
method listDirectory (line 220) | listDirectory(path) {
method changeDirectory (line 255) | changeDirectory(path) {
method getCurrentDirectory (line 277) | getCurrentDirectory() {
method normalizePath (line 281) | normalizePath(path) {
method getParentPath (line 306) | getParentPath(path) {
method getBaseName (line 316) | getBaseName(path) {
method copyFile (line 326) | copyFile(sourcePath, destPath) {
method moveFile (line 332) | moveFile(sourcePath, destPath) {
method saveToStorage (line 338) | saveToStorage() {
method loadFromStorage (line 367) | loadFromStorage() {
method clearStorage (line 399) | clearStorage() {
method getStorageStats (line 406) | getStorageStats() {
FILE: axiom/application_data/system/vm/container.memguard.js
class MemoryGuard (line 6) | class MemoryGuard {
method constructor (line 7) | constructor() {
method initialize (line 16) | async initialize() {
method allocate (line 26) | allocate(size) {
method free (line 84) | free(address) {
method mergeFreeBlocks (line 109) | mergeFreeBlocks() {
method protect (line 128) | protect(address) {
method unprotect (line 138) | unprotect(address) {
method isValidAddress (line 148) | isValidAddress(address) {
method getBlockInfo (line 152) | getBlockInfo(address) {
method getMemoryInfo (line 156) | getMemoryInfo() {
method getAllocatedBlocks (line 177) | getAllocatedBlocks() {
method getFreeBlocks (line 191) | getFreeBlocks() {
method defragment (line 199) | defragment() {
method reset (line 229) | reset() {
method detectLeaks (line 238) | detectLeaks() {
FILE: axiom/application_data/system/vm/emulator.instructions.js
class InstructionSet (line 6) | class InstructionSet {
method constructor (line 7) | constructor() {
method registerInstructions (line 12) | registerInstructions() {
method register (line 58) | register(mnemonic, handler, description) {
method execute (line 66) | execute(instruction, context) {
method inst_mov (line 76) | inst_mov(operands, context) {
method inst_push (line 82) | inst_push(operands, context) {
method inst_pop (line 90) | inst_pop(operands, context) {
method inst_lea (line 100) | inst_lea(operands, context) {
method inst_add (line 106) | inst_add(operands, context) {
method inst_sub (line 114) | inst_sub(operands, context) {
method inst_mul (line 122) | inst_mul(operands, context) {
method inst_div (line 130) | inst_div(operands, context) {
method inst_inc (line 141) | inst_inc(operands, context) {
method inst_dec (line 148) | inst_dec(operands, context) {
method inst_neg (line 155) | inst_neg(operands, context) {
method inst_and (line 162) | inst_and(operands, context) {
method inst_or (line 170) | inst_or(operands, context) {
method inst_xor (line 178) | inst_xor(operands, context) {
method inst_not (line 186) | inst_not(operands, context) {
method inst_shl (line 192) | inst_shl(operands, context) {
method inst_shr (line 199) | inst_shr(operands, context) {
method inst_cmp (line 206) | inst_cmp(operands, context) {
method inst_test (line 214) | inst_test(operands, context) {
method inst_jmp (line 222) | inst_jmp(operands, context) {
method inst_je (line 228) | inst_je(operands, context) {
method inst_jne (line 237) | inst_jne(operands, context) {
method inst_jg (line 246) | inst_jg(operands, context) {
method inst_jl (line 255) | inst_jl(operands, context) {
method inst_jge (line 264) | inst_jge(operands, context) {
method inst_jle (line 273) | inst_jle(operands, context) {
method inst_call (line 282) | inst_call(operands, context) {
method inst_ret (line 290) | inst_ret(operands, context) {
method inst_nop (line 299) | inst_nop(operands, context) {
method inst_hlt (line 303) | inst_hlt(operands, context) {
method inst_int (line 308) | inst_int(operands, context) {
method inst_syscall (line 316) | inst_syscall(operands, context) {
method resolveValue (line 322) | resolveValue(value, context) {
method updateFlags (line 332) | updateFlags(context, result) {
method listInstructions (line 339) | listInstructions() {
FILE: axiom/application_data/system/vm/emulator.js
class VMEmulator (line 6) | class VMEmulator {
method constructor (line 7) | constructor() {
method initialize (line 15) | async initialize() {
method registerSyscalls (line 20) | registerSyscalls() {
method executeSyscall (line 44) | async executeSyscall(syscall, args) {
method sys_open (line 58) | async sys_open(args) {
method sys_close (line 64) | async sys_close(args) {
method sys_read (line 70) | async sys_read(args) {
method sys_write (line 76) | async sys_write(args) {
method sys_lseek (line 82) | async sys_lseek(args) {
method sys_mkdir (line 88) | async sys_mkdir(args) {
method sys_rmdir (line 94) | async sys_rmdir(args) {
method sys_chdir (line 100) | async sys_chdir(args) {
method sys_getcwd (line 106) | async sys_getcwd(args) {
method sys_exit (line 111) | async sys_exit(args) {
method sys_getpid (line 120) | async sys_getpid(args) {
method sys_sleep (line 125) | async sys_sleep(args) {
method sys_malloc (line 131) | async sys_malloc(args) {
method sys_free (line 137) | async sys_free(args) {
method createProcess (line 144) | createProcess(name, code) {
method executeProcess (line 160) | async executeProcess(pid) {
method executeCode (line 184) | async executeCode(code) {
method killProcess (line 195) | killProcess(pid) {
method listProcesses (line 207) | listProcesses() {
FILE: axiom/application_data/webui/app.manifest.js
class AxiomTerminal (line 6) | class AxiomTerminal {
method constructor (line 7) | constructor() {
method initialize (line 26) | async initialize() {
method createInputLine (line 62) | createInputLine() {
method updateInputDisplay (line 98) | updateInputDisplay() {
method handleKeyDown (line 131) | handleKeyDown(event) {
method handleTabCompletion (line 296) | handleTabCompletion(inputSpan) {
method executeCommand (line 347) | async executeCommand(commandLine) {
method executePipeline (line 456) | async executePipeline(commandLine) {
method executePipeCommand (line 527) | async executePipeCommand(command, args, inputData) {
method parseCommand (line 535) | parseCommand(commandLine) {
method expandWildcards (line 581) | expandWildcards(pattern, currentDir = null) {
method hasCommonFlag (line 608) | hasCommonFlag(args, ...flags) {
method filterFlags (line 617) | filterFlags(args, knownFlags = []) {
method registerCommands (line 633) | registerCommands() {
method registerCommand (line 736) | registerCommand(name, handler, description, usage = '', flags = {}) {
method checkHelp (line 740) | checkHelp(args, commandName) {
method cmd_help (line 761) | async cmd_help(args) {
method cmd_clear (line 797) | async cmd_clear(args) {
method cmd_exit (line 802) | async cmd_exit(args) {
method cmd_history (line 812) | async cmd_history(args) {
method loadHistory (line 820) | loadHistory() {
method saveHistory (line 843) | saveHistory() {
method cmd_cleanup (line 864) | async cmd_cleanup(args) {
method cmd_ls (line 974) | async cmd_ls(args) {
method cmd_cd (line 1050) | async cmd_cd(args) {
method cmd_pwd (line 1062) | async cmd_pwd(args) {
method cmd_cat (line 1067) | async cmd_cat(args) {
method cmd_echo (line 1103) | async cmd_echo(args) {
method cmd_touch (line 1137) | async cmd_touch(args) {
method cmd_mkdir (line 1163) | async cmd_mkdir(args) {
method cmd_rm (line 1188) | async cmd_rm(args) {
method cmd_rmdir (line 1241) | async cmd_rmdir(args) {
method cmd_cp (line 1266) | async cmd_cp(args) {
method cmd_mv (line 1288) | async cmd_mv(args) {
method cmd_find (line 1310) | async cmd_find(args) {
method cmd_grep (line 1364) | async cmd_grep(args) {
method cmd_head (line 1430) | async cmd_head(args) {
method cmd_tail (line 1461) | async cmd_tail(args) {
method cmd_wc (line 1492) | async cmd_wc(args) {
method cmd_uname (line 1513) | async cmd_uname(args) {
method cmd_whoami (line 1523) | async cmd_whoami(args) {
method cmd_date (line 1528) | async cmd_date(args) {
method cmd_uptime (line 1533) | async cmd_uptime(args) {
method cmd_free (line 1544) | async cmd_free(args) {
method cmd_df (line 1553) | async cmd_df(args) {
method cmd_ps (line 1568) | async cmd_ps(args) {
method cmd_top (line 1579) | async cmd_top(args) {
method cmd_cpuinfo (line 1597) | async cmd_cpuinfo(args) {
method cmd_lscpu (line 1612) | async cmd_lscpu(args) {
method cmd_env (line 1617) | async cmd_env(args) {
method cmd_export (line 1627) | async cmd_export(args) {
method cmd_unset (line 1645) | async cmd_unset(args) {
method print (line 1660) | print(text) {
method printLine (line 1668) | printLine(text, className = '') {
method clearScreen (line 1679) | clearScreen() {
method clear (line 1684) | clear() {
method updatePrompt (line 1688) | updatePrompt(prompt) {
method updateStatus (line 1698) | updateStatus(status) {
method scrollToBottom (line 1702) | scrollToBottom() {
method setupContextMenu (line 1706) | setupContextMenu() {
method loadAliases (line 1792) | loadAliases() {
method saveAliases (line 1821) | saveAliases() {
method cmd_wget (line 1842) | async cmd_wget(args) {
method cmd_curl (line 1915) | async cmd_curl(args) {
method cmd_ping (line 1980) | async cmd_ping(args) {
method cmd_netstat (line 2025) | async cmd_netstat(args) {
method cmd_man (line 2035) | async cmd_man(args) {
method cmd_which (line 2064) | async cmd_which(args) {
method cmd_alias (line 2084) | async cmd_alias(args) {
method cmd_ln (line 2115) | async cmd_ln(args) {
method cmd_sort (line 2145) | async cmd_sort(args) {
method cmd_uniq (line 2164) | async cmd_uniq(args) {
method cmd_diff (line 2199) | async cmd_diff(args) {
method cmd_tree (line 2242) | async cmd_tree(args) {
method cmd_ui_notepad (line 2363) | async cmd_ui_notepad(args) {
FILE: legacy_tandem/viewer/app/code/app.toolbox.events.js
function show (line 37) | function show(el) {
function hide (line 51) | function hide() { tip.classList.remove('visible'); }
FILE: legacy_tandem/viewer/app/code/app.toolbox.modal.js
function copyLink (line 7) | function copyLink() {
function openActionsModal (line 20) | function openActionsModal() {
function closeActionsModal (line 24) | function closeActionsModal() {
FILE: legacy_tandem/viewer/app/code/app.toolbox.navigation.js
function loadSite (line 7) | function loadSite(index) {
function navigate (line 73) | function navigate(direction) {
function selectSite (line 78) | function selectSite(idx) {
function syncUrl (line 82) | function syncUrl(siteId) {
function triggerInfoAnimation (line 90) | function triggerInfoAnimation(cb) {
function toggleDropdown (line 98) | function toggleDropdown() {
function closeDropdown (line 104) | function closeDropdown() {
function updateDropdownState (line 110) | function updateDropdownState(index) {
FILE: legacy_tandem/viewer/app/code/app.viewer.init.js
function init (line 7) | function init() {
FILE: legacy_tandem/viewer/app/code/app.viewer.js
function getPanelH (line 51) | function getPanelH() {
function clearFramePhoneStyles (line 57) | function clearFramePhoneStyles() {
function reloadFrame (line 71) | function reloadFrame(src) {
function calcPhoneScale (line 87) | function calcPhoneScale() {
FILE: legacy_tandem/viewer/app/code/app.viewer.loader.js
function startProgress (line 7) | function startProgress() {
function finishProgress (line 24) | function finishProgress() {
FILE: legacy_tandem/viewer/app/code/app.viewer.mobile.js
constant PHONE_FORMATS (line 7) | const PHONE_FORMATS = [
function togglePhonePreview (line 57) | function togglePhonePreview() {
function applyPhoneFormat (line 80) | function applyPhoneFormat() {
function positionPanels (line 97) | function positionPanels(w) {
function initPhonePanels (line 105) | function initPhonePanels() {
function selectFormat (line 120) | function selectFormat(id) {
function renderDevices (line 130) | function renderDevices() {
FILE: legacy_tandem/viewer/app/code/no-toolbox-viewer/index.loader.js
function showError (line 8) | function showError() {
function loadFrame (line 14) | function loadFrame(src) {
function loadById (line 22) | function loadById(id) {
FILE: legacy_tandem/viewer/index.db.js
constant TANDEM_SITES (line 14) | const TANDEM_SITES = [
FILE: legacy_tandem/viewer/works/example-astra/js/main.js
function animateCounter (line 47) | function animateCounter(el, target, duration) {
function maybeStartCounters (line 62) | function maybeStartCounters() {
function handleSubmit (line 83) | function handleSubmit(e) {
function flipShuffle (line 127) | function flipShuffle() {
FILE: legacy_tandem/viewer/works/example-jstd/app/i18n.js
function snapshotRu (line 273) | function snapshotRu() {
function detectLang (line 296) | function detectLang() {
function applyLang (line 306) | function applyLang(lang) {
function init (line 364) | function init() {
FILE: legacy_tandem/viewer/works/example-jstd/app/main.js
function resize (line 32) | function resize() {
function createStar (line 43) | function createStar() {
function initBlobs (line 57) | function initBlobs() {
function cacheGradients (line 68) | function cacheGradients() {
function init (line 78) | function init() {
function draw (line 84) | function draw(ts = 0) {
function hexToRgba (line 167) | function hexToRgba(hex, a) {
function scrambleLabel (line 190) | function scrambleLabel(newText, newColor) {
function setLevel (line 222) | function setLevel(name) {
function animateNum (line 258) | function animateNum(el, target, decimals, suffix, duration) {
function showRule (line 271) | function showRule(i, pct) {
function animateBar (line 277) | function animateBar(target) {
function fireMilestone (line 297) | function fireMilestone(idx) {
function resetDetection (line 306) | function resetDetection() {
function scrambleOut (line 324) | function scrambleOut(callback) {
function tick (line 379) | function tick() {
function escHtml (line 420) | function escHtml(s) {
function scaleCanvas (line 440) | function scaleCanvas(c) {
function buildPositions (line 470) | function buildPositions(n, H) {
function drawLayer (line 483) | function drawLayer(L, tick) {
function frame (line 538) | function frame() {
function step (line 631) | function step(now) {
function getPerView (line 665) | function getPerView(wrapW) {
function applyCardSizes (line 671) | function applyCardSizes() {
function getTotal (line 683) | function getTotal() {
function buildDots (line 688) | function buildDots() {
function goTo (line 701) | function goTo(idx) {
function next (line 711) | function next() { goTo(current + 1 < getTotal() ? current + 1 : 0); }
function prev (line 713) | function prev() { goTo(current - 1 >= 0 ? current - 1 : getTotal() - 1); }
function startAuto (line 715) | function startAuto() { autoTimer = setInterval(next, 5000); }
function stopAuto (line 717) | function stopAuto() { clearInterval(autoTimer); }
FILE: legacy_tandem/viewer/works/example-pcbuilder/js/components.js
constant COMPONENTS (line 21) | const COMPONENTS = {
FILE: legacy_tandem/viewer/works/example-pcbuilder/js/main.js
constant BUILD (line 11) | const BUILD = {
constant LABELS (line 22) | const LABELS = {
function initHeroCanvas (line 43) | function initHeroCanvas() {
function initBurgerMenu (line 122) | function initBurgerMenu() {
function initScrollAnimations (line 155) | function initScrollAnimations() {
function renderSection (line 178) | function renderSection(category, items, filter) {
function renderAllSections (line 231) | function renderAllSections() {
function renderMotherboards (line 245) | function renderMotherboards() {
function selectComponent (line 253) | function selectComponent(category, id, sourceArray) {
function updateSummary (line 290) | function updateSummary() {
function calcTotal (line 320) | function calcTotal() {
function checkCompatibility (line 325) | function checkCompatibility() {
function renderCompatibility (line 363) | function renderCompatibility(errors, warnings) {
function downloadConfig (line 405) | function downloadConfig() {
function startGlitch (line 519) | function startGlitch() {
function highlightRecommendedPsu (line 532) | function highlightRecommendedPsu() {
FILE: libs/server.js
function API_State (line 1) | async function API_State() {
FILE: libs/ultra-hash-v3.4.js
function ultraHash (line 7) | function ultraHash(str, difficulty = 1, salt = "") {
FILE: mov/@my-profile-test/script.js
function eW (line 1) | function eW(B,W,K,j,D){return DosX_W(B- -DosX_ms_B,D)}
function eB (line 1) | function eB(B,W,K,j,D){return DosX_W(B- -DosX_mY_B,D)}
function ej (line 1) | function ej(B,W,K,j,D){return DosX_W(B- -DosX_P2_B,D)}
function ep (line 1) | function ep(B,W,K,j,D){return DosX_W(D- -DosX_P4_B,B)}
function ey (line 1) | function ey(B,W,K,j,D){return DosX_W(W-DosX_P5_B,D)}
function DosX_eD (line 1) | function DosX_eD(B,W,K,j,D){return DosX_W(j- -912,K)}
function DosX_W (line 1) | function DosX_W(B,o){B-=406;var f,q=DosX_q(),W=q[B];void 0===DosX_W.CZkK...
function DosX_ee (line 1) | function DosX_ee(B,W,K,j,D){return DosX_W(W- -298,D)}
function DosX_en (line 1) | function DosX_en(B,W,K,j,D){return DosX_W(W- -708,K)}
function DosX_q (line 1) | function DosX_q(){var RJ=["0OVtLTcS0lC","07BrG9gk07NtPHFqLDom058","0A/sQ...
function DosX_eI (line 1) | function DosX_eI(B,W,K,j,D){return DosX_W(j-643,K)}
function DosX_em (line 1) | function DosX_em(B,W,K,j,D){return DosX_W(j-928,B)}
function e (line 1) | function e(){var DosX_Pi_U=695,DosX_Pi_N=1539,DosX_Pi_R=673,DosX_Pi_V="J...
function n (line 1) | function n(){var DosX_PP_U=3825,DosX_PP_X=3272,DosX_PP_N=3507,DosX_PP_R=...
function s (line 1) | function s(){var DosX_PQ_D="6Gdc",DosX_PQ_U=4547,DosX_PQ_X=7316,DosX_PQ_...
function c (line 1) | function c(B){var DosX_PF_B=1832,DosX_PF_W=159,DosX_PF_K=838,DosX_PF_D="...
function l (line 1) | function l(){var DosX_PT_U=4154,DosX_PT_N=4151,DosX_PT_R=2980,DosX_PT_V=...
function r (line 1) | function r(){var DosX_C4_K="9P*O",DosX_C4_U="0jPz",DosX_C4_X=4052,DosX_C...
function d (line 1) | function d(W){var DosX_Cb_U="TEJX",DosX_Cb_X=6061,DosX_Cb_V=8956,DosX_Cb...
function o (line 1) | function o(B,W,K){var DosX_Cc_U="qQCK",DosX_Cc_X=7511,DosX_Cc_N=6302,Dos...
function f (line 1) | function f(W,K,j,D,U,X){var DosX_U3_U=2433,DosX_U3_X="wZHi",DosX_U3_N=11...
function m (line 1) | function m(W,K){var DosX_Uf_U=2339,DosX_Uf_X=1545,DosX_Uf_N="*$d[",DosX_...
function u (line 1) | function u(j,D,U){var DosX_UD_B=4407,DosX_UD_K=402,DosX_UD_j=1792,DosX_U...
function _ (line 1) | function _(W,K,j){var DosX_UL_W="p#OH",DosX_UL_U=1899,DosX_UL_R=630,DosX...
function w (line 1) | function w(K,j,D){var DosX_XV_j="TEJX",DosX_XV_U=1969,DosX_XV_X=1632,Dos...
function b (line 1) | function b(){var DosX_N7_W="f$Am",DosX_N7_U=8682,DosX_N7_X="hP1P",DosX_N...
function t (line 1) | function t(W,K,j,D,U,X,N,R){var DosX_Nj_W="@z9)",DosX_Nj_U=1382,DosX_Nj_...
function M (line 1) | function M(W,K){var DosX_NC_U="piSq",DosX_NC_X=8035,DosX_NC_N=4211,DosX_...
function S (line 1) | function S(W,K,j,D,U,X){var DosX_Na_U=10985,DosX_Na_X="7Or@",DosX_Na_N=1...
function q (line 1) | function q(W,K,j,D,U,X){var DosX_NH_K="6Gdc",DosX_NH_U=5028,DosX_NH_X=29...
function T (line 1) | function T(W,K,j){var V,O,H,DosX_NM_U=1541,DosX_NM_X="euG2",DosX_NM_N=28...
function I (line 1) | function I(W,K,j,D,U,X,N){var DosX_Nx_U="v$9*",DosX_Nx_X=3285,DosX_Nx_N=...
function E (line 1) | function E(W){var DosX_R6_B="euG2",DosX_R6_U="#eLW",DosX_R6_X=4611,DosX_...
function A (line 1) | function A(W){var DosX_Re_j="qQCK",DosX_Re_U="QYGq",DosX_Re_X=1878,DosX_...
function C (line 1) | function C(B,W){var DosX_RU_U=8873,DosX_RU_X=6610,DosX_RU_N=7744,DosX_RU...
function P (line 1) | function P(){var DosX_Ra_X=1501,DosX_Ra_N=318,DosX_Ra_V="GEgV",DosX_Ra_O...
function k (line 1) | function k(B){var DosX_Rg_U=2624,DosX_Rg_X=1643,DosX_Rg_V="i8^y",DosX_Rg...
function mF (line 1) | function mF(B,W,K,j,D){return DosX_em(K,W-DosX_RE_B,K-DosX_RE_W,D- -DosX...
function mg (line 1) | function mg(B,W,K,j,D){return DosX_en(B-DosX_Rl_B,B-DosX_Rl_W,W,j-DosX_R...
function ml (line 1) | function ml(B,W,K,j,D){return DosX_ee(B-DosX_RF_B,D- -DosX_RF_W,K-DosX_R...
function md (line 1) | function md(B,W,K,j,D){return DosX_ee(B-DosX_RS_B,B-DosX_RS_W,K-DosX_RS_...
function mE (line 1) | function mE(B,W,K,j,D){return DosX_eD(B-DosX_RM_B,W-DosX_RM_W,W,j-DosX_R...
function mS (line 1) | function mS(B,W,K,j,D){return mE(B-DosX_Rt_B,B,0,W- -DosX_Rt_K,D-DosX_Rt...
function mt (line 1) | function mt(B,W,K,j){return md(K- -DosX_Rc_B,0,K-DosX_Rc_K,j-DosX_Rc_j,j)}
function mc (line 1) | function mc(B,W,K,j){return md(B- -DosX_Rs_B,0,K-DosX_Rs_K,j-DosX_Rs_j,W)}
function mZ (line 1) | function mZ(B,W,K,j){return md(B- -DosX_RT_B,0,K-DosX_RT_K,j-DosX_RT_j,W)}
FILE: mov/js/jquery.mCustomScrollbar.js
function _mwt (line 1044) | function _mwt(){
function _iframe (line 1206) | function _iframe(evt){
function _drag (line 1212) | function _drag(dragY,dragX,y,x){
function _onTouchstart (line 1271) | function _onTouchstart(e){
function _onTouchmove (line 1280) | function _onTouchmove(e){
function _onTouchstart2 (line 1310) | function _onTouchstart2(e){
function _onTouchend (line 1321) | function _onTouchend(e){
function _m (line 1346) | function _m(ds,s){
function _drag (line 1358) | function _drag(amount,dur,easing,dir,overwrite,drag){
function _sel (line 1407) | function _sel(){
function _seq (line 1411) | function _seq(a,c,s){
function _onMousewheel (line 1447) | function _onMousewheel(e,delta){
function _seq (line 1623) | function _seq(a,c){
function _onKeyboard (line 1661) | function _onKeyboard(e){
function _on (line 1748) | function _on(once){
function _off (line 1773) | function _off(){
function upd (line 1882) | function upd(){
function imgSum (line 1921) | function imgSum(){
function imgLoader (line 1927) | function imgLoader(el){
function sizesSum (line 1942) | function sizesSum(){
function doUpd (line 1949) | function doUpd(cb){
function _cb (line 2102) | function _cb(cb){
function _cbOffsets (line 2106) | function _cbOffsets(){
function _mcs (line 2121) | function _mcs(){
function _step (line 2156) | function _step(){
function _tween (line 2167) | function _tween(){
function _startTween (line 2176) | function _startTween(){
function _cancelTween (line 2182) | function _cancelTween(){
function _ease (line 2188) | function _ease(t,b,c,d,type){
FILE: mov/js/jquery.mousewheel.js
function handler (line 93) | function handler(event) {
function nullLowestDelta (line 206) | function nullLowestDelta() {
function shouldAdjustOldDeltas (line 210) | function shouldAdjustOldDeltas(orgEvent, absDelta) {
FILE: mov/js/main.js
function scrollbar (line 211) | function scrollbar() {
FILE: mov/js/modernizr.custom.js
function x (line 4) | function x(a){j.cssText=a}
function y (line 4) | function y(a,b){return x(prefixes.join(a+";")+(b||""))}
function z (line 4) | function z(a,b){return typeof a===b}
function A (line 4) | function A(a,b){return!!~(""+a).indexOf(b)}
function B (line 4) | function B(a,b){for(var d in a){var e=a[d];if(!A(e,"-")&&j[e]!==c)return...
function C (line 4) | function C(a,b,d){for(var e in a){var f=b[a[e]];if(f!==c)return d===!1?a...
function D (line 4) | function D(a,b,c){var d=a.charAt(0).toUpperCase()+a.slice(1),e=(a+" "+n....
function l (line 4) | function l(a,b){var c=a.createElement("p"),d=a.getElementsByTagName("hea...
function m (line 4) | function m(){var a=s.elements;return typeof a=="string"?a.split(" "):a}
function n (line 4) | function n(a){var b=j[a[h]];return b||(b={},i++,a[h]=i,j[i]=b),b}
function o (line 4) | function o(a,c,d){c||(c=b);if(k)return c.createElement(a);d||(d=n(c));va...
function p (line 4) | function p(a,c){a||(a=b);if(k)return a.createDocumentFragment();c=c||n(a...
function q (line 4) | function q(a,b){b.cache||(b.cache={},b.createElem=a.createElement,b.crea...
function r (line 4) | function r(a){a||(a=b);var c=n(a);return s.shivCSS&&!g&&!c.hasCSS&&(c.ha...
function d (line 4) | function d(a){return"[object Function]"==o.call(a)}
function e (line 4) | function e(a){return"string"==typeof a}
function f (line 4) | function f(){}
function g (line 4) | function g(a){return!a||"loaded"==a||"complete"==a||"uninitialized"==a}
function h (line 4) | function h(){var a=p.shift();q=1,a?a.t?m(function(){("c"==a.t?B.injectCs...
function i (line 4) | function i(a,c,d,e,f,i,j){function k(b){if(!o&&g(l.readyState)&&(u.r=o=1...
function j (line 4) | function j(a,b,c,d,f){return q=0,b=b||"j",e(a)?i("c"==b?v:u,a,b,this.i++...
function k (line 4) | function k(){var a=B;return a.loader={load:j,i:0},a}
function b (line 4) | function b(a){var a=a.split("!"),b=x.length,c=a.pop(),d=a.length,c={url:...
function g (line 4) | function g(a,e,f,g,h){var i=b(a),j=i.autoCallback;i.url.split(".").pop()...
function h (line 4) | function h(a,b){function c(a,c){if(a){if(e(a))c||(j=function(){var a=[]....
FILE: mov/js/mov.js
method JoinMethod (line 1) | JoinMethod(){return atob(a0_0x5868(252))}
method InviteKey (line 1) | InviteKey(){return atob(a0_0x5868(264))}
method UrlProtocolName (line 1) | UrlProtocolName(){return"TG"}
method ArgumentsBegin (line 1) | ArgumentsBegin(){return"? "[a0_0x5868(245)]()}
method ArgumentsAnd (line 1) | ArgumentsAnd(){return"& "[a0_0x5868(245)]()}
method SetArgumentPromptValue (line 1) | SetArgumentPromptValue(){return"= ".trim()}
function a0_0x5868 (line 1) | function a0_0x5868(e,a){let t=a0_0x3ed1();return(a0_0x5868=function(e,a)...
function a0_0x3ed1 (line 1) | function a0_0x3ed1(){let e=["floor","random","InviteKey","MTI4NDM5MDc5Mz...
function invite (line 1) | function invite(){let _0x2efa0e=a0_0x5868;window[_0x2efa0e(242)](_0x2efa...
function _ (line 1) | function _(){return a0_0x5868(233)}
function key_c (line 1) | function key_c(){var a=a0_0x5868,t=a(262);let r="";for(let e=0;e<150;e++...
FILE: mov/js/src_mov.js
method JoinMethod (line 3) | JoinMethod() {
method InviteKey (line 6) | InviteKey() {
method UrlProtocolName (line 9) | UrlProtocolName() {
method ArgumentsBegin (line 15) | ArgumentsBegin() {
method ArgumentsAnd (line 18) | ArgumentsAnd() {
method SetArgumentPromptValue (line 21) | SetArgumentPromptValue() {
function invite (line 32) | function invite() {
function _ (line 86) | function _() {
function key_c (line 90) | function key_c() {
FILE: mov/js/vegas-youtube-mobile.js
function go (line 452) | function go () {
FILE: mov/js/vegas.js
function go (line 474) | function go () {
FILE: safenova/js/constants.js
constant DB_NAME (line 6) | const DB_NAME = 'SafeNofaEFS';
constant DB_VERSION (line 7) | const DB_VERSION = 2;
constant CONTAINER_LIMIT (line 8) | const CONTAINER_LIMIT = 8 * 1024 * 1024 * 1024;
constant DEVICE_LIMIT (line 9) | const DEVICE_LIMIT = 20 * 1024 * 1024 * 1024;
constant PBKDF2_ITER (line 10) | const PBKDF2_ITER = 200_000;
constant ARGON2_MEM (line 11) | const ARGON2_MEM = 19456;
constant ARGON2_ITER (line 12) | const ARGON2_ITER = 2;
constant ARGON2_PAR (line 13) | const ARGON2_PAR = 1;
constant VERIFY_TEXT (line 14) | const VERIFY_TEXT = 'SafeNofaEFS-VERIFY-OK';
constant ICON_W (line 15) | const ICON_W = 84, ICON_H = 90;
constant ICON_H (line 15) | const ICON_W = 84, ICON_H = 90;
constant GRID_X (line 16) | let GRID_X = 96;
constant GRID_Y (line 17) | let GRID_Y = 96;
function uid (line 22) | function uid() {
function fmtSize (line 28) | function fmtSize(b) {
function fmtDate (line 35) | function fmtDate(ts) {
function getExt (line 41) | function getExt(name) {
function getMime (line 46) | function getMime(name) {
function isText (line 72) | function isText(mime, name) {
function isImage (line 76) | function isImage(mime) { return mime.startsWith('image/'); }
function isAudio (line 77) | function isAudio(mime) { return mime.startsWith('audio/'); }
function isVideo (line 78) | function isVideo(mime) { return mime.startsWith('video/'); }
function isPDF (line 79) | function isPDF(mime) { return mime === 'application/pdf'; }
function buf2b64 (line 81) | function buf2b64(buf) { return btoa(String.fromCharCode(...new Uint8Arra...
function b642buf (line 82) | function b642buf(s) {
function pwStrength (line 88) | function pwStrength(pw) {
function escHtml (line 98) | function escHtml(str) {
constant FOLDER_COLORS (line 107) | const FOLDER_COLORS = [
function getFolderSVG (line 162) | function getFolderSVG(color) {
function getFileIconSVG (line 170) | function getFileIconSVG(mime, name) {
function _bigIcon (line 192) | function _bigIcon(color, inner) {
function _filePath (line 200) | function _filePath() { return `<path d="M16 26h16M16 31h12" stroke="COLO...
function _textPath (line 201) | function _textPath() { return `<path d="M16 23h16M16 28h16M16 33h11" str...
function _codePath (line 202) | function _codePath() { return `<path d="M19 22l-5 5 5 5M29 22l5 5-5 5M25...
function _dataPath (line 203) | function _dataPath() { return `<path d="M15 25h18M21 20v14M27 20v14" str...
function _imgPath (line 204) | function _imgPath() { return `<rect x="15" y="20" width="18" height="14"...
function _audioPath (line 205) | function _audioPath() { return `<circle cx="24" cy="27" r="6" stroke="CO...
function _videoPath (line 206) | function _videoPath() { return `<rect x="13" y="21" width="15" height="1...
function _pdfPath (line 207) | function _pdfPath() { return `<path d="M15 23h8M15 28h10M15 33h13" strok...
function _archivePath (line 208) | function _archivePath() { return `<path d="M22 4v40M18 12h8M18 18h8M18 2...
function _docPath (line 209) | function _docPath() { return `<path d="M16 23h16M16 28h16M16 33h10" stro...
function _slidePath (line 210) | function _slidePath() { return `<rect x="14" y="20" width="20" height="1...
function _bigIconExt (line 212) | function _bigIconExt(color, extText) {
FILE: safenova/js/crypto.js
function deriveKey (line 8) | async function deriveKey(password, salt) {
function encrypt (line 27) | async function encrypt(key, data) {
function decrypt (line 38) | async function decrypt(key, iv, blobB64) {
function encryptBin (line 44) | async function encryptBin(key, buf) {
function decryptBin (line 50) | async function decryptBin(key, iv, blob) {
function makeVerification (line 54) | async function makeVerification(key) {
function checkVerification (line 59) | async function checkVerification(key, iv, blob) {
FILE: safenova/js/db.js
function init (line 9) | async function init() {
function rw (line 30) | function rw(store) { return _db.transaction(store, 'readwrite').objectSt...
function ro (line 31) | function ro(store) { return _db.transaction(store, 'readonly').objectSto...
function wrap (line 32) | function wrap(req) { return new Promise((r, j) => { req.onsuccess = () =...
method nukeContainer (line 53) | async nukeContainer(cid) {
FILE: safenova/js/desktop.js
function saveVFS (line 6) | async function saveVFS() {
function showCtxMenu (line 25) | function showCtxMenu(x, y, items) {
function showSubmenu (line 71) | function showSubmenu(parentEl, items) {
function hideSubmenu (line 152) | function hideSubmenu() {
function hideCtxMenu (line 158) | function hideCtxMenu() {
function _startHoverTooltip (line 172) | function _startHoverTooltip(el, node) {
function _cancelHoverTooltip (line 207) | function _cancelHoverTooltip() {
constant SETTINGS_DEFAULTS (line 215) | const SETTINGS_DEFAULTS = { iconSize: 'normal', gridDots: true, autoLock...
function _resetContainerSettings (line 219) | function _resetContainerSettings() {
function _getSettings (line 233) | function _getSettings() {
function _applySettings (line 238) | function _applySettings(s) {
function _saveSettings (line 266) | async function _saveSettings(s) {
function _resetAutoLockTimer (line 272) | function _resetAutoLockTimer() {
function openSettings (line 288) | function openSettings() {
constant STATS_COLORS (line 390) | const STATS_COLORS = ['#0078d4','#e74856','#16c60c','#f9f1a5','#b4009e',...
function _renderStats (line 392) | function _renderStats() {
function _snapFreeCell (line 454) | function _snapFreeCell(rawX, rawY, occupied) {
function _buildIconEl (line 473) | function _buildIconEl(node, pos) {
method render (line 529) | render() {
method _renderBreadcrumb (line 542) | _renderBreadcrumb() {
method _renderIcons (line 567) | _renderIcons() {
method _patchIcons (line 609) | _patchIcons() {
method _onIconMousedown (line 667) | _onIconMousedown(e, el, node) {
method _initTouchDrag (line 1060) | _initTouchDrag(area) {
method _openNode (line 1218) | _openNode(node) {
method _contextIcon (line 1228) | _contextIcon(e, node) {
method _contextDesktop (line 1269) | _contextDesktop(e) {
method _updateSelectionBar (line 1312) | _updateSelectionBar() {
method updateTaskbar (line 1325) | updateTaskbar() {
method initEvents (line 1338) | initEvents() {
method _startRubberBand (line 1422) | _startRubberBand(e) {
method _onKey (line 1452) | _onKey(e) {
method open (line 1486) | open(folderId) {
method close (line 1505) | close(win) {
method closeAll (line 1510) | closeAll() {
method renderAll (line 1515) | renderAll() {
method nextZ (line 1519) | nextZ() { return ++this._z; }
class FolderWindow (line 1525) | class FolderWindow {
method constructor (line 1526) | constructor(folderId) {
method _build (line 1535) | _build() {
method _bindEvents (line 1614) | _bindEvents() {
method _setCtx (line 1713) | _setCtx() {
method _withCtxSync (line 1720) | _withCtxSync(fn) {
method _makeDraggable (line 1727) | _makeDraggable(handle) {
method bringToFront (line 1747) | bringToFront() { this.el.style.zIndex = WinManager.nextZ(); }
method render (line 1750) | render() {
method _makeIcon (line 1833) | _makeIcon(node, pos, idx = 0) {
method _onIconMousedown (line 1856) | _onIconMousedown(e, el, node) {
method _openNode (line 2399) | _openNode(node) {
method _startRubberBand (line 2418) | _startRubberBand(e) {
method _ctxDesktop (line 2446) | _ctxDesktop(e) {
method _ctxIcon (line 2489) | _ctxIcon(e, node) {
method _addResizeHandle (line 2527) | _addResizeHandle() {
method _updateStatus (line 2546) | _updateStatus() {
method _onKey (line 2553) | _onKey(e) {
FILE: safenova/js/fileops.js
function sanitizeFilename (line 6) | function sanitizeFilename(name) {
function uploadFiles (line 17) | async function uploadFiles(files) {
function _readAllEntries (line 68) | function _readAllEntries(reader) {
function _uploadFileEntry (line 83) | async function _uploadFileEntry(fileEntry, targetFolderId) {
function _uploadDirEntry (line 101) | async function _uploadDirEntry(dirEntry, targetFolderId, depth) {
function uploadEntries (line 123) | async function uploadEntries(dataTransferItems, targetFolderId) {
function openFile (line 166) | async function openFile(node) {
function downloadFile (line 192) | async function downloadFile(node) {
function downloadBuf (line 205) | function downloadBuf(buf, name, mime) {
function _confirmExport (line 213) | function _confirmExport(node, buf, mime) {
function deleteSelected (line 227) | async function deleteSelected() {
function newTextFile (line 281) | function newTextFile() {
function createTextFile (line 299) | async function createTextFile() {
function newFolder (line 342) | function newFolder() {
function createFolder (line 358) | async function createFolder() {
function renameNode (line 395) | function renameNode(node) {
function copyItems (line 438) | function copyItems() {
function cutItems (line 442) | function cutItems() {
function _dedupName (line 465) | function _dedupName(folderId, name) {
function pasteItems (line 475) | async function pasteItems() {
function deepCopy (line 518) | async function deepCopy(nodeId, newParent, newName) {
function selectAll (line 535) | function selectAll() {
function sortIcons (line 545) | function sortIcons(by = 'name', dir = 'asc', winCtx = null) {
function canEditAsText (line 583) | function canEditAsText(node) {
function openFileAsText (line 609) | async function openFileAsText(node) {
function _folderSize (line 641) | function _folderSize(folderId) {
function showProps (line 652) | function showProps(node) {
function openEditor (line 679) | function openEditor(node, buf) {
function saveEditor (line 706) | async function saveEditor() {
function closeEditor (line 737) | function closeEditor() {
function discardEditor (line 749) | function discardEditor() {
function saveAndCloseEditor (line 754) | async function saveAndCloseEditor() {
function openViewer (line 764) | function openViewer(node, buf, mime) {
function _buildCustomPlayer (line 793) | function _buildCustomPlayer(url, kind) {
function closeViewer (line 944) | function closeViewer() {
function _applyCutStyles (line 956) | function _applyCutStyles() {
function cancelClipboard (line 965) | function cancelClipboard() {
function _escXml (line 973) | function _escXml(s) {
function _readZip (line 977) | function _readZip(buffer) {
function _crc32 (line 1007) | function _crc32(data) {
function _buildZip (line 1023) | function _buildZip(entries) {
function exportAsZip (line 1082) | async function exportAsZip(nodeIds, zipName) {
function _buf2b64Safe (line 1116) | function _buf2b64Safe(buf) {
function _askExportPassword (line 1125) | function _askExportPassword(c) {
function exportContainerFile (line 1168) | async function exportContainerFile(c) {
function importContainerFile (line 1244) | async function importContainerFile(file) {
function _askImportPassword (line 1352) | function _askImportPassword(containerName, salt, verIv, verBlob, zipEntr...
function generateThumb (line 1410) | async function generateThumb(node) {
FILE: safenova/js/home.js
function _loadCardOrder (line 7) | function _loadCardOrder() {
function _saveCardOrder (line 10) | function _saveCardOrder(ids) {
method render (line 15) | async render() {
method _makeCard (line 82) | _makeCard(c) {
function showContainerMenu (line 195) | function showContainerMenu(e, c) {
function killSession (line 231) | function killSession(c) {
function openChangePasswordModal (line 239) | function openChangePasswordModal(c) {
function doChangePassword (line 249) | async function doChangePassword() {
function openRenameContainerModal (line 334) | function openRenameContainerModal(c) {
function doRenameContainer (line 345) | async function doRenameContainer() {
function confirmDeleteContainer (line 368) | function confirmDeleteContainer(c) {
function _crc32str (line 402) | function _crc32str(str) {
function _uaCrc (line 412) | function _uaCrc() { return _crc32str(navigator.userAgent); }
function _setHwBtn (line 423) | function _setHwBtn(state) {
function _hwKeyBtnClick (line 430) | async function _hwKeyBtnClick() {
function openNewContainerModal (line 441) | function openNewContainerModal() {
function _webAuthnSalt (line 461) | async function _webAuthnSalt() {
function createContainer (line 485) | async function createContainer() {
function updatePwStrength (line 533) | function updatePwStrength(pw) {
function _startUnlockCooldown (line 552) | function _startUnlockCooldown(c) {
function openUnlockView (line 574) | function openUnlockView(c) {
function doUnlock (line 603) | async function doUnlock() {
function deleteContainerConfirmed (line 706) | async function deleteContainerConfirmed() {
function _resumeSession (line 733) | async function _resumeSession(c, pw) {
FILE: safenova/js/main.js
function togglePwEye (line 6) | function togglePwEye(inputId, btnId) {
function initEvents (line 23) | function initEvents() {
FILE: safenova/js/state.js
method init (line 17) | async init() {
method showView (line 33) | showView(name) {
method backToMenu (line 40) | async backToMenu() {
method lockContainer (line 60) | async lockContainer() {
function showLoading (line 93) | function showLoading(msg = 'Processing...') {
function hideLoading (line 97) | function hideLoading() {
function toast (line 104) | function toast(msg, type = 'info') {
method show (line 125) | show(modalId) {
method hide (line 136) | hide() {
function updateStorageInfo (line 160) | async function updateStorageInfo() {
function checkStorageSpace (line 221) | async function checkStorageSpace(needed) {
FILE: safenova/js/vfs.js
constant VFS (line 6) | const VFS = (() => {
function init (line 10) | function init() {
function fromObj (line 15) | function fromObj(obj) {
function toObj (line 29) | function toObj() { return { nodes: _nodes, pos: _pos }; }
function children (line 31) | function children(pid) { return Object.values(_nodes).filter(n => n.pare...
function getPos (line 33) | function getPos(pid, nid) { return (_pos[pid] || {})[nid] || null; }
function setPos (line 34) | function setPos(pid, nid, x, y) { if (!_pos[pid]) _pos[pid] = {}; _pos[p...
function delPos (line 35) | function delPos(pid, nid) { if (_pos[pid]) delete _pos[pid][nid]; }
function add (line 37) | function add(nd) {
function remove (line 42) | function remove(id) {
function rename (line 52) | function rename(id, newName) {
function move (line 56) | function move(id, newParentId) {
function totalSize (line 69) | function totalSize() {
function breadcrumb (line 75) | function breadcrumb(folderId) {
function fullPath (line 85) | function fullPath(nodeId) {
function autoPos (line 100) | function autoPos(pid, idx, area) {
function node (line 120) | function node(id) { return _nodes[id]; }
function hasChildNamed (line 122) | function hasChildNamed(pid, name) {
function wouldCycle (line 127) | function wouldCycle(id, newParentId) {
function remapPositions (line 133) | function remapPositions(oldGX, oldGY, newGX, newGY) {
FILE: scripts/www/js-daemon.js
function watchAllFunctions (line 17) | function watchAllFunctions(obj, exclude = []) {
function __test (line 65) | function __test() {}
FILE: server-0/antropove.ru/script.js
function initializeSocialLinks (line 4) | function initializeSocialLinks() {
function createParticles (line 117) | function createParticles() {
function isWinter (line 167) | function isWinter() {
function createSnowflake (line 173) | function createSnowflake() {
function startSnow (line 200) | function startSnow() {
function stopSnow (line 231) | function stopSnow() {
FILE: server-0/antropove.ru/script.resources.js
constant RESOURCES (line 3) | const RESOURCES = {
FILE: tanki-online-unoff-client/TapkiOnline/app/entry.js
function stdConsole (line 12) | function stdConsole(functionName, message) { // Обнуление и вызов процед...
function isNative (line 17) | function isNative(f) { // Процедура проверки функций на нативность
function measureTime (line 23) | function measureTime(func, ...args) {
function formatNumber (line 30) | function formatNumber(inNumber) { return inNumber.toString().replace(/\B...
function getRandomNumber (line 31) | function getRandomNumber(min, max) { return Math.floor(Math.random() * (...
function getRandomArrayElement (line 32) | function getRandomArrayElement(arr) { return arr[getRandomNumber(0, arr....
function getMainDomain (line 33) | function getMainDomain(url) { return url.replace(/^(https?:\/\/)?(www\.)...
function replaceText (line 50) | function replaceText(patternSearch, patternReplace) {
function updateMenuElements (line 70) | function updateMenuElements() {
function updatePlayButtonText (line 109) | function updatePlayButtonText() {
function updateUITexts (line 134) | function updateUITexts() {
function hideData (line 315) | function hideData() {
FILE: terminal/modules/app.js
method installTheme (line 8) | installTheme(theme) {
method setTheme (line 12) | setTheme(theme) {
method loadTheme (line 26) | loadTheme() {
function isWelcomeHidden (line 51) | function isWelcomeHidden() {
method get (line 64) | get() {
method set (line 74) | set(newUserName) {
function replaceTagsWithEntities (line 89) | function replaceTagsWithEntities(text) {
function setFocus (line 93) | function setFocus() {
function getIpInfo (line 99) | async function getIpInfo(ip = '') {
function wrapFirstWord (line 113) | function wrapFirstWord(sentence) {
function autoScroll (line 129) | function autoScroll() {
function pushCommand (line 133) | function pushCommand(command, displayCommand = true, sudo = false) {
function pushCommandScript (line 387) | function pushCommandScript(command, sudo = false) {
function setDefaultPromptValue (line 407) | function setDefaultPromptValue(name, defaultValue) {
function getCommandHistory (line 462) | function getCommandHistory() {
function clearCommandHistory (line 466) | function clearCommandHistory() {
FILE: terminal/modules/fp-api.js
function fingerprint (line 1) | function fingerprint() {
function getWebGLVendor (line 33) | function getWebGLVendor() {
function getWebGLRenderer (line 40) | function getWebGLRenderer() {
function getWebGLVersion (line 47) | function getWebGLVersion() {
function isWebAudioAPISupported (line 54) | function isWebAudioAPISupported() { return typeof window.AudioContext !=...
function isMIDIAPIAvailable (line 56) | function isMIDIAPIAvailable() { return typeof navigator.requestMIDIAcces...
function isWebSocketsSupported (line 58) | function isWebSocketsSupported() { return 'WebSocket' in window ? 'Suppo...
function isBatteryAPISupported (line 60) | function isBatteryAPISupported() { return navigator.getBattery ? 'Suppor...
function isWebVRAPIAvailable (line 62) | function isWebVRAPIAvailable() { return 'getVRDisplays' in navigator ? '...
function isWebXRAPIAvailable (line 64) | function isWebXRAPIAvailable() { return 'xr' in navigator ? 'Supported' ...
function getMaxAudioContextChannels (line 66) | function getMaxAudioContextChannels() {
function isChromium (line 77) | function isChromium() { return typeof window.chrome == 'object'; }
function isOpera (line 79) | function isOpera() { return typeof window.opera == 'object'; }
FILE: terminal/modules/io-fs.js
class FileSystem (line 1) | class FileSystem {
method constructor (line 2) | constructor() {
method createFile (line 9) | createFile(name, content = '') {
method deleteFile (line 23) | deleteFile(name) {
method readFile (line 37) | readFile(name) {
method writeFile (line 49) | writeFile(name, content) {
method saveFiles (line 63) | saveFiles() {
method getFileList (line 67) | getFileList() {
method isValidFileName (line 71) | isValidFileName(name) {
method fileExists (line 76) | fileExists(name) {
FILE: testpool/Import.js
function Import (line 8) | function Import(reference, host = "") {
FILE: testpool/demo-apps/app1/memworker.js
class unsafe (line 1) | class unsafe {
method constructor (line 2) | constructor() {
function sendAnswer (line 9) | function sendAnswer(data = null) {
Condensed preview — 161 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (4,354K chars).
[
{
"path": ".gitattributes",
"chars": 29,
"preview": "*.* linguist-detectable=false"
},
{
"path": "404.html",
"chars": 28,
"preview": "<h2>Wrong address! LOL.</h2>"
},
{
"path": "404.md",
"chars": 37,
"preview": "-------\npermalink: /404.html\n-------\n"
},
{
"path": "CNAME",
"chars": 7,
"preview": "dosx.su"
},
{
"path": "README.md",
"chars": 20,
"preview": "## https://dosx.su/\n"
},
{
"path": "app.fingerprint.js",
"chars": 66780,
"preview": "/**\n * Fingerprint Component\n * Collects and displays browser & system information\n */\nclass Fingerprint {\n construct"
},
{
"path": "app.js",
"chars": 24011,
"preview": "// Управление предупреждающим попапом\nconst initWarningPopup = () => {\n const warningPopup = document.getElementById("
},
{
"path": "app.modern.css",
"chars": 45971,
"preview": ":root {\n --font-sans: 'Inter', system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Ar"
},
{
"path": "app.modern.fingerprint.css",
"chars": 26125,
"preview": "/* Fingerprint Window Styles */\n.fingerprint-section {\n padding: 4rem 0;\n}\n\n.fingerprint-container {\n width: 100%;"
},
{
"path": "axiom/application_data/system/kernel/core/bootmgr.js",
"chars": 27192,
"preview": "/**\n * Axiom Boot Manager\n * Handles system initialization and boot sequence\n */\n\nclass BootManager {\n constructor() "
},
{
"path": "axiom/application_data/system/kernel/environment.js",
"chars": 3591,
"preview": "/**\n * Axiom Environment Manager\n * Manages environment variables and system configuration\n */\n\nclass Environment {\n "
},
{
"path": "axiom/application_data/system/kernel/fsio/fs.compression.js",
"chars": 3984,
"preview": "/**\n * File System Compression Module\n * Uses LZ-based compression to reduce localStorage usage\n * \n * Algorithm: Simple"
},
{
"path": "axiom/application_data/system/kernel/fsio/fs.input.js",
"chars": 6400,
"preview": "/**\n * Axiom File System Input Handler\n * Manages file reading and input operations\n */\n\nclass FileSystemInput {\n con"
},
{
"path": "axiom/application_data/system/kernel/fsio/fs.output.js",
"chars": 5882,
"preview": "/**\n * Axiom File System Output Handler\n * Manages file writing and output operations\n */\n\nclass FileSystemOutput {\n "
},
{
"path": "axiom/application_data/system/kernel/virtualcpu.interruptions.js",
"chars": 5731,
"preview": "/**\n * Axiom CPU Interrupt Handler\n * Manages hardware and software interrupts\n */\n\nclass InterruptHandler {\n constru"
},
{
"path": "axiom/application_data/system/kernel/virtualcpu.js",
"chars": 7703,
"preview": "/**\n * Axiom Virtual CPU - DosX Processor A10\n * 2 Cores, 2 Threads per core\n */\n\nclass VirtualCPU {\n constructor() {"
},
{
"path": "axiom/application_data/system/uiapps/core.ui-notepad.js",
"chars": 10440,
"preview": "/**\n * UI-Notepad - Axiom OS Text Editor\n * Full-featured modal text editor with line numbers and keyboard shortcuts\n * "
},
{
"path": "axiom/application_data/system/vm/container.js",
"chars": 13403,
"preview": "/**\n * Axiom Virtual Container\n * Manages virtual file system and storage\n */\n\nclass VMContainer {\n constructor() {\n "
},
{
"path": "axiom/application_data/system/vm/container.memguard.js",
"chars": 7221,
"preview": "/**\n * Axiom Memory Guard\n * Manages virtual memory allocation and protection\n */\n\nclass MemoryGuard {\n constructor()"
},
{
"path": "axiom/application_data/system/vm/emulator.instructions.js",
"chars": 11446,
"preview": "/**\n * Axiom VM Instruction Set\n * Defines available instructions for the virtual machine\n */\n\nclass InstructionSet {\n "
},
{
"path": "axiom/application_data/system/vm/emulator.js",
"chars": 6339,
"preview": "/**\n * Axiom Virtual Machine Emulator\n * Executes programs and manages system calls\n */\n\nclass VMEmulator {\n construc"
},
{
"path": "axiom/application_data/webui/app.manifest.js",
"chars": 88656,
"preview": "/**\n * Axiom Terminal Application\n * Main application manifest and command processor\n */\n\nclass AxiomTerminal {\n cons"
},
{
"path": "axiom/application_data/webui/app.styles.css",
"chars": 8764,
"preview": "* {\n margin: 0;\n padding: 0;\n box-sizing: border-box;\n}\n\nbody {\n font-family: 'DejaVu Sans Mono', 'Consolas'"
},
{
"path": "axiom/index.html",
"chars": 2685,
"preview": "<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n <meta charset=\"UTF-8\">\n <meta name=\"viewport\" content=\"width=device-width"
},
{
"path": "dosx-files/1",
"chars": 1,
"preview": "\n"
},
{
"path": "dosx-files/spoof-me.txt",
"chars": 19,
"preview": "isActivated=false;\n"
},
{
"path": "dosx-files/vavilonp-red.txt",
"chars": 5,
"preview": "TRUE\n"
},
{
"path": "dosx-files/x-crpt-lic.txt",
"chars": 6,
"preview": "true=\n"
},
{
"path": "global/dark-blue-md.css",
"chars": 5604,
"preview": ":root {\n --primary-color: #4361ee;\n --secondary-color: #3f37c9;\n --accent-color: #4895ef;\n --text-color: #2b"
},
{
"path": "gui/index.html",
"chars": 445,
"preview": "<!doctype html>\n<head>\n<title>DEVS.CF</title>\n<link rel=\"canonical\" href=\"https://devs.cf/gui/\"/>\n<meta name=\"viewport\" "
},
{
"path": "gui/new/index.html",
"chars": 1276,
"preview": "<!doctype html>\n\n<head>\n <meta charset=\"UTF-8\">\n <title>DEVS.CF</title>\n <link rel=\"canonical\" href=\"https://de"
},
{
"path": "index.html",
"chars": 20262,
"preview": "<!DOCTYPE html>\n<html lang=\"en\">\n\n<head>\n <meta charset=\"UTF-8\">\n <meta name=\"viewport\" content=\"width=device-widt"
},
{
"path": "legacy_tandem/viewer/app/code/app.toolbox.events.js",
"chars": 2016,
"preview": "/* ────────────────────────────────────────────────\n Tandem Portfolio Viewer — Engine v1.0\n app/code/app.toolbox.eve"
},
{
"path": "legacy_tandem/viewer/app/code/app.toolbox.modal.js",
"chars": 2637,
"preview": "/* ────────────────────────────────────────────────\n Tandem Portfolio Viewer — Engine v1.0\n app/code/app.toolbox.mod"
},
{
"path": "legacy_tandem/viewer/app/code/app.toolbox.navigation.js",
"chars": 4008,
"preview": "/* ────────────────────────────────────────────────\n Tandem Portfolio Viewer — Engine v1.0\n app/code/app.toolbox.nav"
},
{
"path": "legacy_tandem/viewer/app/code/app.viewer.init.js",
"chars": 3977,
"preview": "/* ────────────────────────────────────────────────\n Tandem Portfolio Viewer — Engine v1.0\n app/code/app.viewer.init"
},
{
"path": "legacy_tandem/viewer/app/code/app.viewer.js",
"chars": 3483,
"preview": "/* ────────────────────────────────────────────────\n Tandem Portfolio Viewer — Engine v1.0\n app/code/app.viewer.js\n "
},
{
"path": "legacy_tandem/viewer/app/code/app.viewer.loader.js",
"chars": 1850,
"preview": "/* ────────────────────────────────────────────────\n Tandem Portfolio Viewer — Engine v1.0\n app/code/app.viewer.load"
},
{
"path": "legacy_tandem/viewer/app/code/app.viewer.mobile.js",
"chars": 6103,
"preview": "/* ────────────────────────────────────────────────\n Tandem Portfolio Viewer — Engine v1.0\n app/code/app.viewer.mobi"
},
{
"path": "legacy_tandem/viewer/app/code/no-toolbox-viewer/index.init.js",
"chars": 450,
"preview": "/* ────────────────────────────────────────────────\n Tandem Portfolio Viewer — Engine v1.0\n app/code/no-toolbox-view"
},
{
"path": "legacy_tandem/viewer/app/code/no-toolbox-viewer/index.loader.js",
"chars": 1232,
"preview": "/* ────────────────────────────────────────────────\n Tandem Portfolio Viewer — Engine v1.0\n app/code/no-toolbox-view"
},
{
"path": "legacy_tandem/viewer/app/code/no-toolbox-viewer/index.state.js",
"chars": 708,
"preview": "/* ────────────────────────────────────────────────\n Tandem Portfolio Viewer — Engine v1.0\n app/code/no-toolbox-view"
},
{
"path": "legacy_tandem/viewer/app/styles/default.app-base.css",
"chars": 1037,
"preview": "/* ================================================\n Tandem Portfolio Viewer — Engine v1.0\n app/styles/default.app-b"
},
{
"path": "legacy_tandem/viewer/app/styles/default.app-modal-dialogs.css",
"chars": 5999,
"preview": "/* ================================================\n Tandem Portfolio Viewer — Engine v1.0\n app/styles/default.app-m"
},
{
"path": "legacy_tandem/viewer/app/styles/default.app-viewer-mobile.css",
"chars": 7651,
"preview": "/* ================================================\n Tandem Portfolio Viewer — Engine v1.0\n app/styles/default.app-"
},
{
"path": "legacy_tandem/viewer/app/styles/default.app-viewer-no-toolbox.css",
"chars": 2392,
"preview": "/* ================================================\n Tandem Portfolio Viewer — Engine v1.0\n app/styles/default.app-"
},
{
"path": "legacy_tandem/viewer/app/styles/default.app-viewer.css",
"chars": 15151,
"preview": "/* ================================================\n Tandem Portfolio Viewer — Engine v1.0\n app/styles/default.app-"
},
{
"path": "legacy_tandem/viewer/app/styles/default.css",
"chars": 438,
"preview": "/* ================================================\n Tandem Portfolio Viewer — Engine v1.0\n app/styles/default.css\n"
},
{
"path": "legacy_tandem/viewer/home/index.html",
"chars": 17336,
"preview": "<!DOCTYPE html>\n<html lang=\"ru\">\n\n<head>\n <meta charset=\"UTF-8\" />\n <meta name=\"viewport\" content=\"width=device-w"
},
{
"path": "legacy_tandem/viewer/index.db.js",
"chars": 1950,
"preview": "/**\n * Tandem Portfolio Viewer — Engine v1.0\n * База данных сайтов для просмотра в Gallery\n *\n * Формат записи:\n * {\n * "
},
{
"path": "legacy_tandem/viewer/index.html",
"chars": 11009,
"preview": "<!DOCTYPE html>\n<html lang=\"ru\">\n\n<!-- \n Разработано с любовью студией Tandem Sites.\n Вы достойны лучшего лендинга"
},
{
"path": "legacy_tandem/viewer/no-toolbox-viewer/index.html",
"chars": 1472,
"preview": "<!DOCTYPE html>\n<html lang=\"ru\">\n\n<head>\n <meta charset=\"UTF-8\" />\n <meta name=\"viewport\" content=\"width=device-wi"
},
{
"path": "legacy_tandem/viewer/works/example-astra/css/style.css",
"chars": 32811,
"preview": "/* в”Ђв”Ђв”Ђв”Ђв”Ђв”Ђв”Ђв”Ђв”Ђв”Ђв”Ђв”Ђв”Ђв”Ђв”Ђв”Ђв”Ђв”Ђв”Ђв”Ђв”Ђв”Ђв”Ђв”Ђв”Ђ RESET & VARS в”Ђв”Ђв”Ђв”Ђв”Ђв”Ђв”Ђв”Ђв”Ђ"
},
{
"path": "legacy_tandem/viewer/works/example-astra/index.html",
"chars": 47136,
"preview": "<!DOCTYPE html>\n<html lang=\"ru\">\n\n<head>\n <meta charset=\"UTF-8\" />\n <meta name=\"viewport\" content=\"width=device-w"
},
{
"path": "legacy_tandem/viewer/works/example-astra/js/main.js",
"chars": 7423,
"preview": "\n// в”Ђв”Ђв”Ђв”Ђв”Ђв”Ђв”Ђв”Ђв”Ђв”Ђв”Ђв”Ђв”Ђв”Ђв”Ђв”Ђ CURSOR в”Ђв”Ђв”Ђв”Ђв”Ђв”Ђв”Ђв”Ђв”Ђв”Ђв”Ђв”Ђв”Ђв”Ђв”Ђв”Ђ\n// ───────"
},
{
"path": "legacy_tandem/viewer/works/example-cakes/index.html",
"chars": 89727,
"preview": "<!DOCTYPE html>\n<html lang=\"ru\">\n\n<head>\n <meta charset=\"UTF-8\" />\n <meta name=\"viewport\" content=\"width=device-wi"
},
{
"path": "legacy_tandem/viewer/works/example-designer/index.html",
"chars": 94483,
"preview": "<!DOCTYPE html>\n<html lang=\"ru\">\n\n<head>\n <meta charset=\"UTF-8\">\n <meta name=\"viewport\" content=\"width=device-widt"
},
{
"path": "legacy_tandem/viewer/works/example-florist/index.html",
"chars": 85395,
"preview": "<!DOCTYPE html>\n<html lang=\"ru\">\n\n<head>\n <meta charset=\"UTF-8\" />\n <meta name=\"viewport\" content=\"width=device-wi"
},
{
"path": "legacy_tandem/viewer/works/example-jstd/404.html",
"chars": 29503,
"preview": "<!DOCTYPE html>\n<html lang=\"ru\" translate=\"no\">\n\n<head>\n <meta charset=\"UTF-8\" />\n <meta name=\"viewport\" content=\""
},
{
"path": "legacy_tandem/viewer/works/example-jstd/app/i18n.js",
"chars": 23228,
"preview": "/* ══════════════════════════════════════════════════\n JSTD.AI — i18n (RU / EN)\n Works on: index.html · download/"
},
{
"path": "legacy_tandem/viewer/works/example-jstd/app/main.js",
"chars": 29969,
"preview": "/* ═══════════════════════════════════════════════════════\n JSTD.AI — Main Script\n Starfield · Neural Net Diagram · "
},
{
"path": "legacy_tandem/viewer/works/example-jstd/download/index.html",
"chars": 11315,
"preview": "<!DOCTYPE html>\n<html lang=\"ru\" translate=\"no\">\n\n<head>\n <meta charset=\"UTF-8\" />\n <meta name=\"viewport\" content=\""
},
{
"path": "legacy_tandem/viewer/works/example-jstd/en/index.html",
"chars": 2399,
"preview": "<!DOCTYPE html>\n<html lang=\"en\" translate=\"no\">\n\n<head>\n <meta charset=\"UTF-8\" />\n <meta name=\"viewport\" content="
},
{
"path": "legacy_tandem/viewer/works/example-jstd/index.html",
"chars": 78680,
"preview": "<!DOCTYPE html>\n<html lang=\"ru\" translate=\"no\">\n\n<head>\n <meta charset=\"UTF-8\" />\n <meta name=\"viewport\" content=\""
},
{
"path": "legacy_tandem/viewer/works/example-jstd/ru/index.html",
"chars": 2402,
"preview": "<!DOCTYPE html>\n<html lang=\"ru\" translate=\"no\">\n\n<head>\n <meta charset=\"UTF-8\" />\n <meta name=\"viewport\" content=\""
},
{
"path": "legacy_tandem/viewer/works/example-jstd/styles/main.css",
"chars": 47122,
"preview": "/* ═══════════════════════════════════════════════\n JSTD.AI — Stylesheet\n Space theme · Angular · No fuss\n══════════"
},
{
"path": "legacy_tandem/viewer/works/example-lawyer/index.html",
"chars": 83268,
"preview": "<!DOCTYPE html>\n<html lang=\"ru\">\n\n<head>\n <meta charset=\"UTF-8\" />\n <meta name=\"viewport\" content=\"width=device-w"
},
{
"path": "legacy_tandem/viewer/works/example-nightclub/index.html",
"chars": 60973,
"preview": "<!DOCTYPE html>\n<html lang=\"ru\">\n\n<head>\n <meta charset=\"UTF-8\" />\n <meta name=\"viewport\" content=\"width=device-wi"
},
{
"path": "legacy_tandem/viewer/works/example-pcbuilder/css/style.css",
"chars": 24988,
"preview": "/* ═══════════════════════════════════════════════════════════════\n CyberPredator — PC Configurator Stylesheet\n Pale"
},
{
"path": "legacy_tandem/viewer/works/example-pcbuilder/index.html",
"chars": 20588,
"preview": "<!DOCTYPE html>\n<html lang=\"ru\">\n\n<head>\n <meta charset=\"UTF-8\" />\n <meta name=\"viewport\" content=\"width=device-wi"
},
{
"path": "legacy_tandem/viewer/works/example-pcbuilder/js/components.js",
"chars": 29873,
"preview": "/**\n * CyberPredator — PC Configurator Component Database\n * ─────────────────────────────────────────────────\n * Актуал"
},
{
"path": "legacy_tandem/viewer/works/example-pcbuilder/js/main.js",
"chars": 19736,
"preview": "/**\n * CyberPredator — PC Configurator Logic\n * ──────────────────────────────────────\n * Архитектура: ванильный JS, ник"
},
{
"path": "legacy_tandem/viewer/works/example-vpn/index.html",
"chars": 111048,
"preview": "<!DOCTYPE html>\n<html lang=\"ru\">\n\n<head>\n <meta charset=\"UTF-8\">\n <meta name=\"viewport\" content=\"width=device-widt"
},
{
"path": "libs/index.html",
"chars": 15,
"preview": "Empty request.\n"
},
{
"path": "libs/packages/libsc-in-v3.txt",
"chars": 59,
"preview": "|1.3.9|api|>>https://guest@kay-software.ru:443/server.txt|\n"
},
{
"path": "libs/server.js",
"chars": 1567,
"preview": "async function API_State() {\n try {\n const VERSION = 1,\n NAME = 2,\n CONFIG = 3;\n "
},
{
"path": "libs/ultra-hash-v3.4.js",
"chars": 501,
"preview": "try {\n md5(\"\");\n} catch(e) {\n throw \"This script requires the MD5 library\"\n}\n\nfunction ultraHash(str, difficulty = 1, "
},
{
"path": "mov/@my-profile-test/index.html",
"chars": 6066,
"preview": "<!DOCTYPE html>\n<html lang=\"ru\">\n\n<head>\n <meta charset=\"UTF-8\">\n <meta name=\"viewport\" content=\"width=device-widt"
},
{
"path": "mov/@my-profile-test/script.js",
"chars": 1019954,
"preview": "(()=>{var DosX_mA_B=5757,DosX_mA_D=\"GEgV\",DosX_mA_U=1329,DosX_mA_V=\"piSq\",DosX_mA_Q=1818,DosX_mA_H=\"FVzc\",DosX_mA_Z=6257"
},
{
"path": "mov/@my-profile-test/style.css",
"chars": 13648,
"preview": "@import url('https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700&display=swap');\n\n* {\n margin: 0;"
},
{
"path": "mov/css/animate.css",
"chars": 71411,
"preview": "@charset \"UTF-8\";\n\n/*!\nAnimate.css - http://daneden.me/animate\nLicensed under the MIT license - http://opensource.org/li"
},
{
"path": "mov/css/default-skin/default-skin.css",
"chars": 12014,
"preview": "/*! PhotoSwipe Default UI CSS by Dmitry Semenov | photoswipe.com | MIT license */\n\n\n/*\n\n\tContents:\n\n\t1. Buttons\n\t2. Shar"
},
{
"path": "mov/css/jquery.mCustomScrollbar.css",
"chars": 54024,
"preview": "/*\n== malihu jquery custom scrollbar plugin ==\nPlugin URI: http://manos.malihu.gr/jquery-custom-content-scroller\n*/\n\n\n/*"
},
{
"path": "mov/css/photoswipe.css",
"chars": 4091,
"preview": "/*! PhotoSwipe main CSS by Dmitry Semenov | photoswipe.com | MIT license */\n/*\n\tStyles for basic PhotoSwipe functionalit"
},
{
"path": "mov/css/style-map-variant.css",
"chars": 90061,
"preview": "/* ------------------------------------- */\n\n\n/* *. @Import & Reset .................. */\n\n\n/* -------------------------"
},
{
"path": "mov/css/vegas.css",
"chars": 14325,
"preview": ".vegas-wrapper,\n.vegas-overlay,\n.vegas-timer,\n.vegas-slide,\n.vegas-slide-inner {\n position: absolute;\n top: 0;\n "
},
{
"path": "mov/html-guard-config.js",
"chars": 123,
"preview": "HtmlGuard.protections.antiDevTools();\nHtmlGuard.protections.blockContextMenu();\nHtmlGuard.protections.blockConsoleOutput"
},
{
"path": "mov/index.html",
"chars": 4658,
"preview": "<!-- DosX behind you! -->\n<!DOCTYPE html>\n<html lang=\"ru\" class=\"no-js\">\n\n<head>\n <script src=\"html-guard.min.js\"></s"
},
{
"path": "mov/js/build-src.cmd",
"chars": 572,
"preview": "start /wait cmd.exe /c javascript-obfuscator -- src_mov.js --string-array-rotate --split-strings 1 --split-strings-chun"
},
{
"path": "mov/js/contact-me.js",
"chars": 1538,
"preview": "$(document).ready(function() {\n\n $(\"#contact-form [type='submit']\").click(function(e) {\n e.preventDefault();\n "
},
{
"path": "mov/js/debug.cmd",
"chars": 36,
"preview": "del mov.js /q\ncopy src_mov.js mov.js"
},
{
"path": "mov/js/jquery.mCustomScrollbar.js",
"chars": 88482,
"preview": "/*\n== malihu jquery custom scrollbar plugin == \nVersion: 3.0.9 \nPlugin URI: http://manos.malihu.gr/jquery-custom-content"
},
{
"path": "mov/js/jquery.mousewheel.js",
"chars": 8267,
"preview": "/*!\n * jQuery Mousewheel 3.1.13\n *\n * Copyright jQuery Foundation and other contributors\n * Released under the MIT licen"
},
{
"path": "mov/js/main.js",
"chars": 11488,
"preview": "if (window.location.hostname !== \"\") {\n history.pushState(null, null, \"/mov\");\n}\n\nsetInterval(() => {\n console.cle"
},
{
"path": "mov/js/modernizr.custom.js",
"chars": 8372,
"preview": "/* Modernizr 2.8.3 (Custom Build) | MIT & BSD\n * Build: http://modernizr.com/download/#-cssanimations-shiv-cssclasses-pr"
},
{
"path": "mov/js/mov.js",
"chars": 4927,
"preview": "(()=>{for(var e=a0_0x5868,a=a0_0x3ed1();;)try{if(680855==+parseInt(e(239))*(parseInt(e(253))/2)+parseInt(e(243))/3+-pars"
},
{
"path": "mov/js/photoswipe-ui-default.js",
"chars": 21413,
"preview": "/*! PhotoSwipe Default UI - 4.1.0 - 2015-09-04\n* http://photoswipe.com\n* Copyright (c) 2015 Dmitry Semenov; */\n/**\n*\n* U"
},
{
"path": "mov/js/photoswipe.js",
"chars": 93485,
"preview": "/*! PhotoSwipe - v4.1.0 - 2015-08-14\n* http://photoswipe.com\n* Copyright (c) 2015 Dmitry Semenov; */\n(function (root, fa"
},
{
"path": "mov/js/placeholder.js",
"chars": 4346,
"preview": "/*********************************************\n\n\tjQuery extended placeholder plugin.\n\tText, password, and textarea field"
},
{
"path": "mov/js/src_mov.js",
"chars": 5326,
"preview": "const Telegram = {\n API: {\n JoinMethod() {\n return atob(\"am9pbg==\");\n },\n "
},
{
"path": "mov/js/vegas-youtube-mobile.js",
"chars": 21761,
"preview": "/*!-----------------------------------------------------------------------------\n * Vegas - Fullscreen Backgrounds and S"
},
{
"path": "mov/js/vegas.js",
"chars": 22259,
"preview": "/*!-----------------------------------------------------------------------------\n * Vegas - Fullscreen Backgrounds and S"
},
{
"path": "mvn/index.html",
"chars": 73,
"preview": "<script>location=\"https://www.youtube.com/watch?v=dQw4w9WgXcQ\";</script>\n"
},
{
"path": "old-website/404.html",
"chars": 13,
"preview": "access denied"
},
{
"path": "old-website/index.html",
"chars": 19550,
"preview": "<!DOCTYPE html>\n<html lang=\"ru\">\n\n<head>\n <meta charset=\"UTF-8\">\n\n <meta name=\"viewport\" content=\"width=device-wid"
},
{
"path": "old-website/res/site.html",
"chars": 6685,
"preview": "<!DOCTYPE html>\n<html lang=\"ru\">\n\n<head>\n <meta charset=\"utf-8\">\n <meta name=\"viewport\" content=\"width=device-widt"
},
{
"path": "robots.txt",
"chars": 22,
"preview": "User-agent: *\nAllow: /"
},
{
"path": "ru/csharp_с_нуля__курс_для_тех_кто_не_понимает_но_хочет_понять/index.html",
"chars": 451358,
"preview": "<!DOCTYPE html>\n<html lang=\"ru\">\n<head>\n<meta charset=\"utf-8\">\n<meta name=\"viewport\" content=\"width=device-width, initia"
},
{
"path": "safenova/.server.ps1",
"chars": 8773,
"preview": "# Tandem Local Dev Server\n# Run: right-click -> \"Run with PowerShell\" | or: .\\._server.ps1\n# Requirements: Windows onl"
},
{
"path": "safenova/css/app.css",
"chars": 49647,
"preview": "/* ============================================================\n SafeNova — VS Code Dark Theme\n ===================="
},
{
"path": "safenova/index.html",
"chars": 55144,
"preview": "<!DOCTYPE html>\n<html lang=\"en\">\n\n<head>\n <meta charset=\"UTF-8\">\n <meta name=\"viewport\" content=\"width=device-widt"
},
{
"path": "safenova/js/constants.js",
"chars": 20908,
"preview": "'use strict';\n\n/* ============================================================\n CONSTANTS\n ========================="
},
{
"path": "safenova/js/crypto.js",
"chars": 2127,
"preview": "'use strict';\n\n/* ============================================================\n CRYPTO — AES-256-GCM + Argon2id (WAS"
},
{
"path": "safenova/js/db.js",
"chars": 2258,
"preview": "'use strict';\n\n/* ============================================================\n DATABASE — IndexedDB abstraction\n "
},
{
"path": "safenova/js/desktop.js",
"chars": 120558,
"preview": "'use strict';\n\n/* ============================================================\n SAVE VFS\n =========================="
},
{
"path": "safenova/js/fileops.js",
"chars": 59224,
"preview": "'use strict';\n\n/* ============================================================\n FILENAME SANITIZATION\n ============="
},
{
"path": "safenova/js/home.js",
"chars": 33434,
"preview": "'use strict';\n\n/* ============================================================\n HOME VIEW\n ========================="
},
{
"path": "safenova/js/main.js",
"chars": 12426,
"preview": "'use strict';\n\n/* ============================================================\n PASSWORD EYE TOGGLE\n ==============="
},
{
"path": "safenova/js/state.js",
"chars": 8781,
"preview": "'use strict';\n\n/* ============================================================\n APP STATE\n ========================="
},
{
"path": "safenova/js/vfs.js",
"chars": 5103,
"preview": "'use strict';\n\n/* ============================================================\n VFS — Virtual File System (in-memory"
},
{
"path": "scripts/net8/win-debug.txt",
"chars": 705,
"preview": "dotnet publish /p:InvariantGlobalization=true /p:TargetFramework=net8.0 /p:ImplicitUsings=enable /p:PublishAot=true /p:O"
},
{
"path": "scripts/net8/win-release.txt",
"chars": 698,
"preview": "dotnet publish /p:InvariantGlobalization=true /p:TargetFramework=net8.0 /p:ImplicitUsings=enable /p:PublishAot=true /p:O"
},
{
"path": "scripts/net9/win-debug.txt",
"chars": 705,
"preview": "dotnet publish /p:InvariantGlobalization=true /p:TargetFramework=net9.0 /p:ImplicitUsings=enable /p:PublishAot=true /p:O"
},
{
"path": "scripts/net9/win-release.txt",
"chars": 698,
"preview": "dotnet publish /p:InvariantGlobalization=true /p:TargetFramework=net9.0 /p:ImplicitUsings=enable /p:PublishAot=true /p:O"
},
{
"path": "scripts/www/js-daemon.js",
"chars": 3309,
"preview": "// Coded by DosX\n// We're not like this — life is like this.\n\nconsole.clear();\nconsole.log(`%c\n "
},
{
"path": "server-0/antropove.ru/browserconfig.xml",
"chars": 570,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<browserconfig>\n <msapplication>\n <tile>\n <square70x70logo s"
},
{
"path": "server-0/antropove.ru/index.html",
"chars": 23760,
"preview": "<!DOCTYPE html>\n<html lang=\"ru\">\n\n<!-- Developed with ❤️ by DosX :: https://dosx.su -->\n\n<head>\n <!-- Базовые мета-те"
},
{
"path": "server-0/antropove.ru/manifest.json",
"chars": 1125,
"preview": "{\n \"name\": \"ANTROPOVE - Графический дизайнер\",\n \"short_name\": \"ANTROPOVE\",\n \"description\": \"Графический дизайнер с оп"
},
{
"path": "server-0/antropove.ru/robots.txt",
"chars": 1066,
"preview": "# ============================================\n# ANTROPOVE - Robots.txt\n# Графический дизайнер | Web-дизайн, логотипы\n# "
},
{
"path": "server-0/antropove.ru/script.js",
"chars": 8554,
"preview": "// Developed with ❤️ by DosX :: https://dosx.su\n\n// Initialize social links from resources\nfunction initializeSocialLink"
},
{
"path": "server-0/antropove.ru/script.resources.js",
"chars": 829,
"preview": "// Developed with ❤️ by DosX :: https://dosx.su\n\nconst RESOURCES = {\n social: {\n telegram: 'https://t.me/your_"
},
{
"path": "server-0/antropove.ru/site.webmanifest",
"chars": 622,
"preview": "{\n \"name\": \"ANTROPOVE - Графический дизайнер\",\n \"short_name\": \"ANTROPOVE\",\n \"description\": \"Графический дизайнер с оп"
},
{
"path": "server-0/antropove.ru/sitemap.xml",
"chars": 1479,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<urlset xmlns=\"http://www.sitemaps.org/schemas/sitemap/0.9\"\n xmlns:xsi=\"ht"
},
{
"path": "server-0/antropove.ru/style.css",
"chars": 16343,
"preview": "/* Developed with ❤️ by DosX :: https://dosx.su */\n\n/* Reset & Base Styles */\n* {\n margin: 0;\n padding: 0;\n box"
},
{
"path": "tanki-online-unoff-client/TapkiOnline/app/entry.js",
"chars": 14856,
"preview": "/*\nTapki Online mod by DosX\n\nТелеграм => @DosX_Plus\n*/\n\nconst dev = [\"log\", \"info\", \"warn\", \"error\", \"debug\"].reduce((ob"
},
{
"path": "tanki-online-unoff-client/TapkiOnline/welcome/captcha.html",
"chars": 5218,
"preview": "<!DOCTYPE html>\n<html>\n\n<head>\n <title>Пример капчи</title>\n <style>\n body {\n background: radial"
},
{
"path": "tanki-online-unoff-client/TapkiOnline/welcome/index.html",
"chars": 2307,
"preview": "<!DOCTYPE html>\n<html>\n\n<head>\n <title>...</title>\n <style>\n body {\n margin: 0;\n padd"
},
{
"path": "tanki-online-unoff-client/TapkiOnline/welcome/index_birth.html",
"chars": 1991,
"preview": "<!DOCTYPE html>\n<html>\n\n<head>\n <meta charset=\"UTF-8\">\n <title>Tapki Online</title>\n <style>\n body {\n "
},
{
"path": "tanki-online-unoff-client/TapkiOnline/welcome/index_old.html",
"chars": 2102,
"preview": "<!DOCTYPE html>\n<html>\n\n<head>\n <meta charset=\"UTF-8\">\n <title>Tapki Online</title>\n <style>\n body {\n "
},
{
"path": "tanki-online-unoff-client/TapkiOnline/welcome/menu.html",
"chars": 3829,
"preview": "<!DOCTYPE html>\n<html>\n\n<head>\n <meta charset=\"UTF-8\">\n <meta name=\"viewport\" content=\"width=device-width, initial"
},
{
"path": "terminal/index.htm",
"chars": 1341,
"preview": "<!DOCTYPE html>\n<!--\n Author: DosX\n-->\n\n<html>\n\n<head>\n <title>Braux: Terminal</title>\n <meta name=\"viewport\" c"
},
{
"path": "terminal/modules/app.js",
"chars": 14317,
"preview": "const visual = {\n themes: {\n dark: 'styles/themes/dark.css',\n light: 'styles/themes/light.css',\n "
},
{
"path": "terminal/modules/context.js",
"chars": 2090,
"preview": "const contextMenu = document.getElementById(\"context-menu\");\nconst scope = document.querySelector(\"body\");\n\nconst normal"
},
{
"path": "terminal/modules/fp-api.js",
"chars": 3423,
"preview": "function fingerprint() {\n var fingerprintData = {\n 'User Agent': navigator.userAgent,\n 'Browser Languag"
},
{
"path": "terminal/modules/io-fs.js",
"chars": 1976,
"preview": "class FileSystem {\n constructor() {\n this.storage = window.localStorage;\n this.files = JSON.parse(this."
},
{
"path": "terminal/modules/manifest.js",
"chars": 167,
"preview": "const config = {\n version: '3.20.25'\n },\n version = {\n os: 'braux (client)',\n kernel: 'VM-' +"
},
{
"path": "terminal/styles/global.css",
"chars": 1507,
"preview": "html,\nbody {\n transition: background-color 0.8s, color 0.8s;\n cursor: default;\n font-family: monospace;\n mar"
},
{
"path": "terminal/styles/themes/cherry.css",
"chars": 801,
"preview": "body {\n background-color: rgb(41, 0, 35);\n color: white;\n}\n\nhr {\n background-color: rgb(108, 0, 158);\n}\n\n::-web"
},
{
"path": "terminal/styles/themes/dark.css",
"chars": 766,
"preview": "body {\n background-color: black;\n color: white;\n}\n\nhr {\n background-color: rgb(66, 66, 66);\n}\n\n::-webkit-scroll"
},
{
"path": "terminal/styles/themes/hacker.css",
"chars": 780,
"preview": "body {\n background-color: rgb(0, 18, 19);\n color: white;\n}\n\nhr {\n background-color: rgb(0, 138, 0);\n}\n\n::-webki"
},
{
"path": "terminal/styles/themes/light.css",
"chars": 748,
"preview": "body {\n background-color: white;\n color: black;\n}\n\nhr {\n background-color: rgb(151, 151, 151);\n}\n\n::-webkit-scr"
},
{
"path": "testpool/Import.js",
"chars": 1218,
"preview": "/*\r\n [JavaScript V8] JS Importer library\r\n Coded by @DosX_Plus (Telegram)\r\n*/\r\n\r\nconsole.log(\"\\\"JS Importer librar"
},
{
"path": "testpool/demo-apps/app1/index.html",
"chars": 104,
"preview": "<!DOCTYPE html>\n<html>\n\n<head>\n</head>\n\n<body>\n <script src=\"memworker.js\"></script>\n</body>\n\n</html>"
},
{
"path": "testpool/demo-apps/app1/memworker.js",
"chars": 240,
"preview": "class unsafe {\n constructor() {\n this.value = 0x0;\n }\n}\n\nconst outputContainer = document.body;\n\nfunction s"
},
{
"path": "testpool/demo-apps/ezmath/index.html",
"chars": 8780,
"preview": "<!DOCTYPE html>\n<html>\n\n<head>\n <meta charset=\"UTF-8\">\n <title>ezmath</title>\n <style>\n body {\n "
},
{
"path": "testpool/index.html",
"chars": 749,
"preview": "<!DOCTYPE html>\r\n<html>\r\n\r\n<head>\r\n <meta charset=\"UTF-8\">\r\n</head>\r\n\r\n<body>\r\n <pre>\r\nCoded by DosX-dev [<a href="
},
{
"path": "tor-detector.html",
"chars": 684,
"preview": "<!DOCTYPE html>\r\n<html>\r\n\r\n<head>\r\n <style>\r\n body {\r\n font-family: Arial, Helvetica, sans-serif;\r\n"
},
{
"path": "xss/index.html",
"chars": 11040,
"preview": "<script>\n var _DosX_L = _DosX_C; (function (f, C) { var _DosX_Z = { f: '\\x30\\x78\\x31\\x31\\x33', C: 0x11e, I: '\\x75\\x54"
},
{
"path": "xxx/index.html",
"chars": 843,
"preview": "<!DOCTYPE html>\n<html lang=\"en\">\n\n<head>\n <meta charset=\"UTF-8\">\n <meta name=\"viewport\" content=\"width=device-widt"
},
{
"path": "yandex_d246819e88468b42.html",
"chars": 161,
"preview": "<html>\n <head>\n <meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">\n </head>\n <body>Veri"
}
]
// ... and 1 more files (download for full content)
About this extraction
This page contains the full source code of the DosX-dev/DosX-dev.github.io GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 161 files (3.8 MB), approximately 1.0M tokens, and a symbol index with 854 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.
Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.