1<!DOCTYPE html> 2<html lang="ru"> 3 <head> 4 <meta charset="utf-8"> 5 <meta name="viewport" content="width=device-width, initial-scale=1"> 6 <meta name="csrf-token" content="NgAgWJItw4DvT4ApH8GXzgmiQpWiBvFlFadkY7QP"> 7 <title>DLP Software</title> 8 <link rel="icon" href="https://dlpsoftware.ru/favicon.ico" sizes="any"> 9<link rel="icon" type="image/png" sizes="32x32" href="https://dlpsoftware.ru/favicon-32x32.png"> 10<link rel="icon" type="image/png" sizes="16x16" href="https://dlpsoftware.ru/favicon-16x16.png"> 11<link rel="apple-touch-icon" href="https://dlpsoftware.ru/apple-touch-icon.png"> 12 <link rel="preload" as="style" href="https://dlpsoftware.ru/build/assets/app-1UC9nwQy.css" /><link rel="modulepreload" as="script" href="https://dlpsoftware.ru/build/assets/app-D2bYTSPf.js" /><link rel="modulepreload" as="script" href="https://dlpsoftware.ru/build/assets/vue.runtime.esm-bundler-CYb_FA3g.js" /><link rel="stylesheet" href="https://dlpsoftware.ru/build/assets/app-1UC9nwQy.css" />
12<script type="module" src="https://dlpsoftware.ru/build/assets/app-D2bYTSPf.js"></script>
12
12<script id="browser-logger-active"> 13(function() { 14 const ENDPOINT = 'https://dlpsoftware.ru/_boost/browser-logs'; 15 const logQueue = []; 16 let flushTimeout = null; 17 const captureTypes = ["error","warning","info","log","debug","table"]; 18 19 console.log('ð Browser logger active (MCP server detected). Posting to: ' + ENDPOINT); 20 21 // Store original console methods 22 const originalConsole = { 23 log: console.log, 24 debug: console.debug, 25 info: console.info, 26 error: console.error, 27 warn: console.warn, 28 table: console.table 29 }; 30 31 // Walk own enumerable keys so JSON.stringify cannot auto-invoke a proxy fake toJSON (e.g. Livewire's `$wire`) and fire a real request. 32 function toSafeValue(value, seen) { 33 if (value === null || typeof value !== 'object') { 34 return value; 35 } 36 if (value instanceof Error) { 37 return { name: value.name, message: value.message, stack: value.stack }; 38 } 39 // Date has no own enumerable keys, so the walk below would collapse it to {}. 40 if (value instanceof Date) { 41 return value.toISOString(); 42 } 43 if (seen.has(value)) { 44 return '[Circular]'; 45 } 46 seen.add(value); 47 if (Array.isArray(value)) { 48 return value.map((item) => toSafeValue(item, seen)); 49 } 50 const plain = {}; 51 for (const key of Object.keys(value)) { 52 if (key === 'toJSON') continue; 53 try { 54 plain[key] = toSafeValue(value[key], seen); 55 } catch (e) { 56 plain[key] = '[Unreadable]'; 57 } 58 } 59 return plain; 60 } 61 62 // Helper to safely stringify values 63 function safeStringify(obj) { 64 return JSON.stringify(toSafeValue(obj, new WeakSet())); 65 } 66 67 // Normalize log type for consistency (e.g., 'warn' to 'warning') 68 function normalizeType(type) { 69 return type === 'warn' ? 'warning' : type; 70 } 71 72 // Determine if a log type should be captured based on configured levels 73 function shouldCapture(type) { 74 return captureTypes.includes(normalizeType(type)); 75 } 76 77 // Batch and send logs 78 function flushLogs() { 79 if (logQueue.length === 0) return; 80 81 const batch = logQueue.splice(0, logQueue.length); 82 83 fetch(ENDPOINT, { 84 method: 'POST', 85 headers: { 86 'Content-Type': 'application/json', 87 'X-Requested-With': 'XMLHttpRequest' 88 }, 89 body: JSON.stringify({ logs: batch }) 90 }).catch(err => { 91 // Silently fail to avoid infinite loops 92 originalConsole.error('Failed to send logs:', err); 93 }); 94 } 95 96 // Debounced flush (100ms) 97 function scheduleFlush() { 98 if (flushTimeout) clearTimeout(flushTimeout); 99 flushTimeout = setTimeout(flushLogs, 100); 100 } 101 102 // Intercept console methods 103 ['log', 'debug', 'info', 'error', 'warn', 'table'].forEach(method => { 104 console[method] = function(...args) { 105 // Call original method 106 originalConsole[method].apply(console, args); 107 108 // Capture log data 109 try { 110 if (!shouldCapture(method)) { 111 return; 112 } 113 114 logQueue.push({ 115 type: method, 116 timestamp: new Date().toISOString(), 117 data: args.map(arg => { 118 try { 119 return typeof arg === 'object' ? JSON.parse(safeStringify(arg)) : arg; 120 } catch (e) { 121 return String(arg); 122 } 123 }), 124 url: window.location.href, 125 userAgent: navigator.userAgent 126 }); 127 128 scheduleFlush(); 129 } catch (e) { 130 // Fail silently 131 } 132 }; 133 }); 134 135 // Global error handlers for uncaught errors 136 const originalOnError = window.onerror; 137 window.onerror = function boostErrorHandler(errorMsg, url, lineNumber,
137colNumber, error) { 138 try { 139 if (shouldCapture('error')) { 140 logQueue.push({ 141 type: 'uncaught_error', 142 timestamp: new Date().toISOString(), 143 data: [{ 144 message: errorMsg, 145 filename: url, 146 lineno: lineNumber, 147 colno: colNumber, 148 error: error ? { 149 name: error.name, 150 message: error.message, 151 stack: error.stack 152 } : null 153 }], 154 url: window.location.href, 155 userAgent: navigator.userAgent 156 }); 157 158 scheduleFlush(); 159 } 160 161 } catch (e) { 162 // Fail silently 163 } 164 165 // Call original handler if it exists 166 if (originalOnError && typeof originalOnError === 'function') { 167 return originalOnError(errorMsg, url, lineNumber, colNumber, error); 168 } 169 170 // Let the error continue to propagate 171 return false; 172 } 173 window.addEventListener('error', (event) => { 174 try { 175 if (!shouldCapture('error')) { 176 return false; 177 } 178 179 logQueue.push({ 180 type: 'window_error', 181 timestamp: new Date().toISOString(), 182 data: [{ 183 message: event.message, 184 filename: event.filename, 185 lineno: event.lineno, 186 colno: event.colno, 187 error: event.error ? { 188 name: event.error.name, 189 message: event.error.message, 190 stack: event.error.stack 191 } : null 192 }], 193 url: window.location.href, 194 userAgent: navigator.userAgent 195 }); 196 197 scheduleFlush(); 198 } catch (e) { 199 // Fail silently 200 } 201 202 // Let the error continue to propagate 203 return false; 204 }); 205 window.addEventListener('unhandledrejection', (event) => { 206 try { 207 if (!shouldCapture('error')) { 208 return false; 209 } 210 211 logQueue.push({ 212 type: 'error', 213 timestamp: new Date().toISOString(), 214 data: [{ 215 message: 'Unhandled Promise Rejection', 216 reason: toSafeValue(event.reason, new WeakSet()) 217 }], 218 url: window.location.href, 219 userAgent: navigator.userAgent 220 }); 221 222 scheduleFlush(); 223 } catch (e) { 224 // Fail silently 225 } 226 227 // Let the rejection continue to propagate 228 return false; 229 }); 230 231 // Flush on page unload 232 window.addEventListener('beforeunload', () => { 233 if (logQueue.length > 0) { 234 navigator.sendBeacon(ENDPOINT, JSON.stringify({ logs: logQueue })); 235 } 236 }); 237})(); 238</script>
238 239</head> 240 <body class="font-sans text-ink antialiased"> 241 <div class="flex min-h-screen flex-col items-center justify-center px-4 py-10 sm:px-6"> 242 <a href="https://dlpsoftware.ru" class="inline-flex items-center gap-3 text-ink"> 243 <img 244 src="https://dlpsoftware.ru/brand/logo.png" 245 alt="DLP Software" 246 width="512" 247 height="512" 248 decoding="async" 249 class="h-14 w-14 object-contain h-14 w-14" 250> 251 <span class="font-display text-xl font-semibold tracking-tight">DLP Software</span> 252 </a> 253 <div class="glass-card mt-8 w-full max-w-md p-6 sm:p-8"> 254 <h1 class="font-display text-2xl font-semibold tracking-tight">ÐÑ Ð¾Ð´</h1> 255 <p class="mt-2 text-sm text-muted">ÐÐ°Ð±Ð¸Ð½ÐµÑ Ð²ÐµÐ½Ð´Ð¾Ñа и ÑпÑавление каÑÑоÑками пÑодÑкÑов.</p> 256 257 258 <form method="POST" action="https://dlpsoftware.ru/login" class="mt-6 space-y-4"> 259 <input type="hidden" name="_token" value="NgAgWJItw4DvT4ApH8GXzgmiQpWiBvFlFadkY7QP" autocomplete="off"> 260 <div> 261 <label class="block text-sm font-semibold text-ink-soft" for="email"> 262 Email 263</label> 264 <input class="field-input mt-1.5 block w-full" id="email" type="email" name="email" required="required" autofocus="autofocus" autocomplete="username"> 265 </div> 266 267 <div> 268 <label class="block text-sm font-semibold text-ink-soft" for="password"> 269 ÐаÑÐ¾Ð»Ñ 270</label> 271 <input class="field-input mt-1.5 block w-full" id="password" type="password" name="password" required="required" autocomplete="current-password"> 272 </div> 273 274 <label for="remember_me" class="inline-flex items-center gap-2"> 275 <input id="remember_me" type="checkbox" class="rounded border-border text-accent shadow-sm focus:ring-accent" name="remember"> 276 <span class="text-sm text-muted">ÐапомниÑÑ Ð¼ÐµÐ½Ñ</span> 277 </label> 278 279 <div class="flex flex-wrap items-center justify-between gap-3 pt-2"> 280 <a class="auth-link" href="https://dlpsoftware.ru/forgot-password">ÐабÑли паÑолÑ?</a> 281 <button type="submit" class="btn-primary"> 282 ÐойÑи 283</button> 284 </div> 285 286 <p class="pt-2 text-sm text-muted"> 287 ÐÐµÑ Ð°ÐºÐºÐ°ÑнÑа? 288 <a href="https://dlpsoftware.ru/register" class="font-semibold text-accent-ink hover:text-accent">ÐаÑегиÑÑÑиÑоваÑÑÑÑ</a> 289 </p> 290 </form> 291 </div> 292 <a href="https://dlpsoftware.ru" class="mt-6 text-sm font-semibold text-muted transition hover:text-accent-ink">â Ðа ÑайÑ</a> 293 </div> 294 </body> 295</html>
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.