{"id":4099,"date":"2025-12-29T08:14:21","date_gmt":"2025-12-29T08:14:21","guid":{"rendered":"https:\/\/zic.legal\/?page_id=4099"},"modified":"2025-12-29T18:24:14","modified_gmt":"2025-12-29T18:24:14","slug":"unelte","status":"publish","type":"page","link":"https:\/\/zic.legal\/ro\/tools\/","title":{"rendered":"Unelte"},"content":{"rendered":"<div class=\"fusion-fullwidth fullwidth-box fusion-builder-row-1 fusion-flex-container has-pattern-background has-mask-background nonhundred-percent-fullwidth non-hundred-percent-height-scrolling\" style=\"--awb-border-radius-top-left:0px;--awb-border-radius-top-right:0px;--awb-border-radius-bottom-right:0px;--awb-border-radius-bottom-left:0px;--awb-flex-wrap:wrap;\" ><div class=\"fusion-builder-row fusion-row fusion-flex-align-items-flex-start fusion-flex-content-wrap\" style=\"max-width:calc( 100vw + 0px );margin-left: calc(-0px \/ 2 );margin-right: calc(-0px \/ 2 );\"><div class=\"fusion-layout-column fusion_builder_column fusion-builder-column-0 fusion_builder_column_1_1 1_1 fusion-flex-column fusion-flex-align-self-center\" style=\"--awb-padding-top:25.993700000000004px;--awb-padding-bottom:28px;--awb-overflow:visible;--awb-bg-size:cover;--awb-border-radius:0px 0px 12px 12px;--awb-width-large:100%;--awb-margin-top-large:0px;--awb-spacing-right-large:0px;--awb-margin-bottom-large:64px;--awb-spacing-left-large:0px;--awb-width-medium:100%;--awb-order-medium:0;--awb-spacing-right-medium:0px;--awb-spacing-left-medium:0px;--awb-width-small:100%;--awb-order-small:0;--awb-spacing-right-small:0px;--awb-spacing-left-small:0px;\"><div class=\"fusion-column-wrapper fusion-column-has-shadow fusion-flex-justify-content-center fusion-content-layout-row fusion-flex-align-items-center\"><div class=\"fusion-title title fusion-title-1 fusion-sep-none fusion-title-center fusion-title-text fusion-title-size-one fusion-animated title-our-blog\" style=\"--awb-text-color:var(--awb-color3);\" data-animationType=\"fadeIn\" data-animationDuration=\"1.1\" data-animationOffset=\"top-into-view\"><h1 class=\"fusion-title-heading title-heading-center\" style=\"font-family:&quot;Euclid Flex Bold&quot;;font-style:normal;font-weight:400;margin:0;\">Our tools<\/h1><\/div><div class=\"fusion-separator fusion-full-width-sep\" style=\"align-self: center;margin-left: auto;margin-right: auto;width:100%;\"><\/div><!-- Font Preconnect & Preload for faster loading -->\r\n<link rel=\"preconnect\" href=\"https:\/\/fonts.googleapis.com\">\r\n<link rel=\"preconnect\" href=\"https:\/\/fonts.gstatic.com\" crossorigin>\r\n<link rel=\"preload\" href=\"https:\/\/fonts.googleapis.com\/css2?family=Inter:wght@400;500;600;700&display=swap\" as=\"style\" onload=\"this.onload=null;this.rel='stylesheet'\">\r\n<noscript><link rel=\"stylesheet\" href=\"https:\/\/fonts.googleapis.com\/css2?family=Inter:wght@400;500;600;700&display=swap\"><\/noscript>\r\n\r\n<!--\r\n  ZIC Tools Hub v2 - Pre-loaded with CSS Toggle\r\n  Version: 2.1 - Performance Optimized\r\n\r\n  INSTRUCTIUNI DE IMPLEMENTARE:\r\n  =============================\r\n  1. Creaza un snippet NOU in WPCode cu acest cod\r\n  2. In pagina \/tools\/, adauga shortcode-ul pentru acest snippet\r\n  3. Sub acest snippet, adauga toate shortcode-urile tool-urilor in ordinea de mai jos,\r\n     fiecare WRAPPED in div-uri cu data-tool-content:\r\n\r\n  EXEMPLU pentru pagina \/tools\/ (Elementor\/Gutenberg\/etc):\r\n\r\n  [wpcode id=\"ID_ACESTUI_SNIPPET\"]\r\n\r\n  <div data-tool-content=\"prescriptie\" style=\"display:none\">[wpcode id=\"4090\"]<\/div>\r\n  <div data-tool-content=\"concurs\" style=\"display:none\">[wpcode id=\"4088\"]<\/div>\r\n  <div data-tool-content=\"liberare\" style=\"display:none\">[wpcode id=\"4082\"]<\/div>\r\n  <div data-tool-content=\"supraveghere\" style=\"display:none\">[wpcode id=\"4086\"]<\/div>\r\n  <div data-tool-content=\"reducere\" style=\"display:none\">[wpcode id=\"4125\"]<\/div>\r\n  <div data-tool-content=\"cazier\" style=\"display:none\">[wpcode id=\"4092\"]<\/div>\r\n  <div data-tool-content=\"formular\" style=\"display:none\">[wpcode id=\"4126\"]<\/div>\r\n  <div data-tool-content=\"reabilitare\" style=\"display:none\">[wpcode id=\"4120\"]<\/div>\r\n  <div data-tool-content=\"termene\" style=\"display:none\">[wpcode id=\"4121\"]<\/div>\r\n  <div data-tool-content=\"aparator\" style=\"display:none\">[wpcode id=\"4124\"]<\/div>\r\n  <div data-tool-content=\"email\" style=\"display:none\">[wpcode id=\"4095\"]<\/div>\r\n  <div data-tool-content=\"website\" style=\"display:none\">[wpcode id=\"4096\"]<\/div>\r\n-->\r\n\r\n<div id=\"zic-tools-hub\">\r\n  <!-- Loading Indicator -->\r\n  <div class=\"zic-hub__loading\" role=\"status\" aria-label=\"Se \u00eencarc\u0103...\" data-loading>\r\n    <div class=\"zic-hub__loadingContent\">\r\n      <div class=\"zic-hub__loadingSpinner\">\r\n        <div class=\"zic-hub__loadingDot\"><\/div>\r\n        <div class=\"zic-hub__loadingDot\"><\/div>\r\n        <div class=\"zic-hub__loadingDot\"><\/div>\r\n      <\/div>\r\n      <div class=\"zic-hub__loadingBar\">\r\n        <div class=\"zic-hub__loadingProgress\"><\/div>\r\n      <\/div>\r\n      <p class=\"zic-hub__loadingText\">Se \u00eencarc\u0103 instrumentele...<\/p>\r\n    <\/div>\r\n  <\/div>\r\n\r\n  <!-- Tools Grid (hidden until loaded) -->\r\n  <div class=\"zic-hub__grid is-hidden\" role=\"list\" data-hub-grid>\r\n\r\n    <!-- Tool 1: Cerere angajare avocat -->\r\n    <article class=\"zic-hub__card\" data-tool=\"aparator\" role=\"listitem\" tabindex=\"0\">\r\n      <div class=\"zic-hub__cardIcon\">\r\n        <svg width=\"32\" height=\"32\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n          <path d=\"M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z\"\/>\r\n          <polyline points=\"14 2 14 8 20 8\"\/>\r\n          <line x1=\"16\" y1=\"13\" x2=\"8\" y2=\"13\"\/>\r\n          <line x1=\"16\" y1=\"17\" x2=\"8\" y2=\"17\"\/>\r\n          <polyline points=\"10 9 9 9 8 9\"\/>\r\n        <\/svg>\r\n      <\/div>\r\n      <div class=\"zic-hub__cardContent\">\r\n        <h3 class=\"zic-hub__cardTitle\">Cerere angajare avocat<\/h3>\r\n        <p class=\"zic-hub__cardDesc\">Generare cerere privind am\u00e2narea cauzei pentru angajare avocat<\/p>\r\n      <\/div>\r\n      <div class=\"zic-hub__cardBadge\">\r\n        <span>Procedur\u0103<\/span>\r\n      <\/div>\r\n      <div class=\"zic-hub__cardArrow\">\r\n        <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\r\n          <path d=\"M5 12h14M12 5l7 7-7 7\"\/>\r\n        <\/svg>\r\n      <\/div>\r\n    <\/article>\r\n\r\n    <!-- Tool 2: Calculator termene procedurale -->\r\n    <article class=\"zic-hub__card\" data-tool=\"termene\" role=\"listitem\" tabindex=\"0\">\r\n      <div class=\"zic-hub__cardIcon\">\r\n        <svg width=\"32\" height=\"32\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n          <rect x=\"3\" y=\"4\" width=\"18\" height=\"18\" rx=\"2\" ry=\"2\"\/>\r\n          <line x1=\"16\" y1=\"2\" x2=\"16\" y2=\"6\"\/>\r\n          <line x1=\"8\" y1=\"2\" x2=\"8\" y2=\"6\"\/>\r\n          <line x1=\"3\" y1=\"10\" x2=\"21\" y2=\"10\"\/>\r\n        <\/svg>\r\n      <\/div>\r\n      <div class=\"zic-hub__cardContent\">\r\n        <h3 class=\"zic-hub__cardTitle\">Calculator termene procedurale<\/h3>\r\n        <p class=\"zic-hub__cardDesc\">Calculeaz\u0103 termene procedurale conform Codului de procedur\u0103 penal\u0103<\/p>\r\n      <\/div>\r\n      <div class=\"zic-hub__cardBadge\">\r\n        <span>Procedur\u0103<\/span>\r\n      <\/div>\r\n      <div class=\"zic-hub__cardArrow\">\r\n        <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\r\n          <path d=\"M5 12h14M12 5l7 7-7 7\"\/>\r\n        <\/svg>\r\n      <\/div>\r\n    <\/article>\r\n\r\n    <!-- Tool 2: Calculator prescrip\u021bie -->\r\n    <article class=\"zic-hub__card\" data-tool=\"prescriptie\" role=\"listitem\" tabindex=\"0\">\r\n      <div class=\"zic-hub__cardIcon\">\r\n        <svg width=\"32\" height=\"32\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n          <circle cx=\"12\" cy=\"12\" r=\"10\"\/>\r\n          <polyline points=\"12 6 12 12 16 14\"\/>\r\n        <\/svg>\r\n      <\/div>\r\n      <div class=\"zic-hub__cardContent\">\r\n        <h3 class=\"zic-hub__cardTitle\">Calculator prescrip\u021bie<\/h3>\r\n        <p class=\"zic-hub__cardDesc\">Calculeaz\u0103 termenele de prescrip\u021bie conform art. 154-156 Cod penal<\/p>\r\n      <\/div>\r\n      <div class=\"zic-hub__cardBadge\">\r\n        <span>Drept Penal<\/span>\r\n      <\/div>\r\n      <div class=\"zic-hub__cardArrow\">\r\n        <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\r\n          <path d=\"M5 12h14M12 5l7 7-7 7\"\/>\r\n        <\/svg>\r\n      <\/div>\r\n    <\/article>\r\n\r\n    <!-- Tool 3: Calculator concurs -->\r\n    <article class=\"zic-hub__card\" data-tool=\"concurs\" role=\"listitem\" tabindex=\"0\">\r\n      <div class=\"zic-hub__cardIcon\">\r\n        <svg width=\"32\" height=\"32\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n          <path d=\"M12 2L2 7l10 5 10-5-10-5z\"\/>\r\n          <path d=\"M2 17l10 5 10-5\"\/>\r\n          <path d=\"M2 12l10 5 10-5\"\/>\r\n        <\/svg>\r\n      <\/div>\r\n      <div class=\"zic-hub__cardContent\">\r\n        <h3 class=\"zic-hub__cardTitle\">Calculator concurs<\/h3>\r\n        <p class=\"zic-hub__cardDesc\">Calculeaz\u0103 pedeapsa rezultant\u0103 conform art. 39 Cod penal<\/p>\r\n      <\/div>\r\n      <div class=\"zic-hub__cardBadge\">\r\n        <span>Drept Penal<\/span>\r\n      <\/div>\r\n      <div class=\"zic-hub__cardArrow\">\r\n        <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\r\n          <path d=\"M5 12h14M12 5l7 7-7 7\"\/>\r\n        <\/svg>\r\n      <\/div>\r\n    <\/article>\r\n\r\n    <!-- Tool 4: Liberare condi\u021bionat\u0103 -->\r\n    <article class=\"zic-hub__card\" data-tool=\"liberare\" role=\"listitem\" tabindex=\"0\">\r\n      <div class=\"zic-hub__cardIcon\">\r\n        <svg width=\"32\" height=\"32\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n          <path d=\"M12 2l7 4v6c0 5-3 9-7 10-4-1-7-5-7-10V6l7-4Z\"\/>\r\n          <path d=\"M9.5 12.2l1.7 1.7 3.8-4.1\"\/>\r\n        <\/svg>\r\n      <\/div>\r\n      <div class=\"zic-hub__cardContent\">\r\n        <h3 class=\"zic-hub__cardTitle\">Liberare condi\u021bionat\u0103<\/h3>\r\n        <p class=\"zic-hub__cardDesc\">Estimare condi\u021bie de timp conform art. 99-101 CP \u0219i art. 96 L.254\/2013<\/p>\r\n      <\/div>\r\n      <div class=\"zic-hub__cardBadge\">\r\n        <span>Drept Penal<\/span>\r\n      <\/div>\r\n      <div class=\"zic-hub__cardArrow\">\r\n        <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\r\n          <path d=\"M5 12h14M12 5l7 7-7 7\"\/>\r\n        <\/svg>\r\n      <\/div>\r\n    <\/article>\r\n\r\n    <!-- Tool 5: Suspendare supraveghere -->\r\n    <article class=\"zic-hub__card\" data-tool=\"supraveghere\" role=\"listitem\" tabindex=\"0\">\r\n      <div class=\"zic-hub__cardIcon\">\r\n        <svg width=\"32\" height=\"32\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n          <path d=\"M9 12l2 2 4-4\"\/>\r\n          <path d=\"M21 12a9 9 0 1 1-18 0 9 9 0 0 1 18 0Z\"\/>\r\n        <\/svg>\r\n      <\/div>\r\n      <div class=\"zic-hub__cardContent\">\r\n        <h3 class=\"zic-hub__cardTitle\">Suspendare supraveghere<\/h3>\r\n        <p class=\"zic-hub__cardDesc\">Verificarea condi\u021biilor pentru suspendarea execut\u0103rii pedepsei (art. 91 CP)<\/p>\r\n      <\/div>\r\n      <div class=\"zic-hub__cardBadge\">\r\n        <span>Drept Penal<\/span>\r\n      <\/div>\r\n      <div class=\"zic-hub__cardArrow\">\r\n        <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\r\n          <path d=\"M5 12h14M12 5l7 7-7 7\"\/>\r\n        <\/svg>\r\n      <\/div>\r\n    <\/article>\r\n\r\n    <!-- Tool 6: Calculator reducere pedeaps\u0103 -->\r\n    <article class=\"zic-hub__card\" data-tool=\"reducere\" role=\"listitem\" tabindex=\"0\">\r\n      <div class=\"zic-hub__cardIcon\">\r\n        <svg width=\"32\" height=\"32\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n          <rect x=\"4\" y=\"2\" width=\"16\" height=\"20\" rx=\"2\"\/>\r\n          <line x1=\"8\" y1=\"6\" x2=\"16\" y2=\"6\"\/>\r\n          <line x1=\"8\" y1=\"10\" x2=\"16\" y2=\"10\"\/>\r\n          <line x1=\"8\" y1=\"14\" x2=\"12\" y2=\"14\"\/>\r\n          <line x1=\"8\" y1=\"18\" x2=\"10\" y2=\"18\"\/>\r\n        <\/svg>\r\n      <\/div>\r\n      <div class=\"zic-hub__cardContent\">\r\n        <h3 class=\"zic-hub__cardTitle\">Calculator reducere pedeaps\u0103<\/h3>\r\n        <p class=\"zic-hub__cardDesc\">Calculeaz\u0103 reducerea pedepsei conform legisla\u021biei \u00een vigoare<\/p>\r\n      <\/div>\r\n      <div class=\"zic-hub__cardBadge\">\r\n        <span>Drept Penal<\/span>\r\n      <\/div>\r\n      <div class=\"zic-hub__cardArrow\">\r\n        <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\r\n          <path d=\"M5 12h14M12 5l7 7-7 7\"\/>\r\n        <\/svg>\r\n      <\/div>\r\n    <\/article>\r\n\r\n    <!-- Tool 7: Calculator reabilitare -->\r\n    <article class=\"zic-hub__card\" data-tool=\"reabilitare\" role=\"listitem\" tabindex=\"0\">\r\n      <div class=\"zic-hub__cardIcon\">\r\n        <svg width=\"32\" height=\"32\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n          <path d=\"M12 22c5.523 0 10-4.477 10-10S17.523 2 12 2 2 6.477 2 12s4.477 10 10 10z\"\/>\r\n          <path d=\"M8 12l2 2 4-4\"\/>\r\n        <\/svg>\r\n      <\/div>\r\n      <div class=\"zic-hub__cardContent\">\r\n        <h3 class=\"zic-hub__cardTitle\">Calculator reabilitare<\/h3>\r\n        <p class=\"zic-hub__cardDesc\">Verificarea condi\u021biilor pentru reabilitarea de drept \u0219i judec\u0103toreasc\u0103<\/p>\r\n      <\/div>\r\n      <div class=\"zic-hub__cardBadge\">\r\n        <span>Drept Penal<\/span>\r\n      <\/div>\r\n      <div class=\"zic-hub__cardArrow\">\r\n        <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\r\n          <path d=\"M5 12h14M12 5l7 7-7 7\"\/>\r\n        <\/svg>\r\n      <\/div>\r\n    <\/article>\r\n\r\n    <!-- Tool 7: Analiz\u0103 cazier judiciar (dezactivat - \u00een cur\u00e2nd) -->\r\n    <article class=\"zic-hub__card zic-hub__card--disabled\" role=\"listitem\" tabindex=\"-1\" aria-disabled=\"true\">\r\n      <div class=\"zic-hub__cardIcon zic-hub__cardIcon--disabled\">\r\n        <svg width=\"32\" height=\"32\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n          <path d=\"M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z\"\/>\r\n          <polyline points=\"14 2 14 8 20 8\"\/>\r\n          <line x1=\"16\" y1=\"13\" x2=\"8\" y2=\"13\"\/>\r\n          <line x1=\"16\" y1=\"17\" x2=\"8\" y2=\"17\"\/>\r\n          <polyline points=\"10 9 9 9 8 9\"\/>\r\n        <\/svg>\r\n      <\/div>\r\n      <div class=\"zic-hub__cardContent\">\r\n        <h3 class=\"zic-hub__cardTitle\">Analiz\u0103 cazier judiciar<\/h3>\r\n        <p class=\"zic-hub__cardDesc\">Interpretarea informa\u021biilor din cazierul judiciar<\/p>\r\n      <\/div>\r\n      <div class=\"zic-hub__cardBadge zic-hub__cardBadge--soon\">\r\n        <span>\u00cen cur\u00e2nd<\/span>\r\n      <\/div>\r\n      <div class=\"zic-hub__cardArrow\">\r\n        <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\r\n          <path d=\"M5 12h14M12 5l7 7-7 7\"\/>\r\n        <\/svg>\r\n      <\/div>\r\n    <\/article>\r\n\r\n    <!-- Tool 8: Formular clien\u021bi (dezactivat - \u00een cur\u00e2nd) -->\r\n    <article class=\"zic-hub__card zic-hub__card--disabled\" role=\"listitem\" tabindex=\"-1\" aria-disabled=\"true\">\r\n      <div class=\"zic-hub__cardIcon zic-hub__cardIcon--disabled\">\r\n        <svg width=\"32\" height=\"32\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n          <path d=\"M9 11l3 3L22 4\"\/>\r\n          <path d=\"M21 12v7a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h11\"\/>\r\n        <\/svg>\r\n      <\/div>\r\n      <div class=\"zic-hub__cardContent\">\r\n        <h3 class=\"zic-hub__cardTitle\">Formular clien\u021bi<\/h3>\r\n        <p class=\"zic-hub__cardDesc\">Genereaz\u0103 formulare pentru colectarea datelor de la clien\u021bi<\/p>\r\n      <\/div>\r\n      <div class=\"zic-hub__cardBadge zic-hub__cardBadge--soon\">\r\n        <span>\u00cen cur\u00e2nd<\/span>\r\n      <\/div>\r\n      <div class=\"zic-hub__cardArrow\">\r\n        <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\r\n          <path d=\"M5 12h14M12 5l7 7-7 7\"\/>\r\n        <\/svg>\r\n      <\/div>\r\n    <\/article>\r\n\r\n    <!-- Tool 9: Analiz\u0103 header email -->\r\n    <article class=\"zic-hub__card\" data-tool=\"email\" role=\"listitem\" tabindex=\"0\">\r\n      <div class=\"zic-hub__cardIcon zic-hub__cardIcon--cyber\">\r\n        <svg width=\"32\" height=\"32\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n          <path d=\"M4 4h16c1.1 0 2 .9 2 2v12c0 1.1-.9 2-2 2H4c-1.1 0-2-.9-2-2V6c0-1.1.9-2 2-2z\"\/>\r\n          <polyline points=\"22,6 12,13 2,6\"\/>\r\n        <\/svg>\r\n      <\/div>\r\n      <div class=\"zic-hub__cardContent\">\r\n        <h3 class=\"zic-hub__cardTitle\">Analiz\u0103 header email<\/h3>\r\n        <p class=\"zic-hub__cardDesc\">Detecteaz\u0103 email spoofing \u0219i phishing din header-ul emailului<\/p>\r\n      <\/div>\r\n      <div class=\"zic-hub__cardBadge zic-hub__cardBadge--cyber\">\r\n        <span>Cybersecurity<\/span>\r\n      <\/div>\r\n      <div class=\"zic-hub__cardArrow\">\r\n        <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\r\n          <path d=\"M5 12h14M12 5l7 7-7 7\"\/>\r\n        <\/svg>\r\n      <\/div>\r\n    <\/article>\r\n\r\n    <!-- Tool 9: Verificare website -->\r\n    <article class=\"zic-hub__card\" data-tool=\"website\" role=\"listitem\" tabindex=\"0\">\r\n      <div class=\"zic-hub__cardIcon zic-hub__cardIcon--cyber\">\r\n        <svg width=\"32\" height=\"32\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n          <circle cx=\"11\" cy=\"11\" r=\"8\"\/>\r\n          <path d=\"M21 21l-4.35-4.35\"\/>\r\n        <\/svg>\r\n      <\/div>\r\n      <div class=\"zic-hub__cardContent\">\r\n        <h3 class=\"zic-hub__cardTitle\">Verificare website<\/h3>\r\n        <p class=\"zic-hub__cardDesc\">Detecteaz\u0103 link-uri suspecte \u0219i tentative de phishing<\/p>\r\n      <\/div>\r\n      <div class=\"zic-hub__cardBadge zic-hub__cardBadge--cyber\">\r\n        <span>Cybersecurity<\/span>\r\n      <\/div>\r\n      <div class=\"zic-hub__cardArrow\">\r\n        <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\r\n          <path d=\"M5 12h14M12 5l7 7-7 7\"\/>\r\n        <\/svg>\r\n      <\/div>\r\n    <\/article>\r\n\r\n  <\/div>\r\n\r\n  <!-- Tool Display Container -->\r\n  <div class=\"zic-hub__toolContainer is-hidden\" data-tool-container>\r\n    <div class=\"zic-hub__toolHeader\">\r\n      <button type=\"button\" class=\"zic-hub__backBtn\" data-action=\"close-tool\">\r\n        <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\r\n          <path d=\"M19 12H5M12 19l-7-7 7-7\"\/>\r\n        <\/svg>\r\n        <span>\u00cenapoi la instrumente<\/span>\r\n      <\/button>\r\n    <\/div>\r\n    <div class=\"zic-hub__toolBody\" data-tool-body>\r\n      <!-- Selected tool content appears here -->\r\n    <\/div>\r\n  <\/div>\r\n<\/div>\r\n\r\n<style>\r\n\/* ============================================================\r\n   ZIC Tools Hub v2.1 - Dynamic & Responsive Design\r\n   Brand Colors: Purple #8980f5 | Teal #308c97\r\n   Performance: Font preloaded, content-visibility optimized\r\n   ============================================================ *\/\r\n\/* Font loaded via preload in HTML head for faster rendering *\/\r\n\r\n#zic-tools-hub {\r\n  --hub-primary: #8980f5;\r\n  --hub-primary-dark: #7370e0;\r\n  --hub-primary-light: rgba(137, 128, 245, 0.08);\r\n  --hub-primary-glow: rgba(137, 128, 245, 0.35);\r\n\r\n  --hub-cyber: #308c97;\r\n  --hub-cyber-dark: #267a83;\r\n  --hub-cyber-light: rgba(48, 140, 151, 0.08);\r\n  --hub-cyber-glow: rgba(48, 140, 151, 0.35);\r\n\r\n  --hub-ink: #1c1c1c;\r\n  --hub-ink-light: #323232;\r\n  --hub-muted: #5B6370;\r\n  --hub-light: #9CA3AF;\r\n\r\n  --hub-bg: #fcfcfc;\r\n  --hub-surface: #FFFFFF;\r\n  --hub-border: #E5E7EB;\r\n\r\n  --hub-shadow-sm: 0 1px 2px rgba(0,0,0,0.05);\r\n  --hub-shadow: 0 4px 6px -1px rgba(0,0,0,0.1), 0 2px 4px -1px rgba(0,0,0,0.06);\r\n  --hub-shadow-lg: 0 10px 15px -3px rgba(0,0,0,0.1), 0 4px 6px -2px rgba(0,0,0,0.05);\r\n  --hub-shadow-xl: 0 20px 25px -5px rgba(0,0,0,0.1), 0 10px 10px -5px rgba(0,0,0,0.04);\r\n\r\n  --hub-radius: 20px;\r\n  --hub-radius-sm: 14px;\r\n  --hub-radius-xs: 10px;\r\n\r\n  --hub-transition: 200ms cubic-bezier(0.4, 0, 0.2, 1);\r\n  --hub-transition-bounce: 400ms cubic-bezier(0.34, 1.56, 0.64, 1);\r\n  --hub-duration-fast: 150ms;\r\n  --hub-duration-normal: 250ms;\r\n  --hub-duration-slow: 400ms;\r\n  --hub-ease-out: cubic-bezier(0.16, 1, 0.3, 1);\r\n\r\n  font-family: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;\r\n  color: var(--hub-ink);\r\n  line-height: 1.6;\r\n  -webkit-font-smoothing: antialiased;\r\n  position: relative;\r\n  min-height: 400px;\r\n  padding: 20px 20px 40px;\r\n}\r\n\r\n\/* Respect reduced motion preference *\/\r\n@media (prefers-reduced-motion: reduce) {\r\n  #zic-tools-hub *,\r\n  #zic-tools-hub *::before,\r\n  #zic-tools-hub *::after {\r\n    animation-duration: 0.01ms !important;\r\n    transition-duration: 0.01ms !important;\r\n  }\r\n}\r\n\r\n#zic-tools-hub *,\r\n#zic-tools-hub *::before,\r\n#zic-tools-hub *::after {\r\n  box-sizing: border-box;\r\n}\r\n\r\n\/* === Grid Layout === *\/\r\n.zic-hub__grid {\r\n  display: grid;\r\n  grid-template-columns: repeat(3, 1fr);\r\n  gap: 24px;\r\n  max-width: 1100px;\r\n  margin: 0 auto;\r\n  justify-content: center;\r\n}\r\n\r\n\/* 2 columns for medium screens *\/\r\n@media (max-width: 1100px) {\r\n  .zic-hub__grid {\r\n    grid-template-columns: repeat(2, 1fr);\r\n    max-width: 760px;\r\n  }\r\n}\r\n\r\n\/* 1 column for mobile *\/\r\n@media (max-width: 680px) {\r\n  .zic-hub__grid {\r\n    grid-template-columns: 1fr;\r\n    max-width: 400px;\r\n  }\r\n}\r\n\r\n\/* === Card Styles === *\/\r\n.zic-hub__card {\r\n  position: relative;\r\n  background: var(--hub-surface);\r\n  border: 1px solid var(--hub-border);\r\n  border-radius: var(--hub-radius);\r\n  padding: 28px;\r\n  cursor: pointer;\r\n  transition: all var(--hub-transition);\r\n  display: flex;\r\n  flex-direction: column;\r\n  gap: 16px;\r\n  overflow: hidden;\r\n  min-height: 180px;\r\n}\r\n\r\n\/* Top accent line *\/\r\n.zic-hub__card::before {\r\n  content: '';\r\n  position: absolute;\r\n  top: 0;\r\n  left: 0;\r\n  right: 0;\r\n  height: 4px;\r\n  background: linear-gradient(90deg, var(--hub-primary), var(--hub-primary-dark));\r\n  transform: scaleX(0);\r\n  transform-origin: left;\r\n  transition: transform var(--hub-transition);\r\n}\r\n\r\n\/* Glow effect *\/\r\n.zic-hub__card::after {\r\n  content: '';\r\n  position: absolute;\r\n  top: -100%;\r\n  left: -100%;\r\n  width: 300%;\r\n  height: 300%;\r\n  background: radial-gradient(circle at center, var(--hub-primary-light) 0%, transparent 50%);\r\n  opacity: 0;\r\n  transition: opacity 0.5s ease;\r\n  pointer-events: none;\r\n  z-index: 0;\r\n}\r\n\r\n.zic-hub__card:hover,\r\n.zic-hub__card:focus {\r\n  border-color: var(--hub-primary);\r\n  box-shadow: var(--hub-shadow-lg), 0 0 0 4px var(--hub-primary-light);\r\n  transform: translateY(-6px);\r\n}\r\n\r\n.zic-hub__card:hover::before,\r\n.zic-hub__card:focus::before {\r\n  transform: scaleX(1);\r\n}\r\n\r\n.zic-hub__card:hover::after {\r\n  opacity: 1;\r\n}\r\n\r\n.zic-hub__card:focus {\r\n  outline: none;\r\n}\r\n\r\n.zic-hub__card:active {\r\n  transform: translateY(-3px);\r\n  transition-duration: 100ms;\r\n}\r\n\r\n\/* Card content z-index *\/\r\n.zic-hub__card > * {\r\n  position: relative;\r\n  z-index: 1;\r\n}\r\n\r\n\/* Card Icon *\/\r\n.zic-hub__cardIcon {\r\n  width: 60px;\r\n  height: 60px;\r\n  background: linear-gradient(135deg, var(--hub-primary-light), rgba(138, 136, 255, 0.18));\r\n  border-radius: var(--hub-radius-sm);\r\n  display: flex;\r\n  align-items: center;\r\n  justify-content: center;\r\n  color: var(--hub-primary-dark);\r\n  transition: all var(--hub-transition-bounce);\r\n  flex-shrink: 0;\r\n}\r\n\r\n.zic-hub__cardIcon--cyber {\r\n  background: linear-gradient(135deg, var(--hub-cyber-light), rgba(48, 141, 152, 0.18));\r\n  color: var(--hub-cyber-dark);\r\n}\r\n\r\n.zic-hub__card:hover .zic-hub__cardIcon {\r\n  transform: scale(1.1) rotate(-5deg);\r\n  background: linear-gradient(135deg, var(--hub-primary), var(--hub-primary-dark));\r\n  color: #fff;\r\n  box-shadow: 0 10px 25px var(--hub-primary-glow);\r\n}\r\n\r\n.zic-hub__card:hover .zic-hub__cardIcon--cyber {\r\n  background: linear-gradient(135deg, var(--hub-cyber), var(--hub-cyber-dark));\r\n  box-shadow: 0 10px 25px var(--hub-cyber-glow);\r\n}\r\n\r\n\/* Card Content *\/\r\n.zic-hub__cardContent {\r\n  flex: 1;\r\n  padding-right: 40px;\r\n}\r\n\r\n.zic-hub__cardTitle {\r\n  margin: 0 0 8px 0;\r\n  font-size: 19px;\r\n  font-weight: 700;\r\n  color: var(--hub-ink);\r\n  transition: color var(--hub-transition);\r\n}\r\n\r\n.zic-hub__card:hover .zic-hub__cardTitle {\r\n  color: var(--hub-primary-dark);\r\n}\r\n\r\n.zic-hub__cardDesc {\r\n  margin: 0;\r\n  font-size: 14px;\r\n  color: var(--hub-muted);\r\n  line-height: 1.6;\r\n}\r\n\r\n\/* Card Badge *\/\r\n.zic-hub__cardBadge {\r\n  position: absolute;\r\n  top: 24px;\r\n  right: 24px;\r\n}\r\n\r\n.zic-hub__cardBadge span {\r\n  display: inline-block;\r\n  padding: 5px 12px;\r\n  background: var(--hub-primary-light);\r\n  color: var(--hub-primary-dark);\r\n  font-size: 11px;\r\n  font-weight: 700;\r\n  text-transform: uppercase;\r\n  letter-spacing: 0.5px;\r\n  border-radius: 20px;\r\n  transition: all var(--hub-transition);\r\n}\r\n\r\n.zic-hub__card:hover .zic-hub__cardBadge span {\r\n  background: var(--hub-primary);\r\n  color: #fff;\r\n}\r\n\r\n.zic-hub__cardBadge--cyber span {\r\n  background: var(--hub-cyber-light);\r\n  color: var(--hub-cyber-dark);\r\n}\r\n\r\n.zic-hub__card:hover .zic-hub__cardBadge--cyber span {\r\n  background: var(--hub-cyber);\r\n  color: #fff;\r\n}\r\n\r\n\/* Badge \"\u00cen cur\u00e2nd\" *\/\r\n.zic-hub__cardBadge--soon span {\r\n  background: rgba(156, 163, 175, 0.15);\r\n  color: #6B7280;\r\n}\r\n\r\n.zic-hub__card--disabled:hover .zic-hub__cardBadge--soon span {\r\n  background: rgba(156, 163, 175, 0.15);\r\n  color: #6B7280;\r\n}\r\n\r\n\/* Card dezactivat *\/\r\n.zic-hub__card--disabled {\r\n  cursor: not-allowed;\r\n  opacity: 0.65;\r\n}\r\n\r\n.zic-hub__card--disabled::before,\r\n.zic-hub__card--disabled::after {\r\n  display: none;\r\n}\r\n\r\n.zic-hub__card--disabled:hover,\r\n.zic-hub__card--disabled:focus {\r\n  border-color: var(--hub-border);\r\n  box-shadow: var(--hub-shadow-sm);\r\n  transform: none;\r\n}\r\n\r\n.zic-hub__cardIcon--disabled {\r\n  background: rgba(156, 163, 175, 0.1);\r\n  color: var(--hub-light);\r\n}\r\n\r\n.zic-hub__card--disabled:hover .zic-hub__cardIcon--disabled {\r\n  transform: none;\r\n  background: rgba(156, 163, 175, 0.1);\r\n  color: var(--hub-light);\r\n  box-shadow: none;\r\n}\r\n\r\n.zic-hub__card--disabled:hover .zic-hub__cardTitle {\r\n  color: var(--hub-ink);\r\n}\r\n\r\n.zic-hub__card--disabled:hover .zic-hub__cardArrow {\r\n  background: var(--hub-bg);\r\n  color: var(--hub-light);\r\n  transform: none;\r\n  box-shadow: none;\r\n}\r\n\r\n\/* Card Arrow *\/\r\n.zic-hub__cardArrow {\r\n  position: absolute;\r\n  bottom: 24px;\r\n  right: 24px;\r\n  width: 40px;\r\n  height: 40px;\r\n  background: var(--hub-bg);\r\n  border-radius: 50%;\r\n  display: flex;\r\n  align-items: center;\r\n  justify-content: center;\r\n  color: var(--hub-light);\r\n  transition: all var(--hub-transition);\r\n}\r\n\r\n.zic-hub__card:hover .zic-hub__cardArrow {\r\n  background: var(--hub-primary);\r\n  color: #fff;\r\n  transform: translateX(5px);\r\n  box-shadow: 0 4px 12px var(--hub-primary-glow);\r\n}\r\n\r\n\/* === Tool Container === *\/\r\n.zic-hub__toolContainer {\r\n  max-width: 1000px;\r\n  margin: 0 auto;\r\n  animation: hubSlideIn 0.5s cubic-bezier(0.34, 1.56, 0.64, 1);\r\n}\r\n\r\n@keyframes hubSlideIn {\r\n  from {\r\n    opacity: 0;\r\n    transform: translateY(30px);\r\n  }\r\n  to {\r\n    opacity: 1;\r\n    transform: translateY(0);\r\n  }\r\n}\r\n\r\n.zic-hub__toolHeader {\r\n  margin-bottom: 24px;\r\n}\r\n\r\n.zic-hub__backBtn {\r\n  display: inline-flex;\r\n  align-items: center;\r\n  gap: 10px;\r\n  padding: 14px 24px;\r\n  background: var(--hub-surface);\r\n  border: 2px solid var(--hub-border);\r\n  border-radius: var(--hub-radius-sm);\r\n  color: var(--hub-ink-light);\r\n  font-size: 15px;\r\n  font-weight: 600;\r\n  cursor: pointer;\r\n  transition: all var(--hub-transition);\r\n  font-family: inherit;\r\n}\r\n\r\n.zic-hub__backBtn:hover {\r\n  background: var(--hub-primary-light);\r\n  border-color: var(--hub-primary);\r\n  color: var(--hub-primary-dark);\r\n  transform: translateX(-4px);\r\n}\r\n\r\n.zic-hub__backBtn:focus {\r\n  outline: none;\r\n  box-shadow: 0 0 0 4px var(--hub-primary-light);\r\n}\r\n\r\n.zic-hub__toolBody {\r\n  background: var(--hub-surface);\r\n  border-radius: var(--hub-radius);\r\n  box-shadow: var(--hub-shadow-xl);\r\n  overflow: hidden;\r\n  border: 1px solid var(--hub-border);\r\n}\r\n\r\n\/* === Loading Indicator === *\/\r\n.zic-hub__loading {\r\n  display: flex;\r\n  align-items: center;\r\n  justify-content: center;\r\n  min-height: 300px;\r\n  padding: 40px 20px;\r\n}\r\n\r\n.zic-hub__loadingContent {\r\n  display: flex;\r\n  flex-direction: column;\r\n  align-items: center;\r\n  gap: 24px;\r\n  max-width: 300px;\r\n  width: 100%;\r\n}\r\n\r\n.zic-hub__loadingSpinner {\r\n  display: flex;\r\n  align-items: center;\r\n  justify-content: center;\r\n  gap: 8px;\r\n}\r\n\r\n.zic-hub__loadingDot {\r\n  width: 14px;\r\n  height: 14px;\r\n  border-radius: 50%;\r\n  background: linear-gradient(135deg, var(--hub-primary), var(--hub-cyber));\r\n  animation: loadingBounce 1.4s ease-in-out infinite;\r\n}\r\n\r\n.zic-hub__loadingDot:nth-child(1) {\r\n  animation-delay: 0s;\r\n}\r\n\r\n.zic-hub__loadingDot:nth-child(2) {\r\n  animation-delay: 0.2s;\r\n}\r\n\r\n.zic-hub__loadingDot:nth-child(3) {\r\n  animation-delay: 0.4s;\r\n}\r\n\r\n@keyframes loadingBounce {\r\n  0%, 80%, 100% {\r\n    transform: scale(0.6);\r\n    opacity: 0.5;\r\n  }\r\n  40% {\r\n    transform: scale(1);\r\n    opacity: 1;\r\n  }\r\n}\r\n\r\n.zic-hub__loadingBar {\r\n  width: 100%;\r\n  height: 6px;\r\n  background: var(--hub-border);\r\n  border-radius: 10px;\r\n  overflow: hidden;\r\n  position: relative;\r\n}\r\n\r\n.zic-hub__loadingProgress {\r\n  height: 100%;\r\n  width: 40%;\r\n  background: linear-gradient(90deg, var(--hub-primary), var(--hub-cyber));\r\n  border-radius: 10px;\r\n  animation: loadingProgress 1.5s ease-in-out infinite;\r\n}\r\n\r\n@keyframes loadingProgress {\r\n  0% {\r\n    transform: translateX(-100%);\r\n  }\r\n  50% {\r\n    transform: translateX(150%);\r\n  }\r\n  100% {\r\n    transform: translateX(350%);\r\n  }\r\n}\r\n\r\n.zic-hub__loadingText {\r\n  margin: 0;\r\n  font-size: 15px;\r\n  color: var(--hub-muted);\r\n  font-weight: 500;\r\n  text-align: center;\r\n}\r\n\r\n\/* === Utility === *\/\r\n#zic-tools-hub .is-hidden {\r\n  display: none !important;\r\n}\r\n\r\n\/* Hide the tool content divs that are outside the hub *\/\r\n\/* content-visibility: hidden tells browser to skip layout calculation for hidden content *\/\r\n[data-tool-content] {\r\n  display: none !important;\r\n  content-visibility: hidden;\r\n  contain-intrinsic-size: 0 500px;\r\n}\r\n\r\n\/* === Responsive Design === *\/\r\n\r\n\/* Tablets & Mobile *\/\r\n@media (max-width: 680px) {\r\n  #zic-tools-hub {\r\n    padding: 16px;\r\n  }\r\n\r\n  .zic-hub__card {\r\n    padding: 20px;\r\n    min-height: auto;\r\n    flex-direction: row;\r\n    align-items: center;\r\n    gap: 16px;\r\n  }\r\n\r\n  .zic-hub__card::before {\r\n    height: 100%;\r\n    width: 4px;\r\n    right: auto;\r\n    transform: scaleY(0);\r\n    transform-origin: top;\r\n  }\r\n\r\n  .zic-hub__card:hover::before,\r\n  .zic-hub__card:focus::before {\r\n    transform: scaleY(1);\r\n  }\r\n\r\n  .zic-hub__cardIcon {\r\n    width: 52px;\r\n    height: 52px;\r\n  }\r\n\r\n  .zic-hub__cardIcon svg {\r\n    width: 26px;\r\n    height: 26px;\r\n  }\r\n\r\n  .zic-hub__cardContent {\r\n    min-width: 0;\r\n    padding-right: 0;\r\n  }\r\n\r\n  .zic-hub__cardTitle {\r\n    font-size: 16px;\r\n    margin-bottom: 4px;\r\n  }\r\n\r\n  .zic-hub__cardDesc {\r\n    font-size: 13px;\r\n    display: -webkit-box;\r\n    -webkit-line-clamp: 2;\r\n    -webkit-box-orient: vertical;\r\n    overflow: hidden;\r\n  }\r\n\r\n  .zic-hub__cardBadge {\r\n    display: none;\r\n  }\r\n\r\n  .zic-hub__cardArrow {\r\n    position: static;\r\n    width: 36px;\r\n    height: 36px;\r\n    flex-shrink: 0;\r\n  }\r\n\r\n  .zic-hub__card:hover,\r\n  .zic-hub__card:focus {\r\n    transform: translateX(6px);\r\n  }\r\n\r\n  .zic-hub__backBtn {\r\n    padding: 12px 18px;\r\n    font-size: 14px;\r\n  }\r\n\r\n  .zic-hub__toolHeader {\r\n    margin-bottom: 16px;\r\n  }\r\n}\r\n\r\n\/* Small mobile *\/\r\n@media (max-width: 420px) {\r\n  #zic-tools-hub {\r\n    padding: 12px;\r\n  }\r\n\r\n  .zic-hub__card {\r\n    padding: 16px;\r\n  }\r\n\r\n  .zic-hub__cardIcon {\r\n    width: 44px;\r\n    height: 44px;\r\n  }\r\n\r\n  .zic-hub__cardIcon svg {\r\n    width: 22px;\r\n    height: 22px;\r\n  }\r\n\r\n  .zic-hub__cardTitle {\r\n    font-size: 15px;\r\n  }\r\n\r\n  .zic-hub__cardDesc {\r\n    font-size: 12px;\r\n  }\r\n\r\n  .zic-hub__cardArrow {\r\n    width: 32px;\r\n    height: 32px;\r\n  }\r\n}\r\n\r\n\/* === Animation for card entry (deferred until grid loaded) === *\/\r\n\/* Cards start without animation to reduce initial render blocking *\/\r\n.zic-hub__card {\r\n  animation: none;\r\n}\r\n\r\n\/* Animations only trigger after grid is marked as loaded *\/\r\n.zic-hub__grid.is-loaded .zic-hub__card {\r\n  animation: hubCardIn 0.6s cubic-bezier(0.34, 1.56, 0.64, 1) backwards;\r\n}\r\n\r\n.zic-hub__grid.is-loaded .zic-hub__card:nth-child(1) { animation-delay: 0.05s; }\r\n.zic-hub__grid.is-loaded .zic-hub__card:nth-child(2) { animation-delay: 0.1s; }\r\n.zic-hub__grid.is-loaded .zic-hub__card:nth-child(3) { animation-delay: 0.15s; }\r\n.zic-hub__grid.is-loaded .zic-hub__card:nth-child(4) { animation-delay: 0.2s; }\r\n.zic-hub__grid.is-loaded .zic-hub__card:nth-child(5) { animation-delay: 0.25s; }\r\n.zic-hub__grid.is-loaded .zic-hub__card:nth-child(6) { animation-delay: 0.3s; }\r\n\r\n@keyframes hubCardIn {\r\n  from {\r\n    opacity: 0;\r\n    transform: translateY(40px) scale(0.9);\r\n  }\r\n  to {\r\n    opacity: 1;\r\n    transform: translateY(0) scale(1);\r\n  }\r\n}\r\n\r\n\/* === Focus visible for accessibility === *\/\r\n.zic-hub__card:focus-visible {\r\n  outline: 3px solid var(--hub-primary);\r\n  outline-offset: 3px;\r\n}\r\n\r\n\/* === Print styles === *\/\r\n@media print {\r\n  #zic-tools-hub {\r\n    display: none;\r\n  }\r\n}\r\n<\/style>\r\n\r\n<script>\r\n(function() {\r\n  'use strict';\r\n\r\n  const hub = document.getElementById('zic-tools-hub');\r\n  if (!hub) return;\r\n\r\n  const $ = (sel) => hub.querySelector(sel);\r\n  const $$ = (sel) => hub.querySelectorAll(sel);\r\n\r\n  const elements = {\r\n    loading: $('[data-loading]'),\r\n    grid: $('[data-hub-grid]'),\r\n    container: $('[data-tool-container]'),\r\n    body: $('[data-tool-body]'),\r\n    cards: $$('.zic-hub__card')\r\n  };\r\n\r\n  let currentTool = null;\r\n  let originalScrollPos = 0;\r\n  let isLoaded = false;\r\n\r\n  \/\/ Lista de tool-uri valide pentru validare\r\n  const validTools = ['prescriptie', 'concurs', 'liberare', 'supraveghere', 'reducere', 'cazier', 'formular', 'reabilitare', 'termene', 'aparator', 'email', 'website'];\r\n\r\n  \/\/ Validare nume tool - previne injec\u021bie\r\n  function isValidToolName(name) {\r\n    return typeof name === 'string' && validTools.includes(name);\r\n  }\r\n\r\n  \/\/ Sanitizare hash URL\r\n  function sanitizeHash(hash) {\r\n    if (!hash || typeof hash !== 'string') return '';\r\n    \/\/ Permite doar caractere alfanumerice\r\n    return hash.replace(\/[^a-zA-Z0-9]\/g, '');\r\n  }\r\n\r\n  \/\/ Hide loading and show real cards\r\n  function showCards() {\r\n    if (isLoaded) return;\r\n    isLoaded = true;\r\n\r\n    \/\/ Fade out loading indicator\r\n    elements.loading.style.opacity = '0';\r\n    elements.loading.style.transition = 'opacity 0.4s ease';\r\n\r\n    setTimeout(function() {\r\n      elements.loading.classList.add('is-hidden');\r\n      elements.grid.classList.remove('is-hidden');\r\n      \/\/ Trigger deferred card animations after grid is visible\r\n      requestAnimationFrame(function() {\r\n        elements.grid.classList.add('is-loaded');\r\n      });\r\n    }, 400);\r\n  }\r\n\r\n  \/\/ Find all tool content divs (outside the hub, in the page)\r\n  function findToolContent(toolName) {\r\n    \/\/ Validare adi\u021bional\u0103 - doar tool-uri valide\r\n    if (!isValidToolName(toolName)) return null;\r\n    \/\/ Folosim CSS.escape pentru a preveni injec\u021bia selector (dac\u0103 e disponibil)\r\n    const safeName = typeof CSS !== 'undefined' && CSS.escape ? CSS.escape(toolName) : toolName;\r\n    return document.querySelector('[data-tool-content=\"' + safeName + '\"]');\r\n  }\r\n\r\n  function showTool(toolName) {\r\n    \/\/ Validare nume tool\r\n    if (!isValidToolName(toolName)) {\r\n      console.warn('Invalid tool name:', toolName);\r\n      return;\r\n    }\r\n\r\n    const toolContent = findToolContent(toolName);\r\n\r\n    if (!toolContent) {\r\n      console.warn('Tool content not found for:', toolName);\r\n      elements.body.innerHTML = '<div style=\"padding:60px;text-align:center;color:#6B7280;\"><p style=\"font-size:18px;margin-bottom:10px;\">Instrumentul nu a fost g\u0103sit.<\/p><p style=\"font-size:14px;\">Verifica\u021bi c\u0103 shortcode-ul este ad\u0103ugat corect \u00een pagin\u0103.<\/p><\/div>';\r\n    } else {\r\n      \/\/ Clone the content into the tool body\r\n      elements.body.innerHTML = toolContent.innerHTML;\r\n\r\n      \/\/ Re-execute scripts\r\n      reinitializeScripts(elements.body);\r\n    }\r\n\r\n    \/\/ Save scroll position\r\n    originalScrollPos = window.scrollY;\r\n\r\n    \/\/ Show tool container, hide grid\r\n    elements.grid.classList.add('is-hidden');\r\n    elements.container.classList.remove('is-hidden');\r\n    currentTool = toolName;\r\n\r\n    \/\/ Update URL hash - folosim encodeURIComponent pentru siguran\u021b\u0103\r\n    history.pushState(null, '', '#' + encodeURIComponent(toolName));\r\n\r\n    \/\/ Scroll to top of hub\r\n    setTimeout(function() {\r\n      hub.scrollIntoView({ behavior: 'smooth', block: 'start' });\r\n    }, 100);\r\n  }\r\n\r\n  function hideTool() {\r\n    elements.container.classList.add('is-hidden');\r\n    elements.grid.classList.remove('is-hidden');\r\n\r\n    \/\/ Clear tool body to free memory\r\n    elements.body.innerHTML = '';\r\n    currentTool = null;\r\n\r\n    \/\/ Update URL\r\n    history.pushState(null, '', window.location.pathname);\r\n\r\n    \/\/ Scroll back\r\n    setTimeout(function() {\r\n      window.scrollTo({ top: originalScrollPos, behavior: 'smooth' });\r\n    }, 100);\r\n  }\r\n\r\n  function reinitializeScripts(container) {\r\n    \/\/ Find all scripts in the container and re-execute them\r\n    const scripts = container.querySelectorAll('script');\r\n    scripts.forEach(function(oldScript) {\r\n      const newScript = document.createElement('script');\r\n\r\n      \/\/ Copy attributes\r\n      Array.from(oldScript.attributes).forEach(function(attr) {\r\n        newScript.setAttribute(attr.name, attr.value);\r\n      });\r\n\r\n      \/\/ Copy content\r\n      newScript.textContent = oldScript.textContent;\r\n\r\n      \/\/ Replace old with new (this triggers execution)\r\n      if (oldScript.parentNode) {\r\n        oldScript.parentNode.replaceChild(newScript, oldScript);\r\n      }\r\n    });\r\n  }\r\n\r\n  \/\/ Event Handlers\r\n  function handleCardClick(e) {\r\n    const card = e.target.closest('.zic-hub__card');\r\n    if (!card) return;\r\n\r\n    const toolName = card.dataset.tool;\r\n    if (toolName) {\r\n      showTool(toolName);\r\n    }\r\n  }\r\n\r\n  function handleCardKeydown(e) {\r\n    if (e.key === 'Enter' || e.key === ' ') {\r\n      e.preventDefault();\r\n      handleCardClick(e);\r\n    }\r\n  }\r\n\r\n  function handleCloseClick(e) {\r\n    const closeBtn = e.target.closest('[data-action=\"close-tool\"]');\r\n    if (closeBtn) {\r\n      hideTool();\r\n    }\r\n  }\r\n\r\n  function handleKeydown(e) {\r\n    if (e.key === 'Escape' && currentTool) {\r\n      hideTool();\r\n    }\r\n  }\r\n\r\n  function handlePopState() {\r\n    const rawHash = window.location.hash.slice(1);\r\n    const hash = sanitizeHash(decodeURIComponent(rawHash));\r\n    if (hash && isValidToolName(hash) && findToolContent(hash)) {\r\n      showTool(hash);\r\n    } else if (currentTool) {\r\n      hideTool();\r\n    }\r\n  }\r\n\r\n  \/\/ Initialize\r\n  function init() {\r\n    elements.grid.addEventListener('click', handleCardClick);\r\n    elements.grid.addEventListener('keydown', handleCardKeydown);\r\n    elements.container.addEventListener('click', handleCloseClick);\r\n    document.addEventListener('keydown', handleKeydown);\r\n    window.addEventListener('popstate', handlePopState);\r\n\r\n    \/\/ Show cards after a brief moment (simulates loading)\r\n    \/\/ In production, this waits for all tool shortcodes to be ready\r\n    if (document.readyState === 'complete') {\r\n      \/\/ Page already loaded\r\n      setTimeout(showCards, 100);\r\n    } else {\r\n      \/\/ Wait for full page load\r\n      window.addEventListener('load', function() {\r\n        setTimeout(showCards, 100);\r\n      });\r\n    }\r\n\r\n    \/\/ Check for URL hash to auto-open a tool\r\n    const rawHash = window.location.hash.slice(1);\r\n    const hash = sanitizeHash(decodeURIComponent(rawHash));\r\n    if (hash && isValidToolName(hash) && findToolContent(hash)) {\r\n      \/\/ Small delay to ensure page is fully loaded, then go directly to tool\r\n      setTimeout(function() {\r\n        \/\/ Hide loading, skip showing grid, go directly to tool\r\n        elements.loading.classList.add('is-hidden');\r\n        isLoaded = true;\r\n        showTool(hash);\r\n      }, 400);\r\n    }\r\n  }\r\n\r\n  if (document.readyState === 'loading') {\r\n    document.addEventListener('DOMContentLoaded', init);\r\n  } else {\r\n    init();\r\n  }\r\n})();\r\n<\/script>\r\n<div data-tool-content=\"aparator\" style=\"display:none\"><div id=\"zic-amanare-aparator\" class=\"zic2\" data-zic-amanare=\"1\">\r\n  <div class=\"zic2__wrap\">\r\n    <!-- Header -->\r\n    <header class=\"zic2__hero\">\r\n      <div class=\"zic2__brandbar\">\r\n        <div class=\"zic2__mark\" aria-hidden=\"true\">\r\n          <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n            <circle cx=\"12\" cy=\"12\" r=\"10\"\/>\r\n            <path d=\"M12 6v6l4 2\"\/>\r\n          <\/svg>\r\n        <\/div>\r\n        <div class=\"zic2__headerText\">\r\n          <h2 class=\"zic2__title\">Cerere Am\u00e2nare Cauz\u0103<\/h2>\r\n          <p class=\"zic2__subtitle\">Angajare ap\u0103r\u0103tor ales \u0219i preg\u0103tirea ap\u0103r\u0103rii<\/p>\r\n        <\/div>\r\n      <\/div>\r\n    <\/header>\r\n\r\n    <!-- Disclaimer -->\r\n    <div class=\"zic2__disclaimer zic2__disclaimer--top\">\r\n      <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><path d=\"M10.29 3.86L1.82 18a2 2 0 0 0 1.71 3h16.94a2 2 0 0 0 1.71-3L13.71 3.86a2 2 0 0 0-3.42 0z\"\/><line x1=\"12\" y1=\"9\" x2=\"12\" y2=\"13\"\/><line x1=\"12\" y1=\"17\" x2=\"12.01\" y2=\"17\"\/><\/svg>\r\n      <div>\r\n        <strong>Aten\u021bie:<\/strong> Instrument <strong>informativ<\/strong> pentru redactarea unei cereri. <strong>Nu reprezint\u0103 consultan\u021b\u0103 juridic\u0103<\/strong> \u0219i nu garanteaz\u0103 admiterea am\u00e2n\u0103rii. Verifica\u021bi \u00eentotdeauna termenul de judecat\u0103, regulile instan\u021bei \u0219i depune\u021bi cererea c\u00e2t mai devreme.\r\n      <\/div>\r\n    <\/div>\r\n\r\n    <!-- GDPR Consent Banner -->\r\n    <div class=\"zic2__gdprConsent\" data-gdpr-consent>\r\n      <div class=\"zic2__gdprConsentBox\">\r\n        <div class=\"zic2__gdprIcon\">\r\n          <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\r\n            <path d=\"M12 22s8-4 8-10V5l-8-3-8 3v7c0 6 8 10 8 10z\"\/>\r\n          <\/svg>\r\n        <\/div>\r\n        <div class=\"zic2__gdprConsentContent\">\r\n          <strong>Protec\u021bia Datelor Personale (GDPR)<\/strong>\r\n          <ul class=\"zic2__gdprList\">\r\n            <li>Toate datele sunt procesate <strong>exclusiv local<\/strong> \u00een browser-ul dumneavoastr\u0103<\/li>\r\n            <li><strong>Nu stoc\u0103m<\/strong> \u0219i <strong>nu transmitem<\/strong> nicio informa\u021bie c\u0103tre servere externe<\/li>\r\n            <li>PDF-ul se genereaz\u0103 exclusiv pe dispozitivul dumneavoastr\u0103<\/li>\r\n            <li>Pute\u021bi \u0219terge datele oric\u00e2nd folosind butonul \u201eReseteaz\u0103\"<\/li>\r\n            <li>Nu folosim cookies sau tracking<\/li>\r\n          <\/ul>\r\n          <label class=\"zic2__gdprCheckbox\">\r\n            <input type=\"checkbox\" data-gdpr-accept required>\r\n            <svg class=\"zic2__checkboxIcon zic2__checkboxIcon--unchecked\" width=\"22\" height=\"22\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><rect x=\"3\" y=\"3\" width=\"18\" height=\"18\" rx=\"3\"\/><\/svg>\r\n            <svg class=\"zic2__checkboxIcon zic2__checkboxIcon--checked\" width=\"22\" height=\"22\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><rect x=\"3\" y=\"3\" width=\"18\" height=\"18\" rx=\"3\" fill=\"#10B981\"\/><path d=\"M9 12l2 2 4-4\" stroke=\"white\" stroke-width=\"2.5\"\/><\/svg>\r\n            <span>Bifa\u021bi pentru a confirma c\u0103 a\u021bi citit \u0219i \u00een\u021beles informa\u021biile de mai sus. <strong class=\"zic2__req\">*<\/strong><\/span>\r\n          <\/label>\r\n          <button type=\"button\" class=\"zic2__btn zic2__btn--primary zic2__btn--large zic2__gdprAcceptBtn\" data-action=\"accept-gdpr\" disabled>\r\n            <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><path d=\"M9 11l3 3L22 4\"\/><path d=\"M21 12v7a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h11\"\/><\/svg>\r\n            Accept \u0219i continu\u0103\r\n          <\/button>\r\n        <\/div>\r\n      <\/div>\r\n    <\/div>\r\n\r\n    <!-- GDPR Badge (shown after consent) -->\r\n    <div class=\"zic2__gdpr is-hidden\" data-gdpr-badge>\r\n      <div class=\"zic2__gdprIcon\">\r\n        <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\r\n          <path d=\"M12 22s8-4 8-10V5l-8-3-8 3v7c0 6 8 10 8 10z\"\/>\r\n        <\/svg>\r\n      <\/div>\r\n      <div class=\"zic2__gdprContent\">\r\n        <strong>Protec\u021bia Datelor Activ\u0103<\/strong>\r\n        <p>Datele r\u0103m\u00e2n \u00een browser, nu sunt trimise pe server. Pute\u021bi \u0219terge oric\u00e2nd cu Reset.<\/p>\r\n      <\/div>\r\n    <\/div>\r\n\r\n    <!-- Main Form Container (hidden until GDPR consent) -->\r\n    <div class=\"zic2__formContainer is-hidden\" data-form-container>\r\n\r\n    <!-- Progress Bar -->\r\n    <div class=\"zic2__progress\" data-progress>\r\n      <div class=\"zic2__progressBar\">\r\n        <div class=\"zic2__progressFill\" data-progress-fill style=\"width: 25%;\"><\/div>\r\n      <\/div>\r\n      <div class=\"zic2__progressText\">\r\n        <span data-progress-step>Pasul 1<\/span> din <span data-progress-total>4<\/span>\r\n      <\/div>\r\n    <\/div>\r\n\r\n    <!-- Form -->\r\n    <form id=\"zicFormAmanare\" novalidate>\r\n\r\n      <!-- Step 1: Date Identificare -->\r\n      <section class=\"zic2__card zic2__stepCard\" data-step=\"1\" aria-labelledby=\"zic2-sec-identificare\">\r\n        <div class=\"zic2__cardHeader\">\r\n          <div class=\"zic2__cardIcon zic2__cardIcon--purple\">\r\n            <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\r\n              <path d=\"M20 21v-2a4 4 0 0 0-4-4H8a4 4 0 0 0-4 4v2\"\/>\r\n              <circle cx=\"12\" cy=\"7\" r=\"4\"\/>\r\n            <\/svg>\r\n          <\/div>\r\n          <h3 id=\"zic2-sec-identificare\" class=\"zic2__cardTitle\">Datele Dumneavoastr\u0103 (Partea)<\/h3>\r\n        <\/div>\r\n\r\n        <div class=\"zic2__field\">\r\n          <label class=\"zic2__label\" for=\"zic_calitate\">Calitatea procesual\u0103 <span class=\"zic2__req\">*<\/span><\/label>\r\n          <select class=\"zic2__select\" id=\"zic_calitate\" data-field=\"calitateProcesuala\" required>\r\n            <option value=\"\">-- Selecta\u021bi --<\/option>\r\n            <option value=\"inculpat\">Inculpat<\/option>\r\n            <option value=\"persoana_vatamata\">Persoan\u0103 v\u0103t\u0103mat\u0103<\/option>\r\n            <option value=\"parte_civila\">Parte civil\u0103<\/option>\r\n            <option value=\"parte_resp_civilmente\">Parte responsabil\u0103 civilmente<\/option>\r\n            <option value=\"alta_parte\">Alt\u0103 parte<\/option>\r\n          <\/select>\r\n        <\/div>\r\n\r\n        <div class=\"zic2__fieldGrid\">\r\n          <div class=\"zic2__field\">\r\n            <label class=\"zic2__label\" for=\"zic_nume\">Nume <span class=\"zic2__req\">*<\/span><\/label>\r\n            <input type=\"text\" class=\"zic2__input\" id=\"zic_nume\" data-field=\"nume\" placeholder=\"Ex: Popescu\" required maxlength=\"100\" autocomplete=\"family-name\">\r\n          <\/div>\r\n          <div class=\"zic2__field\">\r\n            <label class=\"zic2__label\" for=\"zic_prenume\">Prenume <span class=\"zic2__req\">*<\/span><\/label>\r\n            <input type=\"text\" class=\"zic2__input\" id=\"zic_prenume\" data-field=\"prenume\" placeholder=\"Ex: Ion Alexandru\" required maxlength=\"100\" autocomplete=\"given-name\">\r\n          <\/div>\r\n        <\/div>\r\n\r\n        <div class=\"zic2__field\">\r\n          <label class=\"zic2__label\" for=\"zic_localitate\">Domiciliu (localitate, jude\u021b\/sector) <span class=\"zic2__req\">*<\/span><\/label>\r\n          <input type=\"text\" class=\"zic2__input\" id=\"zic_localitate\" data-field=\"domiciliuLocalitate\" placeholder=\"Ex: Bucure\u0219ti, Sector 1\" required maxlength=\"200\">\r\n        <\/div>\r\n\r\n        <div class=\"zic2__field\">\r\n          <label class=\"zic2__label\" for=\"zic_adresa\">Adres\u0103 complet\u0103 <span class=\"zic2__optional\">(op\u021bional)<\/span><\/label>\r\n          <input type=\"text\" class=\"zic2__input\" id=\"zic_adresa\" data-field=\"adresaCompleta\" placeholder=\"Strada, num\u0103r, bloc, scar\u0103, etaj, apartament\" maxlength=\"300\">\r\n        <\/div>\r\n\r\n        <div class=\"zic2__hint zic2__hint--warning\">\r\n          <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><circle cx=\"12\" cy=\"12\" r=\"10\"\/><path d=\"M12 16v-4\"\/><path d=\"M12 8h.01\"\/><\/svg>\r\n          <span>C\u00e2mpurile de mai jos sunt op\u021bionale. Introduce\u021bi doar dac\u0103 e necesar pentru cerere.<\/span>\r\n        <\/div>\r\n\r\n        <div class=\"zic2__fieldGrid\">\r\n          <div class=\"zic2__field\">\r\n            <label class=\"zic2__label\" for=\"zic_cnp\">CNP <span class=\"zic2__optional\">(op\u021bional)<\/span><\/label>\r\n            <input type=\"text\" class=\"zic2__input\" id=\"zic_cnp\" data-field=\"cnp\" placeholder=\"Nu introduce\u021bi dac\u0103 nu e necesar\" maxlength=\"13\">\r\n          <\/div>\r\n          <div class=\"zic2__field\">\r\n            <label class=\"zic2__label\" for=\"zic_telefon\">Telefon <span class=\"zic2__optional\">(op\u021bional)<\/span><\/label>\r\n            <input type=\"tel\" class=\"zic2__input\" id=\"zic_telefon\" data-field=\"telefon\" placeholder=\"Ex: 0722 123 456\" maxlength=\"20\" autocomplete=\"tel\">\r\n          <\/div>\r\n        <\/div>\r\n\r\n        <div class=\"zic2__field\">\r\n          <label class=\"zic2__label\" for=\"zic_email\">Email <span class=\"zic2__optional\">(op\u021bional)<\/span><\/label>\r\n          <input type=\"email\" class=\"zic2__input\" id=\"zic_email\" data-field=\"email\" placeholder=\"Ex: email@exemplu.ro\" maxlength=\"100\" autocomplete=\"email\">\r\n        <\/div>\r\n      <\/section>\r\n\r\n      <!-- Step 2: Instan\u021b\u0103 & Dosar -->\r\n      <section class=\"zic2__card zic2__stepCard is-hidden\" data-step=\"2\" aria-labelledby=\"zic2-sec-dosar\">\r\n        <div class=\"zic2__cardHeader\">\r\n          <div class=\"zic2__cardIcon zic2__cardIcon--blue\">\r\n            <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\r\n              <path d=\"M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z\"\/>\r\n              <polyline points=\"14 2 14 8 20 8\"\/>\r\n              <line x1=\"16\" y1=\"13\" x2=\"8\" y2=\"13\"\/>\r\n              <line x1=\"16\" y1=\"17\" x2=\"8\" y2=\"17\"\/>\r\n            <\/svg>\r\n          <\/div>\r\n          <h3 id=\"zic2-sec-dosar\" class=\"zic2__cardTitle\">Instan\u021b\u0103 \u0219i Dosar<\/h3>\r\n        <\/div>\r\n\r\n        <div class=\"zic2__field\">\r\n          <label class=\"zic2__label\" for=\"zic_instanta\">Instan\u021b\u0103 <span class=\"zic2__req\">*<\/span><\/label>\r\n          <input type=\"text\" class=\"zic2__input\" id=\"zic_instanta\" data-field=\"instanta\" placeholder=\"Ex: Judec\u0103toria Sectorului 1 Bucure\u0219ti\" required maxlength=\"200\">\r\n        <\/div>\r\n\r\n        <div class=\"zic2__fieldGrid\">\r\n          <div class=\"zic2__field\">\r\n            <label class=\"zic2__label\" for=\"zic_sectia\">Sec\u021bia <span class=\"zic2__optional\">(op\u021bional)<\/span><\/label>\r\n            <input type=\"text\" class=\"zic2__input\" id=\"zic_sectia\" data-field=\"sectia\" placeholder=\"Ex: Sec\u021bia Penal\u0103\" maxlength=\"100\">\r\n          <\/div>\r\n          <div class=\"zic2__field\">\r\n            <label class=\"zic2__label\" for=\"zic_complet\">Complet <span class=\"zic2__optional\">(op\u021bional)<\/span><\/label>\r\n            <input type=\"text\" class=\"zic2__input\" id=\"zic_complet\" data-field=\"complet\" placeholder=\"Ex: C5 \/ Complet 3\" maxlength=\"50\">\r\n          <\/div>\r\n        <\/div>\r\n\r\n        <div class=\"zic2__field\">\r\n          <label class=\"zic2__label\" for=\"zic_numar_dosar\">Num\u0103r dosar <span class=\"zic2__req\">*<\/span><\/label>\r\n          <input type=\"text\" class=\"zic2__input\" id=\"zic_numar_dosar\" data-field=\"numarDosar\" placeholder=\"Ex: 1234\/301\/2024\" required maxlength=\"50\">\r\n        <\/div>\r\n\r\n        <div class=\"zic2__field\">\r\n          <label class=\"zic2__label\" for=\"zic_obiect\">Obiect dosar <span class=\"zic2__optional\">(op\u021bional)<\/span><\/label>\r\n          <input type=\"text\" class=\"zic2__input\" id=\"zic_obiect\" data-field=\"obiectDosar\" placeholder=\"Ex: infrac\u021biune prev. de art. ...\" maxlength=\"300\">\r\n        <\/div>\r\n\r\n        <div class=\"zic2__fieldGrid\">\r\n          <div class=\"zic2__field\">\r\n            <label class=\"zic2__label\" for=\"zic_termen_data\">Data termenului <span class=\"zic2__req\">*<\/span><\/label>\r\n            <input type=\"date\" class=\"zic2__input\" id=\"zic_termen_data\" data-field=\"termenJudecataData\" required>\r\n          <\/div>\r\n          <div class=\"zic2__field\">\r\n            <label class=\"zic2__label\" for=\"zic_termen_ora\">Ora termenului <span class=\"zic2__optional\">(op\u021bional)<\/span><\/label>\r\n            <input type=\"time\" class=\"zic2__input\" id=\"zic_termen_ora\" data-field=\"termenJudecataOra\">\r\n          <\/div>\r\n        <\/div>\r\n\r\n        <div class=\"zic2__field\">\r\n          <label class=\"zic2__label\" for=\"zic_modalitate\">Modalitate depunere cerere<\/label>\r\n          <select class=\"zic2__select\" id=\"zic_modalitate\" data-field=\"modalitateDepunere\">\r\n            <option value=\"registratura\">Registratura instan\u021bei<\/option>\r\n            <option value=\"email\">Email<\/option>\r\n            <option value=\"portal\">Portal instan\u021be (dac\u0103 exist\u0103)<\/option>\r\n            <option value=\"posta\">Po\u0219t\u0103<\/option>\r\n          <\/select>\r\n        <\/div>\r\n      <\/section>\r\n\r\n      <!-- Step 3: Motiv & Solicitare -->\r\n      <section class=\"zic2__card zic2__stepCard is-hidden\" data-step=\"3\" aria-labelledby=\"zic2-sec-motiv\">\r\n        <div class=\"zic2__cardHeader\">\r\n          <div class=\"zic2__cardIcon zic2__cardIcon--warning\">\r\n            <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\r\n              <path d=\"M12 22s8-4 8-10V5l-8-3-8 3v7c0 6 8 10 8 10z\"\/>\r\n            <\/svg>\r\n          <\/div>\r\n          <h3 id=\"zic2-sec-motiv\" class=\"zic2__cardTitle\">Motiv \u0219i Solicitare<\/h3>\r\n        <\/div>\r\n\r\n        <div class=\"zic2__field\">\r\n          <label class=\"zic2__label\">Motivul principal <span class=\"zic2__req\">*<\/span><\/label>\r\n          <div class=\"zic2__pills\" data-required-group=\"motivPrincipal\">\r\n            <label class=\"zic2__pill\"><input type=\"radio\" name=\"motivPrincipal\" data-field=\"motivPrincipal\" value=\"angajare\" required><span>Angajare ap\u0103r\u0103tor ales<\/span><\/label>\r\n            <label class=\"zic2__pill\"><input type=\"radio\" name=\"motivPrincipal\" data-field=\"motivPrincipal\" value=\"pregatire\"><span>Preg\u0103tirea ap\u0103r\u0103rii<\/span><\/label>\r\n            <label class=\"zic2__pill\"><input type=\"radio\" name=\"motivPrincipal\" data-field=\"motivPrincipal\" value=\"ambele\" checked><span>Ambele<\/span><\/label>\r\n          <\/div>\r\n        <\/div>\r\n\r\n        <div class=\"zic2__field\">\r\n          <label class=\"zic2__label\" for=\"zic_detalii_motiv\">Detalii motiv <span class=\"zic2__optional\">(recomandat)<\/span><\/label>\r\n          <textarea class=\"zic2__textarea\" id=\"zic_detalii_motiv\" data-field=\"detaliiMotiv\" placeholder=\"Ex: Am luat leg\u0103tura cu avocatul X la data Y; \u00eemputernicirea se va depune...\" maxlength=\"1000\"><\/textarea>\r\n        <\/div>\r\n\r\n        <div class=\"zic2__fieldGrid\">\r\n          <div class=\"zic2__field\">\r\n            <label class=\"zic2__label\" for=\"zic_avocat_nume\">Nume avocat ales <span class=\"zic2__optional\">(op\u021bional)<\/span><\/label>\r\n            <input type=\"text\" class=\"zic2__input\" id=\"zic_avocat_nume\" data-field=\"avocatAlesNume\" placeholder=\"Ex: Av. Maria Ionescu\" maxlength=\"100\">\r\n          <\/div>\r\n          <div class=\"zic2__field\">\r\n            <label class=\"zic2__label\" for=\"zic_avocat_barou\">Barou <span class=\"zic2__optional\">(op\u021bional)<\/span><\/label>\r\n            <input type=\"text\" class=\"zic2__input\" id=\"zic_avocat_barou\" data-field=\"avocatAlesBarou\" placeholder=\"Ex: Baroul Bucure\u0219ti\" maxlength=\"100\">\r\n          <\/div>\r\n        <\/div>\r\n\r\n        <div class=\"zic2__field\">\r\n          <label class=\"zic2__label\" for=\"zic_termen_nou\">Solicit termen nou dup\u0103 <span class=\"zic2__req\">*<\/span><\/label>\r\n          <select class=\"zic2__select\" id=\"zic_termen_nou\" data-field=\"solicitaTermenNouDupa\" required>\r\n            <option value=\"7\">7 zile<\/option>\r\n            <option value=\"14\" selected>14 zile<\/option>\r\n            <option value=\"21\">21 zile<\/option>\r\n            <option value=\"alta\">Alt\u0103 perioad\u0103<\/option>\r\n          <\/select>\r\n        <\/div>\r\n\r\n        <div class=\"zic2__field is-hidden\" data-show-if=\"solicitaTermenNouDupa=alta\">\r\n          <label class=\"zic2__label\" for=\"zic_termen_nou_text\">Specifica\u021bi perioada dorit\u0103<\/label>\r\n          <input type=\"text\" class=\"zic2__input\" id=\"zic_termen_nou_text\" data-field=\"solicitaTermenNouText\" placeholder=\"Ex: 30 zile \/ dup\u0103 15.02.2025\" maxlength=\"100\">\r\n        <\/div>\r\n\r\n        <div class=\"zic2__field\">\r\n          <label class=\"zic2__label\">Anexe disponibile<\/label>\r\n          <div class=\"zic2__checkList\">\r\n            <label class=\"zic2__checkbox\"><input type=\"checkbox\" data-field=\"anexe\" value=\"imputernicire\"><span class=\"zic2__checkmark\"><\/span><span>\u00cemputernicire avoca\u021bial\u0103 (dac\u0103 exist\u0103)<\/span><\/label>\r\n            <label class=\"zic2__checkbox\"><input type=\"checkbox\" data-field=\"anexe\" value=\"dovada_contactare\"><span class=\"zic2__checkmark\"><\/span><span>Dovad\u0103 contactare avocat \/ programare<\/span><\/label>\r\n            <label class=\"zic2__checkbox\"><input type=\"checkbox\" data-field=\"anexe\" value=\"alte_inscrisuri\"><span class=\"zic2__checkmark\"><\/span><span>Alte \u00eenscrisuri justificative<\/span><\/label>\r\n          <\/div>\r\n        <\/div>\r\n\r\n        <div class=\"zic2__field\">\r\n          <label class=\"zic2__label\">Op\u021biuni suplimentare<\/label>\r\n          <div class=\"zic2__checkList\">\r\n            <label class=\"zic2__checkbox\"><input type=\"checkbox\" data-field=\"asistentaObligatorie\" value=\"da\"><span class=\"zic2__checkmark\"><\/span><span>Asisten\u021b\u0103 juridic\u0103 obligatorie (art. 90 CPP)<\/span><\/label>\r\n          <\/div>\r\n        <\/div>\r\n\r\n        <!-- Baza legal\u0103 info -->\r\n        <div class=\"zic2__infoBox\">\r\n          <div class=\"zic2__infoHeader\">\r\n            <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><circle cx=\"12\" cy=\"12\" r=\"10\"\/><path d=\"M12 16v-4\"\/><path d=\"M12 8h.01\"\/><\/svg>\r\n            <strong>Baz\u0103 legal\u0103<\/strong>\r\n          <\/div>\r\n          <ul class=\"zic2__infoList\">\r\n            <li><strong>CPP art. 10<\/strong> - dreptul la ap\u0103rare (inclusiv timp \u0219i \u00eenlesniri pentru preg\u0103tirea ap\u0103r\u0103rii)<\/li>\r\n            <li><strong>CPP art. 356<\/strong> - asigurarea ap\u0103r\u0103rii \u00een cursul judec\u0103\u021bii; include dreptul la un termen pentru angajare avocat \u0219i preg\u0103tirea ap\u0103r\u0103rii<\/li>\r\n            <li><strong>CPP art. 90<\/strong> - asisten\u021b\u0103 juridic\u0103 obligatorie \u00een anumite cazuri (op\u021bional, dac\u0103 e aplicabil)<\/li>\r\n          <\/ul>\r\n        <\/div>\r\n      <\/section>\r\n\r\n      <!-- Step 4: Preview & Export -->\r\n      <section class=\"zic2__card zic2__stepCard zic2__previewCard is-hidden\" data-step=\"4\" aria-labelledby=\"zic2-sec-preview\">\r\n        <div class=\"zic2__cardHeader\">\r\n          <div class=\"zic2__cardIcon zic2__cardIcon--green\">\r\n            <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\r\n              <path d=\"M9 11l3 3L22 4\"\/>\r\n              <path d=\"M21 12v7a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h11\"\/>\r\n            <\/svg>\r\n          <\/div>\r\n          <h3 id=\"zic2-sec-preview\" class=\"zic2__cardTitle\">Previzualizare \u0219i Export<\/h3>\r\n        <\/div>\r\n\r\n        <div class=\"zic2__hint\" style=\"margin-bottom: 16px;\">\r\n          <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><circle cx=\"12\" cy=\"12\" r=\"10\"\/><path d=\"M12 16v-4\"\/><path d=\"M12 8h.01\"\/><\/svg>\r\n          <span>Verifica\u021bi cererea generat\u0103 mai jos. Ap\u0103sa\u021bi \u201e\u00cenapoi\" pentru a modifica datele.<\/span>\r\n        <\/div>\r\n\r\n        <!-- Warnings container -->\r\n        <div class=\"zic2__warnings is-hidden\" data-warnings role=\"alert\" aria-live=\"polite\"><\/div>\r\n\r\n        <!-- Preview container -->\r\n        <div class=\"zic2__previewContainer\" data-preview><\/div>\r\n\r\n        <!-- Action buttons for preview -->\r\n        <div class=\"zic2__previewActions\">\r\n          <button type=\"button\" class=\"zic2__btn zic2__btn--secondary\" data-action=\"copy\">\r\n            <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><rect x=\"9\" y=\"9\" width=\"13\" height=\"13\" rx=\"2\" ry=\"2\"\/><path d=\"M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1\"\/><\/svg>\r\n            Copiaz\u0103 text\r\n          <\/button>\r\n          <button type=\"button\" class=\"zic2__btn zic2__btn--primary zic2__btn--large\" data-action=\"print\">\r\n            <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><path d=\"M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z\"\/><polyline points=\"14 2 14 8 20 8\"\/><path d=\"M12 18v-6\"\/><path d=\"M9 15l3 3 3-3\"\/><\/svg>\r\n            Export PDF (Print)\r\n          <\/button>\r\n        <\/div>\r\n      <\/section>\r\n    <\/form>\r\n\r\n    <!-- Error -->\r\n    <div class=\"zic2__error is-hidden\" role=\"alert\" aria-live=\"polite\" data-errors><\/div>\r\n\r\n    <!-- Navigation Buttons -->\r\n    <div class=\"zic2__actions\" data-nav>\r\n      <button type=\"button\" class=\"zic2__btn zic2__btn--secondary\" data-action=\"prev\" disabled>\r\n        <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><path d=\"M19 12H5\"\/><polyline points=\"12 19 5 12 12 5\"\/><\/svg>\r\n        \u00cenapoi\r\n      <\/button>\r\n      <button type=\"button\" class=\"zic2__btn zic2__btn--secondary zic2__btn--test\" data-action=\"test-data\">\r\n        <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><path d=\"M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z\"\/><polyline points=\"14 2 14 8 20 8\"\/><line x1=\"16\" y1=\"13\" x2=\"8\" y2=\"13\"\/><line x1=\"16\" y1=\"17\" x2=\"8\" y2=\"17\"\/><polyline points=\"10 9 9 9 8 9\"\/><\/svg>\r\n        Date Test\r\n      <\/button>\r\n      <button type=\"button\" class=\"zic2__btn zic2__btn--secondary\" data-action=\"reset\">\r\n        <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><path d=\"M3 12a9 9 0 1 0 9-9 9.75 9.75 0 0 0-6.74 2.74L3 8\"\/><path d=\"M3 3v5h5\"\/><\/svg>\r\n        Reseteaz\u0103\r\n      <\/button>\r\n      <button type=\"button\" class=\"zic2__btn zic2__btn--primary zic2__btn--large\" data-action=\"next\">\r\n        Urm\u0103torul\r\n        <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><path d=\"M5 12h14\"\/><polyline points=\"12 5 19 12 12 19\"\/><\/svg>\r\n      <\/button>\r\n    <\/div>\r\n\r\n    <\/div><!-- End form container -->\r\n\r\n    <!-- Footer -->\r\n    <footer class=\"zic2__footer\">\r\n      <a href=\"https:\/\/zic.legal\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"zic2__footerLink\">\r\n        2025 ZIC Legal\r\n      <\/a>\r\n    <\/footer>\r\n  <\/div>\r\n<\/div>\r\n\r\n<style>\r\n\/* ============================================================\r\n   ZIC Cerere Amanare Cauza - SECURE VERSION\r\n   Theme: Purple\/Mov | Wizard 4 Steps | GDPR Compliant\r\n   Security Enhanced: Input validation, XSS protection\r\n   ============================================================ *\/\r\n\r\n[data-zic-amanare=\"1\"] {\r\n  --zic-primary: #8A88FF;\r\n  --zic-primary-dark: #6F6CFF;\r\n  --zic-primary-light: rgba(138,136,255,.08);\r\n  --zic-primary-border: rgba(138,136,255,.25);\r\n\r\n  --zic-success: #10B981;\r\n  --zic-success-light: rgba(16,185,129,.08);\r\n  --zic-success-border: rgba(16,185,129,.25);\r\n\r\n  --zic-danger: #EF4444;\r\n  --zic-danger-light: rgba(239,68,68,.08);\r\n  --zic-danger-border: rgba(239,68,68,.25);\r\n\r\n  --zic-warning: #F59E0B;\r\n  --zic-warning-light: rgba(245,158,11,.08);\r\n  --zic-warning-border: rgba(245,158,11,.25);\r\n\r\n  --zic-blue: #3B82F6;\r\n  --zic-blue-light: rgba(59,130,246,.08);\r\n  --zic-blue-border: rgba(59,130,246,.25);\r\n\r\n  --zic-ink: #1F2937;\r\n  --zic-ink-light: #374151;\r\n  --zic-muted: #6B7280;\r\n  --zic-light: #9CA3AF;\r\n\r\n  --zic-bg: #F9FAFB;\r\n  --zic-surface: #FFFFFF;\r\n  --zic-border: #E5E7EB;\r\n\r\n  --zic-shadow-sm: 0 1px 2px rgba(0,0,0,.05);\r\n  --zic-shadow: 0 4px 6px -1px rgba(0,0,0,.1), 0 2px 4px -1px rgba(0,0,0,.06);\r\n  --zic-shadow-lg: 0 10px 15px -3px rgba(0,0,0,.1), 0 4px 6px -2px rgba(0,0,0,.05);\r\n\r\n  --zic-radius: 16px;\r\n  --zic-radius-sm: 12px;\r\n  --zic-radius-xs: 8px;\r\n\r\n  --zic-transition: 150ms ease;\r\n\r\n  font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif;\r\n  color: var(--zic-ink);\r\n  line-height: 1.5;\r\n  -webkit-font-smoothing: antialiased;\r\n}\r\n\r\n[data-zic-amanare=\"1\"] *,\r\n[data-zic-amanare=\"1\"] *::before,\r\n[data-zic-amanare=\"1\"] *::after {\r\n  box-sizing: border-box;\r\n}\r\n\r\n\/* === Reset Avada\/WP overrides === *\/\r\n[data-zic-amanare=\"1\"] input,\r\n[data-zic-amanare=\"1\"] select,\r\n[data-zic-amanare=\"1\"] textarea,\r\n[data-zic-amanare=\"1\"] button {\r\n  font-family: inherit;\r\n  font-size: inherit;\r\n  line-height: inherit;\r\n  margin: 0;\r\n  -webkit-appearance: none;\r\n  -moz-appearance: none;\r\n  appearance: none;\r\n}\r\n\r\n[data-zic-amanare=\"1\"] select {\r\n  background-image: url(\"data:image\/svg+xml,%3Csvg xmlns='http:\/\/www.w3.org\/2000\/svg' width='12' height='12' viewBox='0 0 24 24' fill='none' stroke='%236B7280' stroke-width='2'%3E%3Cpolyline points='6 9 12 15 18 9'\/%3E%3C\/svg%3E\");\r\n  background-repeat: no-repeat;\r\n  background-position: right 12px center;\r\n  padding-right: 36px;\r\n}\r\n\r\n[data-zic-amanare=\"1\"] button {\r\n  cursor: pointer;\r\n  border: none;\r\n  background: none;\r\n}\r\n\r\n\/* === Layout === *\/\r\n[data-zic-amanare=\"1\"] .zic2__wrap {\r\n  max-width: 720px;\r\n  margin: 0 auto;\r\n  padding: 16px;\r\n}\r\n\r\n\/* === Header === *\/\r\n[data-zic-amanare=\"1\"] .zic2__hero {\r\n  margin-bottom: 16px;\r\n}\r\n\r\n[data-zic-amanare=\"1\"] .zic2__brandbar {\r\n  display: flex;\r\n  align-items: center;\r\n  gap: 14px;\r\n  background: linear-gradient(135deg, var(--zic-primary), var(--zic-primary-dark));\r\n  border-radius: var(--zic-radius);\r\n  padding: 20px;\r\n  color: #fff;\r\n  box-shadow: var(--zic-shadow-lg);\r\n}\r\n\r\n[data-zic-amanare=\"1\"] .zic2__mark {\r\n  width: 48px;\r\n  height: 48px;\r\n  background: rgba(255,255,255,.2);\r\n  border-radius: 12px;\r\n  display: flex;\r\n  align-items: center;\r\n  justify-content: center;\r\n  flex-shrink: 0;\r\n}\r\n\r\n[data-zic-amanare=\"1\"] .zic2__headerText {\r\n  flex: 1;\r\n  min-width: 0;\r\n}\r\n\r\n[data-zic-amanare=\"1\"] .zic2__title {\r\n  margin: 0;\r\n  font-size: 20px;\r\n  font-weight: 700;\r\n  line-height: 1.2;\r\n}\r\n\r\n[data-zic-amanare=\"1\"] .zic2__subtitle {\r\n  margin: 4px 0 0;\r\n  font-size: 14px;\r\n  opacity: 0.9;\r\n}\r\n\r\n\/* === Disclaimer === *\/\r\n[data-zic-amanare=\"1\"] .zic2__disclaimer {\r\n  display: flex;\r\n  align-items: flex-start;\r\n  gap: 12px;\r\n  background: linear-gradient(135deg, rgba(245,158,11,.05), rgba(245,158,11,.12));\r\n  border: 1px solid var(--zic-warning-border);\r\n  border-radius: var(--zic-radius-sm);\r\n  padding: 14px 16px;\r\n  margin-bottom: 16px;\r\n  font-size: 13px;\r\n  color: var(--zic-ink-light);\r\n  line-height: 1.5;\r\n}\r\n\r\n[data-zic-amanare=\"1\"] .zic2__disclaimer svg {\r\n  flex-shrink: 0;\r\n  color: var(--zic-warning);\r\n  margin-top: 2px;\r\n}\r\n\r\n[data-zic-amanare=\"1\"] .zic2__disclaimer--top {\r\n  margin-bottom: 12px;\r\n}\r\n\r\n\/* === GDPR Consent Banner === *\/\r\n[data-zic-amanare=\"1\"] .zic2__gdprConsent {\r\n  margin-bottom: 16px;\r\n}\r\n\r\n[data-zic-amanare=\"1\"] .zic2__gdprConsentBox {\r\n  display: flex;\r\n  align-items: flex-start;\r\n  gap: 16px;\r\n  background: linear-gradient(135deg, rgba(59,130,246,.05), rgba(59,130,246,.12));\r\n  border: 2px solid var(--zic-blue-border);\r\n  border-radius: var(--zic-radius);\r\n  padding: 20px;\r\n}\r\n\r\n[data-zic-amanare=\"1\"] .zic2__gdprConsent .zic2__gdprIcon {\r\n  width: 48px;\r\n  height: 48px;\r\n  background: var(--zic-blue);\r\n  border-radius: 12px;\r\n  display: flex;\r\n  align-items: center;\r\n  justify-content: center;\r\n  color: white;\r\n  flex-shrink: 0;\r\n}\r\n\r\n[data-zic-amanare=\"1\"] .zic2__gdprConsentContent {\r\n  flex: 1;\r\n}\r\n\r\n[data-zic-amanare=\"1\"] .zic2__gdprConsentContent > strong {\r\n  display: block;\r\n  color: var(--zic-blue);\r\n  font-size: 16px;\r\n  margin-bottom: 12px;\r\n}\r\n\r\n[data-zic-amanare=\"1\"] .zic2__gdprList {\r\n  margin: 0 0 16px 0;\r\n  padding-left: 20px;\r\n  font-size: 13px;\r\n  color: var(--zic-ink-light);\r\n  line-height: 1.7;\r\n}\r\n\r\n[data-zic-amanare=\"1\"] .zic2__gdprList li {\r\n  margin-bottom: 6px;\r\n}\r\n\r\n[data-zic-amanare=\"1\"] .zic2__gdprCheckbox {\r\n  display: flex;\r\n  align-items: center;\r\n  gap: 12px;\r\n  padding: 16px 18px;\r\n  background: var(--zic-surface);\r\n  border: 2px solid var(--zic-border);\r\n  border-radius: var(--zic-radius-xs);\r\n  cursor: pointer;\r\n  transition: all var(--zic-transition);\r\n  font-size: 14px;\r\n  font-weight: 500;\r\n  color: var(--zic-ink-light);\r\n  margin-bottom: 16px;\r\n}\r\n\r\n[data-zic-amanare=\"1\"] .zic2__gdprCheckbox:hover {\r\n  border-color: var(--zic-blue-border);\r\n  background: var(--zic-blue-light);\r\n}\r\n\r\n[data-zic-amanare=\"1\"] .zic2__gdprCheckbox:has(input:checked) {\r\n  border-color: var(--zic-success);\r\n  background: var(--zic-success-light);\r\n}\r\n\r\n[data-zic-amanare=\"1\"] .zic2__gdprCheckbox input {\r\n  position: absolute;\r\n  opacity: 0;\r\n  width: 0;\r\n  height: 0;\r\n}\r\n\r\n[data-zic-amanare=\"1\"] .zic2__checkboxIcon {\r\n  flex-shrink: 0;\r\n  color: var(--zic-light);\r\n  transition: all var(--zic-transition);\r\n}\r\n\r\n[data-zic-amanare=\"1\"] .zic2__checkboxIcon--checked {\r\n  display: none;\r\n}\r\n\r\n[data-zic-amanare=\"1\"] .zic2__gdprCheckbox:has(input:checked) .zic2__checkboxIcon--unchecked {\r\n  display: none;\r\n}\r\n\r\n[data-zic-amanare=\"1\"] .zic2__gdprCheckbox:has(input:checked) .zic2__checkboxIcon--checked {\r\n  display: block;\r\n}\r\n\r\n[data-zic-amanare=\"1\"] .zic2__gdprAcceptBtn {\r\n  width: 100%;\r\n}\r\n\r\n[data-zic-amanare=\"1\"] .zic2__gdprAcceptBtn:disabled {\r\n  opacity: 0.5;\r\n  cursor: not-allowed;\r\n  transform: none !important;\r\n}\r\n\r\n\/* === GDPR Badge (after consent) === *\/\r\n[data-zic-amanare=\"1\"] .zic2__gdpr {\r\n  display: flex;\r\n  align-items: flex-start;\r\n  gap: 12px;\r\n  background: linear-gradient(135deg, rgba(16,185,129,.05), rgba(16,185,129,.12));\r\n  border: 1px solid var(--zic-success-border);\r\n  border-radius: var(--zic-radius-sm);\r\n  padding: 16px;\r\n  margin-bottom: 16px;\r\n}\r\n\r\n[data-zic-amanare=\"1\"] .zic2__gdprIcon {\r\n  width: 40px;\r\n  height: 40px;\r\n  background: var(--zic-success);\r\n  border-radius: 10px;\r\n  display: flex;\r\n  align-items: center;\r\n  justify-content: center;\r\n  color: white;\r\n  flex-shrink: 0;\r\n}\r\n\r\n[data-zic-amanare=\"1\"] .zic2__gdprContent strong {\r\n  display: block;\r\n  color: var(--zic-success);\r\n  font-size: 14px;\r\n  margin-bottom: 4px;\r\n}\r\n\r\n[data-zic-amanare=\"1\"] .zic2__gdprContent p {\r\n  margin: 0;\r\n  font-size: 13px;\r\n  color: var(--zic-ink-light);\r\n  line-height: 1.5;\r\n}\r\n\r\n\/* === Progress Bar === *\/\r\n[data-zic-amanare=\"1\"] .zic2__progress {\r\n  margin-bottom: 16px;\r\n}\r\n\r\n[data-zic-amanare=\"1\"] .zic2__progressBar {\r\n  height: 6px;\r\n  background: var(--zic-border);\r\n  border-radius: 3px;\r\n  overflow: hidden;\r\n}\r\n\r\n[data-zic-amanare=\"1\"] .zic2__progressFill {\r\n  height: 100%;\r\n  background: linear-gradient(90deg, var(--zic-primary), var(--zic-primary-dark));\r\n  border-radius: 3px;\r\n  transition: width 0.3s ease;\r\n}\r\n\r\n[data-zic-amanare=\"1\"] .zic2__progressText {\r\n  text-align: center;\r\n  font-size: 13px;\r\n  color: var(--zic-muted);\r\n  margin-top: 8px;\r\n}\r\n\r\n\/* === Cards === *\/\r\n[data-zic-amanare=\"1\"] .zic2__card {\r\n  background: var(--zic-surface);\r\n  border: 1px solid var(--zic-border);\r\n  border-radius: var(--zic-radius);\r\n  padding: 20px;\r\n  margin-bottom: 16px;\r\n  box-shadow: var(--zic-shadow-sm);\r\n}\r\n\r\n[data-zic-amanare=\"1\"] .zic2__cardHeader {\r\n  display: flex;\r\n  align-items: center;\r\n  gap: 12px;\r\n  margin-bottom: 20px;\r\n}\r\n\r\n[data-zic-amanare=\"1\"] .zic2__cardIcon {\r\n  width: 36px;\r\n  height: 36px;\r\n  border-radius: 10px;\r\n  display: flex;\r\n  align-items: center;\r\n  justify-content: center;\r\n  flex-shrink: 0;\r\n}\r\n\r\n[data-zic-amanare=\"1\"] .zic2__cardIcon--purple {\r\n  background: var(--zic-primary-light);\r\n  color: var(--zic-primary-dark);\r\n}\r\n\r\n[data-zic-amanare=\"1\"] .zic2__cardIcon--green {\r\n  background: var(--zic-success-light);\r\n  color: var(--zic-success);\r\n}\r\n\r\n[data-zic-amanare=\"1\"] .zic2__cardIcon--warning {\r\n  background: var(--zic-warning-light);\r\n  color: var(--zic-warning);\r\n}\r\n\r\n[data-zic-amanare=\"1\"] .zic2__cardIcon--blue {\r\n  background: var(--zic-blue-light);\r\n  color: var(--zic-blue);\r\n}\r\n\r\n[data-zic-amanare=\"1\"] .zic2__cardTitle {\r\n  margin: 0;\r\n  font-size: 17px;\r\n  font-weight: 700;\r\n  color: var(--zic-ink);\r\n}\r\n\r\n[data-zic-amanare=\"1\"] .zic2__previewCard {\r\n  background: linear-gradient(135deg, rgba(16,185,129,.02), rgba(16,185,129,.06));\r\n  border-color: var(--zic-success-border);\r\n}\r\n\r\n\/* === Form Elements === *\/\r\n[data-zic-amanare=\"1\"] .zic2__fieldGrid {\r\n  display: grid;\r\n  grid-template-columns: 1fr 1fr;\r\n  gap: 16px;\r\n  margin-bottom: 16px;\r\n}\r\n\r\n@media (max-width: 500px) {\r\n  [data-zic-amanare=\"1\"] .zic2__fieldGrid {\r\n    grid-template-columns: 1fr;\r\n  }\r\n}\r\n\r\n[data-zic-amanare=\"1\"] .zic2__field {\r\n  display: flex;\r\n  flex-direction: column;\r\n  gap: 6px;\r\n  margin-bottom: 16px;\r\n}\r\n\r\n[data-zic-amanare=\"1\"] .zic2__fieldGrid .zic2__field {\r\n  margin-bottom: 0;\r\n}\r\n\r\n[data-zic-amanare=\"1\"] .zic2__label {\r\n  font-size: 13px;\r\n  font-weight: 600;\r\n  color: var(--zic-ink-light);\r\n}\r\n\r\n[data-zic-amanare=\"1\"] .zic2__req {\r\n  color: var(--zic-danger);\r\n}\r\n\r\n[data-zic-amanare=\"1\"] .zic2__optional {\r\n  color: var(--zic-light);\r\n  font-weight: 400;\r\n}\r\n\r\n[data-zic-amanare=\"1\"] .zic2__input,\r\n[data-zic-amanare=\"1\"] .zic2__select,\r\n[data-zic-amanare=\"1\"] .zic2__textarea {\r\n  width: 100%;\r\n  padding: 12px 14px;\r\n  font-size: 15px;\r\n  font-family: inherit;\r\n  color: var(--zic-ink);\r\n  background: var(--zic-surface);\r\n  border: 2px solid var(--zic-border);\r\n  border-radius: var(--zic-radius-xs);\r\n  outline: none;\r\n  transition: border-color var(--zic-transition), box-shadow var(--zic-transition);\r\n}\r\n\r\n[data-zic-amanare=\"1\"] .zic2__input:focus,\r\n[data-zic-amanare=\"1\"] .zic2__select:focus,\r\n[data-zic-amanare=\"1\"] .zic2__textarea:focus {\r\n  border-color: var(--zic-primary);\r\n  box-shadow: 0 0 0 3px var(--zic-primary-light);\r\n}\r\n\r\n[data-zic-amanare=\"1\"] .zic2__input::placeholder,\r\n[data-zic-amanare=\"1\"] .zic2__textarea::placeholder {\r\n  color: var(--zic-light);\r\n}\r\n\r\n[data-zic-amanare=\"1\"] .zic2__input.is-invalid,\r\n[data-zic-amanare=\"1\"] .zic2__select.is-invalid,\r\n[data-zic-amanare=\"1\"] .zic2__textarea.is-invalid {\r\n  border-color: var(--zic-danger);\r\n}\r\n\r\n[data-zic-amanare=\"1\"] .zic2__textarea {\r\n  min-height: 100px;\r\n  resize: vertical;\r\n}\r\n\r\n\/* === Hints === *\/\r\n[data-zic-amanare=\"1\"] .zic2__hint {\r\n  display: flex;\r\n  align-items: flex-start;\r\n  gap: 8px;\r\n  padding: 10px 12px;\r\n  background: var(--zic-bg);\r\n  border-radius: var(--zic-radius-xs);\r\n  font-size: 13px;\r\n  color: var(--zic-muted);\r\n  margin-bottom: 16px;\r\n}\r\n\r\n[data-zic-amanare=\"1\"] .zic2__hint svg {\r\n  flex-shrink: 0;\r\n  margin-top: 1px;\r\n}\r\n\r\n[data-zic-amanare=\"1\"] .zic2__hint--warning {\r\n  background: var(--zic-warning-light);\r\n  color: var(--zic-ink-light);\r\n}\r\n\r\n[data-zic-amanare=\"1\"] .zic2__hint--warning svg {\r\n  color: var(--zic-warning);\r\n}\r\n\r\n\/* === Pills === *\/\r\n[data-zic-amanare=\"1\"] .zic2__pills {\r\n  display: flex;\r\n  flex-wrap: wrap;\r\n  gap: 8px;\r\n}\r\n\r\n[data-zic-amanare=\"1\"] .zic2__pill {\r\n  display: flex;\r\n  align-items: center;\r\n  gap: 6px;\r\n  padding: 8px 14px;\r\n  border-radius: var(--zic-radius-xs);\r\n  border: 2px solid var(--zic-border);\r\n  background: var(--zic-bg);\r\n  cursor: pointer;\r\n  transition: all var(--zic-transition);\r\n  font-size: 13px;\r\n  font-weight: 500;\r\n  color: var(--zic-ink-light);\r\n}\r\n\r\n[data-zic-amanare=\"1\"] .zic2__pill:hover {\r\n  border-color: var(--zic-primary-border);\r\n  background: var(--zic-primary-light);\r\n}\r\n\r\n[data-zic-amanare=\"1\"] .zic2__pill:has(input:checked) {\r\n  border-color: var(--zic-primary);\r\n  background: var(--zic-primary-light);\r\n  color: var(--zic-primary-dark);\r\n}\r\n\r\n[data-zic-amanare=\"1\"] .zic2__pill input {\r\n  width: 16px;\r\n  height: 16px;\r\n  accent-color: var(--zic-primary);\r\n}\r\n\r\n\/* === Checkboxes === *\/\r\n[data-zic-amanare=\"1\"] .zic2__checkList {\r\n  display: flex;\r\n  flex-direction: column;\r\n  gap: 10px;\r\n}\r\n\r\n[data-zic-amanare=\"1\"] .zic2__checkbox {\r\n  display: flex;\r\n  align-items: flex-start;\r\n  gap: 12px;\r\n  padding: 12px 14px;\r\n  background: var(--zic-bg);\r\n  border: 1px solid var(--zic-border);\r\n  border-radius: var(--zic-radius-xs);\r\n  cursor: pointer;\r\n  transition: all var(--zic-transition);\r\n  font-size: 14px;\r\n  color: var(--zic-ink-light);\r\n}\r\n\r\n[data-zic-amanare=\"1\"] .zic2__checkbox:hover {\r\n  border-color: var(--zic-primary-border);\r\n  background: var(--zic-primary-light);\r\n}\r\n\r\n[data-zic-amanare=\"1\"] .zic2__checkbox input {\r\n  width: 18px;\r\n  height: 18px;\r\n  accent-color: var(--zic-primary);\r\n  flex-shrink: 0;\r\n  margin-top: 1px;\r\n}\r\n\r\n\/* === Info Box === *\/\r\n[data-zic-amanare=\"1\"] .zic2__infoBox {\r\n  background: var(--zic-blue-light);\r\n  border: 1px solid var(--zic-blue-border);\r\n  border-radius: var(--zic-radius-sm);\r\n  padding: 16px;\r\n  margin-top: 20px;\r\n}\r\n\r\n[data-zic-amanare=\"1\"] .zic2__infoHeader {\r\n  display: flex;\r\n  align-items: center;\r\n  gap: 8px;\r\n  color: var(--zic-blue);\r\n  font-size: 14px;\r\n  margin-bottom: 12px;\r\n}\r\n\r\n[data-zic-amanare=\"1\"] .zic2__infoList {\r\n  margin: 0;\r\n  padding-left: 20px;\r\n  font-size: 13px;\r\n  color: var(--zic-ink-light);\r\n  line-height: 1.6;\r\n}\r\n\r\n[data-zic-amanare=\"1\"] .zic2__infoList li {\r\n  margin-bottom: 6px;\r\n}\r\n\r\n[data-zic-amanare=\"1\"] .zic2__infoList li:last-child {\r\n  margin-bottom: 0;\r\n}\r\n\r\n\/* === Warnings === *\/\r\n[data-zic-amanare=\"1\"] .zic2__warnings {\r\n  background: var(--zic-warning-light);\r\n  border: 1px solid var(--zic-warning-border);\r\n  border-radius: var(--zic-radius-xs);\r\n  padding: 12px 16px;\r\n  margin-bottom: 16px;\r\n  font-size: 13px;\r\n  color: var(--zic-ink-light);\r\n}\r\n\r\n[data-zic-amanare=\"1\"] .zic2__warnings ul {\r\n  margin: 0;\r\n  padding-left: 20px;\r\n}\r\n\r\n[data-zic-amanare=\"1\"] .zic2__warnings li {\r\n  margin-bottom: 4px;\r\n}\r\n\r\n\/* === Preview Container === *\/\r\n[data-zic-amanare=\"1\"] .zic2__previewContainer {\r\n  background: var(--zic-surface);\r\n  border: 1px solid var(--zic-border);\r\n  border-radius: var(--zic-radius-xs);\r\n  padding: 24px;\r\n  margin-bottom: 16px;\r\n  font-size: 14px;\r\n  line-height: 1.7;\r\n  white-space: pre-wrap;\r\n  word-wrap: break-word;\r\n}\r\n\r\n[data-zic-amanare=\"1\"] .zic2__previewActions {\r\n  display: flex;\r\n  flex-wrap: wrap;\r\n  gap: 12px;\r\n  justify-content: center;\r\n}\r\n\r\n\/* === Buttons === *\/\r\n[data-zic-amanare=\"1\"] .zic2__btn {\r\n  display: inline-flex;\r\n  align-items: center;\r\n  justify-content: center;\r\n  gap: 8px;\r\n  padding: 12px 20px;\r\n  font-size: 14px;\r\n  font-weight: 600;\r\n  border-radius: var(--zic-radius-xs);\r\n  transition: all var(--zic-transition);\r\n  white-space: nowrap;\r\n}\r\n\r\n[data-zic-amanare=\"1\"] .zic2__btn--primary {\r\n  background: linear-gradient(135deg, var(--zic-primary), var(--zic-primary-dark));\r\n  color: #fff;\r\n  box-shadow: var(--zic-shadow);\r\n}\r\n\r\n[data-zic-amanare=\"1\"] .zic2__btn--primary:hover {\r\n  transform: translateY(-1px);\r\n  box-shadow: var(--zic-shadow-lg);\r\n}\r\n\r\n[data-zic-amanare=\"1\"] .zic2__btn--primary:active {\r\n  transform: translateY(0);\r\n}\r\n\r\n[data-zic-amanare=\"1\"] .zic2__btn--secondary {\r\n  background: var(--zic-bg);\r\n  color: var(--zic-ink-light);\r\n  border: 2px solid var(--zic-border);\r\n}\r\n\r\n[data-zic-amanare=\"1\"] .zic2__btn--secondary:hover {\r\n  border-color: var(--zic-primary-border);\r\n  background: var(--zic-primary-light);\r\n  color: var(--zic-primary-dark);\r\n}\r\n\r\n[data-zic-amanare=\"1\"] .zic2__btn--large {\r\n  padding: 14px 28px;\r\n  font-size: 15px;\r\n}\r\n\r\n[data-zic-amanare=\"1\"] .zic2__btn--test {\r\n  background: linear-gradient(135deg, rgba(249,115,22,.08), rgba(249,115,22,.15));\r\n  border-color: rgba(249,115,22,.3);\r\n  color: #EA580C;\r\n}\r\n\r\n[data-zic-amanare=\"1\"] .zic2__btn--test:hover {\r\n  background: linear-gradient(135deg, rgba(249,115,22,.15), rgba(249,115,22,.25));\r\n  border-color: #F97316;\r\n  color: #C2410C;\r\n}\r\n\r\n[data-zic-amanare=\"1\"] .zic2__btn:disabled {\r\n  opacity: 0.4;\r\n  cursor: not-allowed;\r\n  transform: none !important;\r\n  box-shadow: none !important;\r\n}\r\n\r\n\/* === Navigation === *\/\r\n[data-zic-amanare=\"1\"] .zic2__actions {\r\n  display: flex;\r\n  flex-wrap: wrap;\r\n  gap: 12px;\r\n  justify-content: space-between;\r\n  margin-bottom: 16px;\r\n}\r\n\r\n\/* === Error === *\/\r\n[data-zic-amanare=\"1\"] .zic2__error {\r\n  background: var(--zic-danger-light);\r\n  border: 1px solid var(--zic-danger-border);\r\n  border-radius: var(--zic-radius-xs);\r\n  padding: 12px 16px;\r\n  margin-bottom: 16px;\r\n  font-size: 14px;\r\n  color: var(--zic-danger);\r\n}\r\n\r\n\/* === Footer === *\/\r\n[data-zic-amanare=\"1\"] .zic2__footer {\r\n  text-align: center;\r\n  padding: 16px 0;\r\n  border-top: 1px solid var(--zic-border);\r\n  margin-top: 8px;\r\n}\r\n\r\n[data-zic-amanare=\"1\"] .zic2__footerLink {\r\n  font-size: 13px;\r\n  color: var(--zic-muted);\r\n  text-decoration: none;\r\n  transition: color var(--zic-transition);\r\n}\r\n\r\n[data-zic-amanare=\"1\"] .zic2__footerLink:hover {\r\n  color: var(--zic-primary);\r\n}\r\n\r\n\/* === Utilities === *\/\r\n[data-zic-amanare=\"1\"] .is-hidden {\r\n  display: none !important;\r\n}\r\n\r\n\/* === Print Styles === *\/\r\n@media print {\r\n  [data-zic-amanare=\"1\"] {\r\n    background: white !important;\r\n  }\r\n\r\n  [data-zic-amanare=\"1\"] .zic2__hero,\r\n  [data-zic-amanare=\"1\"] .zic2__gdpr,\r\n  [data-zic-amanare=\"1\"] .zic2__disclaimer,\r\n  [data-zic-amanare=\"1\"] .zic2__progress,\r\n  [data-zic-amanare=\"1\"] .zic2__actions,\r\n  [data-zic-amanare=\"1\"] .zic2__previewActions,\r\n  [data-zic-amanare=\"1\"] .zic2__footer,\r\n  [data-zic-amanare=\"1\"] .zic2__warnings,\r\n  [data-zic-amanare=\"1\"] .zic2__hint,\r\n  [data-zic-amanare=\"1\"] .zic2__error {\r\n    display: none !important;\r\n  }\r\n\r\n  [data-zic-amanare=\"1\"] .zic2__card {\r\n    border: none !important;\r\n    box-shadow: none !important;\r\n    padding: 0 !important;\r\n  }\r\n\r\n  [data-zic-amanare=\"1\"] .zic2__previewContainer {\r\n    border: none !important;\r\n    padding: 0 !important;\r\n  }\r\n}\r\n\r\n\/* === Responsive === *\/\r\n@media (max-width: 600px) {\r\n  [data-zic-amanare=\"1\"] .zic2__wrap {\r\n    padding: 12px;\r\n  }\r\n\r\n  [data-zic-amanare=\"1\"] .zic2__brandbar {\r\n    padding: 16px;\r\n  }\r\n\r\n  [data-zic-amanare=\"1\"] .zic2__title {\r\n    font-size: 18px;\r\n  }\r\n\r\n  [data-zic-amanare=\"1\"] .zic2__gdprConsentBox {\r\n    flex-direction: column;\r\n    text-align: center;\r\n  }\r\n\r\n  [data-zic-amanare=\"1\"] .zic2__gdprConsent .zic2__gdprIcon {\r\n    align-self: center;\r\n  }\r\n\r\n  [data-zic-amanare=\"1\"] .zic2__gdprList {\r\n    text-align: left;\r\n  }\r\n\r\n  [data-zic-amanare=\"1\"] .zic2__actions {\r\n    flex-direction: column;\r\n  }\r\n\r\n  [data-zic-amanare=\"1\"] .zic2__btn {\r\n    width: 100%;\r\n  }\r\n\r\n  [data-zic-amanare=\"1\"] .zic2__previewActions {\r\n    flex-direction: column;\r\n  }\r\n}\r\n<\/style>\r\n\r\n<script>\r\n(function() {\r\n  'use strict';\r\n\r\n  \/\/ ============================================================\r\n  \/\/ ZIC Cerere Amanare Cauza - Secure JavaScript\r\n  \/\/ No external dependencies, XSS-safe, GDPR compliant\r\n  \/\/ ============================================================\r\n\r\n  \/\/ Rate limiting for exports\r\n  var exportTimestamps = [];\r\n  var MAX_EXPORTS_PER_MINUTE = 10;\r\n\r\n  \/\/ Initialize all instances\r\n  var roots = document.querySelectorAll('[data-zic-amanare=\"1\"]');\r\n  if (!roots.length) return;\r\n\r\n  roots.forEach(function(root) {\r\n    initInstance(root);\r\n  });\r\n\r\n  function initInstance(root) {\r\n    var form = root.querySelector('#zicFormAmanare');\r\n    if (!form) return;\r\n\r\n    var currentStep = 1;\r\n    var totalSteps = 4;\r\n    var gdprAccepted = false;\r\n\r\n    \/\/ Cache DOM elements\r\n    var elements = {\r\n      steps: root.querySelectorAll('[data-step]'),\r\n      progressFill: root.querySelector('[data-progress-fill]'),\r\n      progressStep: root.querySelector('[data-progress-step]'),\r\n      prevBtn: root.querySelector('[data-action=\"prev\"]'),\r\n      nextBtn: root.querySelector('[data-action=\"next\"]'),\r\n      resetBtn: root.querySelector('[data-action=\"reset\"]'),\r\n      testBtn: root.querySelector('[data-action=\"test-data\"]'),\r\n      copyBtn: root.querySelector('[data-action=\"copy\"]'),\r\n      printBtn: root.querySelector('[data-action=\"print\"]'),\r\n      errorsContainer: root.querySelector('[data-errors]'),\r\n      warningsContainer: root.querySelector('[data-warnings]'),\r\n      previewContainer: root.querySelector('[data-preview]'),\r\n      \/\/ GDPR elements\r\n      gdprConsent: root.querySelector('[data-gdpr-consent]'),\r\n      gdprBadge: root.querySelector('[data-gdpr-badge]'),\r\n      gdprAcceptCheckbox: root.querySelector('[data-gdpr-accept]'),\r\n      gdprAcceptBtn: root.querySelector('[data-action=\"accept-gdpr\"]'),\r\n      formContainer: root.querySelector('[data-form-container]')\r\n    };\r\n\r\n    \/\/ Conditional field visibility\r\n    var conditionalFields = root.querySelectorAll('[data-show-if]');\r\n\r\n    \/\/ ============================================================\r\n    \/\/ GDPR CONSENT\r\n    \/\/ ============================================================\r\n\r\n    function initGDPR() {\r\n      if (elements.gdprAcceptCheckbox) {\r\n        elements.gdprAcceptCheckbox.addEventListener('change', function() {\r\n          if (elements.gdprAcceptBtn) {\r\n            elements.gdprAcceptBtn.disabled = !this.checked;\r\n          }\r\n        });\r\n      }\r\n\r\n      if (elements.gdprAcceptBtn) {\r\n        elements.gdprAcceptBtn.addEventListener('click', function() {\r\n          if (elements.gdprAcceptCheckbox && elements.gdprAcceptCheckbox.checked) {\r\n            gdprAccepted = true;\r\n            if (elements.gdprConsent) {\r\n              elements.gdprConsent.classList.add('is-hidden');\r\n            }\r\n            if (elements.gdprBadge) {\r\n              elements.gdprBadge.classList.remove('is-hidden');\r\n            }\r\n            if (elements.formContainer) {\r\n              elements.formContainer.classList.remove('is-hidden');\r\n            }\r\n          }\r\n        });\r\n      }\r\n    }\r\n\r\n    \/\/ ============================================================\r\n    \/\/ TEST DATA\r\n    \/\/ ============================================================\r\n\r\n    function fillTestData() {\r\n      \/\/ Get future date (14 days from now)\r\n      var futureDate = new Date();\r\n      futureDate.setDate(futureDate.getDate() + 14);\r\n      var futureDateStr = futureDate.toISOString().split('T')[0];\r\n\r\n      var testData = {\r\n        'calitateProcesuala': 'inculpat',\r\n        'nume': 'Popescu',\r\n        'prenume': 'Ion Alexandru',\r\n        'domiciliuLocalitate': 'Bucure\u0219ti, Sector 3',\r\n        'adresaCompleta': 'Str. Libert\u0103\u021bii nr. 15, bl. A1, sc. 2, et. 3, ap. 45',\r\n        'telefon': '0722 123 456',\r\n        'email': 'ion.popescu@email.ro',\r\n        'instanta': 'Judec\u0103toria Sectorului 3 Bucure\u0219ti',\r\n        'sectia': 'Sec\u021bia Penal\u0103',\r\n        'complet': 'C5',\r\n        'numarDosar': '1234\/301\/2024',\r\n        'obiectDosar': 'infrac\u021biune prev. de art. 244 Cod penal',\r\n        'termenJudecataData': futureDateStr,\r\n        'termenJudecataOra': '09:00',\r\n        'modalitateDepunere': 'registratura',\r\n        'solicitaTermenNouDupa': '14'\r\n      };\r\n\r\n      \/\/ Fill text inputs and selects\r\n      Object.keys(testData).forEach(function(field) {\r\n        var input = form.querySelector('[data-field=\"' + field + '\"]');\r\n        if (input) {\r\n          if (input.tagName === 'SELECT') {\r\n            input.value = testData[field];\r\n          } else if (input.type === 'radio') {\r\n            var radioBtn = form.querySelector('input[data-field=\"' + field + '\"][value=\"' + testData[field] + '\"]');\r\n            if (radioBtn) {\r\n              radioBtn.checked = true;\r\n            }\r\n          } else {\r\n            input.value = testData[field];\r\n          }\r\n        }\r\n      });\r\n\r\n      \/\/ Set radio for motiv\r\n      var motivRadio = form.querySelector('input[data-field=\"motivPrincipal\"][value=\"ambele\"]');\r\n      if (motivRadio) motivRadio.checked = true;\r\n\r\n      \/\/ Update conditional fields\r\n      updateConditionalFields();\r\n\r\n      \/\/ Clear validation styles\r\n      var invalidInputs = form.querySelectorAll('.is-invalid');\r\n      invalidInputs.forEach(function(input) {\r\n        input.classList.remove('is-invalid');\r\n      });\r\n\r\n      showErrors([]);\r\n    }\r\n\r\n    \/\/ ============================================================\r\n    \/\/ SANITIZATION FUNCTIONS\r\n    \/\/ ============================================================\r\n\r\n    function sanitizeText(str, maxLen) {\r\n      if (typeof str !== 'string') return '';\r\n      maxLen = maxLen || 200;\r\n      \/\/ Remove control characters except newlines and tabs\r\n      str = str.replace(\/[\\x00-\\x08\\x0B\\x0C\\x0E-\\x1F\\x7F]\/g, '');\r\n      \/\/ Normalize whitespace\r\n      str = str.replace(\/\\s+\/g, ' ').trim();\r\n      \/\/ Truncate\r\n      if (str.length > maxLen) {\r\n        str = str.substring(0, maxLen);\r\n      }\r\n      return str;\r\n    }\r\n\r\n    function sanitizeDate(str) {\r\n      if (typeof str !== 'string') return '';\r\n      \/\/ Expect YYYY-MM-DD format\r\n      var match = str.match(\/^(\\d{4})-(\\d{2})-(\\d{2})$\/);\r\n      if (!match) return '';\r\n      var year = parseInt(match[1], 10);\r\n      var month = parseInt(match[2], 10);\r\n      var day = parseInt(match[3], 10);\r\n      if (year < 1900 || year > 2100) return '';\r\n      if (month < 1 || month > 12) return '';\r\n      if (day < 1 || day > 31) return '';\r\n      return str;\r\n    }\r\n\r\n    function sanitizeTime(str) {\r\n      if (typeof str !== 'string') return '';\r\n      \/\/ Expect HH:MM format\r\n      var match = str.match(\/^(\\d{2}):(\\d{2})$\/);\r\n      if (!match) return '';\r\n      var hour = parseInt(match[1], 10);\r\n      var minute = parseInt(match[2], 10);\r\n      if (hour < 0 || hour > 23) return '';\r\n      if (minute < 0 || minute > 59) return '';\r\n      return str;\r\n    }\r\n\r\n    function sanitizeCNP(str) {\r\n      if (typeof str !== 'string') return '';\r\n      str = str.replace(\/\\D\/g, '');\r\n      if (str.length !== 13) return str.substring(0, 13);\r\n      return str;\r\n    }\r\n\r\n    function escapeForDisplay(str) {\r\n      \/\/ Already using textContent, but extra safety\r\n      if (typeof str !== 'string') return '';\r\n      return str;\r\n    }\r\n\r\n    \/\/ ============================================================\r\n    \/\/ DATA COLLECTION\r\n    \/\/ ============================================================\r\n\r\n    function collectFormData() {\r\n      var data = {};\r\n\r\n      \/\/ Text inputs and selects\r\n      var inputs = form.querySelectorAll('input[data-field], select[data-field], textarea[data-field]');\r\n      inputs.forEach(function(input) {\r\n        var field = input.getAttribute('data-field');\r\n        if (!field) return;\r\n\r\n        if (input.type === 'radio') {\r\n          if (input.checked) {\r\n            data[field] = sanitizeText(input.value, 100);\r\n          }\r\n        } else if (input.type === 'checkbox') {\r\n          \/\/ Collect all checked values for this field\r\n          if (!data[field]) data[field] = [];\r\n          if (input.checked) {\r\n            data[field].push(sanitizeText(input.value, 100));\r\n          }\r\n        } else if (input.type === 'date') {\r\n          data[field] = sanitizeDate(input.value);\r\n        } else if (input.type === 'time') {\r\n          data[field] = sanitizeTime(input.value);\r\n        } else if (input.tagName === 'TEXTAREA') {\r\n          data[field] = sanitizeText(input.value, 1000);\r\n        } else if (field === 'cnp') {\r\n          data[field] = sanitizeCNP(input.value);\r\n        } else {\r\n          data[field] = sanitizeText(input.value, 300);\r\n        }\r\n      });\r\n\r\n      return data;\r\n    }\r\n\r\n    \/\/ ============================================================\r\n    \/\/ VALIDATION\r\n    \/\/ ============================================================\r\n\r\n    function validateStep(stepNum) {\r\n      var stepEl = root.querySelector('[data-step=\"' + stepNum + '\"]');\r\n      if (!stepEl) return { valid: true, errors: [] };\r\n\r\n      var errors = [];\r\n      var requiredInputs = stepEl.querySelectorAll('[required]');\r\n\r\n      requiredInputs.forEach(function(input) {\r\n        var field = input.getAttribute('data-field') || input.name || input.id;\r\n        var label = '';\r\n        var labelEl = stepEl.querySelector('label[for=\"' + input.id + '\"]');\r\n        if (labelEl) {\r\n          label = labelEl.textContent.replace(\/\\*\/g, '').trim();\r\n        }\r\n\r\n        if (input.type === 'radio') {\r\n          \/\/ Check if any radio in group is checked\r\n          var name = input.name;\r\n          var checked = stepEl.querySelector('input[name=\"' + name + '\"]:checked');\r\n          if (!checked) {\r\n            if (errors.indexOf('Selecta\u021bi ' + label) === -1) {\r\n              errors.push('Selecta\u021bi ' + label);\r\n            }\r\n          }\r\n        } else {\r\n          var value = input.value.trim();\r\n          if (!value) {\r\n            errors.push('Completa\u021bi ' + (label || field));\r\n            input.classList.add('is-invalid');\r\n          } else {\r\n            input.classList.remove('is-invalid');\r\n          }\r\n        }\r\n      });\r\n\r\n      return { valid: errors.length === 0, errors: errors };\r\n    }\r\n\r\n    function showErrors(errors) {\r\n      if (!elements.errorsContainer) return;\r\n\r\n      if (!errors || errors.length === 0) {\r\n        elements.errorsContainer.classList.add('is-hidden');\r\n        elements.errorsContainer.textContent = '';\r\n        return;\r\n      }\r\n\r\n      elements.errorsContainer.textContent = '';\r\n      errors.forEach(function(err) {\r\n        var p = document.createElement('p');\r\n        p.textContent = err;\r\n        elements.errorsContainer.appendChild(p);\r\n      });\r\n      elements.errorsContainer.classList.remove('is-hidden');\r\n    }\r\n\r\n    \/\/ ============================================================\r\n    \/\/ NAVIGATION\r\n    \/\/ ============================================================\r\n\r\n    function updateProgress() {\r\n      var percent = (currentStep \/ totalSteps) * 100;\r\n      if (elements.progressFill) {\r\n        elements.progressFill.style.width = percent + '%';\r\n      }\r\n      if (elements.progressStep) {\r\n        elements.progressStep.textContent = 'Pasul ' + currentStep;\r\n      }\r\n    }\r\n\r\n    function showStep(stepNum) {\r\n      elements.steps.forEach(function(step) {\r\n        var num = parseInt(step.getAttribute('data-step'), 10);\r\n        if (num === stepNum) {\r\n          step.classList.remove('is-hidden');\r\n        } else {\r\n          step.classList.add('is-hidden');\r\n        }\r\n      });\r\n\r\n      \/\/ Update nav buttons - prev button is disabled on step 1, enabled otherwise\r\n      if (elements.prevBtn) {\r\n        if (stepNum === 1) {\r\n          elements.prevBtn.disabled = true;\r\n        } else {\r\n          elements.prevBtn.disabled = false;\r\n        }\r\n      }\r\n\r\n      if (elements.nextBtn) {\r\n        if (stepNum === totalSteps) {\r\n          elements.nextBtn.textContent = '';\r\n          var svg = document.createElementNS('http:\/\/www.w3.org\/2000\/svg', 'svg');\r\n          svg.setAttribute('width', '16');\r\n          svg.setAttribute('height', '16');\r\n          svg.setAttribute('viewBox', '0 0 24 24');\r\n          svg.setAttribute('fill', 'none');\r\n          svg.setAttribute('stroke', 'currentColor');\r\n          svg.setAttribute('stroke-width', '2');\r\n          var path = document.createElementNS('http:\/\/www.w3.org\/2000\/svg', 'path');\r\n          path.setAttribute('d', 'M9 11l3 3L22 4');\r\n          svg.appendChild(path);\r\n          var path2 = document.createElementNS('http:\/\/www.w3.org\/2000\/svg', 'path');\r\n          path2.setAttribute('d', 'M21 12v7a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h11');\r\n          svg.appendChild(path2);\r\n          elements.nextBtn.appendChild(svg);\r\n          elements.nextBtn.appendChild(document.createTextNode(' Previzualizeaz\u0103'));\r\n        } else {\r\n          elements.nextBtn.textContent = 'Urm\u0103torul ';\r\n          var svg2 = document.createElementNS('http:\/\/www.w3.org\/2000\/svg', 'svg');\r\n          svg2.setAttribute('width', '16');\r\n          svg2.setAttribute('height', '16');\r\n          svg2.setAttribute('viewBox', '0 0 24 24');\r\n          svg2.setAttribute('fill', 'none');\r\n          svg2.setAttribute('stroke', 'currentColor');\r\n          svg2.setAttribute('stroke-width', '2');\r\n          var path3 = document.createElementNS('http:\/\/www.w3.org\/2000\/svg', 'path');\r\n          path3.setAttribute('d', 'M5 12h14');\r\n          svg2.appendChild(path3);\r\n          var polyline = document.createElementNS('http:\/\/www.w3.org\/2000\/svg', 'polyline');\r\n          polyline.setAttribute('points', '12 5 19 12 12 19');\r\n          svg2.appendChild(polyline);\r\n          elements.nextBtn.appendChild(svg2);\r\n        }\r\n      }\r\n\r\n      currentStep = stepNum;\r\n      updateProgress();\r\n      showErrors([]);\r\n\r\n      \/\/ Generate preview on last step\r\n      if (stepNum === totalSteps) {\r\n        generatePreview();\r\n      }\r\n    }\r\n\r\n    function goNext() {\r\n      var validation = validateStep(currentStep);\r\n      if (!validation.valid) {\r\n        showErrors(validation.errors);\r\n        return;\r\n      }\r\n\r\n      if (currentStep < totalSteps) {\r\n        showStep(currentStep + 1);\r\n      }\r\n    }\r\n\r\n    function goPrev() {\r\n      if (currentStep > 1) {\r\n        showStep(currentStep - 1);\r\n      }\r\n    }\r\n\r\n    function resetForm() {\r\n      form.reset();\r\n      \/\/ Clear validation styles\r\n      var invalidInputs = form.querySelectorAll('.is-invalid');\r\n      invalidInputs.forEach(function(input) {\r\n        input.classList.remove('is-invalid');\r\n      });\r\n      showStep(1);\r\n      showErrors([]);\r\n      if (elements.warningsContainer) {\r\n        elements.warningsContainer.classList.add('is-hidden');\r\n      }\r\n      if (elements.previewContainer) {\r\n        elements.previewContainer.textContent = '';\r\n      }\r\n    }\r\n\r\n    \/\/ ============================================================\r\n    \/\/ CONDITIONAL FIELDS\r\n    \/\/ ============================================================\r\n\r\n    function updateConditionalFields() {\r\n      conditionalFields.forEach(function(field) {\r\n        var condition = field.getAttribute('data-show-if');\r\n        if (!condition) return;\r\n\r\n        var parts = condition.split('=');\r\n        if (parts.length !== 2) return;\r\n\r\n        var fieldName = parts[0];\r\n        var expectedValue = parts[1];\r\n\r\n        var input = form.querySelector('[data-field=\"' + fieldName + '\"]');\r\n        if (!input) {\r\n          \/\/ Check for select\r\n          input = form.querySelector('select[data-field=\"' + fieldName + '\"]');\r\n        }\r\n\r\n        if (input) {\r\n          var currentValue = input.value;\r\n          if (currentValue === expectedValue) {\r\n            field.classList.remove('is-hidden');\r\n          } else {\r\n            field.classList.add('is-hidden');\r\n          }\r\n        }\r\n      });\r\n    }\r\n\r\n    \/\/ ============================================================\r\n    \/\/ DOCUMENT GENERATION\r\n    \/\/ ============================================================\r\n\r\n    function getCalitateText(value) {\r\n      var map = {\r\n        'inculpat': 'inculpat',\r\n        'persoana_vatamata': 'persoan\u0103 v\u0103t\u0103mat\u0103',\r\n        'parte_civila': 'parte civil\u0103',\r\n        'parte_resp_civilmente': 'parte responsabil\u0103 civilmente',\r\n        'alta_parte': 'parte'\r\n      };\r\n      return map[value] || value || 'parte';\r\n    }\r\n\r\n    function getMotivText(value) {\r\n      var map = {\r\n        'angajare': 'angaj\u0103rii unui ap\u0103r\u0103tor ales',\r\n        'pregatire': 'preg\u0103tirii ap\u0103r\u0103rii \u00eempreun\u0103 cu ap\u0103r\u0103torul ales',\r\n        'ambele': 'angaj\u0103rii unui ap\u0103r\u0103tor ales \u0219i preg\u0103tirii ap\u0103r\u0103rii'\r\n      };\r\n      return map[value] || 'angaj\u0103rii unui ap\u0103r\u0103tor ales \u0219i preg\u0103tirii ap\u0103r\u0103rii';\r\n    }\r\n\r\n    function getAnexeText(anexe) {\r\n      if (!anexe || anexe.length === 0) return '\u2014';\r\n      var map = {\r\n        'imputernicire': '\u00cemputernicire avoca\u021bial\u0103',\r\n        'dovada_contactare': 'Dovad\u0103 contactare avocat \/ programare',\r\n        'alte_inscrisuri': 'Alte \u00eenscrisuri justificative'\r\n      };\r\n      return anexe.map(function(a) { return map[a] || a; }).join(', ');\r\n    }\r\n\r\n    function formatDate(dateStr) {\r\n      if (!dateStr) return '';\r\n      var parts = dateStr.split('-');\r\n      if (parts.length !== 3) return dateStr;\r\n      return parts[2] + '.' + parts[1] + '.' + parts[0];\r\n    }\r\n\r\n    function getTodayFormatted() {\r\n      var d = new Date();\r\n      var day = String(d.getDate()).padStart(2, '0');\r\n      var month = String(d.getMonth() + 1).padStart(2, '0');\r\n      var year = d.getFullYear();\r\n      return day + '.' + month + '.' + year;\r\n    }\r\n\r\n    function generateDocumentText(data) {\r\n      var lines = [];\r\n\r\n      \/\/ Antet\r\n      lines.push('C\u0102TRE: ' + (data.instanta || '[Instan\u021b\u0103]'));\r\n      if (data.sectia) {\r\n        lines.push('        ' + data.sectia);\r\n      }\r\n      lines.push('');\r\n      lines.push('Dosar nr.: ' + (data.numarDosar || '[Num\u0103r dosar]'));\r\n      if (data.complet) {\r\n        lines.push('Complet: ' + data.complet);\r\n      }\r\n      lines.push('Termen: ' + formatDate(data.termenJudecataData) + (data.termenJudecataOra ? ', ora ' + data.termenJudecataOra : ''));\r\n      lines.push('');\r\n      lines.push('');\r\n\r\n      \/\/ Identificare petent\r\n      var numeComplet = (data.nume || '') + ' ' + (data.prenume || '');\r\n      lines.push('Subsemnatul(a) ' + numeComplet.trim() + ', \u00een calitate de ' + getCalitateText(data.calitateProcesuala) + ',');\r\n      lines.push('domiciliat(\u0103) \u00een ' + (data.domiciliuLocalitate || '[Localitate]') + (data.adresaCompleta ? ', ' + data.adresaCompleta : '') + ',');\r\n\r\n      var contactParts = [];\r\n      if (data.telefon) contactParts.push('tel.: ' + data.telefon);\r\n      if (data.email) contactParts.push('email: ' + data.email);\r\n      if (contactParts.length > 0) {\r\n        lines.push('date de contact: ' + contactParts.join(', ') + ',');\r\n      }\r\n      if (data.cnp) {\r\n        lines.push('CNP: ' + data.cnp + ',');\r\n      }\r\n      lines.push('');\r\n\r\n      \/\/ Obiect\r\n      lines.push('formulez prezenta');\r\n      lines.push('');\r\n      lines.push('                    CERERE DE AM\u00c2NARE A JUDEC\u0102\u021aII');\r\n      lines.push('          \u00een vederea ' + getMotivText(data.motivPrincipal));\r\n      lines.push('');\r\n      lines.push('');\r\n\r\n      \/\/ Motivare\r\n      lines.push('MOTIVARE:');\r\n      lines.push('');\r\n      lines.push('\u00cen fapt, solicit respectuos acordarea unui termen pentru ' + getMotivText(data.motivPrincipal) + '.');\r\n      lines.push('');\r\n\r\n      if (data.detaliiMotiv) {\r\n        lines.push(data.detaliiMotiv);\r\n        lines.push('');\r\n      }\r\n\r\n      if (data.avocatAlesNume) {\r\n        var avocatInfo = 'Am ales ca ap\u0103r\u0103tor pe ' + data.avocatAlesNume;\r\n        if (data.avocatAlesBarou) {\r\n          avocatInfo += ', ' + data.avocatAlesBarou;\r\n        }\r\n        avocatInfo += '.';\r\n        lines.push(avocatInfo);\r\n        lines.push('');\r\n      }\r\n\r\n      \/\/ Baza legala\r\n      lines.push('\u00cen drept, \u00eemi \u00eentemeiez cererea pe dispozi\u021biile:');\r\n      lines.push('- art. 10 din Codul de procedur\u0103 penal\u0103, care consacr\u0103 dreptul la ap\u0103rare, inclusiv dreptul de a dispune de timpul \u0219i de \u00eenlesnirile necesare preg\u0103tirii ap\u0103r\u0103rii;');\r\n      lines.push('- art. 356 din Codul de procedur\u0103 penal\u0103, privind asigurarea ap\u0103r\u0103rii \u00een cursul judec\u0103\u021bii, care prevede dreptul p\u0103r\u021bilor la un termen pentru angajarea unui avocat ales \u0219i pentru preg\u0103tirea ap\u0103r\u0103rii.');\r\n\r\n      if (data.asistentaObligatorie && data.asistentaObligatorie.indexOf('da') !== -1) {\r\n        lines.push('- art. 90 din Codul de procedur\u0103 penal\u0103, privind cazurile de asisten\u021b\u0103 juridic\u0103 obligatorie.');\r\n      }\r\n      lines.push('');\r\n\r\n      \/\/ Solicitare\r\n      lines.push('SOLICITARE:');\r\n      lines.push('');\r\n      var termenText = data.solicitaTermenNouDupa;\r\n      if (termenText === 'alta' && data.solicitaTermenNouText) {\r\n        termenText = data.solicitaTermenNouText;\r\n      } else {\r\n        termenText = termenText + ' zile';\r\n      }\r\n      lines.push('Av\u00e2nd \u00een vedere cele de mai sus, v\u0103 rog s\u0103 dispune\u021bi am\u00e2narea cauzei \u0219i acordarea unui nou termen de judecat\u0103, de preferin\u021b\u0103 dup\u0103 ' + termenText + ', pentru a-mi permite ' + getMotivText(data.motivPrincipal) + '.');\r\n      lines.push('');\r\n\r\n      \/\/ Anexe\r\n      lines.push('ANEXE:');\r\n      lines.push(getAnexeText(data.anexe));\r\n      lines.push('');\r\n      lines.push('');\r\n\r\n      \/\/ Data \u0219i semn\u0103tura\r\n      lines.push('Data: ' + getTodayFormatted());\r\n      lines.push('');\r\n      lines.push('');\r\n      lines.push('Semn\u0103tura,');\r\n      lines.push('');\r\n      lines.push('____________________');\r\n      lines.push(numeComplet.trim());\r\n\r\n      if (data.avocatAlesNume) {\r\n        lines.push('');\r\n        lines.push('');\r\n        lines.push('Ap\u0103r\u0103tor ales: ' + data.avocatAlesNume);\r\n      }\r\n\r\n      return lines.join('\\n');\r\n    }\r\n\r\n    function generatePreview() {\r\n      var data = collectFormData();\r\n      var warnings = [];\r\n\r\n      \/\/ Check for missing recommended fields\r\n      if (!data.detaliiMotiv) {\r\n        warnings.push('Nu a\u021bi completat detaliile motivului. Este recomandat s\u0103 ad\u0103uga\u021bi informa\u021bii suplimentare.');\r\n      }\r\n      if (!data.avocatAlesNume && (data.motivPrincipal === 'angajare' || data.motivPrincipal === 'ambele')) {\r\n        warnings.push('Nu a\u021bi specificat numele avocatului ales.');\r\n      }\r\n      if (!data.anexe || data.anexe.length === 0) {\r\n        warnings.push('Nu a\u021bi bifat nicio anex\u0103. Ata\u0219area de dovezi poate spori \u0219ansele de admitere.');\r\n      }\r\n\r\n      \/\/ Show warnings\r\n      if (elements.warningsContainer) {\r\n        if (warnings.length > 0) {\r\n          elements.warningsContainer.textContent = '';\r\n          var ul = document.createElement('ul');\r\n          warnings.forEach(function(w) {\r\n            var li = document.createElement('li');\r\n            li.textContent = w;\r\n            ul.appendChild(li);\r\n          });\r\n          elements.warningsContainer.appendChild(ul);\r\n          elements.warningsContainer.classList.remove('is-hidden');\r\n        } else {\r\n          elements.warningsContainer.classList.add('is-hidden');\r\n        }\r\n      }\r\n\r\n      \/\/ Generate document\r\n      var docText = generateDocumentText(data);\r\n\r\n      \/\/ Display preview using textContent (XSS safe)\r\n      if (elements.previewContainer) {\r\n        elements.previewContainer.textContent = docText;\r\n      }\r\n    }\r\n\r\n    \/\/ ============================================================\r\n    \/\/ EXPORT FUNCTIONS\r\n    \/\/ ============================================================\r\n\r\n    function canExport() {\r\n      var now = Date.now();\r\n      \/\/ Remove old timestamps\r\n      exportTimestamps = exportTimestamps.filter(function(ts) {\r\n        return now - ts < 60000;\r\n      });\r\n      return exportTimestamps.length < MAX_EXPORTS_PER_MINUTE;\r\n    }\r\n\r\n    function recordExport() {\r\n      exportTimestamps.push(Date.now());\r\n    }\r\n\r\n    function copyToClipboard() {\r\n      if (!elements.previewContainer) return;\r\n\r\n      var text = elements.previewContainer.textContent;\r\n      if (!text) return;\r\n\r\n      if (navigator.clipboard && navigator.clipboard.writeText) {\r\n        navigator.clipboard.writeText(text).then(function() {\r\n          showCopyFeedback(true);\r\n        }).catch(function() {\r\n          fallbackCopy(text);\r\n        });\r\n      } else {\r\n        fallbackCopy(text);\r\n      }\r\n    }\r\n\r\n    function fallbackCopy(text) {\r\n      var textarea = document.createElement('textarea');\r\n      textarea.value = text;\r\n      textarea.style.position = 'fixed';\r\n      textarea.style.left = '-9999px';\r\n      document.body.appendChild(textarea);\r\n      textarea.select();\r\n      try {\r\n        document.execCommand('copy');\r\n        showCopyFeedback(true);\r\n      } catch (e) {\r\n        showCopyFeedback(false);\r\n      }\r\n      document.body.removeChild(textarea);\r\n    }\r\n\r\n    function showCopyFeedback(success) {\r\n      if (!elements.copyBtn) return;\r\n      var originalHTML = elements.copyBtn.innerHTML;\r\n      elements.copyBtn.textContent = success ? 'Copiat!' : 'Eroare';\r\n      setTimeout(function() {\r\n        \/\/ Safe: originalHTML is from static page HTML, not user input\r\n        elements.copyBtn.innerHTML = originalHTML;\r\n      }, 2000);\r\n    }\r\n\r\n    function printDocument() {\r\n      if (!canExport()) {\r\n        alert('Prea multe exporturi \u00eentr-un minut. V\u0103 rug\u0103m a\u0219tepta\u021bi.');\r\n        return;\r\n      }\r\n      recordExport();\r\n\r\n      var data = collectFormData();\r\n\r\n      \/\/ Create print window with elegant formatted document\r\n      var printWindow = window.open('', '_blank', 'width=800,height=600');\r\n      if (!printWindow) {\r\n        \/\/ Popup blocked, try iframe approach\r\n        printViaIframe(data);\r\n        return;\r\n      }\r\n\r\n      var printContent = generatePrintDocument(data);\r\n      printWindow.document.write(printContent);\r\n      printWindow.document.close();\r\n\r\n      printWindow.onload = function() {\r\n        printWindow.focus();\r\n        printWindow.print();\r\n      };\r\n    }\r\n\r\n    function printViaIframe(data) {\r\n      var iframe = document.createElement('iframe');\r\n      iframe.style.position = 'fixed';\r\n      iframe.style.left = '-9999px';\r\n      iframe.style.width = '1px';\r\n      iframe.style.height = '1px';\r\n      document.body.appendChild(iframe);\r\n\r\n      var printContent = generatePrintDocument(data);\r\n      iframe.contentDocument.write(printContent);\r\n      iframe.contentDocument.close();\r\n\r\n      iframe.onload = function() {\r\n        iframe.contentWindow.focus();\r\n        iframe.contentWindow.print();\r\n        setTimeout(function() {\r\n          document.body.removeChild(iframe);\r\n        }, 1000);\r\n      };\r\n    }\r\n\r\n    function escapeHTML(str) {\r\n      if (typeof str !== 'string') return '';\r\n      return str\r\n        .replace(\/&\/g, '&amp;')\r\n        .replace(\/<\/g, '&lt;')\r\n        .replace(\/>\/g, '&gt;')\r\n        .replace(\/\"\/g, '&quot;')\r\n        .replace(\/'\/g, '&#039;');\r\n    }\r\n\r\n    function generatePrintDocument(data) {\r\n      var numeComplet = escapeHTML((data.nume || '') + ' ' + (data.prenume || '')).trim();\r\n      var instanta = escapeHTML(data.instanta || '[Instan\u021b\u0103]');\r\n      var sectia = data.sectia ? escapeHTML(data.sectia) : '';\r\n      var numarDosar = escapeHTML(data.numarDosar || '[Num\u0103r dosar]');\r\n      var complet = data.complet ? escapeHTML(data.complet) : '';\r\n      var termenData = formatDate(data.termenJudecataData);\r\n      var termenOra = data.termenJudecataOra ? ', ora ' + escapeHTML(data.termenJudecataOra) : '';\r\n      var calitate = getCalitateText(data.calitateProcesuala);\r\n      var localitate = escapeHTML(data.domiciliuLocalitate || '[Localitate]');\r\n      var adresa = data.adresaCompleta ? ', ' + escapeHTML(data.adresaCompleta) : '';\r\n      var motivText = getMotivText(data.motivPrincipal);\r\n\r\n      \/\/ Build contact info inline\r\n      var contactParts = [];\r\n      if (data.telefon) contactParts.push('tel.: ' + escapeHTML(data.telefon));\r\n      if (data.email) contactParts.push('email: ' + escapeHTML(data.email));\r\n      var contactText = contactParts.length > 0 ? ', date de contact: ' + contactParts.join(', ') : '';\r\n      var cnpText = data.cnp ? ', CNP: ' + escapeHTML(data.cnp) : '';\r\n\r\n      var detaliiMotivPara = data.detaliiMotiv ? '<p class=\"body-text\">' + escapeHTML(data.detaliiMotiv) + '<\/p>' : '';\r\n\r\n      var avocatPara = '';\r\n      if (data.avocatAlesNume) {\r\n        var avocatInfo = 'Am ales ca ap\u0103r\u0103tor pe ' + escapeHTML(data.avocatAlesNume);\r\n        if (data.avocatAlesBarou) {\r\n          avocatInfo += ', ' + escapeHTML(data.avocatAlesBarou);\r\n        }\r\n        avocatInfo += '.';\r\n        avocatPara = '<p class=\"body-text\">' + avocatInfo + '<\/p>';\r\n      }\r\n\r\n      var art90Line = '';\r\n      if (data.asistentaObligatorie && data.asistentaObligatorie.indexOf('da') !== -1) {\r\n        art90Line = '<li>art. 90 din Codul de procedur\u0103 penal\u0103, privind cazurile de asisten\u021b\u0103 juridic\u0103 obligatorie.<\/li>';\r\n      }\r\n\r\n      var termenNouText = data.solicitaTermenNouDupa;\r\n      if (termenNouText === 'alta' && data.solicitaTermenNouText) {\r\n        termenNouText = escapeHTML(data.solicitaTermenNouText);\r\n      } else {\r\n        termenNouText = termenNouText + ' zile';\r\n      }\r\n\r\n      var avocatFooter = data.avocatAlesNume ? '<p class=\"avocat-footer\">Ap\u0103r\u0103tor ales: ' + escapeHTML(data.avocatAlesNume) + '<\/p>' : '';\r\n\r\n      return '<!DOCTYPE html>' +\r\n        '<html lang=\"ro\">' +\r\n        '<head>' +\r\n        '<meta charset=\"UTF-8\">' +\r\n        '<title>Cerere Am\u00e2nare Cauz\u0103<\/title>' +\r\n        '<style>' +\r\n        '@page { size: A4; margin: 25mm 20mm 25mm 20mm; }' +\r\n        '* { box-sizing: border-box; margin: 0; padding: 0; }' +\r\n        'body { font-family: \"Times New Roman\", Times, serif; font-size: 12pt; line-height: 1.8; color: #000; }' +\r\n        '.document { max-width: 100%; }' +\r\n        '.header { margin-bottom: 24pt; }' +\r\n        '.header-row { margin-bottom: 2pt; }' +\r\n        '.header-label { font-weight: bold; }' +\r\n        '.petent-block { text-align: justify; margin-bottom: 20pt; }' +\r\n        '.title-section { text-align: center; margin: 24pt 0; }' +\r\n        '.title-main { font-size: 14pt; font-weight: bold; text-transform: uppercase; letter-spacing: 1pt; margin: 0 0 6pt 0; }' +\r\n        '.title-sub { font-size: 12pt; font-style: italic; margin: 0; }' +\r\n        '.section-title { font-weight: bold; text-transform: uppercase; margin: 18pt 0 10pt 0; font-size: 12pt; }' +\r\n        '.body-text { text-align: justify; margin: 0 0 10pt 0; }' +\r\n        '.legal-list { margin: 8pt 0 10pt 20pt; padding: 0; list-style-type: disc; }' +\r\n        '.legal-list li { text-align: justify; margin-bottom: 4pt; }' +\r\n        '.signature-section { margin-top: 28pt; }' +\r\n        '.signature-row { display: flex; justify-content: space-between; }' +\r\n        '.signature-left { text-align: left; }' +\r\n        '.signature-right { text-align: right; min-width: 180pt; }' +\r\n        '.signature-label { margin-bottom: 20pt; }' +\r\n        '.signature-line { border-bottom: 1pt solid #000; width: 160pt; margin: 0 auto 4pt auto; }' +\r\n        '.signature-name { text-align: center; }' +\r\n        '.avocat-footer { margin-top: 20pt; text-align: right; font-style: italic; }' +\r\n        '<\/style>' +\r\n        '<\/head>' +\r\n        '<body>' +\r\n        '<div class=\"document\">' +\r\n\r\n        '<!-- ANTET -->' +\r\n        '<div class=\"header\">' +\r\n        '<p class=\"header-row\"><span class=\"header-label\">C\u0102TRE:<\/span> ' + instanta + '<\/p>' +\r\n        (sectia ? '<p class=\"header-row\" style=\"padding-left: 52pt;\">' + sectia + '<\/p>' : '') +\r\n        '<p class=\"header-row\"><span class=\"header-label\">Dosar nr.:<\/span> ' + numarDosar + '<\/p>' +\r\n        (complet ? '<p class=\"header-row\"><span class=\"header-label\">Complet:<\/span> ' + complet + '<\/p>' : '') +\r\n        '<p class=\"header-row\"><span class=\"header-label\">Termen:<\/span> ' + termenData + termenOra + '<\/p>' +\r\n        '<\/div>' +\r\n\r\n        '<!-- IDENTIFICARE PETENT - un singur bloc justify -->' +\r\n        '<div class=\"petent-block\">' +\r\n        'Subsemnatul(a) <strong>' + numeComplet + '<\/strong>, \u00een calitate de ' + calitate + ', ' +\r\n        'domiciliat(\u0103) \u00een ' + localitate + adresa + contactText + cnpText + ', ' +\r\n        'formulez prezenta' +\r\n        '<\/div>' +\r\n\r\n        '<!-- TITLU -->' +\r\n        '<div class=\"title-section\">' +\r\n        '<h1 class=\"title-main\">CERERE DE AM\u00c2NARE A JUDEC\u0102\u021aII<\/h1>' +\r\n        '<p class=\"title-sub\">\u00een vederea ' + motivText + '<\/p>' +\r\n        '<\/div>' +\r\n\r\n        '<!-- MOTIVARE -->' +\r\n        '<p class=\"section-title\">MOTIVARE:<\/p>' +\r\n        '<p class=\"body-text\">\u00cen fapt, solicit respectuos acordarea unui termen pentru ' + motivText + '.<\/p>' +\r\n        detaliiMotivPara +\r\n        avocatPara +\r\n\r\n        '<p class=\"body-text\">\u00cen drept, \u00eemi \u00eentemeiez cererea pe dispozi\u021biile:<\/p>' +\r\n        '<ul class=\"legal-list\">' +\r\n        '<li>art. 10 din Codul de procedur\u0103 penal\u0103, care consacr\u0103 dreptul la ap\u0103rare, inclusiv dreptul de a dispune de timpul \u0219i de \u00eenlesnirile necesare preg\u0103tirii ap\u0103r\u0103rii;<\/li>' +\r\n        '<li>art. 356 din Codul de procedur\u0103 penal\u0103, privind asigurarea ap\u0103r\u0103rii \u00een cursul judec\u0103\u021bii, care prevede dreptul p\u0103r\u021bilor la un termen pentru angajarea unui avocat ales \u0219i pentru preg\u0103tirea ap\u0103r\u0103rii.<\/li>' +\r\n        art90Line +\r\n        '<\/ul>' +\r\n\r\n        '<!-- SOLICITARE -->' +\r\n        '<p class=\"section-title\">SOLICITARE:<\/p>' +\r\n        '<p class=\"body-text\">Av\u00e2nd \u00een vedere cele de mai sus, v\u0103 rog s\u0103 dispune\u021bi am\u00e2narea cauzei \u0219i acordarea unui nou termen de judecat\u0103, de preferin\u021b\u0103 dup\u0103 ' + termenNouText + ', pentru a-mi permite ' + motivText + '.<\/p>' +\r\n\r\n        '<!-- SEMN\u0102TURA -->' +\r\n        '<div class=\"signature-section\">' +\r\n        '<div class=\"signature-row\">' +\r\n        '<div class=\"signature-left\">' +\r\n        '<p class=\"signature-label\">Data: ' + getTodayFormatted() + '<\/p>' +\r\n        '<\/div>' +\r\n        '<div class=\"signature-right\">' +\r\n        '<p class=\"signature-label\">Semn\u0103tura,<\/p>' +\r\n        '<div class=\"signature-line\"><\/div>' +\r\n        '<p class=\"signature-name\">' + numeComplet + '<\/p>' +\r\n        '<\/div>' +\r\n        '<\/div>' +\r\n        avocatFooter +\r\n        '<\/div>' +\r\n\r\n        '<\/div>' +\r\n        '<\/body>' +\r\n        '<\/html>';\r\n    }\r\n\r\n    function buildPrintHTML(docText) {\r\n      \/\/ This function is now a fallback - we use generatePrintDocument instead\r\n      var escapedText = docText\r\n        .replace(\/&\/g, '&amp;')\r\n        .replace(\/<\/g, '&lt;')\r\n        .replace(\/>\/g, '&gt;')\r\n        .replace(\/\"\/g, '&quot;')\r\n        .replace(\/'\/g, '&#039;');\r\n\r\n      return '<!DOCTYPE html>' +\r\n        '<html lang=\"ro\">' +\r\n        '<head>' +\r\n        '<meta charset=\"UTF-8\">' +\r\n        '<title>Cerere Am\u00e2nare Cauz\u0103<\/title>' +\r\n        '<style>' +\r\n        '@page { size: A4; margin: 25mm; }' +\r\n        'body { font-family: \"Times New Roman\", Times, serif; font-size: 12pt; line-height: 1.8; color: #000; margin: 0; padding: 0; }' +\r\n        'pre { white-space: pre-wrap; word-wrap: break-word; font-family: inherit; font-size: inherit; margin: 0; text-align: justify; }' +\r\n        '<\/style>' +\r\n        '<\/head>' +\r\n        '<body>' +\r\n        '<pre>' + escapedText + '<\/pre>' +\r\n        '<\/body>' +\r\n        '<\/html>';\r\n    }\r\n\r\n    \/\/ ============================================================\r\n    \/\/ EVENT LISTENERS\r\n    \/\/ ============================================================\r\n\r\n    if (elements.nextBtn) {\r\n      elements.nextBtn.addEventListener('click', goNext);\r\n    }\r\n\r\n    if (elements.prevBtn) {\r\n      elements.prevBtn.addEventListener('click', goPrev);\r\n    }\r\n\r\n    if (elements.resetBtn) {\r\n      elements.resetBtn.addEventListener('click', function() {\r\n        if (confirm('Sunte\u021bi sigur c\u0103 dori\u021bi s\u0103 reseta\u021bi formularul? Toate datele vor fi \u0219terse.')) {\r\n          resetForm();\r\n        }\r\n      });\r\n    }\r\n\r\n    if (elements.testBtn) {\r\n      elements.testBtn.addEventListener('click', function() {\r\n        fillTestData();\r\n      });\r\n    }\r\n\r\n    if (elements.copyBtn) {\r\n      elements.copyBtn.addEventListener('click', copyToClipboard);\r\n    }\r\n\r\n    if (elements.printBtn) {\r\n      elements.printBtn.addEventListener('click', printDocument);\r\n    }\r\n\r\n    \/\/ Conditional fields\r\n    form.addEventListener('change', function(e) {\r\n      var target = e.target;\r\n      if (target.hasAttribute('data-field')) {\r\n        updateConditionalFields();\r\n      }\r\n    });\r\n\r\n    \/\/ Prevent form submit\r\n    form.addEventListener('submit', function(e) {\r\n      e.preventDefault();\r\n    });\r\n\r\n    \/\/ Keyboard navigation\r\n    form.addEventListener('keydown', function(e) {\r\n      if (e.key === 'Enter' && e.target.tagName !== 'TEXTAREA') {\r\n        e.preventDefault();\r\n        \/\/ Don't auto-advance on Enter to prevent accidental navigation\r\n      }\r\n    });\r\n\r\n    \/\/ Initialize GDPR consent flow\r\n    initGDPR();\r\n\r\n    \/\/ Initialize form (will be hidden until GDPR consent)\r\n    showStep(1);\r\n    updateConditionalFields();\r\n  }\r\n})();\r\n<\/script>\r\n<\/div>\n<div data-tool-content=\"termene\" style=\"display:none\"><div id=\"zic-termene-calculator-v2\" class=\"zic2\" data-zic2=\"1\">\r\n  <div class=\"zic2__wrap\">\r\n    <!-- Header -->\r\n    <header class=\"zic2__hero\">\r\n      <div class=\"zic2__brandbar\">\r\n        <div class=\"zic2__mark\" aria-hidden=\"true\">\r\n          <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n            <rect x=\"3\" y=\"4\" width=\"18\" height=\"18\" rx=\"2\" ry=\"2\"\/>\r\n            <line x1=\"16\" y1=\"2\" x2=\"16\" y2=\"6\"\/>\r\n            <line x1=\"8\" y1=\"2\" x2=\"8\" y2=\"6\"\/>\r\n            <line x1=\"3\" y1=\"10\" x2=\"21\" y2=\"10\"\/>\r\n            <path d=\"M8 14h.01\"\/>\r\n            <path d=\"M12 14h.01\"\/>\r\n            <path d=\"M16 14h.01\"\/>\r\n          <\/svg>\r\n        <\/div>\r\n        <div class=\"zic2__headerText\">\r\n          <h2 class=\"zic2__title\">Calculator termene procedurale<\/h2>\r\n          <p class=\"zic2__subtitle\">Apel, recurs \u00een casa\u021bie, contesta\u021bii (CPP art. 269-270)<\/p>\r\n        <\/div>\r\n      <\/div>\r\n    <\/header>\r\n\r\n    <!-- Info box -->\r\n    <div class=\"zic2__formula\">\r\n      <div class=\"zic2__formulaIcon\">\r\n        <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n          <circle cx=\"12\" cy=\"12\" r=\"10\"\/>\r\n          <path d=\"M12 16v-4\"\/>\r\n          <path d=\"M12 8h.01\"\/>\r\n        <\/svg>\r\n      <\/div>\r\n      <div class=\"zic2__formulaText\">\r\n        <strong>Aten\u021bie:<\/strong> Termenele se calculeaz\u0103 conform <em>art. 269-270 CPP<\/em>. Dac\u0103 ultima zi cade \u00eentr-o zi nelucr\u0103toare, termenul se prelunge\u0219te p\u00e2n\u0103 la prima zi lucr\u0103toare.\r\n      <\/div>\r\n    <\/div>\r\n\r\n    <!-- Warning vizibil -->\r\n    <div class=\"zic2__warningBanner\">\r\n      <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><path d=\"M10.29 3.86L1.82 18a2 2 0 0 0 1.71 3h16.94a2 2 0 0 0 1.71-3L13.71 3.86a2 2 0 0 0-3.42 0z\"\/><line x1=\"12\" y1=\"9\" x2=\"12\" y2=\"13\"\/><line x1=\"12\" y1=\"17\" x2=\"12.01\" y2=\"17\"\/><\/svg>\r\n      <div>\r\n        <strong>Instrument informativ!<\/strong> Calculeaz\u0103 <em>estimativ<\/em> termenele pe baza datelor introduse. <strong>Nu este consultan\u021b\u0103 juridic\u0103.<\/strong> Pentru termene critice: verifica\u021bi exact data\/ora comunic\u0103rii \u0219i confirma\u021bi cu avocat\/gref\u0103.\r\n      <\/div>\r\n    <\/div>\r\n\r\n    <!-- Error Box -->\r\n    <div class=\"zic2__error is-hidden\" role=\"alert\" aria-live=\"polite\" data-errors><\/div>\r\n\r\n    <!-- Card 1: Tipul termenului -->\r\n    <section class=\"zic2__card\" aria-labelledby=\"zic2-sec-termen\">\r\n      <div class=\"zic2__cardHeader\">\r\n        <div class=\"zic2__cardIcon zic2__cardIcon--purple\">\r\n          <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n            <path d=\"M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z\"\/>\r\n            <polyline points=\"14 2 14 8 20 8\"\/>\r\n            <line x1=\"16\" y1=\"13\" x2=\"8\" y2=\"13\"\/>\r\n            <line x1=\"16\" y1=\"17\" x2=\"8\" y2=\"17\"\/>\r\n          <\/svg>\r\n        <\/div>\r\n        <h3 id=\"zic2-sec-termen\" class=\"zic2__cardTitle\">1. Tipul termenului<\/h3>\r\n      <\/div>\r\n\r\n      <div class=\"zic2__field\">\r\n        <label class=\"zic2__label\" for=\"zic2-tip-termen\">Selecta\u021bi calea de atac \/ termenul<\/label>\r\n        <select id=\"zic2-tip-termen\" class=\"zic2__select\" data-field=\"tipTermen\">\r\n          <option value=\"\">Selecta\u021bi...<\/option>\r\n          <option value=\"apel\">Apel (art. 410 CPP) - 10 zile<\/option>\r\n          <option value=\"recurs_casatie\">Recurs \u00een casa\u021bie (art. 435 CPP) - 30 zile<\/option>\r\n          <option value=\"contestatie_generala\">Contesta\u021bie general\u0103 (art. 425\u00b9 CPP) - 3 zile<\/option>\r\n          <option value=\"contestatie_camera\">Contesta\u021bie camer\u0103 preliminar\u0103 (art. 347 CPP) - 3 zile<\/option>\r\n          <option value=\"contestatie_masuri_48h\">Contesta\u021bie m\u0103suri preventive (art. 204-206 CPP) - 48 ore<\/option>\r\n          <option value=\"contestatie_anulare\">Contesta\u021bie \u00een anulare (art. 428 CPP) - 30 zile<\/option>\r\n          <option value=\"revizuire\">Cerere de revizuire (art. 457 CPP) - variabil<\/option>\r\n        <\/select>\r\n      <\/div>\r\n\r\n      <!-- Explicatie termen selectat -->\r\n      <div class=\"zic2__termInfo is-hidden\" data-term-info>\r\n        <div class=\"zic2__termInfoTitle\" data-term-title><\/div>\r\n        <div class=\"zic2__termInfoDesc\" data-term-desc><\/div>\r\n        <div class=\"zic2__termInfoBasis\" data-term-basis><\/div>\r\n      <\/div>\r\n    <\/section>\r\n\r\n    <!-- Card 2: Date necesare -->\r\n    <section class=\"zic2__card is-hidden\" data-card=\"date\" aria-labelledby=\"zic2-sec-date\">\r\n      <div class=\"zic2__cardHeader\">\r\n        <div class=\"zic2__cardIcon zic2__cardIcon--purple\">\r\n          <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n            <circle cx=\"12\" cy=\"12\" r=\"10\"\/>\r\n            <polyline points=\"12 6 12 12 16 14\"\/>\r\n          <\/svg>\r\n        <\/div>\r\n        <h3 id=\"zic2-sec-date\" class=\"zic2__cardTitle\">2. Date necesare<\/h3>\r\n      <\/div>\r\n\r\n      <div class=\"zic2__grid2\" style=\"margin-bottom: 16px;\">\r\n        <div class=\"zic2__field\">\r\n          <label class=\"zic2__label\" for=\"zic2-rol\">Cine declar\u0103 calea de atac?<\/label>\r\n          <select id=\"zic2-rol\" class=\"zic2__select\" data-field=\"rol\">\r\n            <option value=\"\">Selecta\u021bi...<\/option>\r\n            <option value=\"procuror\">Procuror<\/option>\r\n            <option value=\"inculpat\">Inculpat<\/option>\r\n            <option value=\"parte_civila\">Parte civil\u0103<\/option>\r\n            <option value=\"parte_resp_civil\">Parte responsabil\u0103 civilmente<\/option>\r\n            <option value=\"persoana_vatamata\">Persoan\u0103 v\u0103t\u0103mat\u0103<\/option>\r\n            <option value=\"alta\">Alt\u0103 persoan\u0103 ale c\u0103rei interese sunt v\u0103t\u0103mate<\/option>\r\n          <\/select>\r\n        <\/div>\r\n        <div class=\"zic2__field\" data-show-for-trigger>\r\n          <label class=\"zic2__label\" for=\"zic2-trigger\">Momentul de la care curge termenul<\/label>\r\n          <select id=\"zic2-trigger\" class=\"zic2__select\" data-field=\"triggerKind\">\r\n            <option value=\"\">Selecta\u021bi...<\/option>\r\n            <option value=\"comunicare\">Comunicarea hot\u0103r\u00e2rii\/\u00eencheierii<\/option>\r\n            <option value=\"pronuntare\">Pronun\u021barea<\/option>\r\n          <\/select>\r\n        <\/div>\r\n      <\/div>\r\n\r\n      <div class=\"zic2__grid2\">\r\n        <div class=\"zic2__field\">\r\n          <label class=\"zic2__label\" for=\"zic2-data\">Data comunic\u0103rii\/pronun\u021b\u0103rii<\/label>\r\n          <input id=\"zic2-data\" class=\"zic2__input\" type=\"date\" data-field=\"triggerDate\">\r\n        <\/div>\r\n        <div class=\"zic2__field\" data-show-for-hours style=\"display:none;\">\r\n          <label class=\"zic2__label\" for=\"zic2-ora\">Ora exact\u0103 (pentru termene \u00een ore)<\/label>\r\n          <input id=\"zic2-ora\" class=\"zic2__input\" type=\"time\" data-field=\"triggerTime\" value=\"00:00\">\r\n          <span class=\"zic2__fieldHint\">Obligatoriu pentru termene \u00een ore<\/span>\r\n        <\/div>\r\n      <\/div>\r\n\r\n      <!-- Hint pentru ora -->\r\n      <div class=\"zic2__hint\" data-show-hours-hint style=\"display:none; margin-top: 12px;\">\r\n        <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><circle cx=\"12\" cy=\"12\" r=\"10\"\/><path d=\"M9.09 9a3 3 0 0 1 5.83 1c0 2-3 3-3 3\"\/><path d=\"M12 17h.01\"\/><\/svg>\r\n        <span>Pentru termenele \u00een ore, ora exact\u0103 este esen\u021bial\u0103 pentru calcul. Verifica\u021bi ora din \u00eencheiere\/comunicare.<\/span>\r\n      <\/div>\r\n    <\/section>\r\n\r\n    <!-- Card 3: Metoda depunerii -->\r\n    <section class=\"zic2__card is-hidden\" data-card=\"depunere\" aria-labelledby=\"zic2-sec-depunere\">\r\n      <div class=\"zic2__cardHeader\">\r\n        <div class=\"zic2__cardIcon zic2__cardIcon--purple\">\r\n          <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n            <path d=\"M22 12h-6l-2 3h-4l-2-3H2\"\/>\r\n            <path d=\"M5.45 5.11L2 12v6a2 2 0 0 0 2 2h16a2 2 0 0 0 2-2v-6l-3.45-6.89A2 2 0 0 0 16.76 4H7.24a2 2 0 0 0-1.79 1.11z\"\/>\r\n          <\/svg>\r\n        <\/div>\r\n        <h3 id=\"zic2-sec-depunere\" class=\"zic2__cardTitle\">3. Metoda de depunere (op\u021bional)<\/h3>\r\n      <\/div>\r\n\r\n      <div class=\"zic2__field\">\r\n        <label class=\"zic2__label\" for=\"zic2-metoda\">Cum se va depune cererea\/calea de atac?<\/label>\r\n        <select id=\"zic2-metoda\" class=\"zic2__select\" data-field=\"filingMethod\">\r\n          <option value=\"direct\">Direct la instan\u021b\u0103\/parchet<\/option>\r\n          <option value=\"posta\">Po\u0219t\u0103 recomandat\u0103 (art. 270 CPP)<\/option>\r\n          <option value=\"detentie\">Administra\u021bie loc de de\u021binere (art. 270 CPP)<\/option>\r\n          <option value=\"militar\">Unitate militar\u0103 (art. 270 CPP)<\/option>\r\n        <\/select>\r\n      <\/div>\r\n\r\n      <div class=\"zic2__hint\" data-show-for-method style=\"display:none; margin-top: 12px;\">\r\n        <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><circle cx=\"12\" cy=\"12\" r=\"10\"\/><path d=\"M12 16v-4\"\/><path d=\"M12 8h.01\"\/><\/svg>\r\n        <span><strong>Art. 270 CPP:<\/strong> Actul se consider\u0103 f\u0103cut \u00een termen dac\u0103 a fost predat \u0219tampila po\u0219tei\/administra\u021biei locului de de\u021binere\/unit\u0103\u021bii militare \u00eenainte de expirarea termenului.<\/span>\r\n      <\/div>\r\n    <\/section>\r\n\r\n    <!-- Actions -->\r\n    <div class=\"zic2__actions\">\r\n      <button type=\"button\" class=\"zic2__btn zic2__btn--primary zic2__btn--large\" data-action=\"calculate\">\r\n        <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\"><polyline points=\"9 11 12 14 22 4\"\/><path d=\"M21 12v7a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h11\"\/><\/svg>\r\n        Calculeaz\u0103 termenul\r\n      <\/button>\r\n      <button type=\"button\" class=\"zic2__btn zic2__btn--secondary\" data-action=\"reset\">\r\n        <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><path d=\"M3 12a9 9 0 1 0 9-9 9.75 9.75 0 0 0-6.74 2.74L3 8\"\/><path d=\"M3 3v5h5\"\/><\/svg>\r\n        Reseteaz\u0103\r\n      <\/button>\r\n      <button type=\"button\" class=\"zic2__btn zic2__btn--success\" data-action=\"example\">\r\n        <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><path d=\"M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z\"\/><polyline points=\"14 2 14 8 20 8\"\/><\/svg>\r\n        Exemplu\r\n      <\/button>\r\n      <button type=\"button\" class=\"zic2__btn zic2__btn--secondary\" data-action=\"export-pdf\">\r\n        <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><path d=\"M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z\"\/><polyline points=\"14 2 14 8 20 8\"\/><path d=\"M12 18v-6\"\/><path d=\"M9 15l3 3 3-3\"\/><\/svg>\r\n        Descarc\u0103 PDF\r\n      <\/button>\r\n    <\/div>\r\n\r\n    <!-- Result -->\r\n    <section class=\"zic2__card zic2__resultCard is-hidden\" data-result aria-live=\"polite\">\r\n      <div class=\"zic2__cardHeader\">\r\n        <div class=\"zic2__cardIcon zic2__cardIcon--green\" data-result-icon>\r\n          <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\"><polyline points=\"20 6 9 17 4 12\"\/><\/svg>\r\n        <\/div>\r\n        <h3 class=\"zic2__cardTitle\">Rezultat calcul termen<\/h3>\r\n        <div class=\"zic2__spacer\"><\/div>\r\n        <span class=\"zic2__badge\" data-badge>-<\/span>\r\n      <\/div>\r\n      <div class=\"zic2__resultBody\" data-result-content><\/div>\r\n    <\/section>\r\n\r\n    <!-- Disclaimer -->\r\n    <div class=\"zic2__disclaimer\">\r\n      <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><path d=\"M10.29 3.86L1.82 18a2 2 0 0 0 1.71 3h16.94a2 2 0 0 0 1.71-3L13.71 3.86a2 2 0 0 0-3.42 0z\"\/><line x1=\"12\" y1=\"9\" x2=\"12\" y2=\"13\"\/><line x1=\"12\" y1=\"17\" x2=\"12.01\" y2=\"17\"\/><\/svg>\r\n      <div>\r\n        <strong>Disclaimer:<\/strong> Acest calculator este oferit exclusiv \u00een scop informativ \u0219i educativ. Rezultatele sunt estimative \u0219i nu reprezint\u0103 consultan\u021b\u0103 juridic\u0103. Pentru termene critice, verifica\u021bi cu dosarul \u0219i confirma\u021bi cu un avocat.\r\n      <\/div>\r\n    <\/div>\r\n\r\n    <!-- Footer -->\r\n    <footer class=\"zic2__footer\">\r\n      <a href=\"https:\/\/zic.legal\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"zic2__footerLink\">\r\n        &copy; 2025 ZIC Legal\r\n      <\/a>\r\n    <\/footer>\r\n  <\/div>\r\n<\/div>\r\n\r\n<style>\r\n\/* ============================================================\r\n   ZIC Calculator v2 - Termene Procedurale CPP\r\n   Theme: Purple\/Mov | Fully Responsive | Optimized | SECURED\r\n   ============================================================ *\/\r\n\r\n\/* === CSS Variables === *\/\r\n#zic-termene-calculator-v2 {\r\n  --zic-primary: #8A88FF;\r\n  --zic-primary-dark: #6F6CFF;\r\n  --zic-primary-light: rgba(138,136,255,.08);\r\n  --zic-primary-border: rgba(138,136,255,.25);\r\n\r\n  --zic-success: #10B981;\r\n  --zic-success-light: rgba(16,185,129,.08);\r\n  --zic-success-border: rgba(16,185,129,.25);\r\n\r\n  --zic-danger: #EF4444;\r\n  --zic-danger-light: rgba(239,68,68,.08);\r\n  --zic-danger-border: rgba(239,68,68,.25);\r\n\r\n  --zic-warning: #F59E0B;\r\n  --zic-warning-light: rgba(245,158,11,.08);\r\n  --zic-warning-border: rgba(245,158,11,.25);\r\n\r\n  --zic-blue: #3B82F6;\r\n  --zic-blue-light: rgba(59,130,246,.08);\r\n\r\n  --zic-ink: #1F2937;\r\n  --zic-ink-light: #374151;\r\n  --zic-muted: #6B7280;\r\n  --zic-light: #9CA3AF;\r\n\r\n  --zic-bg: #F9FAFB;\r\n  --zic-surface: #FFFFFF;\r\n  --zic-border: #E5E7EB;\r\n\r\n  --zic-shadow-sm: 0 1px 2px rgba(0,0,0,.05);\r\n  --zic-shadow-lg: 0 10px 15px -3px rgba(0,0,0,.1), 0 4px 6px -2px rgba(0,0,0,.05);\r\n\r\n  --zic-radius: 16px;\r\n  --zic-radius-sm: 12px;\r\n  --zic-radius-xs: 8px;\r\n\r\n  --zic-transition: 150ms ease;\r\n\r\n  font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif;\r\n  color: var(--zic-ink);\r\n  line-height: 1.5;\r\n  -webkit-font-smoothing: antialiased;\r\n}\r\n\r\n#zic-termene-calculator-v2 *, #zic-termene-calculator-v2 *::before, #zic-termene-calculator-v2 *::after { box-sizing: border-box; }\r\n\r\n\/* === WordPress\/Avada Override Protection === *\/\r\n#zic-termene-calculator-v2 input[type=\"checkbox\"],\r\n#zic-termene-calculator-v2 input[type=\"radio\"] {\r\n  -webkit-appearance: auto !important;\r\n  -moz-appearance: auto !important;\r\n  appearance: auto !important;\r\n  width: 18px !important;\r\n  height: 18px !important;\r\n  margin: 0 !important;\r\n  padding: 0 !important;\r\n  border: none !important;\r\n  background: none !important;\r\n  box-shadow: none !important;\r\n}\r\n\r\n#zic-termene-calculator-v2 input[type=\"number\"],\r\n#zic-termene-calculator-v2 input[type=\"text\"],\r\n#zic-termene-calculator-v2 input[type=\"date\"],\r\n#zic-termene-calculator-v2 input[type=\"time\"] {\r\n  -webkit-appearance: none !important;\r\n  -moz-appearance: textfield !important;\r\n  appearance: none !important;\r\n  background-image: none !important;\r\n  box-shadow: none !important;\r\n}\r\n\r\n#zic-termene-calculator-v2 select {\r\n  background-image: url(\"data:image\/svg+xml,%3Csvg xmlns='http:\/\/www.w3.org\/2000\/svg' width='12' height='12' viewBox='0 0 24 24' fill='none' stroke='%236B7280' stroke-width='2'%3E%3Cpath d='M6 9l6 6 6-6'\/%3E%3C\/svg%3E\") !important;\r\n  background-repeat: no-repeat !important;\r\n  background-position: right 12px center !important;\r\n  padding-right: 36px !important;\r\n}\r\n\r\n#zic-termene-calculator-v2 button:not(.zic2__btn--primary) {\r\n  background-image: none !important;\r\n}\r\n\r\n#zic-termene-calculator-v2 button {\r\n  text-shadow: none !important;\r\n  letter-spacing: normal !important;\r\n}\r\n\r\n#zic-termene-calculator-v2 h2,\r\n#zic-termene-calculator-v2 h3 {\r\n  text-transform: none !important;\r\n  letter-spacing: normal !important;\r\n}\r\n\r\n#zic-termene-calculator-v2 a { text-decoration: none; }\r\n#zic-termene-calculator-v2 a:hover { text-decoration: underline; }\r\n\r\n#zic-termene-calculator-v2 .zic2__wrap { max-width: 720px; margin: 0 auto; padding: 16px; }\r\n\r\n#zic-termene-calculator-v2 .zic2__hero { margin-bottom: 16px; }\r\n\r\n#zic-termene-calculator-v2 .zic2__brandbar {\r\n  display: flex; align-items: center; gap: 14px;\r\n  background: linear-gradient(135deg, var(--zic-primary), var(--zic-primary-dark));\r\n  border-radius: var(--zic-radius); padding: 20px; color: #fff; box-shadow: var(--zic-shadow-lg);\r\n}\r\n\r\n#zic-termene-calculator-v2 .zic2__mark {\r\n  width: 48px; height: 48px; background: rgba(255,255,255,.2); border-radius: 12px;\r\n  display: flex; align-items: center; justify-content: center; flex-shrink: 0;\r\n}\r\n\r\n#zic-termene-calculator-v2 .zic2__headerText { flex: 1; min-width: 0; }\r\n#zic-termene-calculator-v2 .zic2__title { margin: 0; font-size: 20px; font-weight: 700; line-height: 1.2; }\r\n#zic-termene-calculator-v2 .zic2__subtitle { margin: 4px 0 0; font-size: 14px; opacity: 0.9; }\r\n\r\n#zic-termene-calculator-v2 .zic2__formula {\r\n  display: flex; align-items: flex-start; gap: 10px;\r\n  background: var(--zic-primary-light); border: 1px solid var(--zic-primary-border);\r\n  border-radius: var(--zic-radius-sm); padding: 12px 14px; margin-bottom: 16px;\r\n  font-size: 14px; color: var(--zic-ink-light);\r\n}\r\n#zic-termene-calculator-v2 .zic2__formulaIcon { color: var(--zic-primary-dark); flex-shrink: 0; margin-top: 1px; }\r\n#zic-termene-calculator-v2 .zic2__formulaText strong { color: var(--zic-ink); }\r\n#zic-termene-calculator-v2 .zic2__formulaText em { font-style: italic; color: var(--zic-primary-dark); }\r\n\r\n#zic-termene-calculator-v2 .zic2__warningBanner {\r\n  display: flex; align-items: flex-start; gap: 10px;\r\n  background: var(--zic-warning-light); border: 1px solid var(--zic-warning-border);\r\n  border-radius: var(--zic-radius-sm); padding: 14px; margin-bottom: 16px;\r\n  font-size: 13px; color: #92400E;\r\n}\r\n#zic-termene-calculator-v2 .zic2__warningBanner svg { flex-shrink: 0; margin-top: 1px; color: var(--zic-warning); }\r\n#zic-termene-calculator-v2 .zic2__warningBanner strong { color: var(--zic-ink); }\r\n\r\n#zic-termene-calculator-v2 .zic2__card {\r\n  background: var(--zic-surface); border: 1px solid var(--zic-border);\r\n  border-radius: var(--zic-radius); padding: 20px; margin-bottom: 16px; box-shadow: var(--zic-shadow-sm);\r\n}\r\n\r\n#zic-termene-calculator-v2 .zic2__cardHeader { display: flex; align-items: center; gap: 12px; margin-bottom: 16px; flex-wrap: wrap; }\r\n\r\n#zic-termene-calculator-v2 .zic2__cardIcon {\r\n  width: 36px; height: 36px; border-radius: 10px;\r\n  display: flex; align-items: center; justify-content: center; flex-shrink: 0;\r\n}\r\n#zic-termene-calculator-v2 .zic2__cardIcon--purple { background: var(--zic-primary-light); color: var(--zic-primary-dark); }\r\n#zic-termene-calculator-v2 .zic2__cardIcon--green { background: var(--zic-success-light); color: var(--zic-success); }\r\n#zic-termene-calculator-v2 .zic2__cardIcon--red { background: var(--zic-danger-light); color: var(--zic-danger); }\r\n#zic-termene-calculator-v2 .zic2__cardIcon--warning { background: var(--zic-warning-light); color: var(--zic-warning); }\r\n\r\n#zic-termene-calculator-v2 .zic2__cardTitle { margin: 0; font-size: 17px; font-weight: 700; color: var(--zic-ink); }\r\n#zic-termene-calculator-v2 .zic2__spacer { flex: 1; }\r\n\r\n#zic-termene-calculator-v2 .zic2__badge {\r\n  display: inline-flex; align-items: center; gap: 6px; padding: 6px 12px;\r\n  background: var(--zic-primary-light); color: var(--zic-primary-dark);\r\n  font-size: 12px; font-weight: 600; border-radius: 999px; white-space: nowrap;\r\n}\r\n#zic-termene-calculator-v2 .zic2__badge--yes { background: var(--zic-success-light); color: var(--zic-success); }\r\n#zic-termene-calculator-v2 .zic2__badge--no { background: var(--zic-danger-light); color: var(--zic-danger); }\r\n#zic-termene-calculator-v2 .zic2__badge--warning { background: var(--zic-warning-light); color: #92400E; }\r\n\r\n#zic-termene-calculator-v2 .zic2__field { display: flex; flex-direction: column; gap: 4px; }\r\n#zic-termene-calculator-v2 .zic2__label { font-size: 12px; font-weight: 600; color: var(--zic-muted); }\r\n#zic-termene-calculator-v2 .zic2__fieldHint { font-size: 11px; color: var(--zic-light); margin-top: 4px; }\r\n\r\n#zic-termene-calculator-v2 .zic2__input, #zic-termene-calculator-v2 .zic2__select {\r\n  width: 100%; padding: 10px 12px; font-size: 15px; font-family: inherit;\r\n  color: var(--zic-ink); background: var(--zic-surface);\r\n  border: 2px solid var(--zic-border); border-radius: var(--zic-radius-xs);\r\n  outline: none; transition: border-color var(--zic-transition), box-shadow var(--zic-transition);\r\n}\r\n#zic-termene-calculator-v2 .zic2__input:focus, #zic-termene-calculator-v2 .zic2__select:focus {\r\n  border-color: var(--zic-primary); box-shadow: 0 0 0 3px var(--zic-primary-light);\r\n}\r\n\r\n#zic-termene-calculator-v2 .zic2__grid2 { display: grid; gap: 12px; }\r\n@media (min-width: 640px) { #zic-termene-calculator-v2 .zic2__grid2 { grid-template-columns: 1fr 1fr; } }\r\n\r\n#zic-termene-calculator-v2 .zic2__hint {\r\n  display: flex; align-items: flex-start; gap: 8px;\r\n  padding: 10px 12px; background: var(--zic-bg); border-radius: var(--zic-radius-xs);\r\n  font-size: 12px; color: var(--zic-muted);\r\n}\r\n#zic-termene-calculator-v2 .zic2__hint svg { flex-shrink: 0; margin-top: 1px; }\r\n#zic-termene-calculator-v2 .zic2__hint strong { color: var(--zic-primary-dark); }\r\n\r\n#zic-termene-calculator-v2 .zic2__termInfo {\r\n  margin-top: 16px; padding: 14px; background: var(--zic-bg);\r\n  border: 1px solid var(--zic-border); border-radius: var(--zic-radius-sm);\r\n}\r\n#zic-termene-calculator-v2 .zic2__termInfoTitle { font-size: 15px; font-weight: 700; color: var(--zic-ink); margin-bottom: 6px; }\r\n#zic-termene-calculator-v2 .zic2__termInfoDesc { font-size: 13px; color: var(--zic-ink-light); margin-bottom: 6px; }\r\n#zic-termene-calculator-v2 .zic2__termInfoBasis { font-size: 12px; font-weight: 600; color: var(--zic-primary-dark); }\r\n\r\n#zic-termene-calculator-v2 .zic2__actions { display: flex; flex-wrap: wrap; gap: 10px; margin-bottom: 16px; }\r\n#zic-termene-calculator-v2 .zic2__actions .zic2__btn--primary { flex: 1; min-width: 200px; }\r\n\r\n#zic-termene-calculator-v2 .zic2__btn {\r\n  display: inline-flex; align-items: center; justify-content: center; gap: 6px;\r\n  padding: 10px 16px; font-size: 14px; font-weight: 600;\r\n  border-radius: var(--zic-radius-sm); border: 1px solid transparent;\r\n  cursor: pointer; transition: all var(--zic-transition); white-space: nowrap; text-decoration: none;\r\n}\r\n#zic-termene-calculator-v2 .zic2__btn:focus { outline: none; box-shadow: 0 0 0 3px var(--zic-primary-border); }\r\n#zic-termene-calculator-v2 .zic2__btn:active { transform: translateY(1px); }\r\n\r\n#zic-termene-calculator-v2 .zic2__btn--primary {\r\n  background: linear-gradient(135deg, var(--zic-primary), var(--zic-primary-dark));\r\n  color: #fff; box-shadow: 0 4px 14px rgba(138,136,255,.35);\r\n}\r\n#zic-termene-calculator-v2 .zic2__btn--primary:hover { box-shadow: 0 6px 20px rgba(138,136,255,.45); transform: translateY(-1px); }\r\n#zic-termene-calculator-v2 .zic2__btn--large { padding: 14px 24px; font-size: 15px; }\r\n\r\n#zic-termene-calculator-v2 .zic2__btn--secondary { background: var(--zic-surface); border-color: var(--zic-border); color: var(--zic-ink-light); }\r\n#zic-termene-calculator-v2 .zic2__btn--secondary:hover { background: var(--zic-bg); border-color: var(--zic-primary-border); color: var(--zic-primary-dark); }\r\n\r\n#zic-termene-calculator-v2 .zic2__btn--success { background: var(--zic-success-light); border-color: var(--zic-success-border); color: var(--zic-success); }\r\n#zic-termene-calculator-v2 .zic2__btn--success:hover { background: rgba(16,185,129,.15); }\r\n\r\n#zic-termene-calculator-v2 .zic2__error { margin-bottom: 16px; padding: 12px; background: var(--zic-danger-light); border: 1px solid var(--zic-danger-border); border-radius: var(--zic-radius-xs); color: var(--zic-danger); font-size: 13px; font-weight: 500; }\r\n#zic-termene-calculator-v2 .zic2__error ul { margin: 8px 0 0 18px; padding: 0; }\r\n#zic-termene-calculator-v2 .zic2__error li { margin: 4px 0; }\r\n\r\n#zic-termene-calculator-v2 .zic2__resultCard { border-color: var(--zic-success-border); background: linear-gradient(135deg, rgba(16,185,129,.02), rgba(16,185,129,.06)); }\r\n#zic-termene-calculator-v2 .zic2__resultCard--warning { border-color: var(--zic-warning-border); background: linear-gradient(135deg, rgba(245,158,11,.02), rgba(245,158,11,.06)); }\r\n#zic-termene-calculator-v2 .zic2__resultCard--danger { border-color: var(--zic-danger-border); background: linear-gradient(135deg, rgba(239,68,68,.02), rgba(239,68,68,.06)); }\r\n\r\n#zic-termene-calculator-v2 .zic2__resultBody { display: flex; flex-direction: column; gap: 16px; }\r\n\r\n#zic-termene-calculator-v2 .zic2__kpi { background: var(--zic-surface); border: 1px solid var(--zic-border); border-radius: var(--zic-radius-sm); padding: 16px; }\r\n#zic-termene-calculator-v2 .zic2__kpiLabel { font-size: 12px; font-weight: 600; color: var(--zic-muted); text-transform: uppercase; letter-spacing: 0.5px; margin-bottom: 6px; }\r\n#zic-termene-calculator-v2 .zic2__kpiValue { font-size: 22px; font-weight: 800; color: var(--zic-primary-dark); margin: 0; }\r\n#zic-termene-calculator-v2 .zic2__kpiValue--success { color: var(--zic-success); }\r\n#zic-termene-calculator-v2 .zic2__kpiValue--danger { color: var(--zic-danger); }\r\n#zic-termene-calculator-v2 .zic2__kpiValue--warning { color: #92400E; }\r\n#zic-termene-calculator-v2 .zic2__kpiSub { font-size: 13px; color: var(--zic-muted); margin-top: 4px; }\r\n\r\n#zic-termene-calculator-v2 .zic2__detailsGrid { display: grid; grid-template-columns: 1fr 1fr; gap: 12px; }\r\n#zic-termene-calculator-v2 .zic2__detailItem { background: var(--zic-surface); border: 1px solid var(--zic-border); border-radius: var(--zic-radius-xs); padding: 12px; }\r\n#zic-termene-calculator-v2 .zic2__detailLabel { font-size: 11px; font-weight: 600; color: var(--zic-muted); text-transform: uppercase; letter-spacing: 0.05em; margin-bottom: 4px; }\r\n#zic-termene-calculator-v2 .zic2__detailValue { font-size: 14px; font-weight: 700; color: var(--zic-ink); }\r\n\r\n#zic-termene-calculator-v2 .zic2__explanations { background: var(--zic-bg); border-radius: var(--zic-radius-xs); padding: 14px; margin-top: 12px; }\r\n#zic-termene-calculator-v2 .zic2__explanationsTitle { font-size: 12px; font-weight: 700; color: var(--zic-ink); margin-bottom: 10px; text-transform: uppercase; letter-spacing: 0.5px; }\r\n#zic-termene-calculator-v2 .zic2__explanationItem { display: flex; gap: 8px; padding: 6px 0; font-size: 13px; color: var(--zic-ink-light); border-bottom: 1px dashed var(--zic-border); }\r\n#zic-termene-calculator-v2 .zic2__explanationItem:last-child { border-bottom: none; }\r\n#zic-termene-calculator-v2 .zic2__explanationBasis { font-size: 11px; font-weight: 600; color: var(--zic-primary-dark); white-space: nowrap; }\r\n\r\n#zic-termene-calculator-v2 .zic2__warningBox { display: flex; align-items: flex-start; gap: 10px; padding: 12px; background: var(--zic-warning-light); border: 1px solid var(--zic-warning-border); border-radius: var(--zic-radius-xs); margin-top: 12px; }\r\n#zic-termene-calculator-v2 .zic2__warningBox svg { flex-shrink: 0; color: var(--zic-warning); margin-top: 2px; }\r\n#zic-termene-calculator-v2 .zic2__warningBox span { font-size: 13px; color: #92400E; }\r\n\r\n#zic-termene-calculator-v2 .zic2__disclaimer { display: flex; align-items: flex-start; gap: 10px; padding: 14px; background: var(--zic-bg); border: 1px solid var(--zic-border); border-radius: var(--zic-radius-sm); font-size: 12px; color: var(--zic-muted); line-height: 1.5; margin-bottom: 16px; }\r\n#zic-termene-calculator-v2 .zic2__disclaimer svg { flex-shrink: 0; color: var(--zic-warning); margin-top: 1px; }\r\n#zic-termene-calculator-v2 .zic2__disclaimer strong { color: var(--zic-ink-light); }\r\n\r\n#zic-termene-calculator-v2 .zic2__footer { text-align: center; padding: 8px 0; }\r\n#zic-termene-calculator-v2 .zic2__footerLink { color: var(--zic-primary-dark); text-decoration: none; font-size: 13px; font-weight: 600; transition: color var(--zic-transition); }\r\n#zic-termene-calculator-v2 .zic2__footerLink:hover { color: var(--zic-primary); text-decoration: underline; }\r\n\r\n#zic-termene-calculator-v2 .is-hidden { display: none !important; }\r\n\r\n\/* Small mobile (max 500px) *\/\r\n@media (max-width: 500px) {\r\n  #zic-termene-calculator-v2 .zic2__actions { flex-direction: column; }\r\n  #zic-termene-calculator-v2 .zic2__actions .zic2__btn { width: 100%; min-width: unset; }\r\n  #zic-termene-calculator-v2 .zic2__detailsGrid { grid-template-columns: 1fr; }\r\n}\r\n\r\n@media (min-width: 640px) { #zic-termene-calculator-v2 .zic2__wrap { padding: 24px; } #zic-termene-calculator-v2 .zic2__title { font-size: 24px; } }\r\n@media (min-width: 768px) { #zic-termene-calculator-v2 .zic2__card { padding: 24px; } #zic-termene-calculator-v2 .zic2__brandbar { padding: 24px; } #zic-termene-calculator-v2 .zic2__mark { width: 56px; height: 56px; } #zic-termene-calculator-v2 .zic2__title { font-size: 26px; } }\r\n@media (min-width: 1024px) { #zic-termene-calculator-v2 .zic2__wrap { max-width: 900px; } }\r\n\r\n@media print {\r\n  #zic-termene-calculator-v2 .zic2__actions, #zic-termene-calculator-v2 .zic2__footer { display: none !important; }\r\n  #zic-termene-calculator-v2 .zic2__card { box-shadow: none; border: 1px solid #ddd; break-inside: avoid; }\r\n}\r\n<\/style>\r\n\r\n<script>\r\n(function() {\r\n  'use strict';\r\n  var ROOT_ID = 'zic-termene-calculator-v2';\r\n  var MS_DAY = 86400000;\r\n  var MS_HOUR = 3600000;\r\n  var root = document.getElementById(ROOT_ID);\r\n  if (!root) return;\r\n\r\n  \/\/ ============================================================\r\n  \/\/ SECURITY FUNCTIONS\r\n  \/\/ ============================================================\r\n  function escapeHtml(str) {\r\n    if (str === null || str === undefined) return '';\r\n    var text = String(str);\r\n    var div = document.createElement('div');\r\n    div.textContent = text;\r\n    return div.innerHTML;\r\n  }\r\n\r\n  function isValidDateFormat(dateStr) {\r\n    if (!dateStr || typeof dateStr !== 'string') return false;\r\n    var regex = \/^\\d{4}-\\d{2}-\\d{2}$\/;\r\n    if (!regex.test(dateStr)) return false;\r\n    var parts = dateStr.split('-').map(Number);\r\n    var y = parts[0], m = parts[1], d = parts[2];\r\n    if (y < 1900 || y > 2100 || m < 1 || m > 12 || d < 1) return false;\r\n    var daysInMonth = [31, (y % 4 === 0 && (y % 100 !== 0 || y % 400 === 0)) ? 29 : 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];\r\n    if (d > daysInMonth[m - 1]) return false;\r\n    return true;\r\n  }\r\n\r\n  function isValidTimeFormat(timeStr) {\r\n    if (!timeStr || typeof timeStr !== 'string') return false;\r\n    var regex = \/^([01]?[0-9]|2[0-3]):([0-5][0-9])$\/;\r\n    return regex.test(timeStr);\r\n  }\r\n\r\n  \/\/ ============================================================\r\n  \/\/ TERMS_CATALOG - EXTENSIBIL (CPP)\r\n  \/\/ ============================================================\r\n  var TERMS_CATALOG = {\r\n    apel: {\r\n      slug: 'apel',\r\n      title: 'Apel',\r\n      duration: 10,\r\n      unit: 'zile',\r\n      startRule: 'comunicare',\r\n      roleOverrides: {\r\n        procuror: { startRule: 'pronuntare' }\r\n      },\r\n      legalBasis: ['Art. 410 alin. (1) CPP'],\r\n      explanation: 'Apelul este calea de atac ordinar\u0103 \u00eempotriva sentin\u021bei. Termen: 10 zile de la comunicare (p\u0103r\u021bi) sau pronun\u021bare (procuror).',\r\n      notes: ['Procurorul poate declara apel \u00een 10 zile de la pronun\u021bare.', 'Celelalte p\u0103r\u021bi au termen de la comunicarea copiei minutei.']\r\n    },\r\n    recurs_casatie: {\r\n      slug: 'recurs_casatie',\r\n      title: 'Recurs \u00een casa\u021bie',\r\n      duration: 30,\r\n      unit: 'zile',\r\n      startRule: 'comunicare',\r\n      legalBasis: ['Art. 435 CPP'],\r\n      explanation: 'Cale extraordinar\u0103 de atac exercitabil\u0103 \u00een condi\u021biile legii. Termen: 30 zile de la comunicarea deciziei instan\u021bei de apel.',\r\n      notes: ['Se exercit\u0103 numai pentru motivele prev\u0103zute de art. 438 CPP.']\r\n    },\r\n    contestatie_generala: {\r\n      slug: 'contestatie_generala',\r\n      title: 'Contesta\u021bie general\u0103',\r\n      duration: 3,\r\n      unit: 'zile',\r\n      startRule: 'comunicare',\r\n      roleOverrides: {\r\n        procuror: { startRule: 'pronuntare' }\r\n      },\r\n      legalBasis: ['Art. 425\u00b9 alin. (1) CPP'],\r\n      explanation: 'Contesta\u021bia este admisibil\u0103 numai c\u00e2nd legea o prevede expres. Termen: 3 zile, cu reguli diferite pentru procuror vs p\u0103r\u021bi.',\r\n      notes: ['Procurorul are termen de la pronun\u021bare, celelalte p\u0103r\u021bi de la comunicare.']\r\n    },\r\n    contestatie_camera: {\r\n      slug: 'contestatie_camera',\r\n      title: 'Contesta\u021bie camer\u0103 preliminar\u0103',\r\n      duration: 3,\r\n      unit: 'zile',\r\n      startRule: 'comunicare',\r\n      legalBasis: ['Art. 347 alin. (1) CPP'],\r\n      explanation: 'Se poate contesta \u00eencheierea de camer\u0103 preliminar\u0103 \u00een 3 zile de la comunicare.',\r\n      notes: []\r\n    },\r\n    contestatie_masuri_48h: {\r\n      slug: 'contestatie_masuri_48h',\r\n      title: 'Contesta\u021bie m\u0103suri preventive (48 ore)',\r\n      duration: 48,\r\n      unit: 'ore',\r\n      startRule: 'pronuntare_comunicare',\r\n      legalBasis: ['Art. 204 alin. (1) CPP', 'Art. 205 CPP', 'Art. 206 CPP'],\r\n      explanation: 'Contesta\u021bia \u00eempotriva \u00eencheierii privind m\u0103sura preventiv\u0103 se formuleaz\u0103 \u00een 48 ore de la pronun\u021bare sau comunicare, dup\u0103 caz.',\r\n      notes: ['Introduce\u021bi ora exact\u0103 din \u00eencheiere\/comunicare.', 'Pentru termene \u00een ore, ora expir\u0103rii este esen\u021bial\u0103.']\r\n    },\r\n    contestatie_anulare: {\r\n      slug: 'contestatie_anulare',\r\n      title: 'Contesta\u021bie \u00een anulare',\r\n      duration: 30,\r\n      unit: 'zile',\r\n      startRule: 'comunicare',\r\n      legalBasis: ['Art. 428 alin. (1) CPP'],\r\n      explanation: 'Unele motive de contesta\u021bie \u00een anulare au termen de 30 zile de la comunicare (art. 426 lit. a \u0219i b CPP). Alte motive pot fi invocate oric\u00e2nd.',\r\n      notes: ['Verifica\u021bi motivul invocat - unele nu au termen.']\r\n    },\r\n    revizuire: {\r\n      slug: 'revizuire',\r\n      title: 'Cerere de revizuire',\r\n      duration: null,\r\n      unit: null,\r\n      startRule: 'special',\r\n      legalBasis: ['Art. 457-458 CPP'],\r\n      explanation: 'Termenele pentru revizuire variaz\u0103 \u00een func\u021bie de motiv. Consulta\u021bi art. 457-458 CPP pentru detalii.',\r\n      notes: ['Termenele variaz\u0103 semnificativ \u00een func\u021bie de motivul de revizuire.', 'Unele motive nu au termen.']\r\n    }\r\n  };\r\n\r\n  \/\/ ============================================================\r\n  \/\/ CALENDAR ROMANIA - S\u0103rb\u0103tori legale (Codul muncii art. 139)\r\n  \/\/ ============================================================\r\n\r\n  \/**\r\n   * Calcul Paste Ortodox - Algoritm corect pentru calendarul iulian\r\n   * convertit in calendarul gregorian\r\n   *\/\r\n  function computeOrthodoxEaster(year) {\r\n    \/\/ Algoritm pentru Pastele ortodox (calendarul iulian)\r\n    var a = year % 4;\r\n    var b = year % 7;\r\n    var c = year % 19;\r\n    var d = (19 * c + 15) % 30;\r\n    var e = (2 * a + 4 * b - d + 34) % 7;\r\n    var month = Math.floor((d + e + 114) \/ 31); \/\/ 3 = martie, 4 = aprilie\r\n    var day = ((d + e + 114) % 31) + 1;\r\n\r\n    \/\/ Creare data in calendarul iulian\r\n    var julianDate = new Date(Date.UTC(year, month - 1, day));\r\n\r\n    \/\/ Conversie din calendarul iulian in gregorian\r\n    \/\/ Pentru sec. XX-XXI diferenta este de 13 zile\r\n    var centuryDiff = 13;\r\n    julianDate.setUTCDate(julianDate.getUTCDate() + centuryDiff);\r\n\r\n    return Math.floor(julianDate.getTime() \/ MS_DAY);\r\n  }\r\n\r\n  function getPublicHolidays(year) {\r\n    var holidays = [];\r\n\r\n    \/\/ Sarbatori fixe (Codul muncii art. 139)\r\n    holidays.push(Math.floor(Date.UTC(year, 0, 1) \/ MS_DAY));   \/\/ 1 ianuarie\r\n    holidays.push(Math.floor(Date.UTC(year, 0, 2) \/ MS_DAY));   \/\/ 2 ianuarie\r\n    holidays.push(Math.floor(Date.UTC(year, 0, 24) \/ MS_DAY));  \/\/ 24 ianuarie - Ziua Unirii\r\n    holidays.push(Math.floor(Date.UTC(year, 4, 1) \/ MS_DAY));   \/\/ 1 mai\r\n    holidays.push(Math.floor(Date.UTC(year, 5, 1) \/ MS_DAY));   \/\/ 1 iunie - Ziua Copilului\r\n    holidays.push(Math.floor(Date.UTC(year, 7, 15) \/ MS_DAY));  \/\/ 15 august - Adormirea Maicii Domnului\r\n    holidays.push(Math.floor(Date.UTC(year, 10, 30) \/ MS_DAY)); \/\/ 30 noiembrie - Sf. Andrei\r\n    holidays.push(Math.floor(Date.UTC(year, 11, 1) \/ MS_DAY));  \/\/ 1 decembrie - Ziua Nationala\r\n    holidays.push(Math.floor(Date.UTC(year, 11, 25) \/ MS_DAY)); \/\/ 25 decembrie - Craciun\r\n    holidays.push(Math.floor(Date.UTC(year, 11, 26) \/ MS_DAY)); \/\/ 26 decembrie - Craciun\r\n\r\n    \/\/ Sarbatori mobile (bazate pe Pastele ortodox)\r\n    var easter = computeOrthodoxEaster(year);\r\n    holidays.push(easter - 2);  \/\/ Vinerea Mare\r\n    holidays.push(easter);       \/\/ Paste - prima zi\r\n    holidays.push(easter + 1);   \/\/ Paste - a doua zi\r\n    holidays.push(easter + 49);  \/\/ Rusalii - prima zi\r\n    holidays.push(easter + 50);  \/\/ Rusalii - a doua zi\r\n\r\n    return holidays;\r\n  }\r\n\r\n  function isWeekend(day) {\r\n    var dt = new Date(day * MS_DAY);\r\n    var dow = dt.getUTCDay();\r\n    return dow === 0 || dow === 6; \/\/ duminica sau sambata\r\n  }\r\n\r\n  function isPublicHoliday(day) {\r\n    var dt = new Date(day * MS_DAY);\r\n    var year = dt.getUTCFullYear();\r\n    var holidays = getPublicHolidays(year);\r\n    return holidays.indexOf(day) !== -1;\r\n  }\r\n\r\n  function isNonWorkingDay(day) {\r\n    return isWeekend(day) || isPublicHoliday(day);\r\n  }\r\n\r\n  function getNextWorkingDay(day) {\r\n    var current = day;\r\n    var maxIterations = 30; \/\/ Safety limit\r\n    while (isNonWorkingDay(current) && maxIterations > 0) {\r\n      current++;\r\n      maxIterations--;\r\n    }\r\n    return current;\r\n  }\r\n\r\n  \/\/ ============================================================\r\n  \/\/ DATE HELPERS\r\n  \/\/ ============================================================\r\n  function $(s) { return root.querySelector(s); }\r\n  function $$(s) { return root.querySelectorAll(s); }\r\n\r\n  function parseISO(v) {\r\n    if (!isValidDateFormat(v)) return null;\r\n    var parts = v.split('-').map(Number);\r\n    return Math.floor(Date.UTC(parts[0], parts[1] - 1, parts[2]) \/ MS_DAY);\r\n  }\r\n\r\n  function dayToISO(day) {\r\n    var dt = new Date(day * MS_DAY);\r\n    return dt.getUTCFullYear() + '-' + String(dt.getUTCMonth() + 1).padStart(2, '0') + '-' + String(dt.getUTCDate()).padStart(2, '0');\r\n  }\r\n\r\n  function formatDay(day) {\r\n    if (day === null) return '-';\r\n    var dt = new Date(day * MS_DAY);\r\n    var days = ['Duminic\u0103', 'Luni', 'Mar\u021bi', 'Miercuri', 'Joi', 'Vineri', 'S\u00e2mb\u0103t\u0103'];\r\n    var dayName = days[dt.getUTCDay()];\r\n    return dayName + ', ' + String(dt.getUTCDate()).padStart(2, '0') + '.' + String(dt.getUTCMonth() + 1).padStart(2, '0') + '.' + dt.getUTCFullYear();\r\n  }\r\n\r\n  function formatDayShort(day) {\r\n    if (day === null) return '-';\r\n    var dt = new Date(day * MS_DAY);\r\n    return String(dt.getUTCDate()).padStart(2, '0') + '.' + String(dt.getUTCMonth() + 1).padStart(2, '0') + '.' + dt.getUTCFullYear();\r\n  }\r\n\r\n  function formatDateTime(day, hours, minutes) {\r\n    return formatDay(day) + ', ora ' + String(hours).padStart(2, '0') + ':' + String(minutes).padStart(2, '0');\r\n  }\r\n\r\n  function todayDay() {\r\n    var now = new Date();\r\n    return Math.floor(Date.UTC(now.getFullYear(), now.getMonth(), now.getDate()) \/ MS_DAY);\r\n  }\r\n\r\n  function addDays(day, n) {\r\n    return day + n;\r\n  }\r\n\r\n  \/\/ ============================================================\r\n  \/\/ UI ELEMENTS\r\n  \/\/ ============================================================\r\n  var els = {\r\n    errors: $('[data-errors]'),\r\n    cardDate: $('[data-card=\"date\"]'),\r\n    cardDepunere: $('[data-card=\"depunere\"]'),\r\n    termInfo: $('[data-term-info]'),\r\n    termTitle: $('[data-term-title]'),\r\n    termDesc: $('[data-term-desc]'),\r\n    termBasis: $('[data-term-basis]'),\r\n    result: $('[data-result]'),\r\n    resultContent: $('[data-result-content]'),\r\n    resultIcon: $('[data-result-icon]'),\r\n    badge: $('[data-badge]')\r\n  };\r\n\r\n  function getField(n) { return $('[data-field=\"' + n + '\"]'); }\r\n\r\n  \/\/ ============================================================\r\n  \/\/ ERROR HANDLING\r\n  \/\/ ============================================================\r\n  function showErrors(msgs) {\r\n    if (!msgs || !msgs.length) {\r\n      els.errors.classList.add('is-hidden');\r\n      return;\r\n    }\r\n    els.errors.classList.remove('is-hidden');\r\n    while (els.errors.firstChild) els.errors.removeChild(els.errors.firstChild);\r\n    var header = document.createTextNode('Corecta\u021bi:');\r\n    els.errors.appendChild(header);\r\n    var ul = document.createElement('ul');\r\n    msgs.forEach(function(m) {\r\n      var li = document.createElement('li');\r\n      li.textContent = m;\r\n      ul.appendChild(li);\r\n    });\r\n    els.errors.appendChild(ul);\r\n    els.errors.scrollIntoView({ behavior: 'smooth', block: 'start' });\r\n  }\r\n\r\n  function hideErrors() {\r\n    els.errors.classList.add('is-hidden');\r\n    while (els.errors.firstChild) els.errors.removeChild(els.errors.firstChild);\r\n  }\r\n\r\n  \/\/ ============================================================\r\n  \/\/ UI LOGIC\r\n  \/\/ ============================================================\r\n  function updateTermInfo(tipTermen) {\r\n    var term = TERMS_CATALOG[tipTermen];\r\n    if (!term) {\r\n      els.termInfo.classList.add('is-hidden');\r\n      return;\r\n    }\r\n\r\n    els.termInfo.classList.remove('is-hidden');\r\n    els.termTitle.textContent = term.title;\r\n    els.termDesc.textContent = term.explanation;\r\n    els.termBasis.textContent = term.legalBasis.join(', ');\r\n  }\r\n\r\n  function updateVisibility() {\r\n    var tipTermen = getField('tipTermen')?.value || '';\r\n    var term = TERMS_CATALOG[tipTermen];\r\n    var rol = getField('rol')?.value || '';\r\n\r\n    \/\/ Show\/hide cards based on selection\r\n    if (tipTermen && term && term.duration !== null) {\r\n      els.cardDate.classList.remove('is-hidden');\r\n      els.cardDepunere.classList.remove('is-hidden');\r\n      updateTermInfo(tipTermen);\r\n    } else if (tipTermen && term && term.duration === null) {\r\n      \/\/ Special case (revizuire)\r\n      els.cardDate.classList.add('is-hidden');\r\n      els.cardDepunere.classList.add('is-hidden');\r\n      updateTermInfo(tipTermen);\r\n    } else {\r\n      els.cardDate.classList.add('is-hidden');\r\n      els.cardDepunere.classList.add('is-hidden');\r\n      els.termInfo.classList.add('is-hidden');\r\n    }\r\n\r\n    \/\/ Show\/hide time input for hour-based terms\r\n    var hoursField = $('[data-show-for-hours]');\r\n    var hoursHint = $('[data-show-hours-hint]');\r\n    if (term && term.unit === 'ore') {\r\n      if (hoursField) hoursField.style.display = '';\r\n      if (hoursHint) hoursHint.style.display = '';\r\n    } else {\r\n      if (hoursField) hoursField.style.display = 'none';\r\n      if (hoursHint) hoursHint.style.display = 'none';\r\n    }\r\n\r\n    \/\/ Show\/hide trigger kind selector based on term and role\r\n    var triggerField = $('[data-show-for-trigger]');\r\n    if (term && (term.startRule === 'pronuntare_comunicare' ||\r\n        (rol === 'procuror' && term.roleOverrides && term.roleOverrides.procuror))) {\r\n      if (triggerField) triggerField.style.display = '';\r\n    } else {\r\n      if (triggerField) triggerField.style.display = 'none';\r\n      \/\/ Reset to default\r\n      var triggerSelect = getField('triggerKind');\r\n      if (triggerSelect && term) {\r\n        if (rol === 'procuror' && term.roleOverrides && term.roleOverrides.procuror) {\r\n          triggerSelect.value = term.roleOverrides.procuror.startRule;\r\n        } else {\r\n          triggerSelect.value = term.startRule === 'pronuntare' ? 'pronuntare' : 'comunicare';\r\n        }\r\n      }\r\n    }\r\n\r\n    \/\/ Show\/hide method hint\r\n    var methodValue = getField('filingMethod')?.value || 'direct';\r\n    var methodHint = $('[data-show-for-method]');\r\n    if (methodHint) {\r\n      methodHint.style.display = (methodValue !== 'direct') ? '' : 'none';\r\n    }\r\n  }\r\n\r\n  \/\/ ============================================================\r\n  \/\/ CALCULATION ENGINE (CPP art. 269-270)\r\n  \/\/ ============================================================\r\n  function collectData() {\r\n    return {\r\n      tipTermen: getField('tipTermen')?.value || '',\r\n      rol: getField('rol')?.value || '',\r\n      triggerKind: getField('triggerKind')?.value || '',\r\n      triggerDate: getField('triggerDate')?.value || '',\r\n      triggerTime: getField('triggerTime')?.value || '00:00',\r\n      filingMethod: getField('filingMethod')?.value || 'direct'\r\n    };\r\n  }\r\n\r\n  function validate(data) {\r\n    var errors = [];\r\n\r\n    if (!data.tipTermen) {\r\n      errors.push('Selecta\u021bi tipul termenului.');\r\n    }\r\n\r\n    var term = TERMS_CATALOG[data.tipTermen];\r\n    if (term && term.duration === null) {\r\n      errors.push('Acest tip de termen nu poate fi calculat automat. Consulta\u021bi textul de lege.');\r\n      return errors;\r\n    }\r\n\r\n    if (!data.rol) {\r\n      errors.push('Selecta\u021bi rolul procesual.');\r\n    }\r\n\r\n    if (!data.triggerDate) {\r\n      errors.push('Introduce\u021bi data de la care curge termenul.');\r\n    } else if (!isValidDateFormat(data.triggerDate)) {\r\n      errors.push('Data introdus\u0103 nu este valid\u0103.');\r\n    }\r\n\r\n    if (term && term.unit === 'ore') {\r\n      if (!data.triggerTime || !isValidTimeFormat(data.triggerTime)) {\r\n        errors.push('Pentru termene \u00een ore, introduce\u021bi ora exact\u0103.');\r\n      }\r\n    }\r\n\r\n    return errors;\r\n  }\r\n\r\n  \/\/ Store last result for PDF export\r\n  var lastResult = null;\r\n\r\n  function calculate() {\r\n    hideErrors();\r\n    els.result.classList.add('is-hidden');\r\n\r\n    var data = collectData();\r\n    var errors = validate(data);\r\n\r\n    if (errors.length) {\r\n      showErrors(errors);\r\n      return;\r\n    }\r\n\r\n    var term = TERMS_CATALOG[data.tipTermen];\r\n    var explain = [];\r\n    var warnings = [];\r\n\r\n    \/\/ Determine start rule based on role (Art. 410, 425^1 CPP)\r\n    var effectiveStartRule = term.startRule;\r\n    if (data.rol === 'procuror' && term.roleOverrides && term.roleOverrides.procuror) {\r\n      effectiveStartRule = term.roleOverrides.procuror.startRule;\r\n      explain.push({ text: 'Pentru procuror, termenul curge de la pronun\u021bare.', basis: term.legalBasis[0] });\r\n    } else if (term.startRule === 'pronuntare_comunicare') {\r\n      effectiveStartRule = data.triggerKind || 'comunicare';\r\n    }\r\n\r\n    var triggerDay = parseISO(data.triggerDate);\r\n    var triggerHour = 0;\r\n    var triggerMinute = 0;\r\n\r\n    if (term.unit === 'ore' && data.triggerTime) {\r\n      var timeParts = data.triggerTime.split(':').map(Number);\r\n      triggerHour = timeParts[0] || 0;\r\n      triggerMinute = timeParts[1] || 0;\r\n    }\r\n\r\n    var rawDeadlineDay;\r\n    var rawDeadlineHour = 23;\r\n    var rawDeadlineMinute = 59;\r\n    var adjustedDeadlineDay;\r\n    var adjustedDeadlineHour;\r\n    var adjustedDeadlineMinute;\r\n\r\n    if (term.unit === 'zile') {\r\n      \/\/ CPP art. 269 alin. (1) - nu se socoteste ziua de start\r\n      \/\/ Termenul expira la sfarsitul zilei-limita (ora 24:00)\r\n      rawDeadlineDay = addDays(triggerDay, term.duration);\r\n      explain.push({\r\n        text: 'Termenul de ' + term.duration + ' zile \u00eencepe s\u0103 curg\u0103 \u00een ziua urm\u0103toare datei de ' +\r\n              (effectiveStartRule === 'pronuntare' ? 'pronun\u021bare' : 'comunicare') + '.',\r\n        basis: 'Art. 269 alin. (1) CPP'\r\n      });\r\n\r\n      \/\/ CPP art. 269 alin. (4) - ajustare pentru zi nelucratoare\r\n      if (isNonWorkingDay(rawDeadlineDay)) {\r\n        adjustedDeadlineDay = getNextWorkingDay(rawDeadlineDay);\r\n        explain.push({\r\n          text: 'Ultima zi a termenului cade \u00eentr-o zi nelucr\u0103toare. Termenul se prelunge\u0219te p\u00e2n\u0103 la prima zi lucr\u0103toare.',\r\n          basis: 'Art. 269 alin. (4) CPP'\r\n        });\r\n      } else {\r\n        adjustedDeadlineDay = rawDeadlineDay;\r\n      }\r\n      adjustedDeadlineHour = 23;\r\n      adjustedDeadlineMinute = 59;\r\n\r\n    } else if (term.unit === 'ore') {\r\n      \/\/ CPP art. 269 alin. (2) - termene in ore\r\n      var totalMinutes = triggerHour * 60 + triggerMinute + term.duration * 60;\r\n      var daysToAdd = Math.floor(totalMinutes \/ (24 * 60));\r\n      var remainingMinutes = totalMinutes % (24 * 60);\r\n\r\n      rawDeadlineDay = addDays(triggerDay, daysToAdd);\r\n      rawDeadlineHour = Math.floor(remainingMinutes \/ 60);\r\n      rawDeadlineMinute = remainingMinutes % 60;\r\n\r\n      explain.push({\r\n        text: 'Termenul de ' + term.duration + ' ore expir\u0103 la ' +\r\n              String(rawDeadlineHour).padStart(2, '0') + ':' + String(rawDeadlineMinute).padStart(2, '0') + '.',\r\n        basis: 'Art. 269 alin. (2) CPP'\r\n      });\r\n\r\n      adjustedDeadlineDay = rawDeadlineDay;\r\n      adjustedDeadlineHour = rawDeadlineHour;\r\n      adjustedDeadlineMinute = rawDeadlineMinute;\r\n\r\n      \/\/ Warning pentru termene in ore care cad in zi nelucratoare\r\n      \/\/ Art. 269 alin. (4) CPP se aplica doar termenelor pe zile\/luni\/ani\r\n      if (isNonWorkingDay(rawDeadlineDay)) {\r\n        warnings.push('Termenul expir\u0103 \u00eentr-o zi nelucr\u0103toare. Pentru termene \u00een ore, art. 269 alin. (4) CPP NU prevede \u00een mod expres prelungirea. Consulta\u021bi jurispruden\u021ba sau confirma\u021bi cu instan\u021ba!');\r\n      }\r\n    }\r\n\r\n    \/\/ Art. 270 CPP - metoda depunerii\r\n    if (data.filingMethod !== 'direct') {\r\n      var methodLabels = {\r\n        posta: 'po\u0219t\u0103 recomandat\u0103',\r\n        detentie: 'administra\u021bia locului de de\u021binere',\r\n        militar: 'unitate militar\u0103'\r\n      };\r\n      explain.push({\r\n        text: 'Dac\u0103 depune\u021bi prin ' + methodLabels[data.filingMethod] + ', actul se consider\u0103 f\u0103cut \u00een termen dac\u0103 a fost predat \u00eenainte de expirare.',\r\n        basis: 'Art. 270 CPP'\r\n      });\r\n    }\r\n\r\n    \/\/ Add notes from catalog\r\n    if (term.notes && term.notes.length > 0) {\r\n      term.notes.forEach(function(note) {\r\n        warnings.push(note);\r\n      });\r\n    }\r\n\r\n    \/\/ Determine if deadline has passed\r\n    var today = todayDay();\r\n    var isExpired = adjustedDeadlineDay < today;\r\n\r\n    lastResult = {\r\n      term: term,\r\n      triggerDay: triggerDay,\r\n      triggerHour: triggerHour,\r\n      triggerMinute: triggerMinute,\r\n      rawDeadlineDay: rawDeadlineDay,\r\n      rawDeadlineHour: rawDeadlineHour,\r\n      rawDeadlineMinute: rawDeadlineMinute,\r\n      adjustedDeadlineDay: adjustedDeadlineDay,\r\n      adjustedDeadlineHour: adjustedDeadlineHour,\r\n      adjustedDeadlineMinute: adjustedDeadlineMinute,\r\n      explain: explain,\r\n      warnings: warnings,\r\n      isExpired: isExpired,\r\n      filingMethod: data.filingMethod,\r\n      effectiveStartRule: effectiveStartRule\r\n    };\r\n\r\n    renderResult(lastResult);\r\n  }\r\n\r\n  function renderResult(result) {\r\n    while (els.resultContent.firstChild) els.resultContent.removeChild(els.resultContent.firstChild);\r\n\r\n    \/\/ Update icon and card based on status\r\n    els.resultIcon.className = 'zic2__cardIcon';\r\n    els.result.className = 'zic2__card zic2__resultCard';\r\n    els.badge.className = 'zic2__badge';\r\n\r\n    if (result.isExpired) {\r\n      els.resultIcon.classList.add('zic2__cardIcon--red');\r\n      els.result.classList.add('zic2__resultCard--danger');\r\n      els.badge.classList.add('zic2__badge--no');\r\n      els.badge.textContent = 'Expirat';\r\n    } else if (result.warnings.length > 0) {\r\n      els.resultIcon.classList.add('zic2__cardIcon--warning');\r\n      els.result.classList.add('zic2__resultCard--warning');\r\n      els.badge.classList.add('zic2__badge--warning');\r\n      els.badge.textContent = '\u00cen termen (aten\u021bie)';\r\n    } else {\r\n      els.resultIcon.classList.add('zic2__cardIcon--green');\r\n      els.badge.classList.add('zic2__badge--yes');\r\n      els.badge.textContent = '\u00cen termen';\r\n    }\r\n\r\n    \/\/ KPI - Deadline\r\n    var kpi1 = document.createElement('div');\r\n    kpi1.className = 'zic2__kpi';\r\n    var kpi1Label = document.createElement('div');\r\n    kpi1Label.className = 'zic2__kpiLabel';\r\n    kpi1Label.textContent = 'Termen limit\u0103';\r\n    kpi1.appendChild(kpi1Label);\r\n\r\n    var kpi1Value = document.createElement('p');\r\n    kpi1Value.className = 'zic2__kpiValue';\r\n\r\n    if (result.term.unit === 'ore') {\r\n      kpi1Value.textContent = formatDateTime(result.adjustedDeadlineDay, result.adjustedDeadlineHour, result.adjustedDeadlineMinute);\r\n    } else {\r\n      kpi1Value.textContent = formatDay(result.adjustedDeadlineDay);\r\n    }\r\n\r\n    if (result.isExpired) {\r\n      kpi1Value.classList.add('zic2__kpiValue--danger');\r\n    } else {\r\n      kpi1Value.classList.add('zic2__kpiValue--success');\r\n    }\r\n    kpi1.appendChild(kpi1Value);\r\n\r\n    if (result.isExpired) {\r\n      var expiredNote = document.createElement('div');\r\n      expiredNote.className = 'zic2__kpiSub';\r\n      expiredNote.textContent = 'Termenul pare expirat!';\r\n      expiredNote.style.color = 'var(--zic-danger)';\r\n      kpi1.appendChild(expiredNote);\r\n    }\r\n\r\n    \/\/ Not\u0103 pentru ajustare\r\n    if (result.rawDeadlineDay !== result.adjustedDeadlineDay) {\r\n      var adjustNote = document.createElement('div');\r\n      adjustNote.className = 'zic2__kpiSub';\r\n      adjustNote.textContent = 'Termen brut: ' + formatDayShort(result.rawDeadlineDay) + ' (zi nelucr\u0103toare)';\r\n      kpi1.appendChild(adjustNote);\r\n    }\r\n\r\n    els.resultContent.appendChild(kpi1);\r\n\r\n    \/\/ Details grid\r\n    var grid = document.createElement('div');\r\n    grid.className = 'zic2__detailsGrid';\r\n\r\n    var methodLabels = {\r\n      direct: 'Direct la instan\u021b\u0103',\r\n      posta: 'Po\u0219t\u0103 recomandat\u0103',\r\n      detentie: 'Loc de de\u021binere',\r\n      militar: 'Unitate militar\u0103'\r\n    };\r\n\r\n    var details = [\r\n      { label: 'Tip termen', value: result.term.title },\r\n      { label: 'Durat\u0103', value: result.term.duration + ' ' + result.term.unit },\r\n      { label: 'Data de start', value: formatDayShort(result.triggerDay) },\r\n      { label: 'Moment start', value: result.effectiveStartRule === 'pronuntare' ? 'Pronun\u021bare' : 'Comunicare' }\r\n    ];\r\n\r\n    if (result.term.unit === 'ore') {\r\n      details.push({ label: 'Ora de start', value: String(result.triggerHour).padStart(2, '0') + ':' + String(result.triggerMinute).padStart(2, '0') });\r\n    }\r\n\r\n    details.push({ label: 'Metod\u0103 depunere', value: methodLabels[result.filingMethod] || 'Direct' });\r\n\r\n    details.forEach(function(d) {\r\n      var item = document.createElement('div');\r\n      item.className = 'zic2__detailItem';\r\n      var label = document.createElement('div');\r\n      label.className = 'zic2__detailLabel';\r\n      label.textContent = d.label;\r\n      var value = document.createElement('div');\r\n      value.className = 'zic2__detailValue';\r\n      value.textContent = d.value;\r\n      item.appendChild(label);\r\n      item.appendChild(value);\r\n      grid.appendChild(item);\r\n    });\r\n\r\n    els.resultContent.appendChild(grid);\r\n\r\n    \/\/ Warnings\r\n    if (result.warnings.length > 0) {\r\n      result.warnings.forEach(function(w) {\r\n        var warnBox = document.createElement('div');\r\n        warnBox.className = 'zic2__warningBox';\r\n        \/\/ Creare SVG cu metode DOM (f\u0103r\u0103 innerHTML pentru securitate)\r\n        var warnIcon = document.createElementNS('http:\/\/www.w3.org\/2000\/svg', 'svg');\r\n        warnIcon.setAttribute('width', '16');\r\n        warnIcon.setAttribute('height', '16');\r\n        warnIcon.setAttribute('viewBox', '0 0 24 24');\r\n        warnIcon.setAttribute('fill', 'none');\r\n        warnIcon.setAttribute('stroke', 'currentColor');\r\n        warnIcon.setAttribute('stroke-width', '2');\r\n        var pathEl = document.createElementNS('http:\/\/www.w3.org\/2000\/svg', 'path');\r\n        pathEl.setAttribute('d', 'M10.29 3.86L1.82 18a2 2 0 0 0 1.71 3h16.94a2 2 0 0 0 1.71-3L13.71 3.86a2 2 0 0 0-3.42 0z');\r\n        var line1 = document.createElementNS('http:\/\/www.w3.org\/2000\/svg', 'line');\r\n        line1.setAttribute('x1', '12');\r\n        line1.setAttribute('y1', '9');\r\n        line1.setAttribute('x2', '12');\r\n        line1.setAttribute('y2', '13');\r\n        var line2 = document.createElementNS('http:\/\/www.w3.org\/2000\/svg', 'line');\r\n        line2.setAttribute('x1', '12');\r\n        line2.setAttribute('y1', '17');\r\n        line2.setAttribute('x2', '12.01');\r\n        line2.setAttribute('y2', '17');\r\n        warnIcon.appendChild(pathEl);\r\n        warnIcon.appendChild(line1);\r\n        warnIcon.appendChild(line2);\r\n        warnBox.appendChild(warnIcon);\r\n        var warnText = document.createElement('span');\r\n        warnText.textContent = w;\r\n        warnBox.appendChild(warnText);\r\n        els.resultContent.appendChild(warnBox);\r\n      });\r\n    }\r\n\r\n    \/\/ Explanations\r\n    if (result.explain.length > 0) {\r\n      var explainDiv = document.createElement('div');\r\n      explainDiv.className = 'zic2__explanations';\r\n      var explainTitle = document.createElement('div');\r\n      explainTitle.className = 'zic2__explanationsTitle';\r\n      explainTitle.textContent = 'Detalii calcul';\r\n      explainDiv.appendChild(explainTitle);\r\n\r\n      result.explain.forEach(function(e) {\r\n        var item = document.createElement('div');\r\n        item.className = 'zic2__explanationItem';\r\n        var text = document.createElement('span');\r\n        text.textContent = e.text;\r\n        item.appendChild(text);\r\n        if (e.basis) {\r\n          var basis = document.createElement('span');\r\n          basis.className = 'zic2__explanationBasis';\r\n          basis.textContent = e.basis;\r\n          item.appendChild(basis);\r\n        }\r\n        explainDiv.appendChild(item);\r\n      });\r\n\r\n      els.resultContent.appendChild(explainDiv);\r\n    }\r\n\r\n    \/\/ Show result\r\n    els.result.classList.remove('is-hidden');\r\n    setTimeout(function() {\r\n      els.result.scrollIntoView({ behavior: 'smooth', block: 'nearest' });\r\n    }, 100);\r\n  }\r\n\r\n  function resetAll() {\r\n    hideErrors();\r\n    els.result.classList.add('is-hidden');\r\n    lastResult = null;\r\n\r\n    var fields = ['tipTermen', 'rol', 'triggerKind', 'triggerDate', 'triggerTime'];\r\n    fields.forEach(function(f) {\r\n      var el = getField(f);\r\n      if (el) {\r\n        if (f === 'triggerTime') {\r\n          el.value = '00:00';\r\n        } else {\r\n          el.value = '';\r\n        }\r\n      }\r\n    });\r\n\r\n    var methodField = getField('filingMethod');\r\n    if (methodField) methodField.value = 'direct';\r\n\r\n    updateVisibility();\r\n  }\r\n\r\n  function fillExample() {\r\n    resetAll();\r\n\r\n    getField('tipTermen').value = 'apel';\r\n    getField('rol').value = 'inculpat';\r\n\r\n    \/\/ Seteaz\u0103 o dat\u0103 de acum 5 zile pentru exemplu\r\n    var exampleDay = todayDay() - 5;\r\n    getField('triggerDate').value = dayToISO(exampleDay);\r\n    getField('filingMethod').value = 'direct';\r\n\r\n    updateVisibility();\r\n  }\r\n\r\n  \/\/ ============================================================\r\n  \/\/ EXPORT PDF (SECURIZAT - DOM methods, fara innerHTML cu date user)\r\n  \/\/ ============================================================\r\n  function exportPDF() {\r\n    if (!lastResult) {\r\n      alert('Calcula\u021bi mai \u00eent\u00e2i termenul pentru a genera PDF-ul.');\r\n      return;\r\n    }\r\n\r\n    var printWindow = window.open('', '_blank');\r\n    if (!printWindow) {\r\n      alert('Permite\u021bi pop-up-urile pentru a genera PDF-ul.');\r\n      return;\r\n    }\r\n\r\n    var result = lastResult;\r\n    var dateStr = new Date().toLocaleDateString('ro-RO', {\r\n      year: 'numeric', month: 'long', day: 'numeric'\r\n    });\r\n\r\n    var doc = printWindow.document;\r\n    doc.open();\r\n    doc.write('<!DOCTYPE html><html lang=\"ro\"><head><meta charset=\"UTF-8\"><title>Raport Calculator Termene Procedurale - ZIC Legal<\/title>');\r\n    doc.write('<style>');\r\n    doc.write('* { box-sizing: border-box; margin: 0; padding: 0; }');\r\n    doc.write('body { font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif; max-width: 700px; margin: 0 auto; padding: 40px 30px; color: #1F2937; line-height: 1.6; }');\r\n    doc.write('.header { border-bottom: 3px solid #8A88FF; padding-bottom: 20px; margin-bottom: 30px; }');\r\n    doc.write('.header h1 { color: #6F6CFF; font-size: 24px; margin-bottom: 5px; }');\r\n    doc.write('.header p { color: #6B7280; font-size: 14px; }');\r\n    doc.write('.kpi { background: #F5F5FF; border: 2px solid #C4C3FF; border-radius: 12px; padding: 20px; margin-bottom: 20px; text-align: center; }');\r\n    doc.write('.kpi-label { font-size: 12px; font-weight: 600; color: #6B7280; text-transform: uppercase; letter-spacing: 0.5px; margin-bottom: 8px; }');\r\n    doc.write('.kpi-value { font-size: 24px; font-weight: 800; color: #6F6CFF; }');\r\n    doc.write('.kpi-value.expired { color: #EF4444; }');\r\n    doc.write('.kpi-value.valid { color: #10B981; }');\r\n    doc.write('.kpi-sub { font-size: 13px; color: #6B7280; margin-top: 8px; }');\r\n    doc.write('.grid { display: grid; grid-template-columns: 1fr 1fr; gap: 12px; margin-bottom: 20px; }');\r\n    doc.write('.item { background: #F9FAFB; border: 1px solid #E5E7EB; border-radius: 8px; padding: 12px; }');\r\n    doc.write('.item-label { font-size: 11px; font-weight: 600; color: #6B7280; text-transform: uppercase; margin-bottom: 4px; }');\r\n    doc.write('.item-value { font-size: 14px; font-weight: 700; color: #1F2937; }');\r\n    doc.write('.warning { background: #FEF3C7; border: 1px solid #FCD34D; border-radius: 8px; padding: 12px; margin-bottom: 12px; font-size: 13px; color: #92400E; }');\r\n    doc.write('.explain { background: #F3F4F6; border-radius: 8px; padding: 14px; margin-bottom: 20px; }');\r\n    doc.write('.explain-title { font-size: 12px; font-weight: 700; color: #1F2937; margin-bottom: 10px; text-transform: uppercase; }');\r\n    doc.write('.explain-item { display: flex; justify-content: space-between; padding: 6px 0; font-size: 13px; color: #374151; border-bottom: 1px dashed #E5E7EB; }');\r\n    doc.write('.explain-item:last-child { border-bottom: none; }');\r\n    doc.write('.explain-basis { font-size: 11px; font-weight: 600; color: #6F6CFF; }');\r\n    doc.write('.disclaimer { margin-top: 30px; padding: 15px; background: #F3F4F6; border-radius: 8px; font-size: 11px; color: #6B7280; }');\r\n    doc.write('.disclaimer strong { color: #374151; }');\r\n    doc.write('.footer { margin-top: 40px; padding-top: 20px; border-top: 1px solid #E5E7EB; text-align: center; color: #6B7280; font-size: 12px; }');\r\n    doc.write('.footer a { color: #6F6CFF; text-decoration: none; }');\r\n    doc.write('@media print { body { padding: 20px; } }');\r\n    doc.write('<\/style><\/head><body>');\r\n    doc.close();\r\n\r\n    var body = doc.body;\r\n\r\n    \/\/ Header\r\n    var header = doc.createElement('div');\r\n    header.className = 'header';\r\n    var h1 = doc.createElement('h1');\r\n    h1.textContent = 'Calculator termene procedurale';\r\n    header.appendChild(h1);\r\n    var datePara = doc.createElement('p');\r\n    datePara.textContent = 'Raport generat la ' + dateStr;\r\n    header.appendChild(datePara);\r\n    body.appendChild(header);\r\n\r\n    \/\/ KPI - Deadline\r\n    var kpi = doc.createElement('div');\r\n    kpi.className = 'kpi';\r\n    var kpiLabel = doc.createElement('div');\r\n    kpiLabel.className = 'kpi-label';\r\n    kpiLabel.textContent = 'Termen limit\u0103';\r\n    kpi.appendChild(kpiLabel);\r\n\r\n    var kpiValue = doc.createElement('div');\r\n    kpiValue.className = 'kpi-value';\r\n    if (result.term.unit === 'ore') {\r\n      kpiValue.textContent = formatDateTime(result.adjustedDeadlineDay, result.adjustedDeadlineHour, result.adjustedDeadlineMinute);\r\n    } else {\r\n      kpiValue.textContent = formatDay(result.adjustedDeadlineDay);\r\n    }\r\n    if (result.isExpired) {\r\n      kpiValue.classList.add('expired');\r\n    } else {\r\n      kpiValue.classList.add('valid');\r\n    }\r\n    kpi.appendChild(kpiValue);\r\n\r\n    if (result.isExpired) {\r\n      var expiredNote = doc.createElement('div');\r\n      expiredNote.className = 'kpi-sub';\r\n      expiredNote.textContent = 'Termenul pare expirat!';\r\n      expiredNote.style.color = '#EF4444';\r\n      kpi.appendChild(expiredNote);\r\n    }\r\n\r\n    if (result.rawDeadlineDay !== result.adjustedDeadlineDay) {\r\n      var adjustNote = doc.createElement('div');\r\n      adjustNote.className = 'kpi-sub';\r\n      adjustNote.textContent = 'Termen brut: ' + formatDayShort(result.rawDeadlineDay) + ' (ajustat pentru zi nelucr\u0103toare)';\r\n      kpi.appendChild(adjustNote);\r\n    }\r\n\r\n    body.appendChild(kpi);\r\n\r\n    \/\/ Details grid\r\n    var grid = doc.createElement('div');\r\n    grid.className = 'grid';\r\n\r\n    var methodLabels = {\r\n      direct: 'Direct la instan\u021b\u0103',\r\n      posta: 'Po\u0219t\u0103 recomandat\u0103',\r\n      detentie: 'Loc de de\u021binere',\r\n      militar: 'Unitate militar\u0103'\r\n    };\r\n\r\n    var details = [\r\n      { label: 'Tip termen', value: result.term.title },\r\n      { label: 'Durat\u0103', value: result.term.duration + ' ' + result.term.unit },\r\n      { label: 'Data de start', value: formatDayShort(result.triggerDay) },\r\n      { label: 'Moment start', value: result.effectiveStartRule === 'pronuntare' ? 'Pronun\u021bare' : 'Comunicare' },\r\n      { label: 'Metod\u0103 depunere', value: methodLabels[result.filingMethod] || 'Direct' }\r\n    ];\r\n\r\n    if (result.term.unit === 'ore') {\r\n      details.push({ label: 'Ora de start', value: String(result.triggerHour).padStart(2, '0') + ':' + String(result.triggerMinute).padStart(2, '0') });\r\n    }\r\n\r\n    details.forEach(function(d) {\r\n      var item = doc.createElement('div');\r\n      item.className = 'item';\r\n      var label = doc.createElement('div');\r\n      label.className = 'item-label';\r\n      label.textContent = d.label;\r\n      var value = doc.createElement('div');\r\n      value.className = 'item-value';\r\n      value.textContent = d.value;\r\n      item.appendChild(label);\r\n      item.appendChild(value);\r\n      grid.appendChild(item);\r\n    });\r\n\r\n    body.appendChild(grid);\r\n\r\n    \/\/ Warnings\r\n    if (result.warnings.length > 0) {\r\n      result.warnings.forEach(function(w) {\r\n        var warnDiv = doc.createElement('div');\r\n        warnDiv.className = 'warning';\r\n        warnDiv.textContent = w;\r\n        body.appendChild(warnDiv);\r\n      });\r\n    }\r\n\r\n    \/\/ Explanations\r\n    if (result.explain.length > 0) {\r\n      var explainDiv = doc.createElement('div');\r\n      explainDiv.className = 'explain';\r\n      var explainTitle = doc.createElement('div');\r\n      explainTitle.className = 'explain-title';\r\n      explainTitle.textContent = 'Detalii calcul';\r\n      explainDiv.appendChild(explainTitle);\r\n\r\n      result.explain.forEach(function(e) {\r\n        var item = doc.createElement('div');\r\n        item.className = 'explain-item';\r\n        var text = doc.createElement('span');\r\n        text.textContent = e.text;\r\n        item.appendChild(text);\r\n        if (e.basis) {\r\n          var basis = doc.createElement('span');\r\n          basis.className = 'explain-basis';\r\n          basis.textContent = e.basis;\r\n          item.appendChild(basis);\r\n        }\r\n        explainDiv.appendChild(item);\r\n      });\r\n\r\n      body.appendChild(explainDiv);\r\n    }\r\n\r\n    \/\/ Disclaimer\r\n    var disclaimer = doc.createElement('div');\r\n    disclaimer.className = 'disclaimer';\r\n    var discStrong = doc.createElement('strong');\r\n    discStrong.textContent = 'Disclaimer: ';\r\n    disclaimer.appendChild(discStrong);\r\n    disclaimer.appendChild(doc.createTextNode('Acest raport este oferit exclusiv \u00een scop informativ \u0219i educativ. Rezultatele generate sunt estimative \u0219i nu constituie consultan\u021b\u0103 juridic\u0103. Pentru termene critice, verifica\u021bi cu dosarul \u0219i confirma\u021bi cu un avocat.'));\r\n    body.appendChild(disclaimer);\r\n\r\n    \/\/ Footer\r\n    var footer = doc.createElement('div');\r\n    footer.className = 'footer';\r\n    var footerP1 = doc.createElement('p');\r\n    footerP1.textContent = 'Generat cu Calculator termene procedurale';\r\n    footer.appendChild(footerP1);\r\n    var footerP2 = doc.createElement('p');\r\n    var footerLink = doc.createElement('a');\r\n    footerLink.href = 'https:\/\/zic.legal';\r\n    footerLink.textContent = 'ZIC Legal';\r\n    footerLink.rel = 'noopener noreferrer';\r\n    footerP2.appendChild(footerLink);\r\n    footer.appendChild(footerP2);\r\n    body.appendChild(footer);\r\n\r\n    printWindow.focus();\r\n    setTimeout(function() {\r\n      printWindow.print();\r\n    }, 300);\r\n  }\r\n\r\n  \/\/ ============================================================\r\n  \/\/ EVENT LISTENERS\r\n  \/\/ ============================================================\r\n  root.addEventListener('click', function(e) {\r\n    var btn = e.target.closest('[data-action]');\r\n    if (!btn) return;\r\n    var action = btn.dataset.action;\r\n    if (action === 'calculate') calculate();\r\n    else if (action === 'reset') resetAll();\r\n    else if (action === 'example') fillExample();\r\n    else if (action === 'export-pdf') exportPDF();\r\n  });\r\n\r\n  root.addEventListener('change', function(e) {\r\n    var field = e.target.dataset.field;\r\n    if (field === 'tipTermen' || field === 'rol' || field === 'filingMethod') {\r\n      updateVisibility();\r\n    }\r\n  });\r\n\r\n  \/\/ Initialize\r\n  updateVisibility();\r\n})();\r\n<\/script>\r\n<\/div>\r\n<\/div>\n<div data-tool-content=\"prescriptie\" style=\"display:none\"><div id=\"zic-prescriptie-calculator-v2\" class=\"zic2\" data-zic2=\"1\">\r\n  <div class=\"zic2__wrap\">\r\n    <!-- Header -->\r\n    <header class=\"zic2__hero\">\r\n      <div class=\"zic2__brandbar\">\r\n        <div class=\"zic2__mark\" aria-hidden=\"true\">\r\n          <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n            <circle cx=\"12\" cy=\"12\" r=\"10\"\/>\r\n            <polyline points=\"12 6 12 12 16 14\"\/>\r\n          <\/svg>\r\n        <\/div>\r\n        <div class=\"zic2__headerText\">\r\n          <h2 class=\"zic2__title\">Calculator prescriptie<\/h2>\r\n          <p class=\"zic2__subtitle\">Calculeaza termenele conform Art. 154-156 Cod penal<\/p>\r\n        <\/div>\r\n      <\/div>\r\n    <\/header>\r\n\r\n    <!-- Formula info -->\r\n    <div class=\"zic2__formula\">\r\n      <div class=\"zic2__formulaIcon\">\r\n        <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n          <circle cx=\"12\" cy=\"12\" r=\"10\"\/>\r\n          <path d=\"M12 16v-4\"\/>\r\n          <path d=\"M12 8h.01\"\/>\r\n        <\/svg>\r\n      <\/div>\r\n      <div class=\"zic2__formulaText\">\r\n        <strong>Termen general:<\/strong> de la data savarsirii pana la implinirea termenului. <strong>Termen special:<\/strong> 2x termenul general (daca intreruperea e posibila).\r\n      <\/div>\r\n    <\/div>\r\n\r\n    <!-- Card: Setari generale -->\r\n    <section class=\"zic2__card\" aria-labelledby=\"zic2-sec-setari\">\r\n      <div class=\"zic2__cardHeader\">\r\n        <div class=\"zic2__cardIcon zic2__cardIcon--purple\">\r\n          <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n            <path d=\"M10.325 4.317c.426-1.756 2.924-1.756 3.35 0a1.724 1.724 0 0 0 2.573 1.066c1.543-.94 3.31.826 2.37 2.37a1.724 1.724 0 0 0 1.065 2.572c1.756.426 1.756 2.924 0 3.35a1.724 1.724 0 0 0-1.066 2.573c.94 1.543-.826 3.31-2.37 2.37a1.724 1.724 0 0 0-2.572 1.065c-.426 1.756-2.924 1.756-3.35 0a1.724 1.724 0 0 0-2.573-1.066c-1.543.94-3.31-.826-2.37-2.37a1.724 1.724 0 0 0-1.065-2.572c-1.756-.426-1.756-2.924 0-3.35a1.724 1.724 0 0 0 1.066-2.573c-.94-1.543.826-3.31 2.37-2.37 1 .608 2.296.07 2.572-1.065Z\"\/>\r\n            <circle cx=\"12\" cy=\"12\" r=\"3\"\/>\r\n          <\/svg>\r\n        <\/div>\r\n        <h3 id=\"zic2-sec-setari\" class=\"zic2__cardTitle\">Setari generale<\/h3>\r\n      <\/div>\r\n\r\n      <div class=\"zic2__field\" style=\"margin-bottom: 16px;\">\r\n        <label class=\"zic2__label\" for=\"zic2-favorable-law\">Legea penala mai favorabila<\/label>\r\n        <select id=\"zic2-favorable-law\" class=\"zic2__select\" data-field=\"favorableLaw\">\r\n          <option value=\"\">Selectati perioada...<\/option>\r\n          <option value=\"pre-2018\">Anterioara datei de 25.06.2018<\/option>\r\n          <option value=\"2018-2022\">Perioada 25.06.2018 - 30.05.2022<\/option>\r\n          <option value=\"post-2022\">Ulterioara datei de 30.05.2022<\/option>\r\n        <\/select>\r\n      <\/div>\r\n\r\n      <label class=\"zic2__checkbox\">\r\n        <input type=\"checkbox\" data-field=\"includePandemic\">\r\n        <span class=\"zic2__checkmark\"><\/span>\r\n        <span class=\"zic2__checkLabel\">\r\n          <strong>Include suspendarea pandemiei<\/strong>\r\n          <small>16.03.2020 - 14.05.2020 (pana la 60 zile, in functie de suprapunere)<\/small>\r\n        <\/span>\r\n      <\/label>\r\n\r\n      <!-- Hint -->\r\n      <div class=\"zic2__hint\" style=\"margin-top: 16px;\">\r\n        <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><circle cx=\"12\" cy=\"12\" r=\"10\"\/><path d=\"M9.09 9a3 3 0 0 1 5.83 1c0 2-3 3-3 3\"\/><path d=\"M12 17h.01\"\/><\/svg>\r\n        <span>In perioada 25.06.2018 - 30.05.2022, mecanismul intreruperii prescriptiei a fost pus sub semnul intrebarii (Deciziile CCR 297\/2018 si 358\/2022).<\/span>\r\n      <\/div>\r\n    <\/section>\r\n\r\n    <!-- Card: Infractiuni -->\r\n    <section class=\"zic2__card\" aria-labelledby=\"zic2-sec-infractiuni\">\r\n      <div class=\"zic2__cardHeader\">\r\n        <div class=\"zic2__cardIcon zic2__cardIcon--purple\">\r\n          <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n            <path d=\"M14.5 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V7.5L14.5 2z\"\/>\r\n            <polyline points=\"14 2 14 8 20 8\"\/>\r\n            <line x1=\"16\" y1=\"13\" x2=\"8\" y2=\"13\"\/>\r\n            <line x1=\"16\" y1=\"17\" x2=\"8\" y2=\"17\"\/>\r\n          <\/svg>\r\n        <\/div>\r\n        <h3 id=\"zic2-sec-infractiuni\" class=\"zic2__cardTitle\">Infractiuni<\/h3>\r\n      <\/div>\r\n\r\n      <div class=\"zic2__btnGroup\">\r\n        <button type=\"button\" class=\"zic2__btn zic2__btn--outline\" data-action=\"addOffense\">\r\n          <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\"><path d=\"M12 5v14M5 12h14\"\/><\/svg>\r\n          Adauga infractiune\r\n        <\/button>\r\n        <button type=\"button\" class=\"zic2__btn zic2__btn--success\" data-action=\"example\">\r\n          <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><path d=\"M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z\"\/><polyline points=\"14 2 14 8 20 8\"\/><line x1=\"16\" y1=\"13\" x2=\"8\" y2=\"13\"\/><line x1=\"16\" y1=\"17\" x2=\"8\" y2=\"17\"\/><\/svg>\r\n          Exemplu\r\n        <\/button>\r\n      <\/div>\r\n\r\n      <!-- Offenses Container -->\r\n      <div class=\"zic2__rows\" data-offenses><\/div>\r\n\r\n      <div class=\"zic2__emptyState\" data-empty=\"offenses\">\r\n        <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\">\r\n          <circle cx=\"12\" cy=\"12\" r=\"10\"\/>\r\n          <polyline points=\"12 6 12 12 16 14\"\/>\r\n        <\/svg>\r\n        <span>Adauga cel putin o infractiune<\/span>\r\n      <\/div>\r\n\r\n      <div class=\"zic2__error is-hidden\" role=\"alert\" aria-live=\"polite\" data-errors><\/div>\r\n    <\/section>\r\n\r\n    <!-- Actions -->\r\n    <div class=\"zic2__actions\">\r\n      <button type=\"button\" class=\"zic2__btn zic2__btn--primary zic2__btn--large\" data-action=\"calculate\">\r\n        <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\"><polyline points=\"9 11 12 14 22 4\"\/><path d=\"M21 12v7a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h11\"\/><\/svg>\r\n        Calculeaza\r\n      <\/button>\r\n      <button type=\"button\" class=\"zic2__btn zic2__btn--secondary\" data-action=\"reset\">\r\n        <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><path d=\"M3 12a9 9 0 1 0 9-9 9.75 9.75 0 0 0-6.74 2.74L3 8\"\/><path d=\"M3 3v5h5\"\/><\/svg>\r\n        Reseteaza\r\n      <\/button>\r\n      <button type=\"button\" class=\"zic2__btn zic2__btn--secondary\" data-action=\"export-pdf\">\r\n        <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><path d=\"M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z\"\/><polyline points=\"14 2 14 8 20 8\"\/><path d=\"M12 18v-6\"\/><path d=\"M9 15l3 3 3-3\"\/><\/svg>\r\n        Descarca PDF\r\n      <\/button>\r\n    <\/div>\r\n\r\n    <!-- Result -->\r\n    <section class=\"zic2__card zic2__resultCard is-hidden\" data-result aria-live=\"polite\">\r\n      <div class=\"zic2__cardHeader\">\r\n        <div class=\"zic2__cardIcon zic2__cardIcon--green\">\r\n          <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\"><polyline points=\"20 6 9 17 4 12\"\/><\/svg>\r\n        <\/div>\r\n        <h3 class=\"zic2__cardTitle\">Rezultat calcul prescriptie<\/h3>\r\n      <\/div>\r\n      <div class=\"zic2__pandNote is-hidden\" data-pandemic-note>\r\n        <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><path d=\"M10.29 3.86L1.82 18a2 2 0 0 0 1.71 3h16.94a2 2 0 0 0 1.71-3L13.71 3.86a2 2 0 0 0-3.42 0z\"\/><line x1=\"12\" y1=\"9\" x2=\"12\" y2=\"13\"\/><line x1=\"12\" y1=\"17\" x2=\"12.01\" y2=\"17\"\/><\/svg>\r\n        <span>Prima data = fara suspendare. A doua (daca apare) = cu suspendarea pe perioada starii de urgenta.<\/span>\r\n      <\/div>\r\n      <div class=\"zic2__resultBody\" data-result-content><\/div>\r\n    <\/section>\r\n\r\n    <!-- Disclaimer -->\r\n    <div class=\"zic2__disclaimer\">\r\n      <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><path d=\"M10.29 3.86L1.82 18a2 2 0 0 0 1.71 3h16.94a2 2 0 0 0 1.71-3L13.71 3.86a2 2 0 0 0-3.42 0z\"\/><line x1=\"12\" y1=\"9\" x2=\"12\" y2=\"13\"\/><line x1=\"12\" y1=\"17\" x2=\"12.01\" y2=\"17\"\/><\/svg>\r\n      <div>\r\n        <strong>Disclaimer:<\/strong> Acest calculator este oferit exclusiv in scop informativ si educativ. Rezultatele generate nu constituie consultanta juridica si nu pot inlocui sfatul unui avocat specializat.\r\n      <\/div>\r\n    <\/div>\r\n\r\n    <!-- Footer -->\r\n    <footer class=\"zic2__footer\">\r\n      <a href=\"https:\/\/zic.legal\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"zic2__footerLink\">\r\n        &copy; 2025 ZIC Legal\r\n      <\/a>\r\n    <\/footer>\r\n  <\/div>\r\n<\/div>\r\n\r\n<style>\r\n\/* ============================================================\r\n   ZIC Calculator v2 - Prescriptie\r\n   Theme: Purple\/Mov | Fully Responsive | Optimized\r\n   ============================================================ *\/\r\n\r\n\/* === CSS Variables === *\/\r\n#zic-prescriptie-calculator-v2 {\r\n  --zic-primary: #8A88FF;\r\n  --zic-primary-dark: #6F6CFF;\r\n  --zic-primary-light: rgba(138,136,255,.08);\r\n  --zic-primary-border: rgba(138,136,255,.25);\r\n\r\n  --zic-success: #10B981;\r\n  --zic-success-light: rgba(16,185,129,.08);\r\n  --zic-success-border: rgba(16,185,129,.25);\r\n\r\n  --zic-danger: #EF4444;\r\n  --zic-danger-light: rgba(239,68,68,.08);\r\n  --zic-danger-border: rgba(239,68,68,.25);\r\n\r\n  --zic-warning: #F59E0B;\r\n  --zic-warning-light: rgba(245,158,11,.08);\r\n  --zic-warning-border: rgba(245,158,11,.25);\r\n\r\n  --zic-blue: #3B82F6;\r\n  --zic-blue-light: rgba(59,130,246,.08);\r\n\r\n  --zic-ink: #1F2937;\r\n  --zic-ink-light: #374151;\r\n  --zic-muted: #6B7280;\r\n  --zic-light: #9CA3AF;\r\n\r\n  --zic-bg: #F9FAFB;\r\n  --zic-surface: #FFFFFF;\r\n  --zic-border: #E5E7EB;\r\n\r\n  --zic-shadow-sm: 0 1px 2px rgba(0,0,0,.05);\r\n  --zic-shadow: 0 4px 6px -1px rgba(0,0,0,.1), 0 2px 4px -1px rgba(0,0,0,.06);\r\n  --zic-shadow-lg: 0 10px 15px -3px rgba(0,0,0,.1), 0 4px 6px -2px rgba(0,0,0,.05);\r\n\r\n  --zic-radius: 16px;\r\n  --zic-radius-sm: 12px;\r\n  --zic-radius-xs: 8px;\r\n\r\n  --zic-transition: 150ms ease;\r\n\r\n  font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif;\r\n  color: var(--zic-ink);\r\n  line-height: 1.5;\r\n  -webkit-font-smoothing: antialiased;\r\n}\r\n\r\n#zic-prescriptie-calculator-v2 *,\r\n#zic-prescriptie-calculator-v2 *::before,\r\n#zic-prescriptie-calculator-v2 *::after {\r\n  box-sizing: border-box;\r\n}\r\n\r\n\/* === WordPress\/Avada Override Protection === *\/\r\n#zic-prescriptie-calculator-v2 input[type=\"checkbox\"] {\r\n  -webkit-appearance: checkbox !important;\r\n  -moz-appearance: checkbox !important;\r\n  appearance: checkbox !important;\r\n  width: 18px !important;\r\n  height: 18px !important;\r\n  margin: 0 !important;\r\n  padding: 0 !important;\r\n  border: none !important;\r\n  background: none !important;\r\n  box-shadow: none !important;\r\n}\r\n\r\n#zic-prescriptie-calculator-v2 input[type=\"number\"],\r\n#zic-prescriptie-calculator-v2 input[type=\"text\"],\r\n#zic-prescriptie-calculator-v2 input[type=\"date\"] {\r\n  -webkit-appearance: none !important;\r\n  -moz-appearance: textfield !important;\r\n  appearance: none !important;\r\n  background-image: none !important;\r\n  box-shadow: none !important;\r\n}\r\n\r\n#zic-prescriptie-calculator-v2 select {\r\n  background-image: url(\"data:image\/svg+xml,%3Csvg xmlns='http:\/\/www.w3.org\/2000\/svg' width='12' height='12' viewBox='0 0 24 24' fill='none' stroke='%236B7280' stroke-width='2'%3E%3Cpath d='M6 9l6 6 6-6'\/%3E%3C\/svg%3E\") !important;\r\n  background-repeat: no-repeat !important;\r\n  background-position: right 12px center !important;\r\n  padding-right: 36px !important;\r\n}\r\n\r\n#zic-prescriptie-calculator-v2 button:not(.zic2__btn--primary) {\r\n  background-image: none !important;\r\n}\r\n\r\n#zic-prescriptie-calculator-v2 button {\r\n  text-shadow: none !important;\r\n  letter-spacing: normal !important;\r\n}\r\n\r\n#zic-prescriptie-calculator-v2 h2,\r\n#zic-prescriptie-calculator-v2 h3 {\r\n  text-transform: none !important;\r\n  letter-spacing: normal !important;\r\n}\r\n\r\n#zic-prescriptie-calculator-v2 a {\r\n  text-decoration: none;\r\n}\r\n\r\n#zic-prescriptie-calculator-v2 a:hover {\r\n  text-decoration: underline;\r\n}\r\n\r\n\/* === Layout === *\/\r\n#zic-prescriptie-calculator-v2 .zic2__wrap {\r\n  max-width: 720px;\r\n  margin: 0 auto;\r\n  padding: 16px;\r\n}\r\n\r\n\/* === Header === *\/\r\n#zic-prescriptie-calculator-v2 .zic2__hero {\r\n  margin-bottom: 16px;\r\n}\r\n\r\n#zic-prescriptie-calculator-v2 .zic2__brandbar {\r\n  display: flex;\r\n  align-items: center;\r\n  gap: 14px;\r\n  background: linear-gradient(135deg, var(--zic-primary), var(--zic-primary-dark));\r\n  border-radius: var(--zic-radius);\r\n  padding: 20px;\r\n  color: #fff;\r\n  box-shadow: var(--zic-shadow-lg);\r\n}\r\n\r\n#zic-prescriptie-calculator-v2 .zic2__mark {\r\n  width: 48px;\r\n  height: 48px;\r\n  background: rgba(255,255,255,.2);\r\n  border-radius: 12px;\r\n  display: flex;\r\n  align-items: center;\r\n  justify-content: center;\r\n  flex-shrink: 0;\r\n}\r\n\r\n#zic-prescriptie-calculator-v2 .zic2__headerText {\r\n  flex: 1;\r\n  min-width: 0;\r\n}\r\n\r\n#zic-prescriptie-calculator-v2 .zic2__title {\r\n  margin: 0;\r\n  font-size: 20px;\r\n  font-weight: 700;\r\n  line-height: 1.2;\r\n}\r\n\r\n#zic-prescriptie-calculator-v2 .zic2__subtitle {\r\n  margin: 4px 0 0;\r\n  font-size: 14px;\r\n  opacity: 0.9;\r\n}\r\n\r\n\/* === Formula Box === *\/\r\n#zic-prescriptie-calculator-v2 .zic2__formula {\r\n  display: flex;\r\n  align-items: flex-start;\r\n  gap: 10px;\r\n  background: var(--zic-primary-light);\r\n  border: 1px solid var(--zic-primary-border);\r\n  border-radius: var(--zic-radius-sm);\r\n  padding: 12px 14px;\r\n  margin-bottom: 16px;\r\n  font-size: 14px;\r\n  color: var(--zic-ink-light);\r\n}\r\n\r\n#zic-prescriptie-calculator-v2 .zic2__formulaIcon {\r\n  color: var(--zic-primary-dark);\r\n  flex-shrink: 0;\r\n  margin-top: 1px;\r\n}\r\n\r\n#zic-prescriptie-calculator-v2 .zic2__formulaText strong {\r\n  color: var(--zic-ink);\r\n}\r\n\r\n\/* === Cards === *\/\r\n#zic-prescriptie-calculator-v2 .zic2__card {\r\n  background: var(--zic-surface);\r\n  border: 1px solid var(--zic-border);\r\n  border-radius: var(--zic-radius);\r\n  padding: 20px;\r\n  margin-bottom: 16px;\r\n  box-shadow: var(--zic-shadow-sm);\r\n}\r\n\r\n#zic-prescriptie-calculator-v2 .zic2__cardHeader {\r\n  display: flex;\r\n  align-items: center;\r\n  gap: 12px;\r\n  margin-bottom: 16px;\r\n}\r\n\r\n#zic-prescriptie-calculator-v2 .zic2__cardIcon {\r\n  width: 36px;\r\n  height: 36px;\r\n  border-radius: 10px;\r\n  display: flex;\r\n  align-items: center;\r\n  justify-content: center;\r\n  flex-shrink: 0;\r\n}\r\n\r\n#zic-prescriptie-calculator-v2 .zic2__cardIcon--purple {\r\n  background: var(--zic-primary-light);\r\n  color: var(--zic-primary-dark);\r\n}\r\n\r\n#zic-prescriptie-calculator-v2 .zic2__cardIcon--green {\r\n  background: var(--zic-success-light);\r\n  color: var(--zic-success);\r\n}\r\n\r\n#zic-prescriptie-calculator-v2 .zic2__cardTitle {\r\n  margin: 0;\r\n  font-size: 17px;\r\n  font-weight: 700;\r\n  color: var(--zic-ink);\r\n}\r\n\r\n\/* === Form Elements === *\/\r\n#zic-prescriptie-calculator-v2 .zic2__field {\r\n  display: flex;\r\n  flex-direction: column;\r\n  gap: 4px;\r\n}\r\n\r\n#zic-prescriptie-calculator-v2 .zic2__label {\r\n  font-size: 12px;\r\n  font-weight: 600;\r\n  color: var(--zic-muted);\r\n}\r\n\r\n#zic-prescriptie-calculator-v2 .zic2__input,\r\n#zic-prescriptie-calculator-v2 .zic2__select {\r\n  width: 100%;\r\n  padding: 10px 12px;\r\n  font-size: 15px;\r\n  font-family: inherit;\r\n  color: var(--zic-ink);\r\n  background: var(--zic-surface);\r\n  border: 2px solid var(--zic-border);\r\n  border-radius: var(--zic-radius-xs);\r\n  outline: none;\r\n  transition: border-color var(--zic-transition), box-shadow var(--zic-transition);\r\n}\r\n\r\n#zic-prescriptie-calculator-v2 .zic2__input:focus,\r\n#zic-prescriptie-calculator-v2 .zic2__select:focus {\r\n  border-color: var(--zic-primary);\r\n  box-shadow: 0 0 0 3px var(--zic-primary-light);\r\n}\r\n\r\n\/* === Checkbox === *\/\r\n#zic-prescriptie-calculator-v2 .zic2__checkbox {\r\n  display: flex;\r\n  align-items: flex-start;\r\n  gap: 12px;\r\n  padding: 14px;\r\n  background: var(--zic-bg);\r\n  border: 1px solid var(--zic-border);\r\n  border-radius: var(--zic-radius-sm);\r\n  cursor: pointer;\r\n  transition: all var(--zic-transition);\r\n}\r\n\r\n#zic-prescriptie-calculator-v2 .zic2__checkbox:hover {\r\n  background: var(--zic-primary-light);\r\n  border-color: var(--zic-primary-border);\r\n}\r\n\r\n#zic-prescriptie-calculator-v2 .zic2__checkbox input[type=\"checkbox\"] {\r\n  width: 18px;\r\n  height: 18px;\r\n  accent-color: var(--zic-primary);\r\n  flex-shrink: 0;\r\n  margin-top: 2px;\r\n}\r\n\r\n#zic-prescriptie-calculator-v2 .zic2__checkLabel {\r\n  display: flex;\r\n  flex-direction: column;\r\n  gap: 2px;\r\n}\r\n\r\n#zic-prescriptie-calculator-v2 .zic2__checkLabel strong {\r\n  font-size: 14px;\r\n  font-weight: 700;\r\n  color: var(--zic-ink-light);\r\n}\r\n\r\n#zic-prescriptie-calculator-v2 .zic2__checkLabel small {\r\n  font-size: 12px;\r\n  color: var(--zic-muted);\r\n}\r\n\r\n\/* === Buttons === *\/\r\n#zic-prescriptie-calculator-v2 .zic2__btnGroup {\r\n  display: flex;\r\n  flex-wrap: wrap;\r\n  gap: 8px;\r\n  margin-bottom: 16px;\r\n}\r\n\r\n#zic-prescriptie-calculator-v2 .zic2__btn {\r\n  display: inline-flex;\r\n  align-items: center;\r\n  justify-content: center;\r\n  gap: 6px;\r\n  padding: 10px 16px;\r\n  font-size: 14px;\r\n  font-weight: 600;\r\n  border-radius: var(--zic-radius-sm);\r\n  border: 1px solid transparent;\r\n  cursor: pointer;\r\n  transition: all var(--zic-transition);\r\n  white-space: nowrap;\r\n  text-decoration: none;\r\n}\r\n\r\n#zic-prescriptie-calculator-v2 .zic2__btn:focus {\r\n  outline: none;\r\n  box-shadow: 0 0 0 3px var(--zic-primary-border);\r\n}\r\n\r\n#zic-prescriptie-calculator-v2 .zic2__btn:active {\r\n  transform: translateY(1px);\r\n}\r\n\r\n#zic-prescriptie-calculator-v2 .zic2__btn--primary {\r\n  background: linear-gradient(135deg, var(--zic-primary), var(--zic-primary-dark));\r\n  color: #fff;\r\n  box-shadow: 0 4px 14px rgba(138,136,255,.35);\r\n}\r\n\r\n#zic-prescriptie-calculator-v2 .zic2__btn--primary:hover {\r\n  box-shadow: 0 6px 20px rgba(138,136,255,.45);\r\n  transform: translateY(-1px);\r\n}\r\n\r\n#zic-prescriptie-calculator-v2 .zic2__btn--large {\r\n  padding: 14px 24px;\r\n  font-size: 15px;\r\n}\r\n\r\n#zic-prescriptie-calculator-v2 .zic2__btn--secondary {\r\n  background: var(--zic-surface);\r\n  border-color: var(--zic-border);\r\n  color: var(--zic-ink-light);\r\n}\r\n\r\n#zic-prescriptie-calculator-v2 .zic2__btn--secondary:hover {\r\n  background: var(--zic-bg);\r\n  border-color: var(--zic-primary-border);\r\n  color: var(--zic-primary-dark);\r\n}\r\n\r\n#zic-prescriptie-calculator-v2 .zic2__btn--outline {\r\n  background: var(--zic-surface);\r\n  border-color: var(--zic-primary-border);\r\n  color: var(--zic-primary-dark);\r\n}\r\n\r\n#zic-prescriptie-calculator-v2 .zic2__btn--outline:hover {\r\n  background: var(--zic-primary-light);\r\n}\r\n\r\n#zic-prescriptie-calculator-v2 .zic2__btn--success {\r\n  background: var(--zic-success-light);\r\n  border-color: var(--zic-success-border);\r\n  color: var(--zic-success);\r\n}\r\n\r\n#zic-prescriptie-calculator-v2 .zic2__btn--success:hover {\r\n  background: rgba(16,185,129,.15);\r\n}\r\n\r\n#zic-prescriptie-calculator-v2 .zic2__btn--danger {\r\n  background: var(--zic-danger-light);\r\n  border-color: var(--zic-danger-border);\r\n  color: var(--zic-danger);\r\n  padding: 8px 12px;\r\n  font-size: 13px;\r\n}\r\n\r\n#zic-prescriptie-calculator-v2 .zic2__btn--danger:hover {\r\n  background: rgba(239,68,68,.15);\r\n}\r\n\r\n\/* === Rows === *\/\r\n#zic-prescriptie-calculator-v2 .zic2__rows {\r\n  display: flex;\r\n  flex-direction: column;\r\n  gap: 10px;\r\n}\r\n\r\n#zic-prescriptie-calculator-v2 .zic2__row {\r\n  background: var(--zic-bg);\r\n  border: 1px solid var(--zic-border);\r\n  border-radius: var(--zic-radius-sm);\r\n  padding: 14px;\r\n  transition: border-color var(--zic-transition);\r\n}\r\n\r\n#zic-prescriptie-calculator-v2 .zic2__row:hover {\r\n  border-color: var(--zic-primary-border);\r\n}\r\n\r\n#zic-prescriptie-calculator-v2 .zic2__rowHeader {\r\n  display: flex;\r\n  align-items: center;\r\n  justify-content: space-between;\r\n  margin-bottom: 12px;\r\n}\r\n\r\n#zic-prescriptie-calculator-v2 .zic2__rowTag {\r\n  display: inline-flex;\r\n  align-items: center;\r\n  gap: 6px;\r\n  font-size: 13px;\r\n  font-weight: 700;\r\n  color: var(--zic-ink-light);\r\n}\r\n\r\n#zic-prescriptie-calculator-v2 .zic2__rowBadge {\r\n  width: 24px;\r\n  height: 24px;\r\n  background: linear-gradient(135deg, var(--zic-primary), var(--zic-primary-dark));\r\n  color: #fff;\r\n  border-radius: 8px;\r\n  display: flex;\r\n  align-items: center;\r\n  justify-content: center;\r\n  font-size: 12px;\r\n  font-weight: 800;\r\n}\r\n\r\n#zic-prescriptie-calculator-v2 .zic2__rowGrid {\r\n  display: grid;\r\n  grid-template-columns: 1fr;\r\n  gap: 10px;\r\n}\r\n\r\n#zic-prescriptie-calculator-v2 .zic2__rowGrid2 {\r\n  display: grid;\r\n  grid-template-columns: 1fr 1fr;\r\n  gap: 10px;\r\n  margin-top: 10px;\r\n}\r\n\r\n\/* === Pills === *\/\r\n#zic-prescriptie-calculator-v2 .zic2__pills {\r\n  display: flex;\r\n  flex-wrap: wrap;\r\n  gap: 8px;\r\n  margin-bottom: 10px;\r\n}\r\n\r\n#zic-prescriptie-calculator-v2 .zic2__pill {\r\n  display: flex;\r\n  align-items: center;\r\n  gap: 6px;\r\n  padding: 8px 12px;\r\n  border-radius: var(--zic-radius-xs);\r\n  border: 2px solid var(--zic-border);\r\n  background: var(--zic-bg);\r\n  cursor: pointer;\r\n  transition: all var(--zic-transition);\r\n}\r\n\r\n#zic-prescriptie-calculator-v2 .zic2__pill:hover {\r\n  background: var(--zic-primary-light);\r\n  border-color: var(--zic-primary-border);\r\n}\r\n\r\n#zic-prescriptie-calculator-v2 .zic2__pill.is-active {\r\n  background: var(--zic-primary-light);\r\n  border-color: var(--zic-primary);\r\n}\r\n\r\n#zic-prescriptie-calculator-v2 .zic2__pill input {\r\n  width: 16px;\r\n  height: 16px;\r\n  accent-color: var(--zic-primary);\r\n}\r\n\r\n#zic-prescriptie-calculator-v2 .zic2__pill span {\r\n  font-size: 13px;\r\n  font-weight: 600;\r\n  color: var(--zic-ink-light);\r\n}\r\n\r\n\/* === Empty State === *\/\r\n#zic-prescriptie-calculator-v2 .zic2__emptyState {\r\n  display: flex;\r\n  flex-direction: column;\r\n  align-items: center;\r\n  justify-content: center;\r\n  gap: 8px;\r\n  padding: 24px;\r\n  background: var(--zic-bg);\r\n  border: 2px dashed var(--zic-border);\r\n  border-radius: var(--zic-radius-sm);\r\n  color: var(--zic-light);\r\n  font-size: 13px;\r\n  text-align: center;\r\n}\r\n\r\n\/* === Hint === *\/\r\n#zic-prescriptie-calculator-v2 .zic2__hint {\r\n  display: flex;\r\n  align-items: flex-start;\r\n  gap: 8px;\r\n  padding: 10px 12px;\r\n  background: var(--zic-bg);\r\n  border-radius: var(--zic-radius-xs);\r\n  font-size: 12px;\r\n  color: var(--zic-muted);\r\n}\r\n\r\n#zic-prescriptie-calculator-v2 .zic2__hint svg {\r\n  flex-shrink: 0;\r\n  margin-top: 1px;\r\n}\r\n\r\n\/* === Actions === *\/\r\n#zic-prescriptie-calculator-v2 .zic2__actions {\r\n  display: flex;\r\n  flex-wrap: wrap;\r\n  gap: 10px;\r\n  margin-bottom: 16px;\r\n}\r\n\r\n#zic-prescriptie-calculator-v2 .zic2__actions .zic2__btn--primary {\r\n  flex: 1;\r\n  min-width: 200px;\r\n}\r\n\r\n\/* === Error === *\/\r\n#zic-prescriptie-calculator-v2 .zic2__error {\r\n  margin-top: 12px;\r\n  padding: 12px;\r\n  background: var(--zic-danger-light);\r\n  border: 1px solid var(--zic-danger-border);\r\n  border-radius: var(--zic-radius-xs);\r\n  color: var(--zic-danger);\r\n  font-size: 13px;\r\n  font-weight: 500;\r\n}\r\n\r\n#zic-prescriptie-calculator-v2 .zic2__error ul {\r\n  margin: 8px 0 0 18px;\r\n  padding: 0;\r\n}\r\n\r\n#zic-prescriptie-calculator-v2 .zic2__error li {\r\n  margin: 4px 0;\r\n}\r\n\r\n\/* === Result === *\/\r\n#zic-prescriptie-calculator-v2 .zic2__resultCard {\r\n  border-color: var(--zic-success-border);\r\n  background: linear-gradient(135deg, rgba(16,185,129,.02), rgba(16,185,129,.06));\r\n}\r\n\r\n#zic-prescriptie-calculator-v2 .zic2__resultBody {\r\n  display: flex;\r\n  flex-direction: column;\r\n  gap: 12px;\r\n}\r\n\r\n#zic-prescriptie-calculator-v2 .zic2__pandNote {\r\n  display: flex;\r\n  align-items: flex-start;\r\n  gap: 10px;\r\n  padding: 12px 14px;\r\n  background: var(--zic-warning-light);\r\n  border: 1px solid var(--zic-warning-border);\r\n  border-radius: var(--zic-radius-xs);\r\n  font-size: 13px;\r\n  color: #92400E;\r\n  margin-bottom: 12px;\r\n}\r\n\r\n#zic-prescriptie-calculator-v2 .zic2__pandNote svg {\r\n  flex-shrink: 0;\r\n  margin-top: 1px;\r\n  color: var(--zic-warning);\r\n}\r\n\r\n\/* Result Table *\/\r\n#zic-prescriptie-calculator-v2 .zic2__tableWrap {\r\n  overflow-x: auto;\r\n  border-radius: var(--zic-radius-sm);\r\n  border: 1px solid var(--zic-border);\r\n}\r\n\r\n#zic-prescriptie-calculator-v2 table {\r\n  width: 100%;\r\n  border-collapse: collapse;\r\n  min-width: 600px;\r\n}\r\n\r\n#zic-prescriptie-calculator-v2 th {\r\n  text-align: left;\r\n  font-size: 11px;\r\n  text-transform: uppercase;\r\n  letter-spacing: 0.5px;\r\n  color: var(--zic-muted);\r\n  padding: 12px 14px;\r\n  border-bottom: 2px solid var(--zic-border);\r\n  background: var(--zic-bg);\r\n}\r\n\r\n#zic-prescriptie-calculator-v2 td {\r\n  padding: 12px 14px;\r\n  border-bottom: 1px solid var(--zic-border);\r\n  font-size: 13px;\r\n  color: var(--zic-ink-light);\r\n  vertical-align: top;\r\n}\r\n\r\n#zic-prescriptie-calculator-v2 tr:last-child td {\r\n  border-bottom: none;\r\n}\r\n\r\n#zic-prescriptie-calculator-v2 tr:nth-child(even) td {\r\n  background: rgba(249, 250, 251, 0.5);\r\n}\r\n\r\n#zic-prescriptie-calculator-v2 .zic2__chip {\r\n  display: inline-flex;\r\n  align-items: center;\r\n  padding: 4px 10px;\r\n  border-radius: 999px;\r\n  font-weight: 700;\r\n  font-size: 11px;\r\n}\r\n\r\n#zic-prescriptie-calculator-v2 .zic2__chip--yes {\r\n  background: var(--zic-success-light);\r\n  color: var(--zic-success);\r\n}\r\n\r\n#zic-prescriptie-calculator-v2 .zic2__chip--no {\r\n  background: var(--zic-danger-light);\r\n  color: var(--zic-danger);\r\n}\r\n\r\n#zic-prescriptie-calculator-v2 .zic2__subdate {\r\n  font-size: 12px;\r\n  margin-top: 4px;\r\n  color: var(--zic-primary-dark);\r\n}\r\n\r\n\/* Mobile Cards *\/\r\n#zic-prescriptie-calculator-v2 .zic2__mobileResult {\r\n  display: block;\r\n}\r\n\r\n#zic-prescriptie-calculator-v2 .zic2__desktopResult {\r\n  display: none;\r\n}\r\n\r\n@media (min-width: 768px) {\r\n  #zic-prescriptie-calculator-v2 .zic2__mobileResult { display: none; }\r\n  #zic-prescriptie-calculator-v2 .zic2__desktopResult { display: block; }\r\n}\r\n\r\n#zic-prescriptie-calculator-v2 .zic2__miniCard {\r\n  background: var(--zic-surface);\r\n  border: 1px solid var(--zic-border);\r\n  border-radius: var(--zic-radius-sm);\r\n  padding: 14px;\r\n  margin-bottom: 10px;\r\n}\r\n\r\n#zic-prescriptie-calculator-v2 .zic2__miniCard:last-child {\r\n  margin-bottom: 0;\r\n}\r\n\r\n#zic-prescriptie-calculator-v2 .zic2__miniTitle {\r\n  font-weight: 700;\r\n  font-size: 14px;\r\n  margin: 0 0 12px 0;\r\n  padding-bottom: 10px;\r\n  border-bottom: 1px solid var(--zic-border);\r\n  color: var(--zic-ink);\r\n}\r\n\r\n#zic-prescriptie-calculator-v2 .zic2__miniGrid {\r\n  display: grid;\r\n  grid-template-columns: 1fr 1fr;\r\n  gap: 12px;\r\n  font-size: 13px;\r\n}\r\n\r\n#zic-prescriptie-calculator-v2 .zic2__klabel {\r\n  color: var(--zic-muted);\r\n  font-size: 11px;\r\n  text-transform: uppercase;\r\n  letter-spacing: 0.05em;\r\n  margin-bottom: 4px;\r\n}\r\n\r\n#zic-prescriptie-calculator-v2 .zic2__kvalue {\r\n  font-weight: 700;\r\n  color: var(--zic-ink);\r\n}\r\n\r\n#zic-prescriptie-calculator-v2 .zic2__kvalue--yes { color: var(--zic-success); }\r\n#zic-prescriptie-calculator-v2 .zic2__kvalue--no { color: var(--zic-danger); }\r\n\r\n\/* === Disclaimer === *\/\r\n#zic-prescriptie-calculator-v2 .zic2__disclaimer {\r\n  display: flex;\r\n  align-items: flex-start;\r\n  gap: 10px;\r\n  padding: 14px;\r\n  background: var(--zic-bg);\r\n  border: 1px solid var(--zic-border);\r\n  border-radius: var(--zic-radius-sm);\r\n  font-size: 12px;\r\n  color: var(--zic-muted);\r\n  line-height: 1.5;\r\n  margin-bottom: 16px;\r\n}\r\n\r\n#zic-prescriptie-calculator-v2 .zic2__disclaimer svg {\r\n  flex-shrink: 0;\r\n  color: var(--zic-warning);\r\n  margin-top: 1px;\r\n}\r\n\r\n#zic-prescriptie-calculator-v2 .zic2__disclaimer strong {\r\n  color: var(--zic-ink-light);\r\n}\r\n\r\n\/* === Footer === *\/\r\n#zic-prescriptie-calculator-v2 .zic2__footer {\r\n  text-align: center;\r\n  padding: 8px 0;\r\n}\r\n\r\n#zic-prescriptie-calculator-v2 .zic2__footerLink {\r\n  color: var(--zic-primary-dark);\r\n  text-decoration: none;\r\n  font-size: 13px;\r\n  font-weight: 600;\r\n  transition: color var(--zic-transition);\r\n}\r\n\r\n#zic-prescriptie-calculator-v2 .zic2__footerLink:hover {\r\n  color: var(--zic-primary);\r\n  text-decoration: underline;\r\n}\r\n\r\n\/* === Utility === *\/\r\n#zic-prescriptie-calculator-v2 .is-hidden {\r\n  display: none !important;\r\n}\r\n\r\n\/* === RESPONSIVE === *\/\r\n\r\n\/* Small mobile (max 500px) *\/\r\n@media (max-width: 500px) {\r\n  #zic-prescriptie-calculator-v2 .zic2__actions {\r\n    flex-direction: column;\r\n  }\r\n\r\n  #zic-prescriptie-calculator-v2 .zic2__actions .zic2__btn {\r\n    width: 100%;\r\n    min-width: unset;\r\n  }\r\n\r\n  #zic-prescriptie-calculator-v2 .zic2__btnGroup {\r\n    flex-direction: column;\r\n  }\r\n\r\n  #zic-prescriptie-calculator-v2 .zic2__btnGroup .zic2__btn {\r\n    width: 100%;\r\n  }\r\n\r\n  #zic-prescriptie-calculator-v2 .zic2__rowGrid {\r\n    grid-template-columns: 1fr;\r\n  }\r\n}\r\n\r\n\/* Tablet (640px+) *\/\r\n@media (min-width: 640px) {\r\n  #zic-prescriptie-calculator-v2 .zic2__wrap {\r\n    padding: 24px;\r\n  }\r\n  #zic-prescriptie-calculator-v2 .zic2__title {\r\n    font-size: 24px;\r\n  }\r\n  #zic-prescriptie-calculator-v2 .zic2__rowGrid {\r\n    grid-template-columns: 1fr 1fr;\r\n  }\r\n}\r\n\r\n@media (min-width: 768px) {\r\n  #zic-prescriptie-calculator-v2 .zic2__card {\r\n    padding: 24px;\r\n  }\r\n  #zic-prescriptie-calculator-v2 .zic2__brandbar {\r\n    padding: 24px;\r\n  }\r\n  #zic-prescriptie-calculator-v2 .zic2__mark {\r\n    width: 56px;\r\n    height: 56px;\r\n  }\r\n  #zic-prescriptie-calculator-v2 .zic2__title {\r\n    font-size: 26px;\r\n  }\r\n}\r\n\r\n@media (min-width: 1024px) {\r\n  #zic-prescriptie-calculator-v2 .zic2__wrap {\r\n    max-width: 900px;\r\n  }\r\n}\r\n\r\n\/* Print styles *\/\r\n@media print {\r\n  #zic-prescriptie-calculator-v2 .zic2__btnGroup,\r\n  #zic-prescriptie-calculator-v2 .zic2__actions,\r\n  #zic-prescriptie-calculator-v2 .zic2__hint,\r\n  #zic-prescriptie-calculator-v2 .zic2__emptyState,\r\n  #zic-prescriptie-calculator-v2 .zic2__footer {\r\n    display: none !important;\r\n  }\r\n  #zic-prescriptie-calculator-v2 .zic2__card {\r\n    box-shadow: none;\r\n    border: 1px solid #ddd;\r\n    break-inside: avoid;\r\n  }\r\n  #zic-prescriptie-calculator-v2 .zic2__resultCard.is-hidden {\r\n    display: block !important;\r\n  }\r\n}\r\n<\/style>\r\n\r\n<script>\r\n(function() {\r\n  'use strict';\r\n\r\n  const ROOT_ID = 'zic-prescriptie-calculator-v2';\r\n  const MS_DAY = 86400000;\r\n\r\n  \/\/ === SECURITY: HTML Sanitization Function ===\r\n  \/\/ Prevents XSS attacks by escaping HTML special characters\r\n  function escapeHtml(unsafe) {\r\n    if (unsafe === null || typeof unsafe === 'undefined') return '';\r\n    return String(unsafe)\r\n      .replace(\/&\/g, '&amp;')\r\n      .replace(\/<\/g, '&lt;')\r\n      .replace(\/>\/g, '&gt;')\r\n      .replace(\/\"\/g, '&quot;')\r\n      .replace(\/'\/g, '&#039;');\r\n  }\r\n\r\n  \/\/ === SECURITY: Validate and sanitize offense name ===\r\n  \/\/ Allows only alphanumeric, Romanian diacritics, spaces, dots, dashes, and common punctuation\r\n  function sanitizeOffenseName(name) {\r\n    if (!name || typeof name !== 'string') return '';\r\n    \/\/ Remove any potentially dangerous characters, keep only safe ones\r\n    \/\/ Allow: letters (including Romanian diacritics), numbers, spaces, dots, dashes, parentheses\r\n    return name\r\n      .replace(\/[^\\w\\s\u0102\u0103\u00c2\u00e2\u00ce\u00ee\u0218\u0219\u021a\u021b.,\\-()]\/gi, '')\r\n      .substring(0, 200); \/\/ Limit length to prevent DoS\r\n  }\r\n\r\n  \/\/ === SECURITY: Validate numeric input (integers only for penalty years) ===\r\n  function validateNumericInput(value, min, max) {\r\n    \/\/ First, clean the input to only allow digits\r\n    const cleanValue = String(value).replace(\/[^0-9]\/g, '');\r\n    if (cleanValue === '') return null;\r\n    const num = parseInt(cleanValue, 10);\r\n    if (!Number.isFinite(num)) return null;\r\n    if (num < min || num > max) return null;\r\n    return num;\r\n  }\r\n\r\n  \/\/ === SECURITY: Validate date format (YYYY-MM-DD) ===\r\n  function isValidDateFormat(dateStr) {\r\n    if (!dateStr || typeof dateStr !== 'string') return false;\r\n    const dateRegex = \/^\\d{4}-\\d{2}-\\d{2}$\/;\r\n    if (!dateRegex.test(dateStr)) return false;\r\n    const parts = dateStr.split('-').map(n => parseInt(n, 10));\r\n    const [year, month, day] = parts;\r\n    if (year < 1900 || year > 2100) return false;\r\n    if (month < 1 || month > 12) return false;\r\n    if (day < 1 || day > 31) return false;\r\n    return true;\r\n  }\r\n\r\n  const root = document.getElementById(ROOT_ID);\r\n  if (!root) return;\r\n\r\n  const $ = (sel) => root.querySelector(sel);\r\n  const $$ = (sel) => root.querySelectorAll(sel);\r\n\r\n  const elements = {\r\n    errors: $('[data-errors]'),\r\n    offenses: $('[data-offenses]'),\r\n    emptyState: $('[data-empty=\"offenses\"]'),\r\n    resultCard: $('[data-result]'),\r\n    resultContent: $('[data-result-content]'),\r\n    pandemicNote: $('[data-pandemic-note]'),\r\n    favorableLaw: $('[data-field=\"favorableLaw\"]'),\r\n    includePandemic: $('[data-field=\"includePandemic\"]')\r\n  };\r\n\r\n  let state = {\r\n    offenses: [],\r\n    lastResult: null\r\n  };\r\n\r\n  \/\/ === Date Helpers ===\r\n  function parseISOToDay(value) {\r\n    if (!isValidDateFormat(value)) return null;\r\n    const parts = value.split('-').map(n => parseInt(n, 10));\r\n    const [y, m, d] = parts;\r\n    return Math.floor(Date.UTC(y, m - 1, d) \/ MS_DAY);\r\n  }\r\n\r\n  function dayToISO(day) {\r\n    const dt = new Date(day * MS_DAY);\r\n    const y = dt.getUTCFullYear();\r\n    const m = String(dt.getUTCMonth() + 1).padStart(2, '0');\r\n    const d = String(dt.getUTCDate()).padStart(2, '0');\r\n    return y + '-' + m + '-' + d;\r\n  }\r\n\r\n  function formatDay(day) {\r\n    if (day === null || typeof day === 'undefined') return '-';\r\n    const dt = new Date(day * MS_DAY);\r\n    const dd = String(dt.getUTCDate()).padStart(2, '0');\r\n    const mm = String(dt.getUTCMonth() + 1).padStart(2, '0');\r\n    const yyyy = dt.getUTCFullYear();\r\n    return dd + '.' + mm + '.' + yyyy;\r\n  }\r\n\r\n  function addYears(day, years) {\r\n    const dt = new Date(day * MS_DAY);\r\n    dt.setUTCFullYear(dt.getUTCFullYear() + years);\r\n    return Math.floor(dt.getTime() \/ MS_DAY);\r\n  }\r\n\r\n  function overlapDays(aStart, aEnd, bStart, bEnd) {\r\n    const start = Math.max(aStart, bStart);\r\n    const end = Math.min(aEnd, bEnd);\r\n    return start <= end ? (end - start + 1) : 0;\r\n  }\r\n\r\n  function applySuspension(baseEnd, start, suspStart, suspEnd) {\r\n    let end = baseEnd;\r\n    for (let i = 0; i < 8; i++) {\r\n      const ov = overlapDays(start, end, suspStart, suspEnd);\r\n      const next = baseEnd + ov;\r\n      if (next === end) break;\r\n      end = next;\r\n    }\r\n    return end;\r\n  }\r\n\r\n  \/\/ === Legal Logic ===\r\n  function calculatePrescriptionTermYears(offense) {\r\n    if (offense.isLifeSentence) return 15;\r\n    if (offense.isFine) return 3;\r\n    const max = validateNumericInput(offense.maxPenalty, 0, 100);\r\n    if (max === null) return null;\r\n    if (max > 20) return 15;\r\n    if (max > 10) return 10;\r\n    if (max > 5) return 8;\r\n    if (max > 1) return 5;\r\n    return 3;\r\n  }\r\n\r\n  function interruptionAllowedByRegime(regime) {\r\n    return regime === 'pre-2018' || regime === 'post-2022';\r\n  }\r\n\r\n  \/\/ === UI Helpers ===\r\n  \/\/ SECURITY FIX: Use textContent and DOM methods instead of innerHTML\r\n  function showErrors(messages) {\r\n    if (!messages || !messages.length) {\r\n      elements.errors.classList.add('is-hidden');\r\n      \/\/ Clear properly\r\n      while (elements.errors.firstChild) {\r\n        elements.errors.removeChild(elements.errors.firstChild);\r\n      }\r\n      return;\r\n    }\r\n    elements.errors.classList.remove('is-hidden');\r\n\r\n    \/\/ SECURITY: Build error list using DOM methods instead of innerHTML\r\n    \/\/ Clear properly first\r\n    while (elements.errors.firstChild) {\r\n      elements.errors.removeChild(elements.errors.firstChild);\r\n    }\r\n    const headerText = document.createTextNode('Corectati urmatoarele:');\r\n    elements.errors.appendChild(headerText);\r\n\r\n    const ul = document.createElement('ul');\r\n    messages.forEach(function(m) {\r\n      const li = document.createElement('li');\r\n      li.textContent = m; \/\/ SECURITY: textContent automatically escapes HTML\r\n      ul.appendChild(li);\r\n    });\r\n    elements.errors.appendChild(ul);\r\n\r\n    elements.errors.scrollIntoView({ behavior: 'smooth', block: 'start' });\r\n  }\r\n\r\n  function hideErrors() {\r\n    elements.errors.classList.add('is-hidden');\r\n    \/\/ Clear error content properly\r\n    while (elements.errors.firstChild) {\r\n      elements.errors.removeChild(elements.errors.firstChild);\r\n    }\r\n  }\r\n\r\n  function updateEmptyState() {\r\n    const hasOffenses = state.offenses.length > 0;\r\n    elements.emptyState.classList.toggle('is-hidden', hasOffenses);\r\n  }\r\n\r\n  \/\/ === Row Builder ===\r\n  \/\/ SECURITY FIX: Build DOM elements instead of using innerHTML with user data\r\n  function createOffenseRow(offense, index) {\r\n    const row = document.createElement('div');\r\n    row.className = 'zic2__row';\r\n    row.dataset.index = String(index);\r\n\r\n    const showMaxPenalty = !offense.isLifeSentence && !offense.isFine;\r\n\r\n    \/\/ Build the row header\r\n    const rowHeader = document.createElement('div');\r\n    rowHeader.className = 'zic2__rowHeader';\r\n\r\n    const rowTag = document.createElement('span');\r\n    rowTag.className = 'zic2__rowTag';\r\n\r\n    const rowBadge = document.createElement('span');\r\n    rowBadge.className = 'zic2__rowBadge';\r\n    rowBadge.textContent = String(index + 1);\r\n    rowTag.appendChild(rowBadge);\r\n    rowTag.appendChild(document.createTextNode(' Infractiunea #' + (index + 1)));\r\n    rowHeader.appendChild(rowTag);\r\n\r\n    if (index > 0) {\r\n      const deleteBtn = document.createElement('button');\r\n      deleteBtn.type = 'button';\r\n      deleteBtn.className = 'zic2__btn zic2__btn--danger';\r\n      deleteBtn.dataset.action = 'deleteOffense';\r\n      deleteBtn.textContent = 'Sterge';\r\n      rowHeader.appendChild(deleteBtn);\r\n    }\r\n    row.appendChild(rowHeader);\r\n\r\n    \/\/ Offense name field\r\n    const nameField = document.createElement('div');\r\n    nameField.className = 'zic2__field';\r\n    nameField.style.marginBottom = '10px';\r\n\r\n    const nameLabel = document.createElement('label');\r\n    nameLabel.className = 'zic2__label';\r\n    nameLabel.textContent = 'Denumire infractiune';\r\n    nameField.appendChild(nameLabel);\r\n\r\n    const nameInput = document.createElement('input');\r\n    nameInput.className = 'zic2__input';\r\n    nameInput.type = 'text';\r\n    nameInput.placeholder = 'Ex: Inselaciune art. 244 CP';\r\n    nameInput.value = offense.name || ''; \/\/ Input values are automatically escaped by the browser\r\n    nameInput.dataset.field = 'name';\r\n    nameInput.autocomplete = 'off';\r\n    nameInput.maxLength = 200; \/\/ SECURITY: Limit input length\r\n    nameField.appendChild(nameInput);\r\n    row.appendChild(nameField);\r\n\r\n    \/\/ Pills for sentence type\r\n    const pills = document.createElement('div');\r\n    pills.className = 'zic2__pills';\r\n\r\n    \/\/ Life sentence pill\r\n    const lifePill = document.createElement('label');\r\n    lifePill.className = 'zic2__pill' + (offense.isLifeSentence ? ' is-active' : '');\r\n    const lifeCheckbox = document.createElement('input');\r\n    lifeCheckbox.type = 'checkbox';\r\n    lifeCheckbox.checked = !!offense.isLifeSentence;\r\n    lifeCheckbox.dataset.field = 'isLifeSentence';\r\n    lifePill.appendChild(lifeCheckbox);\r\n    const lifeSpan = document.createElement('span');\r\n    lifeSpan.textContent = 'Detentiune pe viata';\r\n    lifePill.appendChild(lifeSpan);\r\n    pills.appendChild(lifePill);\r\n\r\n    \/\/ Fine pill\r\n    const finePill = document.createElement('label');\r\n    finePill.className = 'zic2__pill' + (offense.isFine ? ' is-active' : '');\r\n    const fineCheckbox = document.createElement('input');\r\n    fineCheckbox.type = 'checkbox';\r\n    fineCheckbox.checked = !!offense.isFine;\r\n    fineCheckbox.dataset.field = 'isFine';\r\n    finePill.appendChild(fineCheckbox);\r\n    const fineSpan = document.createElement('span');\r\n    fineSpan.textContent = 'Amenda (unica pedeapsa)';\r\n    finePill.appendChild(fineSpan);\r\n    pills.appendChild(finePill);\r\n\r\n    row.appendChild(pills);\r\n\r\n    \/\/ Max penalty field (conditional)\r\n    if (showMaxPenalty) {\r\n      const maxField = document.createElement('div');\r\n      maxField.className = 'zic2__field';\r\n      maxField.style.marginBottom = '10px';\r\n\r\n      const maxLabel = document.createElement('label');\r\n      maxLabel.className = 'zic2__label';\r\n      maxLabel.textContent = 'Maximum special al pedepsei (ani)';\r\n      maxField.appendChild(maxLabel);\r\n\r\n      const maxInput = document.createElement('input');\r\n      maxInput.className = 'zic2__input';\r\n      maxInput.type = 'number';\r\n      maxInput.min = '0';\r\n      maxInput.max = '100'; \/\/ SECURITY: Reasonable max limit\r\n      maxInput.step = '1';\r\n      maxInput.placeholder = 'Ex: 5';\r\n      maxInput.value = offense.maxPenalty || '';\r\n      maxInput.dataset.field = 'maxPenalty';\r\n      maxInput.inputMode = 'numeric';\r\n      maxInput.autocomplete = 'off';\r\n      maxField.appendChild(maxInput);\r\n\r\n      row.appendChild(maxField);\r\n    }\r\n\r\n    \/\/ Date fields grid\r\n    const dateGrid = document.createElement('div');\r\n    dateGrid.className = 'zic2__rowGrid2';\r\n\r\n    \/\/ Consumption date\r\n    const consumeField = document.createElement('div');\r\n    consumeField.className = 'zic2__field';\r\n    const consumeLabel = document.createElement('label');\r\n    consumeLabel.className = 'zic2__label';\r\n    consumeLabel.textContent = 'Data consumarii';\r\n    consumeField.appendChild(consumeLabel);\r\n    const consumeInput = document.createElement('input');\r\n    consumeInput.className = 'zic2__input';\r\n    consumeInput.type = 'date';\r\n    consumeInput.value = offense.consumptionDate || '';\r\n    consumeInput.dataset.field = 'consumptionDate';\r\n    consumeInput.min = '1900-01-01'; \/\/ SECURITY: Reasonable date limits\r\n    consumeInput.max = '2100-12-31';\r\n    consumeField.appendChild(consumeInput);\r\n    dateGrid.appendChild(consumeField);\r\n\r\n    \/\/ Exhaustion date\r\n    const exhaustField = document.createElement('div');\r\n    exhaustField.className = 'zic2__field';\r\n    const exhaustLabel = document.createElement('label');\r\n    exhaustLabel.className = 'zic2__label';\r\n    exhaustLabel.textContent = 'Data epuizarii (optional)';\r\n    exhaustField.appendChild(exhaustLabel);\r\n    const exhaustInput = document.createElement('input');\r\n    exhaustInput.className = 'zic2__input';\r\n    exhaustInput.type = 'date';\r\n    exhaustInput.value = offense.exhaustionDate || '';\r\n    exhaustInput.dataset.field = 'exhaustionDate';\r\n    exhaustInput.min = '1900-01-01'; \/\/ SECURITY: Reasonable date limits\r\n    exhaustInput.max = '2100-12-31';\r\n    exhaustField.appendChild(exhaustInput);\r\n    dateGrid.appendChild(exhaustField);\r\n\r\n    row.appendChild(dateGrid);\r\n\r\n    return row;\r\n  }\r\n\r\n  function renderOffenses() {\r\n    \/\/ Clear all child elements properly to avoid memory leaks\r\n    while (elements.offenses.firstChild) {\r\n      elements.offenses.removeChild(elements.offenses.firstChild);\r\n    }\r\n    state.offenses.forEach(function(offense, idx) {\r\n      elements.offenses.appendChild(createOffenseRow(offense, idx));\r\n    });\r\n    updateEmptyState();\r\n  }\r\n\r\n  function addOffense() {\r\n    \/\/ SECURITY: Limit number of offenses to prevent DoS\r\n    if (state.offenses.length >= 50) {\r\n      showErrors(['Numarul maxim de infractiuni este 50.']);\r\n      return;\r\n    }\r\n    state.offenses.push({\r\n      name: '',\r\n      consumptionDate: '',\r\n      exhaustionDate: '',\r\n      maxPenalty: '',\r\n      isLifeSentence: false,\r\n      isFine: false\r\n    });\r\n    renderOffenses();\r\n  }\r\n\r\n  function deleteOffense(index) {\r\n    if (state.offenses.length <= 1) return;\r\n    \/\/ SECURITY: Validate index\r\n    if (index < 0 || index >= state.offenses.length) return;\r\n    state.offenses.splice(index, 1);\r\n    renderOffenses();\r\n  }\r\n\r\n  function updateOffenseField(index, field, value) {\r\n    \/\/ SECURITY: Validate index\r\n    if (index < 0 || index >= state.offenses.length) return;\r\n    const offense = state.offenses[index];\r\n    if (!offense) return;\r\n\r\n    \/\/ SECURITY: Whitelist allowed fields\r\n    const allowedFields = ['name', 'consumptionDate', 'exhaustionDate', 'maxPenalty', 'isLifeSentence', 'isFine'];\r\n    if (allowedFields.indexOf(field) === -1) return;\r\n\r\n    if (field === 'isLifeSentence') {\r\n      offense.isLifeSentence = !!value;\r\n      if (offense.isLifeSentence) {\r\n        offense.isFine = false;\r\n        offense.maxPenalty = '';\r\n      }\r\n      renderOffenses();\r\n      return;\r\n    }\r\n    if (field === 'isFine') {\r\n      offense.isFine = !!value;\r\n      if (offense.isFine) {\r\n        offense.isLifeSentence = false;\r\n        offense.maxPenalty = '';\r\n      }\r\n      renderOffenses();\r\n      return;\r\n    }\r\n\r\n    \/\/ SECURITY: Sanitize name field\r\n    if (field === 'name') {\r\n      offense[field] = sanitizeOffenseName(value);\r\n    } else if (field === 'maxPenalty') {\r\n      \/\/ SECURITY: Validate numeric input - allow empty string for clearing\r\n      var strValue = String(value || '').trim();\r\n      if (strValue === '') {\r\n        offense[field] = '';\r\n      } else {\r\n        var validated = validateNumericInput(strValue, 0, 100);\r\n        offense[field] = validated !== null ? String(validated) : offense[field]; \/\/ Keep old value if invalid\r\n      }\r\n    } else if (field === 'consumptionDate' || field === 'exhaustionDate') {\r\n      \/\/ SECURITY: Validate date format - allow empty string for clearing\r\n      var dateValue = String(value || '').trim();\r\n      if (dateValue === '') {\r\n        offense[field] = '';\r\n      } else {\r\n        offense[field] = isValidDateFormat(dateValue) ? dateValue : offense[field]; \/\/ Keep old value if invalid\r\n      }\r\n    } else {\r\n      offense[field] = String(value || '').substring(0, 200);\r\n    }\r\n  }\r\n\r\n  \/\/ === Calculate ===\r\n  function calculate() {\r\n    hideErrors();\r\n\r\n    const regime = elements.favorableLaw.value || '';\r\n    const includePandemic = !!elements.includePandemic.checked;\r\n\r\n    \/\/ SECURITY: Validate regime value\r\n    const validRegimes = ['pre-2018', '2018-2022', 'post-2022'];\r\n    const errors = [];\r\n    if (!regime || validRegimes.indexOf(regime) === -1) {\r\n      errors.push('Selectati perioada (legea penala mai favorabila).');\r\n    }\r\n\r\n    const pandemicStart = parseISOToDay('2020-03-16');\r\n    const pandemicEnd = parseISOToDay('2020-05-14');\r\n\r\n    const results = [];\r\n\r\n    state.offenses.forEach(function(offense, idx) {\r\n      const label = 'Infractiunea #' + (idx + 1);\r\n\r\n      \/\/ SECURITY: Sanitize and validate name\r\n      const sanitizedName = sanitizeOffenseName(offense.name);\r\n      if (!sanitizedName) {\r\n        errors.push(label + ': introduceti denumirea infractiunii.');\r\n        return;\r\n      }\r\n\r\n      const termYears = calculatePrescriptionTermYears(offense);\r\n      if (termYears === null) {\r\n        errors.push(label + ': introduceti maximul special (ani) sau selectati \"detentiune pe viata\" \/ \"amenda\".');\r\n        return;\r\n      }\r\n\r\n      const startISO = offense.exhaustionDate || offense.consumptionDate;\r\n      const startDay = parseISOToDay(startISO);\r\n\r\n      if (startDay === null) {\r\n        errors.push(label + ': introduceti cel putin o data (consumare sau epuizare).');\r\n        return;\r\n      }\r\n\r\n      const generalBase = addYears(startDay, termYears) - 1;\r\n      var generalWith = null;\r\n      if (includePandemic) {\r\n        generalWith = applySuspension(generalBase, startDay, pandemicStart, pandemicEnd);\r\n      }\r\n\r\n      const canInterrupt = interruptionAllowedByRegime(regime);\r\n\r\n      var specialWithout = null;\r\n      var specialWith = null;\r\n\r\n      if (canInterrupt) {\r\n        const specialBase = addYears(startDay, termYears * 2) - 1;\r\n        specialWithout = specialBase;\r\n        if (includePandemic) {\r\n          specialWith = applySuspension(specialBase, startDay, pandemicStart, pandemicEnd);\r\n        }\r\n      }\r\n\r\n      results.push({\r\n        name: sanitizedName, \/\/ SECURITY: Use sanitized name\r\n        termYears: termYears,\r\n        canInterrupt: canInterrupt,\r\n        generalWithout: generalBase,\r\n        generalWith: generalWith,\r\n        specialWithout: specialWithout,\r\n        specialWith: specialWith\r\n      });\r\n    });\r\n\r\n    if (errors.length) {\r\n      showErrors(errors);\r\n      elements.resultCard.classList.add('is-hidden');\r\n      return;\r\n    }\r\n\r\n    state.lastResult = { results: results, includePandemic: includePandemic, regime: regime };\r\n    renderResults(results, includePandemic);\r\n  }\r\n\r\n  \/\/ SECURITY FIX: Build results using DOM methods instead of innerHTML\r\n  function renderResults(results, includePandemic) {\r\n    \/\/ Clear result content properly to avoid memory leaks\r\n    while (elements.resultContent.firstChild) {\r\n      elements.resultContent.removeChild(elements.resultContent.firstChild);\r\n    }\r\n\r\n    \/\/ Pandemic note\r\n    if (includePandemic) {\r\n      elements.pandemicNote.classList.remove('is-hidden');\r\n    } else {\r\n      elements.pandemicNote.classList.add('is-hidden');\r\n    }\r\n\r\n    \/\/ Mobile view container\r\n    const mobileDiv = document.createElement('div');\r\n    mobileDiv.className = 'zic2__mobileResult';\r\n\r\n    results.forEach(function(r) {\r\n      const miniCard = document.createElement('div');\r\n      miniCard.className = 'zic2__miniCard';\r\n\r\n      const miniTitle = document.createElement('div');\r\n      miniTitle.className = 'zic2__miniTitle';\r\n      miniTitle.textContent = r.name; \/\/ SECURITY: textContent escapes HTML\r\n      miniCard.appendChild(miniTitle);\r\n\r\n      const miniGrid = document.createElement('div');\r\n      miniGrid.className = 'zic2__miniGrid';\r\n\r\n      \/\/ Term row\r\n      const termDiv = document.createElement('div');\r\n      const termLabel = document.createElement('div');\r\n      termLabel.className = 'zic2__klabel';\r\n      termLabel.textContent = 'Termen general';\r\n      termDiv.appendChild(termLabel);\r\n      const termValue = document.createElement('div');\r\n      termValue.className = 'zic2__kvalue';\r\n      termValue.textContent = r.termYears + ' ani';\r\n      termDiv.appendChild(termValue);\r\n      miniGrid.appendChild(termDiv);\r\n\r\n      \/\/ Date row\r\n      const dateDiv = document.createElement('div');\r\n      const dateLabel = document.createElement('div');\r\n      dateLabel.className = 'zic2__klabel';\r\n      dateLabel.textContent = 'Data implinirii';\r\n      dateDiv.appendChild(dateLabel);\r\n      const dateValue = document.createElement('div');\r\n      dateValue.className = 'zic2__kvalue';\r\n      dateValue.textContent = formatDay(r.generalWithout);\r\n      dateDiv.appendChild(dateValue);\r\n      if (r.generalWith !== null && r.generalWith !== r.generalWithout) {\r\n        const subdate = document.createElement('div');\r\n        subdate.className = 'zic2__subdate';\r\n        subdate.textContent = formatDay(r.generalWith);\r\n        dateDiv.appendChild(subdate);\r\n      }\r\n      miniGrid.appendChild(dateDiv);\r\n\r\n      \/\/ Interruption row\r\n      const intDiv = document.createElement('div');\r\n      const intLabel = document.createElement('div');\r\n      intLabel.className = 'zic2__klabel';\r\n      intLabel.textContent = 'Intrerupere';\r\n      intDiv.appendChild(intLabel);\r\n      const intValue = document.createElement('div');\r\n      intValue.className = 'zic2__kvalue ' + (r.canInterrupt ? 'zic2__kvalue--yes' : 'zic2__kvalue--no');\r\n      intValue.textContent = r.canInterrupt ? 'Da' : 'Nu';\r\n      intDiv.appendChild(intValue);\r\n      miniGrid.appendChild(intDiv);\r\n\r\n      \/\/ Special term row\r\n      const specDiv = document.createElement('div');\r\n      const specLabel = document.createElement('div');\r\n      specLabel.className = 'zic2__klabel';\r\n      specLabel.textContent = 'Termen special';\r\n      specDiv.appendChild(specLabel);\r\n      const specValue = document.createElement('div');\r\n      specValue.className = 'zic2__kvalue';\r\n      specValue.textContent = r.canInterrupt ? (r.termYears * 2) + ' ani' : '-';\r\n      specDiv.appendChild(specValue);\r\n      miniGrid.appendChild(specDiv);\r\n\r\n      if (r.canInterrupt) {\r\n        const specDateDiv = document.createElement('div');\r\n        specDateDiv.style.gridColumn = '1 \/ -1';\r\n        const specDateLabel = document.createElement('div');\r\n        specDateLabel.className = 'zic2__klabel';\r\n        specDateLabel.textContent = 'Data termen special';\r\n        specDateDiv.appendChild(specDateLabel);\r\n        const specDateValue = document.createElement('div');\r\n        specDateValue.className = 'zic2__kvalue';\r\n        specDateValue.textContent = formatDay(r.specialWithout);\r\n        specDateDiv.appendChild(specDateValue);\r\n        if (r.specialWith !== null && r.specialWith !== r.specialWithout) {\r\n          const specSubdate = document.createElement('div');\r\n          specSubdate.className = 'zic2__subdate';\r\n          specSubdate.textContent = formatDay(r.specialWith);\r\n          specDateDiv.appendChild(specSubdate);\r\n        }\r\n        miniGrid.appendChild(specDateDiv);\r\n      }\r\n\r\n      miniCard.appendChild(miniGrid);\r\n      mobileDiv.appendChild(miniCard);\r\n    });\r\n\r\n    elements.resultContent.appendChild(mobileDiv);\r\n\r\n    \/\/ Desktop view - table\r\n    const desktopDiv = document.createElement('div');\r\n    desktopDiv.className = 'zic2__desktopResult';\r\n\r\n    const tableWrap = document.createElement('div');\r\n    tableWrap.className = 'zic2__tableWrap';\r\n\r\n    const table = document.createElement('table');\r\n    const thead = document.createElement('thead');\r\n    const headerRow = document.createElement('tr');\r\n\r\n    var headers = ['Infractiune', 'Termen', 'Data implinirii', 'Intrerupere', 'T. special', 'Data t. special'];\r\n    headers.forEach(function(h) {\r\n      const th = document.createElement('th');\r\n      th.textContent = h;\r\n      headerRow.appendChild(th);\r\n    });\r\n    thead.appendChild(headerRow);\r\n    table.appendChild(thead);\r\n\r\n    const tbody = document.createElement('tbody');\r\n    results.forEach(function(r) {\r\n      const tr = document.createElement('tr');\r\n\r\n      \/\/ Name cell\r\n      const nameTd = document.createElement('td');\r\n      nameTd.style.fontWeight = '700';\r\n      nameTd.style.color = 'var(--zic-ink)';\r\n      nameTd.textContent = r.name; \/\/ SECURITY: textContent escapes HTML\r\n      tr.appendChild(nameTd);\r\n\r\n      \/\/ Term cell\r\n      const termTd = document.createElement('td');\r\n      termTd.textContent = r.termYears + ' ani';\r\n      tr.appendChild(termTd);\r\n\r\n      \/\/ General date cell\r\n      const dateTd = document.createElement('td');\r\n      dateTd.textContent = formatDay(r.generalWithout);\r\n      if (r.generalWith !== null && r.generalWith !== r.generalWithout) {\r\n        const subdate = document.createElement('div');\r\n        subdate.className = 'zic2__subdate';\r\n        subdate.textContent = formatDay(r.generalWith);\r\n        dateTd.appendChild(subdate);\r\n      }\r\n      tr.appendChild(dateTd);\r\n\r\n      \/\/ Interruption cell\r\n      const intTd = document.createElement('td');\r\n      const chip = document.createElement('span');\r\n      chip.className = 'zic2__chip ' + (r.canInterrupt ? 'zic2__chip--yes' : 'zic2__chip--no');\r\n      chip.textContent = r.canInterrupt ? 'Da' : 'Nu';\r\n      intTd.appendChild(chip);\r\n      tr.appendChild(intTd);\r\n\r\n      \/\/ Special term cell\r\n      const specTd = document.createElement('td');\r\n      specTd.textContent = r.canInterrupt ? (r.termYears * 2) + ' ani' : '-';\r\n      tr.appendChild(specTd);\r\n\r\n      \/\/ Special date cell\r\n      const specDateTd = document.createElement('td');\r\n      if (r.canInterrupt) {\r\n        specDateTd.textContent = formatDay(r.specialWithout);\r\n        if (r.specialWith !== null && r.specialWith !== r.specialWithout) {\r\n          const specSubdate = document.createElement('div');\r\n          specSubdate.className = 'zic2__subdate';\r\n          specSubdate.textContent = formatDay(r.specialWith);\r\n          specDateTd.appendChild(specSubdate);\r\n        }\r\n      } else {\r\n        specDateTd.textContent = '-';\r\n      }\r\n      tr.appendChild(specDateTd);\r\n\r\n      tbody.appendChild(tr);\r\n    });\r\n    table.appendChild(tbody);\r\n    tableWrap.appendChild(table);\r\n    desktopDiv.appendChild(tableWrap);\r\n    elements.resultContent.appendChild(desktopDiv);\r\n\r\n    elements.resultCard.classList.remove('is-hidden');\r\n    setTimeout(function() {\r\n      elements.resultCard.scrollIntoView({ behavior: 'smooth', block: 'nearest' });\r\n    }, 100);\r\n  }\r\n\r\n  function reset() {\r\n    state.offenses = [{ name: '', consumptionDate: '', exhaustionDate: '', maxPenalty: '', isLifeSentence: false, isFine: false }];\r\n    state.lastResult = null;\r\n    elements.favorableLaw.value = '';\r\n    elements.includePandemic.checked = false;\r\n    hideErrors();\r\n    elements.resultCard.classList.add('is-hidden');\r\n    \/\/ Clear result content properly\r\n    while (elements.resultContent.firstChild) {\r\n      elements.resultContent.removeChild(elements.resultContent.firstChild);\r\n    }\r\n    renderOffenses();\r\n  }\r\n\r\n  function loadExample() {\r\n    state.offenses = [\r\n      { name: 'Inselaciune - art. 244 CP', consumptionDate: '2022-03-15', exhaustionDate: '', maxPenalty: '5', isLifeSentence: false, isFine: false },\r\n      { name: 'Fals in inscrisuri - art. 322 CP', consumptionDate: '2022-03-15', exhaustionDate: '', maxPenalty: '3', isLifeSentence: false, isFine: false }\r\n    ];\r\n    elements.favorableLaw.value = 'post-2022';\r\n    elements.includePandemic.checked = false;\r\n    hideErrors();\r\n    elements.resultCard.classList.add('is-hidden');\r\n    renderOffenses();\r\n  }\r\n\r\n  \/\/ SECURITY FIX: Build PDF content using DOM methods and proper escaping\r\n  function exportPDF() {\r\n    if (!state.lastResult || !state.lastResult.results.length) {\r\n      alert('Calculeaza mai intai rezultatul pentru a genera PDF-ul.');\r\n      return;\r\n    }\r\n\r\n    var printWindow = window.open('', '_blank');\r\n    if (!printWindow) {\r\n      alert('Permite pop-up-urile pentru a genera PDF-ul.');\r\n      return;\r\n    }\r\n\r\n    var results = state.lastResult.results;\r\n    var includePandemic = state.lastResult.includePandemic;\r\n    var regime = state.lastResult.regime;\r\n\r\n    var dateStr = new Date().toLocaleDateString('ro-RO', {\r\n      year: 'numeric', month: 'long', day: 'numeric'\r\n    });\r\n\r\n    var regimeLabels = {\r\n      'pre-2018': 'Anterioara datei de 25.06.2018',\r\n      '2018-2022': 'Perioada 25.06.2018 - 30.05.2022',\r\n      'post-2022': 'Ulterioara datei de 30.05.2022'\r\n    };\r\n\r\n    \/\/ Build content using document methods for security\r\n    var doc = printWindow.document;\r\n    doc.open();\r\n\r\n    \/\/ Write the doctype and basic structure\r\n    doc.write('<!DOCTYPE html><html lang=\"ro\"><head><meta charset=\"UTF-8\"><title>Raport Calculator Prescriptie - ZIC Legal<\/title>');\r\n    doc.write('<style>');\r\n    doc.write('* { box-sizing: border-box; margin: 0; padding: 0; }');\r\n    doc.write('body { font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif; max-width: 700px; margin: 0 auto; padding: 40px 30px; color: #1F2937; line-height: 1.6; }');\r\n    doc.write('.header { border-bottom: 3px solid #8A88FF; padding-bottom: 20px; margin-bottom: 30px; }');\r\n    doc.write('.header h1 { color: #6F6CFF; font-size: 24px; margin-bottom: 5px; }');\r\n    doc.write('.header p { color: #6B7280; font-size: 14px; }');\r\n    doc.write('.info { background: #F9FAFB; border-radius: 8px; padding: 15px; margin-bottom: 20px; font-size: 14px; }');\r\n    doc.write('.info strong { color: #374151; }');\r\n    doc.write('table { width: 100%; border-collapse: collapse; margin-bottom: 20px; font-size: 13px; }');\r\n    doc.write('th { background: #F3F4F6; text-align: left; padding: 10px 12px; border-bottom: 2px solid #E5E7EB; font-size: 11px; text-transform: uppercase; color: #6B7280; }');\r\n    doc.write('td { padding: 10px 12px; border-bottom: 1px solid #E5E7EB; vertical-align: top; }');\r\n    doc.write('.name { font-weight: 700; color: #1F2937; }');\r\n    doc.write('.yes { color: #10B981; font-weight: 600; }');\r\n    doc.write('.no { color: #EF4444; font-weight: 600; }');\r\n    doc.write('.subdate { font-size: 12px; color: #6F6CFF; margin-top: 4px; }');\r\n    doc.write('.note { background: #FEF3C7; border: 1px solid #FCD34D; border-radius: 8px; padding: 12px 15px; margin-bottom: 20px; font-size: 13px; color: #92400E; }');\r\n    doc.write('.footer { margin-top: 40px; padding-top: 20px; border-top: 1px solid #E5E7EB; text-align: center; color: #6B7280; font-size: 12px; }');\r\n    doc.write('.footer a { color: #6F6CFF; text-decoration: none; }');\r\n    doc.write('.disclaimer { margin-top: 30px; padding: 15px; background: #F3F4F6; border-radius: 8px; font-size: 11px; color: #6B7280; }');\r\n    doc.write('@media print { body { padding: 20px; } }');\r\n    doc.write('<\/style><\/head><body>');\r\n    doc.close();\r\n\r\n    \/\/ Now build the body content using DOM methods for security\r\n    var body = doc.body;\r\n\r\n    \/\/ Header\r\n    var header = doc.createElement('div');\r\n    header.className = 'header';\r\n    var h1 = doc.createElement('h1');\r\n    h1.textContent = 'Calculator Prescriptie';\r\n    header.appendChild(h1);\r\n    var datePara = doc.createElement('p');\r\n    datePara.textContent = 'Raport generat la ' + dateStr;\r\n    header.appendChild(datePara);\r\n    body.appendChild(header);\r\n\r\n    \/\/ Info section\r\n    var info = doc.createElement('div');\r\n    info.className = 'info';\r\n    var lawStrong = doc.createElement('strong');\r\n    lawStrong.textContent = 'Legea aplicabila: ';\r\n    info.appendChild(lawStrong);\r\n    info.appendChild(doc.createTextNode((regimeLabels[regime] || regime)));\r\n    info.appendChild(doc.createElement('br'));\r\n    var suspStrong = doc.createElement('strong');\r\n    suspStrong.textContent = 'Suspendare pandemie: ';\r\n    info.appendChild(suspStrong);\r\n    info.appendChild(doc.createTextNode(includePandemic ? 'Da' : 'Nu'));\r\n    body.appendChild(info);\r\n\r\n    \/\/ Pandemic note if needed\r\n    if (includePandemic) {\r\n      var note = doc.createElement('div');\r\n      note.className = 'note';\r\n      note.textContent = 'Prima data = fara suspendare. A doua (daca apare) = cu suspendarea pe perioada starii de urgenta.';\r\n      body.appendChild(note);\r\n    }\r\n\r\n    \/\/ Results table\r\n    var table = doc.createElement('table');\r\n    var thead = doc.createElement('thead');\r\n    var headerRow = doc.createElement('tr');\r\n    ['Infractiune', 'Termen', 'Data implinirii', 'Intrerupere', 'T. special', 'Data t. special'].forEach(function(text) {\r\n      var th = doc.createElement('th');\r\n      th.textContent = text;\r\n      headerRow.appendChild(th);\r\n    });\r\n    thead.appendChild(headerRow);\r\n    table.appendChild(thead);\r\n\r\n    var tbody = doc.createElement('tbody');\r\n    results.forEach(function(r) {\r\n      var tr = doc.createElement('tr');\r\n\r\n      \/\/ Name - SECURITY: Using textContent escapes any HTML\r\n      var nameTd = doc.createElement('td');\r\n      nameTd.className = 'name';\r\n      nameTd.textContent = r.name;\r\n      tr.appendChild(nameTd);\r\n\r\n      \/\/ Term\r\n      var termTd = doc.createElement('td');\r\n      termTd.textContent = r.termYears + ' ani';\r\n      tr.appendChild(termTd);\r\n\r\n      \/\/ General date\r\n      var dateTd = doc.createElement('td');\r\n      dateTd.textContent = formatDay(r.generalWithout);\r\n      if (r.generalWith !== null && r.generalWith !== r.generalWithout) {\r\n        var subdate = doc.createElement('div');\r\n        subdate.className = 'subdate';\r\n        subdate.textContent = formatDay(r.generalWith);\r\n        dateTd.appendChild(subdate);\r\n      }\r\n      tr.appendChild(dateTd);\r\n\r\n      \/\/ Interruption\r\n      var intTd = doc.createElement('td');\r\n      intTd.className = r.canInterrupt ? 'yes' : 'no';\r\n      intTd.textContent = r.canInterrupt ? 'Da' : 'Nu';\r\n      tr.appendChild(intTd);\r\n\r\n      \/\/ Special term\r\n      var specTd = doc.createElement('td');\r\n      specTd.textContent = r.canInterrupt ? (r.termYears * 2) + ' ani' : '-';\r\n      tr.appendChild(specTd);\r\n\r\n      \/\/ Special date\r\n      var specDateTd = doc.createElement('td');\r\n      if (r.canInterrupt) {\r\n        specDateTd.textContent = formatDay(r.specialWithout);\r\n        if (r.specialWith !== null && r.specialWith !== r.specialWithout) {\r\n          var specSubdate = doc.createElement('div');\r\n          specSubdate.className = 'subdate';\r\n          specSubdate.textContent = formatDay(r.specialWith);\r\n          specDateTd.appendChild(specSubdate);\r\n        }\r\n      } else {\r\n        specDateTd.textContent = '-';\r\n      }\r\n      tr.appendChild(specDateTd);\r\n\r\n      tbody.appendChild(tr);\r\n    });\r\n    table.appendChild(tbody);\r\n    body.appendChild(table);\r\n\r\n    \/\/ Disclaimer\r\n    var disclaimer = doc.createElement('div');\r\n    disclaimer.className = 'disclaimer';\r\n    var discStrong = doc.createElement('strong');\r\n    discStrong.textContent = 'Disclaimer: ';\r\n    disclaimer.appendChild(discStrong);\r\n    disclaimer.appendChild(doc.createTextNode('Acest raport este oferit exclusiv in scop informativ si educativ. Rezultatele generate nu constituie consultanta juridica si nu pot inlocui sfatul unui avocat specializat.'));\r\n    body.appendChild(disclaimer);\r\n\r\n    \/\/ Footer\r\n    var footer = doc.createElement('div');\r\n    footer.className = 'footer';\r\n    var footerP1 = doc.createElement('p');\r\n    footerP1.textContent = 'Generat cu Calculator Prescriptie';\r\n    footer.appendChild(footerP1);\r\n    var footerP2 = doc.createElement('p');\r\n    var footerLink = doc.createElement('a');\r\n    footerLink.href = 'https:\/\/zic.legal';\r\n    footerLink.textContent = 'ZIC Legal';\r\n    footerLink.rel = 'noopener noreferrer';\r\n    footerP2.appendChild(footerLink);\r\n    footer.appendChild(footerP2);\r\n    body.appendChild(footer);\r\n\r\n    printWindow.focus();\r\n\r\n    setTimeout(function() {\r\n      printWindow.print();\r\n    }, 300);\r\n  }\r\n\r\n  \/\/ === Event Handlers ===\r\n  function handleClick(e) {\r\n    var button = e.target.closest('[data-action]');\r\n    if (!button) return;\r\n\r\n    var action = button.dataset.action;\r\n    var row = button.closest('[data-index]');\r\n    var index = row ? parseInt(row.dataset.index, 10) : -1;\r\n\r\n    \/\/ SECURITY: Validate index\r\n    if (row && (isNaN(index) || index < 0)) return;\r\n\r\n    switch (action) {\r\n      case 'addOffense':\r\n        addOffense();\r\n        break;\r\n      case 'deleteOffense':\r\n        deleteOffense(index);\r\n        break;\r\n      case 'calculate':\r\n        calculate();\r\n        break;\r\n      case 'reset':\r\n        reset();\r\n        break;\r\n      case 'example':\r\n        loadExample();\r\n        break;\r\n      case 'export-pdf':\r\n        exportPDF();\r\n        break;\r\n    }\r\n  }\r\n\r\n  function handleChange(e) {\r\n    var target = e.target;\r\n    var field = target.dataset.field;\r\n    if (!field) return;\r\n\r\n    var row = target.closest('[data-index]');\r\n    if (row) {\r\n      var index = parseInt(row.dataset.index, 10);\r\n      \/\/ SECURITY: Validate index\r\n      if (isNaN(index) || index < 0) return;\r\n      var value = target.type === 'checkbox' ? target.checked : target.value;\r\n      updateOffenseField(index, field, value);\r\n    }\r\n  }\r\n\r\n  \/\/ === SECURITY: Validate input on keydown to prevent invalid characters ===\r\n  function handleKeydown(e) {\r\n    var input = e.target;\r\n    if (!input.matches('.zic2__input[type=\"number\"]')) return;\r\n\r\n    \/\/ Allow: backspace, delete, tab, escape, enter, arrows\r\n    var allowedKeys = ['Backspace', 'Delete', 'Tab', 'Escape', 'Enter', 'ArrowLeft', 'ArrowRight', 'ArrowUp', 'ArrowDown', 'Home', 'End'];\r\n    if (allowedKeys.indexOf(e.key) !== -1) return;\r\n\r\n    \/\/ Allow Ctrl+A, Ctrl+C, Ctrl+V, Ctrl+X\r\n    if ((e.ctrlKey || e.metaKey) && ['a', 'c', 'v', 'x'].indexOf(e.key.toLowerCase()) !== -1) return;\r\n\r\n    \/\/ Block non-numeric characters (including dot, minus, etc.)\r\n    if (!\/^[0-9]$\/.test(e.key)) {\r\n      e.preventDefault();\r\n    }\r\n  }\r\n\r\n  \/\/ === SECURITY: Sanitize pasted content ===\r\n  function handlePaste(e) {\r\n    var input = e.target;\r\n    if (!input.matches('.zic2__input[type=\"number\"]')) return;\r\n\r\n    var pastedData = (e.clipboardData || window.clipboardData).getData('text');\r\n    \/\/ Only allow if pasted data contains only digits\r\n    if (!\/^\\d*$\/.test(pastedData)) {\r\n      e.preventDefault();\r\n      \/\/ Extract only digits from pasted content\r\n      var digitsOnly = pastedData.replace(\/\\D\/g, '');\r\n      if (digitsOnly) {\r\n        \/\/ Insert cleaned data at cursor position\r\n        var start = input.selectionStart;\r\n        var end = input.selectionEnd;\r\n        var currentValue = input.value;\r\n        input.value = currentValue.substring(0, start) + digitsOnly + currentValue.substring(end);\r\n        input.setSelectionRange(start + digitsOnly.length, start + digitsOnly.length);\r\n        \/\/ Trigger change event to update state\r\n        input.dispatchEvent(new Event('change', { bubbles: true }));\r\n      }\r\n    }\r\n  }\r\n\r\n  \/\/ === Initialize ===\r\n  function init() {\r\n    root.addEventListener('click', handleClick);\r\n    root.addEventListener('change', handleChange);\r\n    \/\/ Also listen for 'input' events for real-time text field updates\r\n    root.addEventListener('input', handleChange);\r\n    \/\/ SECURITY: Add input validation handlers\r\n    root.addEventListener('keydown', handleKeydown, true);\r\n    root.addEventListener('paste', handlePaste, true);\r\n\r\n    \/\/ Add initial offense\r\n    state.offenses.push({ name: '', consumptionDate: '', exhaustionDate: '', maxPenalty: '', isLifeSentence: false, isFine: false });\r\n    renderOffenses();\r\n  }\r\n\r\n  if (document.readyState === 'loading') {\r\n    document.addEventListener('DOMContentLoaded', init);\r\n  } else {\r\n    init();\r\n  }\r\n})();\r\n<\/script>\r\n<\/div>\r\n<\/div>\n<div data-tool-content=\"concurs\" style=\"display:none\"><div id=\"zic-concurs-calculator-v2\" class=\"zic2\" data-zic2=\"1\">\r\n  <div class=\"zic2__wrap\">\r\n    <!-- Header -->\r\n    <header class=\"zic2__hero\">\r\n      <div class=\"zic2__brandbar\">\r\n        <div class=\"zic2__mark\" aria-hidden=\"true\">\r\n          <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n            <path d=\"M12 2L2 7l10 5 10-5-10-5z\"\/>\r\n            <path d=\"M2 17l10 5 10-5\"\/>\r\n            <path d=\"M2 12l10 5 10-5\"\/>\r\n          <\/svg>\r\n        <\/div>\r\n        <div class=\"zic2__headerText\">\r\n          <h2 class=\"zic2__title\">Calculator concurs de infrac\u021biuni<\/h2>\r\n          <p class=\"zic2__subtitle\">Calculeaz\u0103 pedeapsa rezultant\u0103 conform art. 39 Cod penal<\/p>\r\n        <\/div>\r\n      <\/div>\r\n    <\/header>\r\n\r\n    <!-- Formula info -->\r\n    <div class=\"zic2__formula\">\r\n      <div class=\"zic2__formulaIcon\">\r\n        <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n          <circle cx=\"12\" cy=\"12\" r=\"10\"\/>\r\n          <path d=\"M12 16v-4\"\/>\r\n          <path d=\"M12 8h.01\"\/>\r\n        <\/svg>\r\n      <\/div>\r\n      <div class=\"zic2__formulaText\">\r\n        <strong>Formula:<\/strong> Pedeapsa cea mai grea + 1\/3 din totalul celorlalte pedepse\r\n      <\/div>\r\n    <\/div>\r\n\r\n    <!-- Card 1: Pedepse -->\r\n    <section class=\"zic2__card\" aria-labelledby=\"zic2-sec-pedepse\">\r\n      <div class=\"zic2__cardHeader\">\r\n        <div class=\"zic2__cardIcon zic2__cardIcon--purple\">\r\n          <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n            <rect x=\"3\" y=\"11\" width=\"18\" height=\"11\" rx=\"2\" ry=\"2\"\/>\r\n            <path d=\"M7 11V7a5 5 0 0 1 10 0v4\"\/>\r\n          <\/svg>\r\n        <\/div>\r\n        <h3 id=\"zic2-sec-pedepse\" class=\"zic2__cardTitle\">Pedepse<\/h3>\r\n      <\/div>\r\n\r\n      <div class=\"zic2__btnGroup\">\r\n        <button type=\"button\" class=\"zic2__btn zic2__btn--outline\" data-action=\"add-prison\">\r\n          <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\"><path d=\"M12 5v14M5 12h14\"\/><\/svg>\r\n          \u00cenchisoare\r\n        <\/button>\r\n        <button type=\"button\" class=\"zic2__btn zic2__btn--outline\" data-action=\"add-fine\">\r\n          <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\"><path d=\"M12 5v14M5 12h14\"\/><\/svg>\r\n          Amend\u0103\r\n        <\/button>\r\n        <button type=\"button\" class=\"zic2__btn zic2__btn--success\" data-action=\"example\">\r\n          <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><path d=\"M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z\"\/><polyline points=\"14 2 14 8 20 8\"\/><line x1=\"16\" y1=\"13\" x2=\"8\" y2=\"13\"\/><line x1=\"16\" y1=\"17\" x2=\"8\" y2=\"17\"\/><\/svg>\r\n          Exemplu\r\n        <\/button>\r\n      <\/div>\r\n\r\n      <!-- Pedepse cu inchisoarea -->\r\n      <div class=\"zic2__section\">\r\n        <div class=\"zic2__sectionHeader\">\r\n          <span class=\"zic2__sectionTitle\">Pedepse cu \u00eenchisoarea<\/span>\r\n          <span class=\"zic2__badge\" data-live=\"prisonCount\">0<\/span>\r\n        <\/div>\r\n        <div class=\"zic2__rows\" data-rows=\"prison\"><\/div>\r\n        <div class=\"zic2__emptyState\" data-empty=\"prison\">\r\n          <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\"><rect x=\"3\" y=\"11\" width=\"18\" height=\"11\" rx=\"2\" ry=\"2\"\/><path d=\"M7 11V7a5 5 0 0 1 10 0v4\"\/><\/svg>\r\n          <span>Adaug\u0103 o pedeaps\u0103 cu \u00eenchisoarea<\/span>\r\n        <\/div>\r\n      <\/div>\r\n\r\n      <!-- Amenzi -->\r\n      <div class=\"zic2__section\">\r\n        <div class=\"zic2__sectionHeader\">\r\n          <span class=\"zic2__sectionTitle\">Amenzi<\/span>\r\n          <span class=\"zic2__badge\" data-live=\"fineCount\">0<\/span>\r\n        <\/div>\r\n        <div class=\"zic2__rows\" data-rows=\"fine\"><\/div>\r\n        <div class=\"zic2__emptyState\" data-empty=\"fine\">\r\n          <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\"><line x1=\"12\" y1=\"1\" x2=\"12\" y2=\"23\"\/><path d=\"M17 5H9.5a3.5 3.5 0 0 0 0 7h5a3.5 3.5 0 0 1 0 7H6\"\/><\/svg>\r\n          <span>Adaug\u0103 o amend\u0103 (op\u021bional)<\/span>\r\n        <\/div>\r\n      <\/div>\r\n\r\n      <div class=\"zic2__error is-hidden\" role=\"alert\" aria-live=\"polite\" data-error=\"prison\"><\/div>\r\n\r\n      <!-- Hint -->\r\n      <div class=\"zic2__hint\">\r\n        <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><circle cx=\"12\" cy=\"12\" r=\"10\"\/><path d=\"M9.09 9a3 3 0 0 1 5.83 1c0 2-3 3-3 3\"\/><path d=\"M12 17h.01\"\/><\/svg>\r\n        <span>La <strong>\"Max lege\"<\/strong> completeaz\u0103 maximul special al infrac\u021biunii pentru verificarea art. 39 alin. (2).<\/span>\r\n      <\/div>\r\n    <\/section>\r\n\r\n    <!-- Card 2: Deduceri -->\r\n    <section class=\"zic2__card\" aria-labelledby=\"zic2-sec-deduceri\">\r\n      <div class=\"zic2__cardHeader\">\r\n        <div class=\"zic2__cardIcon zic2__cardIcon--blue\">\r\n          <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n            <line x1=\"5\" y1=\"12\" x2=\"19\" y2=\"12\"\/>\r\n          <\/svg>\r\n        <\/div>\r\n        <h3 id=\"zic2-sec-deduceri\" class=\"zic2__cardTitle\">Deduceri <span class=\"zic2__optional\">(op\u021bional)<\/span><\/h3>\r\n      <\/div>\r\n\r\n      <div class=\"zic2__deduceriGrid\">\r\n        <div class=\"zic2__deduceriBox\">\r\n          <div class=\"zic2__deduceriLabel\">Durat\u0103 executat\u0103 \/ re\u021binere<\/div>\r\n          <div class=\"zic2__inputGroup\">\r\n            <div class=\"zic2__field\">\r\n              <label class=\"zic2__label\" for=\"zic2-ded-ani\">Ani<\/label>\r\n              <input id=\"zic2-ded-ani\" class=\"zic2__input\" type=\"number\" min=\"0\" max=\"100\" inputmode=\"numeric\" placeholder=\"0\" autocomplete=\"off\">\r\n            <\/div>\r\n            <div class=\"zic2__field\">\r\n              <label class=\"zic2__label\" for=\"zic2-ded-luni\">Luni<\/label>\r\n              <input id=\"zic2-ded-luni\" class=\"zic2__input\" type=\"number\" min=\"0\" max=\"11\" inputmode=\"numeric\" placeholder=\"0\" autocomplete=\"off\">\r\n            <\/div>\r\n            <div class=\"zic2__field\">\r\n              <label class=\"zic2__label\" for=\"zic2-ded-zile\">Zile<\/label>\r\n              <input id=\"zic2-ded-zile\" class=\"zic2__input\" type=\"number\" min=\"0\" max=\"29\" inputmode=\"numeric\" placeholder=\"0\" autocomplete=\"off\">\r\n            <\/div>\r\n          <\/div>\r\n        <\/div>\r\n\r\n        <div class=\"zic2__deduceriBox\">\r\n          <div class=\"zic2__deduceriLabel\">Amend\u0103 achitat\u0103<\/div>\r\n          <div class=\"zic2__field\">\r\n            <label class=\"zic2__label\" for=\"zic2-amenda-dedusa\">Sum\u0103 (lei)<\/label>\r\n            <input id=\"zic2-amenda-dedusa\" class=\"zic2__input\" type=\"number\" min=\"0\" max=\"999999999\" inputmode=\"numeric\" placeholder=\"0\" autocomplete=\"off\">\r\n          <\/div>\r\n        <\/div>\r\n      <\/div>\r\n    <\/section>\r\n\r\n    <!-- Actions -->\r\n    <div class=\"zic2__actions\">\r\n      <button type=\"button\" class=\"zic2__btn zic2__btn--primary zic2__btn--large\" data-action=\"calculate\">\r\n        <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\"><polyline points=\"9 11 12 14 22 4\"\/><path d=\"M21 12v7a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h11\"\/><\/svg>\r\n        Calculeaz\u0103\r\n      <\/button>\r\n      <button type=\"button\" class=\"zic2__btn zic2__btn--secondary\" data-action=\"reset\">\r\n        <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><path d=\"M3 12a9 9 0 1 0 9-9 9.75 9.75 0 0 0-6.74 2.74L3 8\"\/><path d=\"M3 3v5h5\"\/><\/svg>\r\n        Reseteaz\u0103\r\n      <\/button>\r\n      <button type=\"button\" class=\"zic2__btn zic2__btn--secondary\" data-action=\"export-pdf\">\r\n        <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><path d=\"M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z\"\/><polyline points=\"14 2 14 8 20 8\"\/><path d=\"M12 18v-6\"\/><path d=\"M9 15l3 3 3-3\"\/><\/svg>\r\n        Descarc\u0103 PDF\r\n      <\/button>\r\n    <\/div>\r\n\r\n    <!-- Result -->\r\n    <section class=\"zic2__card zic2__resultCard is-hidden\" data-result aria-live=\"polite\">\r\n      <div class=\"zic2__cardHeader\">\r\n        <div class=\"zic2__cardIcon zic2__cardIcon--green\">\r\n          <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\"><polyline points=\"20 6 9 17 4 12\"\/><\/svg>\r\n        <\/div>\r\n        <h3 class=\"zic2__cardTitle\">Rezultat calcul<\/h3>\r\n      <\/div>\r\n      <div class=\"zic2__resultBody\" data-result-content><\/div>\r\n    <\/section>\r\n\r\n    <!-- Disclaimer -->\r\n    <div class=\"zic2__disclaimer\">\r\n      <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><path d=\"M10.29 3.86L1.82 18a2 2 0 0 0 1.71 3h16.94a2 2 0 0 0 1.71-3L13.71 3.86a2 2 0 0 0-3.42 0z\"\/><line x1=\"12\" y1=\"9\" x2=\"12\" y2=\"13\"\/><line x1=\"12\" y1=\"17\" x2=\"12.01\" y2=\"17\"\/><\/svg>\r\n      <div>\r\n        <strong>Disclaimer:<\/strong> Acest calculator este oferit exclusiv \u00een scop informativ \u0219i educativ. Rezultatele generate nu constituie consultan\u021b\u0103 juridic\u0103 \u0219i nu pot \u00eenlocui sfatul unui avocat specializat.\r\n      <\/div>\r\n    <\/div>\r\n\r\n    <!-- Footer -->\r\n    <footer class=\"zic2__footer\">\r\n      <a href=\"https:\/\/zic.legal\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"zic2__footerLink\">\r\n        \u00a9 2025 ZIC Legal\r\n      <\/a>\r\n    <\/footer>\r\n  <\/div>\r\n<\/div>\r\n\r\n<style>\r\n\/* ============================================================\r\n   ZIC Calculator v3.0 - Concurs de Infrac\u021biuni (SECURIZAT)\r\n   Theme: Purple\/Mov | Fully Responsive | Optimized\r\n   Security: XSS Protection, Input Validation, Safe DOM\r\n   ============================================================ *\/\r\n\r\n\/* === CSS Variables === *\/\r\n#zic-concurs-calculator-v2 {\r\n  --zic-primary: #8A88FF;\r\n  --zic-primary-dark: #6F6CFF;\r\n  --zic-primary-light: rgba(138,136,255,.08);\r\n  --zic-primary-border: rgba(138,136,255,.25);\r\n\r\n  --zic-success: #10B981;\r\n  --zic-success-light: rgba(16,185,129,.08);\r\n  --zic-success-border: rgba(16,185,129,.25);\r\n\r\n  --zic-danger: #EF4444;\r\n  --zic-danger-light: rgba(239,68,68,.08);\r\n  --zic-danger-border: rgba(239,68,68,.25);\r\n\r\n  --zic-warning: #F59E0B;\r\n  --zic-warning-light: rgba(245,158,11,.08);\r\n  --zic-warning-border: rgba(245,158,11,.25);\r\n\r\n  --zic-blue: #3B82F6;\r\n  --zic-blue-light: rgba(59,130,246,.08);\r\n\r\n  --zic-ink: #1F2937;\r\n  --zic-ink-light: #374151;\r\n  --zic-muted: #6B7280;\r\n  --zic-light: #9CA3AF;\r\n\r\n  --zic-bg: #F9FAFB;\r\n  --zic-surface: #FFFFFF;\r\n  --zic-border: #E5E7EB;\r\n\r\n  --zic-shadow-sm: 0 1px 2px rgba(0,0,0,.05);\r\n  --zic-shadow: 0 4px 6px -1px rgba(0,0,0,.1), 0 2px 4px -1px rgba(0,0,0,.06);\r\n  --zic-shadow-lg: 0 10px 15px -3px rgba(0,0,0,.1), 0 4px 6px -2px rgba(0,0,0,.05);\r\n\r\n  --zic-radius: 16px;\r\n  --zic-radius-sm: 12px;\r\n  --zic-radius-xs: 8px;\r\n\r\n  --zic-transition: 150ms ease;\r\n\r\n  font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif;\r\n  color: var(--zic-ink);\r\n  line-height: 1.5;\r\n  -webkit-font-smoothing: antialiased;\r\n}\r\n\r\n#zic-concurs-calculator-v2 *,\r\n#zic-concurs-calculator-v2 *::before,\r\n#zic-concurs-calculator-v2 *::after {\r\n  box-sizing: border-box;\r\n}\r\n\r\n\/* === WordPress\/Avada Override Protection === *\/\r\n#zic-concurs-calculator-v2 input[type=\"number\"],\r\n#zic-concurs-calculator-v2 input[type=\"text\"] {\r\n  -webkit-appearance: none !important;\r\n  -moz-appearance: textfield !important;\r\n  appearance: none !important;\r\n  background-image: none !important;\r\n  box-shadow: none !important;\r\n}\r\n\r\n#zic-concurs-calculator-v2 button:not(.zic2__btn--primary) {\r\n  background-image: none !important;\r\n}\r\n\r\n#zic-concurs-calculator-v2 button {\r\n  text-shadow: none !important;\r\n  letter-spacing: normal !important;\r\n}\r\n\r\n#zic-concurs-calculator-v2 h2,\r\n#zic-concurs-calculator-v2 h3 {\r\n  text-transform: none !important;\r\n  letter-spacing: normal !important;\r\n}\r\n\r\n#zic-concurs-calculator-v2 a {\r\n  text-decoration: none;\r\n}\r\n\r\n#zic-concurs-calculator-v2 a:hover {\r\n  text-decoration: underline;\r\n}\r\n\r\n\/* === Layout === *\/\r\n#zic-concurs-calculator-v2 .zic2__wrap {\r\n  max-width: 720px;\r\n  margin: 0 auto;\r\n  padding: 16px;\r\n}\r\n\r\n\/* === Header === *\/\r\n#zic-concurs-calculator-v2 .zic2__hero {\r\n  margin-bottom: 16px;\r\n}\r\n\r\n#zic-concurs-calculator-v2 .zic2__brandbar {\r\n  display: flex;\r\n  align-items: center;\r\n  gap: 14px;\r\n  background: linear-gradient(135deg, var(--zic-primary), var(--zic-primary-dark));\r\n  border-radius: var(--zic-radius);\r\n  padding: 20px;\r\n  color: #fff;\r\n  box-shadow: var(--zic-shadow-lg);\r\n}\r\n\r\n#zic-concurs-calculator-v2 .zic2__mark {\r\n  width: 48px;\r\n  height: 48px;\r\n  background: rgba(255,255,255,.2);\r\n  border-radius: 12px;\r\n  display: flex;\r\n  align-items: center;\r\n  justify-content: center;\r\n  flex-shrink: 0;\r\n}\r\n\r\n#zic-concurs-calculator-v2 .zic2__headerText {\r\n  flex: 1;\r\n  min-width: 0;\r\n}\r\n\r\n#zic-concurs-calculator-v2 .zic2__title {\r\n  margin: 0;\r\n  font-size: 20px;\r\n  font-weight: 700;\r\n  line-height: 1.2;\r\n}\r\n\r\n#zic-concurs-calculator-v2 .zic2__subtitle {\r\n  margin: 4px 0 0;\r\n  font-size: 14px;\r\n  opacity: 0.9;\r\n}\r\n\r\n\/* === Formula Box === *\/\r\n#zic-concurs-calculator-v2 .zic2__formula {\r\n  display: flex;\r\n  align-items: flex-start;\r\n  gap: 10px;\r\n  background: var(--zic-primary-light);\r\n  border: 1px solid var(--zic-primary-border);\r\n  border-radius: var(--zic-radius-sm);\r\n  padding: 12px 14px;\r\n  margin-bottom: 16px;\r\n  font-size: 14px;\r\n  color: var(--zic-ink-light);\r\n}\r\n\r\n#zic-concurs-calculator-v2 .zic2__formulaIcon {\r\n  color: var(--zic-primary-dark);\r\n  flex-shrink: 0;\r\n  margin-top: 1px;\r\n}\r\n\r\n#zic-concurs-calculator-v2 .zic2__formulaText strong {\r\n  color: var(--zic-ink);\r\n}\r\n\r\n\/* === Cards === *\/\r\n#zic-concurs-calculator-v2 .zic2__card {\r\n  background: var(--zic-surface);\r\n  border: 1px solid var(--zic-border);\r\n  border-radius: var(--zic-radius);\r\n  padding: 20px;\r\n  margin-bottom: 16px;\r\n  box-shadow: var(--zic-shadow-sm);\r\n}\r\n\r\n#zic-concurs-calculator-v2 .zic2__cardHeader {\r\n  display: flex;\r\n  align-items: center;\r\n  gap: 12px;\r\n  margin-bottom: 16px;\r\n}\r\n\r\n#zic-concurs-calculator-v2 .zic2__cardIcon {\r\n  width: 36px;\r\n  height: 36px;\r\n  border-radius: 10px;\r\n  display: flex;\r\n  align-items: center;\r\n  justify-content: center;\r\n  flex-shrink: 0;\r\n}\r\n\r\n#zic-concurs-calculator-v2 .zic2__cardIcon--purple {\r\n  background: var(--zic-primary-light);\r\n  color: var(--zic-primary-dark);\r\n}\r\n\r\n#zic-concurs-calculator-v2 .zic2__cardIcon--blue {\r\n  background: var(--zic-blue-light);\r\n  color: var(--zic-blue);\r\n}\r\n\r\n#zic-concurs-calculator-v2 .zic2__cardIcon--green {\r\n  background: var(--zic-success-light);\r\n  color: var(--zic-success);\r\n}\r\n\r\n#zic-concurs-calculator-v2 .zic2__cardTitle {\r\n  margin: 0;\r\n  font-size: 17px;\r\n  font-weight: 700;\r\n  color: var(--zic-ink);\r\n}\r\n\r\n#zic-concurs-calculator-v2 .zic2__optional {\r\n  font-weight: 400;\r\n  color: var(--zic-muted);\r\n  font-size: 14px;\r\n}\r\n\r\n\/* === Buttons === *\/\r\n#zic-concurs-calculator-v2 .zic2__btnGroup {\r\n  display: flex;\r\n  flex-wrap: wrap;\r\n  gap: 8px;\r\n  margin-bottom: 20px;\r\n}\r\n\r\n#zic-concurs-calculator-v2 .zic2__btn {\r\n  display: inline-flex;\r\n  align-items: center;\r\n  justify-content: center;\r\n  gap: 6px;\r\n  padding: 10px 16px;\r\n  font-size: 14px;\r\n  font-weight: 600;\r\n  border-radius: var(--zic-radius-sm);\r\n  border: 1px solid transparent;\r\n  cursor: pointer;\r\n  transition: all var(--zic-transition);\r\n  white-space: nowrap;\r\n  text-decoration: none;\r\n}\r\n\r\n#zic-concurs-calculator-v2 .zic2__btn:focus {\r\n  outline: none;\r\n  box-shadow: 0 0 0 3px var(--zic-primary-border);\r\n}\r\n\r\n#zic-concurs-calculator-v2 .zic2__btn:active {\r\n  transform: translateY(1px);\r\n}\r\n\r\n#zic-concurs-calculator-v2 .zic2__btn--primary {\r\n  background: linear-gradient(135deg, var(--zic-primary), var(--zic-primary-dark));\r\n  color: #fff;\r\n  box-shadow: 0 4px 14px rgba(138,136,255,.35);\r\n}\r\n\r\n#zic-concurs-calculator-v2 .zic2__btn--primary:hover {\r\n  box-shadow: 0 6px 20px rgba(138,136,255,.45);\r\n  transform: translateY(-1px);\r\n}\r\n\r\n#zic-concurs-calculator-v2 .zic2__btn--large {\r\n  padding: 14px 24px;\r\n  font-size: 15px;\r\n}\r\n\r\n#zic-concurs-calculator-v2 .zic2__btn--secondary {\r\n  background: var(--zic-surface);\r\n  border-color: var(--zic-border);\r\n  color: var(--zic-ink-light);\r\n}\r\n\r\n#zic-concurs-calculator-v2 .zic2__btn--secondary:hover {\r\n  background: var(--zic-bg);\r\n  border-color: var(--zic-primary-border);\r\n  color: var(--zic-primary-dark);\r\n}\r\n\r\n#zic-concurs-calculator-v2 .zic2__btn--outline {\r\n  background: var(--zic-surface);\r\n  border-color: var(--zic-primary-border);\r\n  color: var(--zic-primary-dark);\r\n}\r\n\r\n#zic-concurs-calculator-v2 .zic2__btn--outline:hover {\r\n  background: var(--zic-primary-light);\r\n}\r\n\r\n#zic-concurs-calculator-v2 .zic2__btn--success {\r\n  background: var(--zic-success-light);\r\n  border-color: var(--zic-success-border);\r\n  color: var(--zic-success);\r\n}\r\n\r\n#zic-concurs-calculator-v2 .zic2__btn--success:hover {\r\n  background: rgba(16,185,129,.15);\r\n}\r\n\r\n#zic-concurs-calculator-v2 .zic2__btn--danger {\r\n  background: var(--zic-danger-light);\r\n  border-color: var(--zic-danger-border);\r\n  color: var(--zic-danger);\r\n  padding: 8px 12px;\r\n  font-size: 13px;\r\n}\r\n\r\n#zic-concurs-calculator-v2 .zic2__btn--danger:hover {\r\n  background: rgba(239,68,68,.15);\r\n}\r\n\r\n\/* === Sections === *\/\r\n#zic-concurs-calculator-v2 .zic2__section {\r\n  margin-bottom: 20px;\r\n}\r\n\r\n#zic-concurs-calculator-v2 .zic2__section:last-of-type {\r\n  margin-bottom: 16px;\r\n}\r\n\r\n#zic-concurs-calculator-v2 .zic2__sectionHeader {\r\n  display: flex;\r\n  align-items: center;\r\n  justify-content: space-between;\r\n  margin-bottom: 10px;\r\n}\r\n\r\n#zic-concurs-calculator-v2 .zic2__sectionTitle {\r\n  font-size: 13px;\r\n  font-weight: 700;\r\n  color: var(--zic-primary-dark);\r\n  text-transform: uppercase;\r\n  letter-spacing: 0.5px;\r\n}\r\n\r\n#zic-concurs-calculator-v2 .zic2__badge {\r\n  display: inline-flex;\r\n  align-items: center;\r\n  justify-content: center;\r\n  min-width: 24px;\r\n  height: 24px;\r\n  padding: 0 8px;\r\n  background: var(--zic-primary-light);\r\n  color: var(--zic-primary-dark);\r\n  font-size: 12px;\r\n  font-weight: 700;\r\n  border-radius: 12px;\r\n}\r\n\r\n\/* === Rows (Pedepse) === *\/\r\n#zic-concurs-calculator-v2 .zic2__rows {\r\n  display: flex;\r\n  flex-direction: column;\r\n  gap: 10px;\r\n}\r\n\r\n#zic-concurs-calculator-v2 .zic2__row {\r\n  background: var(--zic-bg);\r\n  border: 1px solid var(--zic-border);\r\n  border-radius: var(--zic-radius-sm);\r\n  padding: 14px;\r\n  transition: border-color var(--zic-transition);\r\n}\r\n\r\n#zic-concurs-calculator-v2 .zic2__row:hover {\r\n  border-color: var(--zic-primary-border);\r\n}\r\n\r\n#zic-concurs-calculator-v2 .zic2__rowHeader {\r\n  display: flex;\r\n  align-items: center;\r\n  justify-content: space-between;\r\n  margin-bottom: 12px;\r\n}\r\n\r\n#zic-concurs-calculator-v2 .zic2__rowTag {\r\n  display: inline-flex;\r\n  align-items: center;\r\n  gap: 6px;\r\n  font-size: 13px;\r\n  font-weight: 700;\r\n  color: var(--zic-ink-light);\r\n}\r\n\r\n#zic-concurs-calculator-v2 .zic2__rowTag svg {\r\n  color: var(--zic-muted);\r\n}\r\n\r\n#zic-concurs-calculator-v2 .zic2__rowGrid {\r\n  display: grid;\r\n  grid-template-columns: 1fr 1fr;\r\n  gap: 10px;\r\n}\r\n\r\n\/* === Empty State === *\/\r\n#zic-concurs-calculator-v2 .zic2__emptyState {\r\n  display: flex;\r\n  flex-direction: column;\r\n  align-items: center;\r\n  justify-content: center;\r\n  gap: 8px;\r\n  padding: 24px;\r\n  background: var(--zic-bg);\r\n  border: 2px dashed var(--zic-border);\r\n  border-radius: var(--zic-radius-sm);\r\n  color: var(--zic-light);\r\n  font-size: 13px;\r\n  text-align: center;\r\n}\r\n\r\n\/* === Hint === *\/\r\n#zic-concurs-calculator-v2 .zic2__hint {\r\n  display: flex;\r\n  align-items: flex-start;\r\n  gap: 8px;\r\n  padding: 10px 12px;\r\n  background: var(--zic-bg);\r\n  border-radius: var(--zic-radius-xs);\r\n  font-size: 12px;\r\n  color: var(--zic-muted);\r\n}\r\n\r\n#zic-concurs-calculator-v2 .zic2__hint svg {\r\n  flex-shrink: 0;\r\n  margin-top: 1px;\r\n}\r\n\r\n#zic-concurs-calculator-v2 .zic2__hint strong {\r\n  color: var(--zic-ink-light);\r\n}\r\n\r\n\/* === Fields === *\/\r\n#zic-concurs-calculator-v2 .zic2__field {\r\n  display: flex;\r\n  flex-direction: column;\r\n  gap: 4px;\r\n}\r\n\r\n#zic-concurs-calculator-v2 .zic2__label {\r\n  font-size: 12px;\r\n  font-weight: 600;\r\n  color: var(--zic-muted);\r\n}\r\n\r\n#zic-concurs-calculator-v2 .zic2__input {\r\n  width: 100%;\r\n  padding: 10px 12px;\r\n  font-size: 15px;\r\n  font-family: inherit;\r\n  color: var(--zic-ink);\r\n  background: var(--zic-surface);\r\n  border: 2px solid var(--zic-border);\r\n  border-radius: var(--zic-radius-xs);\r\n  outline: none;\r\n  transition: border-color var(--zic-transition), box-shadow var(--zic-transition);\r\n  -moz-appearance: textfield;\r\n}\r\n\r\n#zic-concurs-calculator-v2 .zic2__input::-webkit-outer-spin-button,\r\n#zic-concurs-calculator-v2 .zic2__input::-webkit-inner-spin-button {\r\n  -webkit-appearance: none;\r\n  margin: 0;\r\n}\r\n\r\n#zic-concurs-calculator-v2 .zic2__input::placeholder {\r\n  color: var(--zic-light);\r\n}\r\n\r\n#zic-concurs-calculator-v2 .zic2__input:focus {\r\n  border-color: var(--zic-primary);\r\n  box-shadow: 0 0 0 3px var(--zic-primary-light);\r\n}\r\n\r\n\/* === Deduceri Grid === *\/\r\n#zic-concurs-calculator-v2 .zic2__deduceriGrid {\r\n  display: grid;\r\n  gap: 16px;\r\n}\r\n\r\n#zic-concurs-calculator-v2 .zic2__deduceriBox {\r\n  background: var(--zic-bg);\r\n  border-radius: var(--zic-radius-sm);\r\n  padding: 14px;\r\n}\r\n\r\n#zic-concurs-calculator-v2 .zic2__deduceriLabel {\r\n  font-size: 13px;\r\n  font-weight: 700;\r\n  color: var(--zic-ink-light);\r\n  margin-bottom: 10px;\r\n}\r\n\r\n#zic-concurs-calculator-v2 .zic2__inputGroup {\r\n  display: grid;\r\n  grid-template-columns: repeat(3, 1fr);\r\n  gap: 10px;\r\n}\r\n\r\n\/* === Actions === *\/\r\n#zic-concurs-calculator-v2 .zic2__actions {\r\n  display: flex;\r\n  flex-wrap: wrap;\r\n  gap: 10px;\r\n  margin-bottom: 16px;\r\n}\r\n\r\n#zic-concurs-calculator-v2 .zic2__actions .zic2__btn--primary {\r\n  flex: 1;\r\n  min-width: 200px;\r\n}\r\n\r\n\/* === Error === *\/\r\n#zic-concurs-calculator-v2 .zic2__error {\r\n  margin-top: 12px;\r\n  padding: 12px;\r\n  background: var(--zic-danger-light);\r\n  border: 1px solid var(--zic-danger-border);\r\n  border-radius: var(--zic-radius-xs);\r\n  color: var(--zic-danger);\r\n  font-size: 13px;\r\n  font-weight: 500;\r\n}\r\n\r\n\/* === Result === *\/\r\n#zic-concurs-calculator-v2 .zic2__resultCard {\r\n  border-color: var(--zic-success-border);\r\n  background: linear-gradient(135deg, rgba(16,185,129,.02), rgba(16,185,129,.06));\r\n}\r\n\r\n#zic-concurs-calculator-v2 .zic2__resultBody {\r\n  display: flex;\r\n  flex-direction: column;\r\n  gap: 16px;\r\n}\r\n\r\n#zic-concurs-calculator-v2 .zic2__kpi {\r\n  background: var(--zic-surface);\r\n  border: 1px solid var(--zic-border);\r\n  border-radius: var(--zic-radius-sm);\r\n  padding: 16px;\r\n}\r\n\r\n#zic-concurs-calculator-v2 .zic2__kpiLabel {\r\n  font-size: 12px;\r\n  font-weight: 600;\r\n  color: var(--zic-muted);\r\n  text-transform: uppercase;\r\n  letter-spacing: 0.5px;\r\n  margin-bottom: 6px;\r\n}\r\n\r\n#zic-concurs-calculator-v2 .zic2__kpiValue {\r\n  font-size: 22px;\r\n  font-weight: 800;\r\n  color: var(--zic-primary-dark);\r\n  margin: 0;\r\n}\r\n\r\n#zic-concurs-calculator-v2 .zic2__detailsList {\r\n  margin: 0;\r\n  padding-left: 20px;\r\n  font-size: 14px;\r\n  color: var(--zic-ink-light);\r\n}\r\n\r\n#zic-concurs-calculator-v2 .zic2__detailsList li {\r\n  margin-bottom: 6px;\r\n}\r\n\r\n#zic-concurs-calculator-v2 .zic2__detailsList li:last-child {\r\n  margin-bottom: 0;\r\n}\r\n\r\n#zic-concurs-calculator-v2 .zic2__alert {\r\n  display: flex;\r\n  align-items: flex-start;\r\n  gap: 10px;\r\n  padding: 12px 14px;\r\n  border-radius: var(--zic-radius-xs);\r\n  font-size: 13px;\r\n}\r\n\r\n#zic-concurs-calculator-v2 .zic2__alert--warning {\r\n  background: var(--zic-warning-light);\r\n  border: 1px solid var(--zic-warning-border);\r\n  color: #92400E;\r\n}\r\n\r\n#zic-concurs-calculator-v2 .zic2__alert--danger {\r\n  background: var(--zic-danger-light);\r\n  border: 1px solid var(--zic-danger-border);\r\n  color: var(--zic-danger);\r\n}\r\n\r\n#zic-concurs-calculator-v2 .zic2__alert svg {\r\n  flex-shrink: 0;\r\n  margin-top: 1px;\r\n}\r\n\r\n\/* === Disclaimer === *\/\r\n#zic-concurs-calculator-v2 .zic2__disclaimer {\r\n  display: flex;\r\n  align-items: flex-start;\r\n  gap: 10px;\r\n  padding: 14px;\r\n  background: var(--zic-bg);\r\n  border: 1px solid var(--zic-border);\r\n  border-radius: var(--zic-radius-sm);\r\n  font-size: 12px;\r\n  color: var(--zic-muted);\r\n  line-height: 1.5;\r\n  margin-bottom: 16px;\r\n}\r\n\r\n#zic-concurs-calculator-v2 .zic2__disclaimer svg {\r\n  flex-shrink: 0;\r\n  color: var(--zic-warning);\r\n  margin-top: 1px;\r\n}\r\n\r\n#zic-concurs-calculator-v2 .zic2__disclaimer strong {\r\n  color: var(--zic-ink-light);\r\n}\r\n\r\n\/* === Footer === *\/\r\n#zic-concurs-calculator-v2 .zic2__footer {\r\n  text-align: center;\r\n  padding: 8px 0;\r\n}\r\n\r\n#zic-concurs-calculator-v2 .zic2__footerLink {\r\n  color: var(--zic-primary-dark);\r\n  text-decoration: none;\r\n  font-size: 13px;\r\n  font-weight: 600;\r\n  transition: color var(--zic-transition);\r\n}\r\n\r\n#zic-concurs-calculator-v2 .zic2__footerLink:hover {\r\n  color: var(--zic-primary);\r\n  text-decoration: underline;\r\n}\r\n\r\n\/* === Utility === *\/\r\n#zic-concurs-calculator-v2 .is-hidden {\r\n  display: none !important;\r\n}\r\n\r\n\/* === RESPONSIVE === *\/\r\n\r\n\/* Small mobile (max 500px) *\/\r\n@media (max-width: 500px) {\r\n  #zic-concurs-calculator-v2 .zic2__actions {\r\n    flex-direction: column;\r\n  }\r\n\r\n  #zic-concurs-calculator-v2 .zic2__actions .zic2__btn {\r\n    width: 100%;\r\n    min-width: unset;\r\n  }\r\n\r\n  #zic-concurs-calculator-v2 .zic2__btnGroup {\r\n    flex-direction: column;\r\n  }\r\n\r\n  #zic-concurs-calculator-v2 .zic2__btnGroup .zic2__btn {\r\n    width: 100%;\r\n  }\r\n\r\n  #zic-concurs-calculator-v2 .zic2__rowGrid {\r\n    grid-template-columns: 1fr !important;\r\n  }\r\n\r\n  #zic-concurs-calculator-v2 .zic2__inputGroup {\r\n    grid-template-columns: 1fr;\r\n  }\r\n\r\n  #zic-concurs-calculator-v2 .zic2__deduceriGrid {\r\n    grid-template-columns: 1fr;\r\n  }\r\n}\r\n\r\n\/* Tablet (640px+) *\/\r\n@media (min-width: 640px) {\r\n  #zic-concurs-calculator-v2 .zic2__wrap {\r\n    padding: 24px;\r\n  }\r\n\r\n  #zic-concurs-calculator-v2 .zic2__title {\r\n    font-size: 24px;\r\n  }\r\n\r\n  #zic-concurs-calculator-v2 .zic2__rowGrid {\r\n    grid-template-columns: repeat(4, 1fr);\r\n  }\r\n\r\n  #zic-concurs-calculator-v2 .zic2__deduceriGrid {\r\n    grid-template-columns: 1.5fr 1fr;\r\n  }\r\n}\r\n\r\n\/* Desktop (768px+) *\/\r\n@media (min-width: 768px) {\r\n  #zic-concurs-calculator-v2 .zic2__card {\r\n    padding: 24px;\r\n  }\r\n\r\n  #zic-concurs-calculator-v2 .zic2__brandbar {\r\n    padding: 24px;\r\n  }\r\n\r\n  #zic-concurs-calculator-v2 .zic2__mark {\r\n    width: 56px;\r\n    height: 56px;\r\n  }\r\n\r\n  #zic-concurs-calculator-v2 .zic2__title {\r\n    font-size: 26px;\r\n  }\r\n}\r\n\r\n\/* Large screens (1024px+) *\/\r\n@media (min-width: 1024px) {\r\n  #zic-concurs-calculator-v2 .zic2__wrap {\r\n    max-width: 900px;\r\n  }\r\n}\r\n\r\n\/* Print styles *\/\r\n@media print {\r\n  #zic-concurs-calculator-v2 .zic2__btnGroup,\r\n  #zic-concurs-calculator-v2 .zic2__actions,\r\n  #zic-concurs-calculator-v2 .zic2__hint,\r\n  #zic-concurs-calculator-v2 .zic2__emptyState,\r\n  #zic-concurs-calculator-v2 .zic2__footer {\r\n    display: none !important;\r\n  }\r\n\r\n  #zic-concurs-calculator-v2 .zic2__card {\r\n    box-shadow: none;\r\n    border: 1px solid #ddd;\r\n    break-inside: avoid;\r\n  }\r\n\r\n  #zic-concurs-calculator-v2 .zic2__resultCard.is-hidden {\r\n    display: block !important;\r\n  }\r\n}\r\n<\/style>\r\n\r\n<script>\r\n(function() {\r\n  'use strict';\r\n\r\n  \/\/ === SECURITY: Safe DOM Element Creation ===\r\n  \/\/ Creeaz\u0103 elemente DOM \u00een mod sigur, f\u0103r\u0103 innerHTML cu date nesanitizate\r\n  const createElement = (tag, attrs = {}, children = []) => {\r\n    const el = document.createElement(tag);\r\n\r\n    \/\/ Seteaz\u0103 atributele \u00een mod sigur (doar atribute permise)\r\n    const allowedAttrs = ['class', 'id', 'type', 'min', 'max', 'placeholder',\r\n                          'inputmode', 'autocomplete', 'for', 'role', 'aria-live',\r\n                          'aria-hidden', 'aria-labelledby', 'aria-label', 'data-field', 'data-action',\r\n                          'data-row', 'data-rows', 'data-empty', 'data-live',\r\n                          'data-error', 'data-result', 'data-result-content',\r\n                          'href', 'target', 'rel', 'width', 'height', 'viewBox',\r\n                          'fill', 'stroke', 'stroke-width', 'stroke-linecap',\r\n                          'stroke-linejoin', 'd', 'cx', 'cy', 'r', 'x', 'y',\r\n                          'x1', 'y1', 'x2', 'y2', 'rx', 'ry', 'points'];\r\n\r\n    for (const [key, value] of Object.entries(attrs)) {\r\n      if (key === 'textContent') {\r\n        el.textContent = value;\r\n      } else if (allowedAttrs.includes(key) || key.startsWith('data-')) {\r\n        el.setAttribute(key, String(value));\r\n      }\r\n    }\r\n\r\n    children.forEach(child => {\r\n      if (typeof child === 'string') {\r\n        el.appendChild(document.createTextNode(child));\r\n      } else if (child instanceof Node) {\r\n        el.appendChild(child);\r\n      }\r\n    });\r\n\r\n    return el;\r\n  };\r\n\r\n  \/\/ === Constants ===\r\n  const ROOT_ID = 'zic-concurs-calculator-v2';\r\n  const MONTHS_IN_YEAR = 12;\r\n  const DAYS_IN_MONTH = 30;\r\n  const MAX_DAYS = 29; \/\/ Zile maxime per lun\u0103 (0-29 = 30 valori posibile)\r\n  const MAX_MONTHS = 11; \/\/ Luni maxime (0-11 = 12 valori posibile)\r\n  const MAX_GENERAL_MONTHS = 30 * MONTHS_IN_YEAR; \/\/ 30 years\r\n\r\n  \/\/ SECURITY: Limite pentru validare input\r\n  const MAX_YEARS = 100;\r\n  const MAX_FINE_AMOUNT = 999999999;\r\n  const MAX_PENALTIES = 50; \/\/ Limit\u0103 pentru num\u0103rul de pedepse\r\n\r\n  \/\/ === State ===\r\n  let lastResult = null;\r\n\r\n  \/\/ === DOM References ===\r\n  const root = document.getElementById(ROOT_ID);\r\n  if (!root) {\r\n    console.warn('ZIC Calculator: Element root nu a fost g\u0103sit');\r\n    return;\r\n  }\r\n\r\n  const $ = (sel) => root.querySelector(sel);\r\n\r\n  const elements = {\r\n    prisonRows: $('[data-rows=\"prison\"]'),\r\n    fineRows: $('[data-rows=\"fine\"]'),\r\n    prisonEmpty: $('[data-empty=\"prison\"]'),\r\n    fineEmpty: $('[data-empty=\"fine\"]'),\r\n    prisonCount: $('[data-live=\"prisonCount\"]'),\r\n    fineCount: $('[data-live=\"fineCount\"]'),\r\n    error: $('[data-error=\"prison\"]'),\r\n    resultCard: $('[data-result]'),\r\n    resultContent: $('[data-result-content]'),\r\n    dedYears: $('#zic2-ded-ani'),\r\n    dedMonths: $('#zic2-ded-luni'),\r\n    dedDays: $('#zic2-ded-zile'),\r\n    dedFine: $('#zic2-amenda-dedusa')\r\n  };\r\n\r\n  \/\/ Verific\u0103 dac\u0103 toate elementele esen\u021biale exist\u0103\r\n  const requiredElements = [\r\n    'prisonRows', 'fineRows', 'prisonEmpty', 'fineEmpty',\r\n    'prisonCount', 'fineCount', 'error', 'resultCard', 'resultContent',\r\n    'dedYears', 'dedMonths', 'dedDays', 'dedFine'\r\n  ];\r\n  for (const key of requiredElements) {\r\n    if (!elements[key]) {\r\n      console.error(`ZIC Calculator: Element esen\u021bial lips\u0103 - ${key}`);\r\n      return;\r\n    }\r\n  }\r\n\r\n  \/\/ === SECURITY: Strict Numeric Validation ===\r\n  const toInt = (val) => {\r\n    if (val === null || val === undefined || val === '') return 0;\r\n    \/\/ Elimin\u0103 orice caracter non-numeric (nu sunt necesare numere negative \u00een acest calculator)\r\n    const cleaned = String(val).replace(\/[^\\d]\/g, '');\r\n    const n = parseInt(cleaned, 10);\r\n    \/\/ Verific\u0103 pentru NaN, Infinity \u0219i valori invalide\r\n    if (!Number.isFinite(n) || Number.isNaN(n)) return 0;\r\n    return n;\r\n  };\r\n\r\n  const clamp = (val, min = 0, max = Infinity) => {\r\n    const n = toInt(val);\r\n    \/\/ Double-check pentru siguran\u021b\u0103\r\n    if (!Number.isFinite(n)) return min;\r\n    return Math.max(min, Math.min(max, n));\r\n  };\r\n\r\n  const formatNumber = (n) => {\r\n    \/\/ SECURITY: Asigur\u0103-te c\u0103 n este un num\u0103r valid\r\n    const num = Number.isFinite(n) ? n : 0;\r\n    return num.toLocaleString('ro-RO');\r\n  };\r\n\r\n  \/\/ === Duration Helpers ===\r\n  const toMonths = (years, months, days) => {\r\n    const y = clamp(years, 0, MAX_YEARS);\r\n    const m = clamp(months, 0, MAX_MONTHS);\r\n    const d = clamp(days, 0, MAX_DAYS);\r\n    return (y * MONTHS_IN_YEAR) + m + (d \/ DAYS_IN_MONTH);\r\n  };\r\n\r\n  const fromMonths = (totalMonths) => {\r\n    \/\/ SECURITY: Validare strict\u0103\r\n    let t = Number.isFinite(totalMonths) ? Math.max(0, totalMonths) : 0;\r\n    let years = Math.floor(t \/ MONTHS_IN_YEAR);\r\n    let months = Math.floor(t % MONTHS_IN_YEAR);\r\n    \/\/ Folosim DAYS_IN_MONTH pentru calcul dar limit\u0103m la MAX_DAYS\r\n    let days = Math.round((t % 1) * DAYS_IN_MONTH);\r\n\r\n    if (days > MAX_DAYS) { days = 0; months++; }\r\n    if (months > MAX_MONTHS) { months = 0; years++; }\r\n\r\n    return { years, months, days };\r\n  };\r\n\r\n  const formatDuration = (d) => {\r\n    \/\/ SECURITY: Validare obiect \u0219i valori\r\n    if (!d || typeof d !== 'object') return '0 zile';\r\n\r\n    const years = clamp(d.years, 0, MAX_YEARS);\r\n    const months = clamp(d.months, 0, MAX_MONTHS);\r\n    const days = clamp(d.days, 0, MAX_DAYS);\r\n\r\n    const parts = [];\r\n    if (years > 0) parts.push(`${years} ${years === 1 ? 'an' : 'ani'}`);\r\n    if (months > 0) parts.push(`${months} ${months === 1 ? 'lun\u0103' : 'luni'}`);\r\n    if (days > 0 || parts.length === 0) parts.push(`${days} ${days === 1 ? 'zi' : 'zile'}`);\r\n    return parts.join(', ');\r\n  };\r\n\r\n  const formatCurrency = (amount) => {\r\n    const safeAmount = clamp(amount, 0, MAX_FINE_AMOUNT);\r\n    return formatNumber(Math.floor(safeAmount)) + ' lei';\r\n  };\r\n\r\n  \/\/ === UI Helpers ===\r\n  const showError = (msg) => {\r\n    \/\/ SECURITY: Folose\u0219te textContent \u00een loc de innerHTML\r\n    elements.error.textContent = msg;\r\n    elements.error.classList.remove('is-hidden');\r\n  };\r\n\r\n  const hideError = () => {\r\n    elements.error.textContent = '';\r\n    elements.error.classList.add('is-hidden');\r\n  };\r\n\r\n  const updateCounts = () => {\r\n    const prisonCount = elements.prisonRows.querySelectorAll('[data-row=\"prison\"]').length;\r\n    const fineCount = elements.fineRows.querySelectorAll('[data-row=\"fine\"]').length;\r\n\r\n    \/\/ SECURITY: Folose\u0219te textContent\r\n    elements.prisonCount.textContent = String(clamp(prisonCount, 0, MAX_PENALTIES));\r\n    elements.fineCount.textContent = String(clamp(fineCount, 0, MAX_PENALTIES));\r\n\r\n    elements.prisonEmpty.classList.toggle('is-hidden', prisonCount > 0);\r\n    elements.fineEmpty.classList.toggle('is-hidden', fineCount > 0);\r\n  };\r\n\r\n  \/\/ === SECURITY: Safe Field Creation ===\r\n  const createField = (label, attrs = {}) => {\r\n    const id = `zic2_${Math.random().toString(36).substr(2, 9)}`;\r\n\r\n    const field = createElement('div', { class: 'zic2__field' });\r\n\r\n    const labelEl = createElement('label', {\r\n      class: 'zic2__label',\r\n      for: id\r\n    }, [label]);\r\n\r\n    const inputEl = createElement('input', {\r\n      class: 'zic2__input',\r\n      type: 'number',\r\n      id: id,\r\n      autocomplete: 'off',\r\n      min: attrs.min !== undefined ? String(attrs.min) : '0',\r\n      max: attrs.max !== undefined ? String(attrs.max) : String(MAX_FINE_AMOUNT),\r\n      placeholder: attrs.placeholder || '0',\r\n      inputmode: attrs.inputmode || 'numeric',\r\n      'data-field': attrs['data-field'] || ''\r\n    });\r\n\r\n    field.appendChild(labelEl);\r\n    field.appendChild(inputEl);\r\n\r\n    \/\/ SECURITY: Previne input non-numeric\r\n    inputEl.addEventListener('input', (e) => {\r\n      const value = e.target.value;\r\n      \/\/ Elimin\u0103 caractere non-numerice\r\n      e.target.value = value.replace(\/[^\\d]\/g, '');\r\n    });\r\n\r\n    return field;\r\n  };\r\n\r\n  \/\/ === SECURITY: Safe SVG Creation ===\r\n  const createSvgIcon = (type) => {\r\n    const svgNS = 'http:\/\/www.w3.org\/2000\/svg';\r\n    const svg = document.createElementNS(svgNS, 'svg');\r\n    svg.setAttribute('width', '14');\r\n    svg.setAttribute('height', '14');\r\n    svg.setAttribute('viewBox', '0 0 24 24');\r\n    svg.setAttribute('fill', 'none');\r\n    svg.setAttribute('stroke', 'currentColor');\r\n    svg.setAttribute('stroke-width', '2');\r\n\r\n    if (type === 'prison') {\r\n      const rect = document.createElementNS(svgNS, 'rect');\r\n      rect.setAttribute('x', '3');\r\n      rect.setAttribute('y', '11');\r\n      rect.setAttribute('width', '18');\r\n      rect.setAttribute('height', '11');\r\n      rect.setAttribute('rx', '2');\r\n      svg.appendChild(rect);\r\n\r\n      const path = document.createElementNS(svgNS, 'path');\r\n      path.setAttribute('d', 'M7 11V7a5 5 0 0 1 10 0v4');\r\n      svg.appendChild(path);\r\n    } else if (type === 'fine') {\r\n      const line = document.createElementNS(svgNS, 'line');\r\n      line.setAttribute('x1', '12');\r\n      line.setAttribute('y1', '1');\r\n      line.setAttribute('x2', '12');\r\n      line.setAttribute('y2', '23');\r\n      svg.appendChild(line);\r\n\r\n      const path = document.createElementNS(svgNS, 'path');\r\n      path.setAttribute('d', 'M17 5H9.5a3.5 3.5 0 0 0 0 7h5a3.5 3.5 0 0 1 0 7H6');\r\n      svg.appendChild(path);\r\n    } else if (type === 'warning') {\r\n      const path = document.createElementNS(svgNS, 'path');\r\n      path.setAttribute('d', 'M10.29 3.86L1.82 18a2 2 0 0 0 1.71 3h16.94a2 2 0 0 0 1.71-3L13.71 3.86a2 2 0 0 0-3.42 0z');\r\n      svg.appendChild(path);\r\n\r\n      const line1 = document.createElementNS(svgNS, 'line');\r\n      line1.setAttribute('x1', '12');\r\n      line1.setAttribute('y1', '9');\r\n      line1.setAttribute('x2', '12');\r\n      line1.setAttribute('y2', '13');\r\n      svg.appendChild(line1);\r\n\r\n      const line2 = document.createElementNS(svgNS, 'line');\r\n      line2.setAttribute('x1', '12');\r\n      line2.setAttribute('y1', '17');\r\n      line2.setAttribute('x2', '12.01');\r\n      line2.setAttribute('y2', '17');\r\n      svg.appendChild(line2);\r\n    } else if (type === 'danger') {\r\n      const circle = document.createElementNS(svgNS, 'circle');\r\n      circle.setAttribute('cx', '12');\r\n      circle.setAttribute('cy', '12');\r\n      circle.setAttribute('r', '10');\r\n      svg.appendChild(circle);\r\n\r\n      const line1 = document.createElementNS(svgNS, 'line');\r\n      line1.setAttribute('x1', '12');\r\n      line1.setAttribute('y1', '8');\r\n      line1.setAttribute('x2', '12');\r\n      line1.setAttribute('y2', '12');\r\n      svg.appendChild(line1);\r\n\r\n      const line2 = document.createElementNS(svgNS, 'line');\r\n      line2.setAttribute('x1', '12');\r\n      line2.setAttribute('y1', '16');\r\n      line2.setAttribute('x2', '12.01');\r\n      line2.setAttribute('y2', '16');\r\n      svg.appendChild(line2);\r\n    }\r\n\r\n    svg.setAttribute('width', '16');\r\n    svg.setAttribute('height', '16');\r\n    return svg;\r\n  };\r\n\r\n  \/\/ === SECURITY: Safe Row Builders ===\r\n  const createPrisonRow = () => {\r\n    \/\/ SECURITY: Verific\u0103 limita de pedepse\r\n    const currentCount = elements.prisonRows.querySelectorAll('[data-row=\"prison\"]').length;\r\n    if (currentCount >= MAX_PENALTIES) {\r\n      showError(`Limita maxim\u0103 de ${MAX_PENALTIES} pedepse a fost atins\u0103.`);\r\n      return null;\r\n    }\r\n\r\n    const row = createElement('div', { class: 'zic2__row', 'data-row': 'prison' });\r\n\r\n    const header = createElement('div', { class: 'zic2__rowHeader' });\r\n\r\n    const tag = createElement('span', { class: 'zic2__rowTag' });\r\n    tag.appendChild(createSvgIcon('prison'));\r\n    tag.appendChild(document.createTextNode(' Pedeaps\u0103 \u00eenchisoare'));\r\n\r\n    const deleteBtn = createElement('button', {\r\n      type: 'button',\r\n      class: 'zic2__btn zic2__btn--danger',\r\n      'data-action': 'delete-row',\r\n      'aria-label': '\u0218terge aceast\u0103 pedeaps\u0103 cu \u00eenchisoarea'\r\n    }, ['\u0218terge']);\r\n\r\n    header.appendChild(tag);\r\n    header.appendChild(deleteBtn);\r\n\r\n    const grid = createElement('div', { class: 'zic2__rowGrid' });\r\n    grid.appendChild(createField('Ani', { min: 0, max: MAX_YEARS, placeholder: '0', inputmode: 'numeric', 'data-field': 'years' }));\r\n    grid.appendChild(createField('Luni', { min: 0, max: MAX_MONTHS, placeholder: '0', inputmode: 'numeric', 'data-field': 'months' }));\r\n    grid.appendChild(createField('Zile', { min: 0, max: MAX_DAYS, placeholder: '0', inputmode: 'numeric', 'data-field': 'days' }));\r\n    grid.appendChild(createField('Max lege (ani)', { min: 0, max: MAX_YEARS, placeholder: 'ex: 20', inputmode: 'numeric', 'data-field': 'maxLaw' }));\r\n\r\n    row.appendChild(header);\r\n    row.appendChild(grid);\r\n\r\n    return row;\r\n  };\r\n\r\n  const createFineRow = () => {\r\n    \/\/ SECURITY: Verific\u0103 limita de amenzi\r\n    const currentCount = elements.fineRows.querySelectorAll('[data-row=\"fine\"]').length;\r\n    if (currentCount >= MAX_PENALTIES) {\r\n      showError(`Limita maxim\u0103 de ${MAX_PENALTIES} amenzi a fost atins\u0103.`);\r\n      return null;\r\n    }\r\n\r\n    const row = createElement('div', { class: 'zic2__row', 'data-row': 'fine' });\r\n\r\n    const header = createElement('div', { class: 'zic2__rowHeader' });\r\n\r\n    const tag = createElement('span', { class: 'zic2__rowTag' });\r\n    tag.appendChild(createSvgIcon('fine'));\r\n    tag.appendChild(document.createTextNode(' Amend\u0103'));\r\n\r\n    const deleteBtn = createElement('button', {\r\n      type: 'button',\r\n      class: 'zic2__btn zic2__btn--danger',\r\n      'data-action': 'delete-row',\r\n      'aria-label': '\u0218terge aceast\u0103 amend\u0103'\r\n    }, ['\u0218terge']);\r\n\r\n    header.appendChild(tag);\r\n    header.appendChild(deleteBtn);\r\n\r\n    const field = createField('Sum\u0103 (lei)', { min: 0, max: MAX_FINE_AMOUNT, placeholder: '0', inputmode: 'numeric', 'data-field': 'amount' });\r\n\r\n    row.appendChild(header);\r\n    row.appendChild(field);\r\n\r\n    return row;\r\n  };\r\n\r\n  \/\/ === Data Collection ===\r\n  const collectPrisonData = () => {\r\n    const rows = elements.prisonRows.querySelectorAll('[data-row=\"prison\"]');\r\n    const items = [];\r\n\r\n    rows.forEach(row => {\r\n      const years = clamp(row.querySelector('[data-field=\"years\"]')?.value, 0, MAX_YEARS);\r\n      const months = clamp(row.querySelector('[data-field=\"months\"]')?.value, 0, MAX_MONTHS);\r\n      const days = clamp(row.querySelector('[data-field=\"days\"]')?.value, 0, MAX_DAYS);\r\n      const maxLaw = clamp(row.querySelector('[data-field=\"maxLaw\"]')?.value, 0, MAX_YEARS);\r\n\r\n      const totalMonths = toMonths(years, months, days);\r\n      if (totalMonths > 0) {\r\n        items.push({ years, months, days, maxLaw, totalMonths });\r\n      }\r\n    });\r\n\r\n    return items;\r\n  };\r\n\r\n  const collectFineData = () => {\r\n    const rows = elements.fineRows.querySelectorAll('[data-row=\"fine\"]');\r\n    const items = [];\r\n\r\n    rows.forEach(row => {\r\n      const amount = clamp(row.querySelector('[data-field=\"amount\"]')?.value, 0, MAX_FINE_AMOUNT);\r\n      if (amount > 0) items.push(amount);\r\n    });\r\n\r\n    return items;\r\n  };\r\n\r\n  \/\/ === Calculations ===\r\n  const calculatePrison = (items) => {\r\n    if (items.length === 0) return null;\r\n\r\n    \/\/ Sort by total months descending\r\n    const sorted = [...items].sort((a, b) => b.totalMonths - a.totalMonths);\r\n    const maxPenalty = sorted[0].totalMonths;\r\n    const otherPenalties = sorted.slice(1).reduce((sum, p) => sum + p.totalMonths, 0);\r\n    const increment = otherPenalties \/ 3;\r\n    const resultant = maxPenalty + increment;\r\n\r\n    \/\/ Check for life imprisonment (art. 39 alin. 2)\r\n    const hasInfraction20Years = items.some(p => clamp(p.maxLaw, 0, MAX_YEARS) >= 20);\r\n    const excess = resultant - MAX_GENERAL_MONTHS;\r\n    const lifeImprisonment = excess >= 120 && hasInfraction20Years;\r\n    const exceedsMaximum = resultant > MAX_GENERAL_MONTHS;\r\n\r\n    \/\/ Apply deductions\r\n    const deductionMonths = toMonths(\r\n      elements.dedYears.value,\r\n      elements.dedMonths.value,\r\n      elements.dedDays.value\r\n    );\r\n\r\n    const beforeDeduction = lifeImprisonment ? resultant : Math.min(resultant, MAX_GENERAL_MONTHS);\r\n    const finalMonths = Math.max(0, beforeDeduction - deductionMonths);\r\n\r\n    return {\r\n      max: fromMonths(maxPenalty),\r\n      sumOthers: fromMonths(otherPenalties),\r\n      increment: fromMonths(increment),\r\n      resultant: fromMonths(resultant),\r\n      final: fromMonths(finalMonths),\r\n      exceedsMaximum,\r\n      lifeImprisonment\r\n    };\r\n  };\r\n\r\n  const calculateFine = (items) => {\r\n    if (items.length === 0) return null;\r\n\r\n    const sorted = [...items].sort((a, b) => b - a);\r\n    const maxFine = sorted[0];\r\n    const otherFines = sorted.slice(1).reduce((sum, f) => sum + f, 0);\r\n    const increment = Math.floor(otherFines \/ 3);\r\n    const resultant = maxFine + increment;\r\n\r\n    const deduction = clamp(elements.dedFine.value, 0, MAX_FINE_AMOUNT);\r\n    const final = Math.max(0, resultant - deduction);\r\n\r\n    return { max: maxFine, sumOthers: otherFines, increment, resultant, final };\r\n  };\r\n\r\n  \/\/ === SECURITY: Safe Render Result (DOM-based, no innerHTML) ===\r\n  const renderResult = (prison, fine) => {\r\n    \/\/ Clear existing content safely\r\n    while (elements.resultContent.firstChild) {\r\n      elements.resultContent.removeChild(elements.resultContent.firstChild);\r\n    }\r\n\r\n    if (prison) {\r\n      \/\/ KPI Section\r\n      const kpiDiv = createElement('div', { class: 'zic2__kpi' });\r\n      const kpiLabel = createElement('div', { class: 'zic2__kpiLabel' }, ['Pedeaps\u0103 final\u0103 cu \u00eenchisoarea']);\r\n      const kpiValue = createElement('p', { class: 'zic2__kpiValue' }, [\r\n        formatDuration(prison.final) + (prison.lifeImprisonment ? ' *' : '')\r\n      ]);\r\n      kpiDiv.appendChild(kpiLabel);\r\n      kpiDiv.appendChild(kpiValue);\r\n      elements.resultContent.appendChild(kpiDiv);\r\n\r\n      \/\/ Details List\r\n      const detailsList = createElement('ul', { class: 'zic2__detailsList' });\r\n\r\n      const li1 = createElement('li');\r\n      li1.appendChild(document.createTextNode('Pedeapsa cea mai grea: '));\r\n      const strong1 = createElement('strong', {}, [formatDuration(prison.max)]);\r\n      li1.appendChild(strong1);\r\n      detailsList.appendChild(li1);\r\n\r\n      detailsList.appendChild(createElement('li', {}, ['Suma celorlalte pedepse: ' + formatDuration(prison.sumOthers)]));\r\n      detailsList.appendChild(createElement('li', {}, ['Spor obligatoriu (1\/3): ' + formatDuration(prison.increment)]));\r\n      detailsList.appendChild(createElement('li', {}, ['Pedeaps\u0103 rezultant\u0103: ' + formatDuration(prison.resultant)]));\r\n\r\n      elements.resultContent.appendChild(detailsList);\r\n\r\n      \/\/ Warning Alert\r\n      if (prison.exceedsMaximum) {\r\n        const warningAlert = createElement('div', { class: 'zic2__alert zic2__alert--warning' });\r\n        warningAlert.appendChild(createSvgIcon('warning'));\r\n        const warningSpan = createElement('span', {}, ['Pedeapsa rezultant\u0103 dep\u0103\u0219e\u0219te maximul general de 30 de ani.']);\r\n        warningAlert.appendChild(warningSpan);\r\n        elements.resultContent.appendChild(warningAlert);\r\n      }\r\n\r\n      \/\/ Danger Alert (Life Imprisonment)\r\n      if (prison.lifeImprisonment) {\r\n        const dangerAlert = createElement('div', { class: 'zic2__alert zic2__alert--danger' });\r\n        dangerAlert.appendChild(createSvgIcon('danger'));\r\n        const dangerSpan = createElement('span');\r\n        const boldStar = createElement('strong', {}, ['*']);\r\n        dangerSpan.appendChild(boldStar);\r\n        dangerSpan.appendChild(document.createTextNode(' Posibilitatea aplic\u0103rii deten\u021biunii pe via\u021b\u0103 (art. 39 alin. 2 C.pen.)'));\r\n        dangerAlert.appendChild(dangerSpan);\r\n        elements.resultContent.appendChild(dangerAlert);\r\n      }\r\n    }\r\n\r\n    if (fine) {\r\n      \/\/ KPI Section for Fine\r\n      const fineKpiDiv = createElement('div', { class: 'zic2__kpi' });\r\n      const fineKpiLabel = createElement('div', { class: 'zic2__kpiLabel' }, ['Amend\u0103 final\u0103']);\r\n      const fineKpiValue = createElement('p', { class: 'zic2__kpiValue' }, [formatCurrency(fine.final)]);\r\n      fineKpiDiv.appendChild(fineKpiLabel);\r\n      fineKpiDiv.appendChild(fineKpiValue);\r\n      elements.resultContent.appendChild(fineKpiDiv);\r\n\r\n      \/\/ Fine Details List\r\n      const fineDetailsList = createElement('ul', { class: 'zic2__detailsList' });\r\n\r\n      const fineLi1 = createElement('li');\r\n      fineLi1.appendChild(document.createTextNode('Amenda cea mai mare: '));\r\n      const fineStrong1 = createElement('strong', {}, [formatCurrency(fine.max)]);\r\n      fineLi1.appendChild(fineStrong1);\r\n      fineDetailsList.appendChild(fineLi1);\r\n\r\n      fineDetailsList.appendChild(createElement('li', {}, ['Suma celorlalte amenzi: ' + formatCurrency(fine.sumOthers)]));\r\n      fineDetailsList.appendChild(createElement('li', {}, ['Spor obligatoriu (1\/3): ' + formatCurrency(fine.increment)]));\r\n\r\n      elements.resultContent.appendChild(fineDetailsList);\r\n    }\r\n\r\n    elements.resultCard.classList.remove('is-hidden');\r\n    setTimeout(() => {\r\n      elements.resultCard.scrollIntoView({ behavior: 'smooth', block: 'nearest' });\r\n    }, 100);\r\n  };\r\n\r\n  \/\/ === Actions ===\r\n  const calculate = () => {\r\n    hideError();\r\n\r\n    const prisonData = collectPrisonData();\r\n    const fineData = collectFineData();\r\n\r\n    if (prisonData.length === 0 && fineData.length === 0) {\r\n      showError('Introduce\u021bi cel pu\u021bin o pedeaps\u0103 (\u00eenchisoare sau amend\u0103) cu valori valide.');\r\n      elements.resultCard.classList.add('is-hidden');\r\n      return;\r\n    }\r\n\r\n    const prisonResult = calculatePrison(prisonData);\r\n    const fineResult = calculateFine(fineData);\r\n\r\n    lastResult = {\r\n      prison: prisonResult,\r\n      fine: fineResult,\r\n      timestamp: new Date().toISOString()\r\n    };\r\n\r\n    renderResult(prisonResult, fineResult);\r\n  };\r\n\r\n  const reset = () => {\r\n    \/\/ Clear all rows safely\r\n    while (elements.prisonRows.firstChild) {\r\n      elements.prisonRows.removeChild(elements.prisonRows.firstChild);\r\n    }\r\n    while (elements.fineRows.firstChild) {\r\n      elements.fineRows.removeChild(elements.fineRows.firstChild);\r\n    }\r\n\r\n    elements.dedYears.value = '';\r\n    elements.dedMonths.value = '';\r\n    elements.dedDays.value = '';\r\n    elements.dedFine.value = '';\r\n\r\n    hideError();\r\n    elements.resultCard.classList.add('is-hidden');\r\n\r\n    while (elements.resultContent.firstChild) {\r\n      elements.resultContent.removeChild(elements.resultContent.firstChild);\r\n    }\r\n\r\n    lastResult = null;\r\n\r\n    \/\/ Add one empty prison row\r\n    const newRow = createPrisonRow();\r\n    if (newRow) {\r\n      elements.prisonRows.appendChild(newRow);\r\n    }\r\n    updateCounts();\r\n  };\r\n\r\n  const loadExample = () => {\r\n    \/\/ Clear existing rows\r\n    while (elements.prisonRows.firstChild) {\r\n      elements.prisonRows.removeChild(elements.prisonRows.firstChild);\r\n    }\r\n    while (elements.fineRows.firstChild) {\r\n      elements.fineRows.removeChild(elements.fineRows.firstChild);\r\n    }\r\n    hideError();\r\n\r\n    const examples = [\r\n      { years: 3, months: 0, days: 0, maxLaw: 10 },\r\n      { years: 2, months: 6, days: 0, maxLaw: 7 },\r\n      { years: 1, months: 0, days: 0, maxLaw: 5 }\r\n    ];\r\n\r\n    examples.forEach(data => {\r\n      const row = createPrisonRow();\r\n      if (row) {\r\n        row.querySelector('[data-field=\"years\"]').value = data.years;\r\n        row.querySelector('[data-field=\"months\"]').value = data.months;\r\n        row.querySelector('[data-field=\"days\"]').value = data.days;\r\n        row.querySelector('[data-field=\"maxLaw\"]').value = data.maxLaw;\r\n        elements.prisonRows.appendChild(row);\r\n      }\r\n    });\r\n\r\n    elements.dedYears.value = '';\r\n    elements.dedMonths.value = '';\r\n    elements.dedDays.value = '';\r\n    elements.dedFine.value = '';\r\n\r\n    updateCounts();\r\n    elements.resultCard.classList.add('is-hidden');\r\n  };\r\n\r\n  \/\/ === SECURITY: Safe PDF Export ===\r\n  const exportPDF = () => {\r\n    if (!lastResult || (!lastResult.prison && !lastResult.fine)) {\r\n      alert('Calculeaz\u0103 mai \u00eent\u00e2i rezultatul pentru a genera PDF-ul.');\r\n      return;\r\n    }\r\n\r\n    \/\/ SECURITY: Ad\u0103ug\u0103m 'noopener' pentru a preveni accesul la window.opener\r\n    const printWindow = window.open('about:blank', '_blank', 'noopener');\r\n    if (!printWindow) {\r\n      alert('Permite pop-up-urile pentru a genera PDF-ul.');\r\n      return;\r\n    }\r\n\r\n    const { prison, fine } = lastResult;\r\n    const date = new Date().toLocaleDateString('ro-RO', {\r\n      year: 'numeric', month: 'long', day: 'numeric'\r\n    });\r\n\r\n    \/\/ SECURITY: Construire document folosind DOM API\r\n    const doc = printWindow.document;\r\n    doc.open();\r\n\r\n    \/\/ Write minimal HTML structure\r\n    doc.write('<!DOCTYPE html><html lang=\"ro\"><head><meta charset=\"UTF-8\"><title>Raport Calculator Concurs - ZIC Legal<\/title><\/head><body><\/body><\/html>');\r\n    doc.close();\r\n\r\n    \/\/ Add styles safely\r\n    const style = doc.createElement('style');\r\n    style.textContent = `\r\n      * { box-sizing: border-box; margin: 0; padding: 0; }\r\n      body {\r\n        font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;\r\n        max-width: 700px;\r\n        margin: 0 auto;\r\n        padding: 40px 30px;\r\n        color: #1F2937;\r\n        line-height: 1.6;\r\n      }\r\n      .header {\r\n        border-bottom: 3px solid #8A88FF;\r\n        padding-bottom: 20px;\r\n        margin-bottom: 30px;\r\n      }\r\n      .header h1 {\r\n        color: #6F6CFF;\r\n        font-size: 24px;\r\n        margin-bottom: 5px;\r\n      }\r\n      .header p {\r\n        color: #6B7280;\r\n        font-size: 14px;\r\n      }\r\n      .section {\r\n        background: #F9FAFB;\r\n        border-radius: 12px;\r\n        padding: 20px;\r\n        margin-bottom: 20px;\r\n      }\r\n      .section h2 {\r\n        font-size: 16px;\r\n        color: #374151;\r\n        margin-bottom: 15px;\r\n        padding-bottom: 10px;\r\n        border-bottom: 1px solid #E5E7EB;\r\n      }\r\n      .kpi {\r\n        font-size: 22px;\r\n        font-weight: 700;\r\n        color: #6F6CFF;\r\n        margin-bottom: 15px;\r\n      }\r\n      ul {\r\n        padding-left: 20px;\r\n      }\r\n      li {\r\n        margin-bottom: 8px;\r\n        color: #374151;\r\n      }\r\n      li strong {\r\n        color: #1F2937;\r\n      }\r\n      .alert {\r\n        padding: 12px 15px;\r\n        border-radius: 8px;\r\n        margin-top: 15px;\r\n        font-size: 13px;\r\n      }\r\n      .alert-warning {\r\n        background: #FEF3C7;\r\n        border: 1px solid #FCD34D;\r\n        color: #92400E;\r\n      }\r\n      .alert-danger {\r\n        background: #FEE2E2;\r\n        border: 1px solid #FECACA;\r\n        color: #DC2626;\r\n      }\r\n      .footer {\r\n        margin-top: 40px;\r\n        padding-top: 20px;\r\n        border-top: 1px solid #E5E7EB;\r\n        text-align: center;\r\n        color: #6B7280;\r\n        font-size: 12px;\r\n      }\r\n      .footer a {\r\n        color: #6F6CFF;\r\n        text-decoration: none;\r\n      }\r\n      .disclaimer {\r\n        margin-top: 30px;\r\n        padding: 15px;\r\n        background: #F3F4F6;\r\n        border-radius: 8px;\r\n        font-size: 11px;\r\n        color: #6B7280;\r\n      }\r\n      @media print {\r\n        body { padding: 20px; }\r\n        .section { break-inside: avoid; }\r\n      }\r\n    `;\r\n    doc.head.appendChild(style);\r\n\r\n    const body = doc.body;\r\n\r\n    \/\/ Header\r\n    const headerDiv = doc.createElement('div');\r\n    headerDiv.className = 'header';\r\n    const h1 = doc.createElement('h1');\r\n    h1.textContent = 'Calculator Concurs de Infrac\u021biuni';\r\n    const pDate = doc.createElement('p');\r\n    pDate.textContent = 'Raport generat la ' + date;\r\n    headerDiv.appendChild(h1);\r\n    headerDiv.appendChild(pDate);\r\n    body.appendChild(headerDiv);\r\n\r\n    \/\/ Prison section\r\n    if (prison) {\r\n      const sectionDiv = doc.createElement('div');\r\n      sectionDiv.className = 'section';\r\n\r\n      const h2 = doc.createElement('h2');\r\n      h2.textContent = 'Pedeaps\u0103 cu \u00eenchisoarea';\r\n      sectionDiv.appendChild(h2);\r\n\r\n      const kpiDiv = doc.createElement('div');\r\n      kpiDiv.className = 'kpi';\r\n      kpiDiv.textContent = formatDuration(prison.final) + (prison.lifeImprisonment ? ' *' : '');\r\n      sectionDiv.appendChild(kpiDiv);\r\n\r\n      const ul = doc.createElement('ul');\r\n\r\n      const li1 = doc.createElement('li');\r\n      li1.appendChild(doc.createTextNode('Pedeapsa cea mai grea: '));\r\n      const strong1 = doc.createElement('strong');\r\n      strong1.textContent = formatDuration(prison.max);\r\n      li1.appendChild(strong1);\r\n      ul.appendChild(li1);\r\n\r\n      const li2 = doc.createElement('li');\r\n      li2.textContent = 'Suma celorlalte pedepse: ' + formatDuration(prison.sumOthers);\r\n      ul.appendChild(li2);\r\n\r\n      const li3 = doc.createElement('li');\r\n      li3.textContent = 'Spor obligatoriu (1\/3): ' + formatDuration(prison.increment);\r\n      ul.appendChild(li3);\r\n\r\n      const li4 = doc.createElement('li');\r\n      li4.textContent = 'Pedeaps\u0103 rezultant\u0103: ' + formatDuration(prison.resultant);\r\n      ul.appendChild(li4);\r\n\r\n      sectionDiv.appendChild(ul);\r\n\r\n      if (prison.exceedsMaximum) {\r\n        const alertWarning = doc.createElement('div');\r\n        alertWarning.className = 'alert alert-warning';\r\n        alertWarning.textContent = 'Pedeapsa rezultant\u0103 dep\u0103\u0219e\u0219te maximul general de 30 de ani.';\r\n        sectionDiv.appendChild(alertWarning);\r\n      }\r\n\r\n      if (prison.lifeImprisonment) {\r\n        const alertDanger = doc.createElement('div');\r\n        alertDanger.className = 'alert alert-danger';\r\n        const starStrong = doc.createElement('strong');\r\n        starStrong.textContent = '*';\r\n        alertDanger.appendChild(starStrong);\r\n        alertDanger.appendChild(doc.createTextNode(' Posibilitatea aplic\u0103rii deten\u021biunii pe via\u021b\u0103 (art. 39 alin. 2 C.pen.)'));\r\n        sectionDiv.appendChild(alertDanger);\r\n      }\r\n\r\n      body.appendChild(sectionDiv);\r\n    }\r\n\r\n    \/\/ Fine section\r\n    if (fine) {\r\n      const fineSection = doc.createElement('div');\r\n      fineSection.className = 'section';\r\n\r\n      const h2Fine = doc.createElement('h2');\r\n      h2Fine.textContent = 'Amend\u0103';\r\n      fineSection.appendChild(h2Fine);\r\n\r\n      const kpiFine = doc.createElement('div');\r\n      kpiFine.className = 'kpi';\r\n      kpiFine.textContent = formatCurrency(fine.final);\r\n      fineSection.appendChild(kpiFine);\r\n\r\n      const ulFine = doc.createElement('ul');\r\n\r\n      const liF1 = doc.createElement('li');\r\n      liF1.appendChild(doc.createTextNode('Amenda cea mai mare: '));\r\n      const strongF1 = doc.createElement('strong');\r\n      strongF1.textContent = formatCurrency(fine.max);\r\n      liF1.appendChild(strongF1);\r\n      ulFine.appendChild(liF1);\r\n\r\n      const liF2 = doc.createElement('li');\r\n      liF2.textContent = 'Suma celorlalte amenzi: ' + formatCurrency(fine.sumOthers);\r\n      ulFine.appendChild(liF2);\r\n\r\n      const liF3 = doc.createElement('li');\r\n      liF3.textContent = 'Spor obligatoriu (1\/3): ' + formatCurrency(fine.increment);\r\n      ulFine.appendChild(liF3);\r\n\r\n      fineSection.appendChild(ulFine);\r\n      body.appendChild(fineSection);\r\n    }\r\n\r\n    \/\/ Disclaimer\r\n    const disclaimerDiv = doc.createElement('div');\r\n    disclaimerDiv.className = 'disclaimer';\r\n    const strongDisclaimer = doc.createElement('strong');\r\n    strongDisclaimer.textContent = 'Disclaimer:';\r\n    disclaimerDiv.appendChild(strongDisclaimer);\r\n    disclaimerDiv.appendChild(doc.createTextNode(' Acest raport este oferit exclusiv \u00een scop informativ \u0219i educativ. Rezultatele generate nu constituie consultan\u021b\u0103 juridic\u0103 \u0219i nu pot \u00eenlocui sfatul unui avocat specializat.'));\r\n    body.appendChild(disclaimerDiv);\r\n\r\n    \/\/ Footer\r\n    const footerDiv = doc.createElement('div');\r\n    footerDiv.className = 'footer';\r\n    const p1 = doc.createElement('p');\r\n    p1.textContent = 'Generat cu Calculator Concurs de Infrac\u021biuni';\r\n    footerDiv.appendChild(p1);\r\n    const p2 = doc.createElement('p');\r\n    const link = doc.createElement('a');\r\n    link.href = 'https:\/\/zic.legal';\r\n    link.textContent = 'ZIC Legal';\r\n    link.setAttribute('rel', 'noopener noreferrer');\r\n    p2.appendChild(link);\r\n    footerDiv.appendChild(p2);\r\n    body.appendChild(footerDiv);\r\n\r\n    printWindow.focus();\r\n\r\n    setTimeout(() => {\r\n      printWindow.print();\r\n    }, 300);\r\n  };\r\n\r\n  \/\/ === SECURITY: Whitelist of valid actions ===\r\n  const VALID_ACTIONS = ['add-prison', 'add-fine', 'delete-row', 'calculate', 'reset', 'example', 'export-pdf'];\r\n\r\n  \/\/ === Event Handlers ===\r\n  const handleClick = (e) => {\r\n    const button = e.target.closest('[data-action]');\r\n    if (!button) return;\r\n\r\n    const action = button.dataset.action;\r\n\r\n    \/\/ SECURITY: Validate action is in whitelist\r\n    if (!VALID_ACTIONS.includes(action)) {\r\n      console.warn('ZIC Calculator: Invalid action attempted:', action);\r\n      return;\r\n    }\r\n\r\n    switch (action) {\r\n      case 'add-prison': {\r\n        const row = createPrisonRow();\r\n        if (row) {\r\n          elements.prisonRows.appendChild(row);\r\n          updateCounts();\r\n          \/\/ Focus management: mut\u0103 focusul pe primul input al r\u00e2ndului nou\r\n          const firstInput = row.querySelector('.zic2__input');\r\n          if (firstInput) firstInput.focus();\r\n        }\r\n        break;\r\n      }\r\n      case 'add-fine': {\r\n        const row = createFineRow();\r\n        if (row) {\r\n          elements.fineRows.appendChild(row);\r\n          updateCounts();\r\n          \/\/ Focus management: mut\u0103 focusul pe inputul de amend\u0103\r\n          const fineInput = row.querySelector('.zic2__input');\r\n          if (fineInput) fineInput.focus();\r\n        }\r\n        break;\r\n      }\r\n      case 'delete-row':\r\n        button.closest('[data-row]').remove();\r\n        hideError();\r\n        updateCounts();\r\n        break;\r\n      case 'calculate':\r\n        calculate();\r\n        break;\r\n      case 'reset':\r\n        reset();\r\n        break;\r\n      case 'example':\r\n        loadExample();\r\n        break;\r\n      case 'export-pdf':\r\n        exportPDF();\r\n        break;\r\n    }\r\n  };\r\n\r\n  const handleBlur = (e) => {\r\n    const input = e.target;\r\n    if (!input.matches('.zic2__input')) return;\r\n\r\n    const val = input.value.trim();\r\n    if (val === '') return; \/\/ Nu modifica c\u00e2mpurile goale\r\n\r\n    const field = input.dataset.field;\r\n    if (field === 'months' || input.id === 'zic2-ded-luni') {\r\n      input.value = clamp(val, 0, MAX_MONTHS);\r\n    } else if (field === 'days' || input.id === 'zic2-ded-zile') {\r\n      input.value = clamp(val, 0, MAX_DAYS);\r\n    } else if (field === 'years' || input.id === 'zic2-ded-ani') {\r\n      input.value = clamp(val, 0, MAX_YEARS);\r\n    } else if (field === 'maxLaw') {\r\n      input.value = clamp(val, 0, MAX_YEARS);\r\n    } else if (field === 'amount' || input.id === 'zic2-amenda-dedusa') {\r\n      input.value = clamp(val, 0, MAX_FINE_AMOUNT);\r\n    }\r\n  };\r\n\r\n  \/\/ === SECURITY: Validate input on keydown to prevent invalid characters ===\r\n  const handleKeydown = (e) => {\r\n    const input = e.target;\r\n    if (!input.matches('.zic2__input[type=\"number\"]')) return;\r\n\r\n    \/\/ Allow: backspace, delete, tab, escape, enter, arrows\r\n    const allowedKeys = ['Backspace', 'Delete', 'Tab', 'Escape', 'Enter', 'ArrowLeft', 'ArrowRight', 'ArrowUp', 'ArrowDown', 'Home', 'End'];\r\n    if (allowedKeys.includes(e.key)) return;\r\n\r\n    \/\/ Allow Ctrl+A, Ctrl+C, Ctrl+V, Ctrl+X\r\n    if ((e.ctrlKey || e.metaKey) && ['a', 'c', 'v', 'x'].includes(e.key.toLowerCase())) return;\r\n\r\n    \/\/ Block non-numeric characters (including dot, minus, etc.)\r\n    if (!\/^[0-9]$\/.test(e.key)) {\r\n      e.preventDefault();\r\n    }\r\n  };\r\n\r\n  \/\/ === SECURITY: Sanitize pasted content ===\r\n  const handlePaste = (e) => {\r\n    const input = e.target;\r\n    if (!input.matches('.zic2__input[type=\"number\"]')) return;\r\n\r\n    const pastedData = (e.clipboardData || window.clipboardData).getData('text');\r\n    \/\/ Only allow if pasted data contains only digits\r\n    if (!\/^\\d*$\/.test(pastedData)) {\r\n      e.preventDefault();\r\n      \/\/ Extract only digits from pasted content\r\n      const digitsOnly = pastedData.replace(\/\\D\/g, '');\r\n      if (digitsOnly) {\r\n        \/\/ Insert cleaned data at cursor position\r\n        const start = input.selectionStart;\r\n        const end = input.selectionEnd;\r\n        const currentValue = input.value;\r\n        input.value = currentValue.substring(0, start) + digitsOnly + currentValue.substring(end);\r\n        input.setSelectionRange(start + digitsOnly.length, start + digitsOnly.length);\r\n      }\r\n    }\r\n  };\r\n\r\n  \/\/ === Initialize ===\r\n  const init = () => {\r\n    root.addEventListener('click', handleClick);\r\n    root.addEventListener('blur', handleBlur, true);\r\n    \/\/ SECURITY: Add input validation handlers\r\n    root.addEventListener('keydown', handleKeydown, true);\r\n    root.addEventListener('paste', handlePaste, true);\r\n\r\n    \/\/ Adaug\u0103 listener pentru input non-numeric pe c\u00e2mpurile statice din HTML\r\n    const staticInputs = root.querySelectorAll('#zic2-ded-ani, #zic2-ded-luni, #zic2-ded-zile, #zic2-amenda-dedusa');\r\n    staticInputs.forEach(input => {\r\n      input.addEventListener('input', (e) => {\r\n        e.target.value = e.target.value.replace(\/[^\\d]\/g, '');\r\n      });\r\n    });\r\n\r\n    \/\/ Add initial prison row\r\n    const initialRow = createPrisonRow();\r\n    if (initialRow) {\r\n      elements.prisonRows.appendChild(initialRow);\r\n    }\r\n    updateCounts();\r\n  };\r\n\r\n  if (document.readyState === 'loading') {\r\n    document.addEventListener('DOMContentLoaded', init);\r\n  } else {\r\n    init();\r\n  }\r\n})();\r\n<\/script>\r\n<\/div>\n<div data-tool-content=\"liberare\" style=\"display:none\"><div id=\"zic-liberare-calculator-v2\" class=\"zic2\" data-zic2=\"1\">\r\n  <div class=\"zic2__wrap\">\r\n    <!-- Header -->\r\n    <header class=\"zic2__hero\">\r\n      <div class=\"zic2__brandbar\">\r\n        <div class=\"zic2__mark\" aria-hidden=\"true\">\r\n          <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n            <path d=\"M12 2l7 4v6c0 5-3 9-7 10-4-1-7-5-7-10V6l7-4Z\"\/>\r\n            <path d=\"M9.5 12.2l1.7 1.7 3.8-4.1\"\/>\r\n          <\/svg>\r\n        <\/div>\r\n        <div class=\"zic2__headerText\">\r\n          <h2 class=\"zic2__title\">Calculator liberare condi\u021bionat\u0103<\/h2>\r\n          <p class=\"zic2__subtitle\">Estimare orientativ\u0103 a condi\u021biei de timp (art. 99-101 CP; art. 96 L.254\/2013)<\/p>\r\n        <\/div>\r\n      <\/div>\r\n    <\/header>\r\n\r\n    <!-- Formula info -->\r\n    <div class=\"zic2__formula\">\r\n      <div class=\"zic2__formulaIcon\">\r\n        <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n          <circle cx=\"12\" cy=\"12\" r=\"10\"\/>\r\n          <path d=\"M12 16v-4\"\/>\r\n          <path d=\"M12 8h.01\"\/>\r\n        <\/svg>\r\n      <\/div>\r\n      <div class=\"zic2__formulaText\">\r\n        <strong>Zile considerate<\/strong> = Zile executate efectiv + Zile c\u00e2\u0219tig (munc\u0103\/educa\u021bie). Pragul depinde de durata pedepsei \u0219i v\u00e2rst\u0103.\r\n      <\/div>\r\n    <\/div>\r\n\r\n    <!-- Error Box -->\r\n    <div class=\"zic2__error is-hidden\" role=\"alert\" aria-live=\"polite\" data-errors><\/div>\r\n\r\n    <!-- Card: Set\u0103ri generale -->\r\n    <section class=\"zic2__card\" aria-labelledby=\"zic2-sec-general\">\r\n      <div class=\"zic2__cardHeader\">\r\n        <div class=\"zic2__cardIcon zic2__cardIcon--purple\">\r\n          <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n            <path d=\"M10.325 4.317c.426-1.756 2.924-1.756 3.35 0a1.724 1.724 0 0 0 2.573 1.066c1.543-.94 3.31.826 2.37 2.37a1.724 1.724 0 0 0 1.065 2.572c1.756.426 1.756 2.924 0 3.35a1.724 1.724 0 0 0-1.066 2.573c.94 1.543-.826 3.31-2.37 2.37a1.724 1.724 0 0 0-2.572 1.065c-.426 1.756-2.924 1.756-3.35 0a1.724 1.724 0 0 0-2.573-1.066c-1.543.94-3.31-.826-2.37-2.37a1.724 1.724 0 0 0-1.065-2.572c-1.756-.426-1.756-2.924 0-3.35a1.724 1.724 0 0 0 1.066-2.573c-.94-1.543.826-3.31 2.37-2.37 1 .608 2.296.07 2.572-1.065Z\"\/>\r\n            <circle cx=\"12\" cy=\"12\" r=\"3\"\/>\r\n          <\/svg>\r\n        <\/div>\r\n        <h3 id=\"zic2-sec-general\" class=\"zic2__cardTitle\">Set\u0103ri generale<\/h3>\r\n        <div class=\"zic2__spacer\"><\/div>\r\n        <span class=\"zic2__badge zic2__badge--live\">Executat: <strong data-live=\"effective\">0<\/strong> zile<\/span>\r\n      <\/div>\r\n\r\n      <div class=\"zic2__grid2\">\r\n        <div class=\"zic2__field\">\r\n          <label class=\"zic2__label\" for=\"zic2-tip\">Categoria pedepsei<\/label>\r\n          <select id=\"zic2-tip\" class=\"zic2__select\" data-field=\"tip\">\r\n            <option value=\"inchisoare\" selected>\u00cenchisoare<\/option>\r\n            <option value=\"detentiune_viata\">Deten\u021biune pe via\u021b\u0103<\/option>\r\n          <\/select>\r\n        <\/div>\r\n        <div class=\"zic2__field\">\r\n          <label class=\"zic2__label\" for=\"zic2-varsta\">V\u00e2rsta (ani \u00eemplini\u021bi)<\/label>\r\n          <input id=\"zic2-varsta\" class=\"zic2__input\" type=\"number\" min=\"0\" max=\"150\" inputmode=\"numeric\" data-field=\"varsta\" placeholder=\"Ex: 35\">\r\n        <\/div>\r\n      <\/div>\r\n\r\n      <div data-section=\"onlyInch\" style=\"margin-top: 16px;\">\r\n        <div class=\"zic2__field\" style=\"margin-bottom: 16px;\">\r\n          <label class=\"zic2__label\">Durata pedepsei (\u00eenchisoare)<\/label>\r\n          <div class=\"zic2__grid3\">\r\n            <div class=\"zic2__field\">\r\n              <label class=\"zic2__label\" for=\"zic2-ani\">Ani<\/label>\r\n              <input id=\"zic2-ani\" class=\"zic2__input\" type=\"number\" min=\"0\" max=\"100\" inputmode=\"numeric\" data-field=\"ani\" placeholder=\"0\">\r\n            <\/div>\r\n            <div class=\"zic2__field\">\r\n              <label class=\"zic2__label\" for=\"zic2-luni\">Luni<\/label>\r\n              <input id=\"zic2-luni\" class=\"zic2__input\" type=\"number\" min=\"0\" max=\"11\" inputmode=\"numeric\" data-field=\"luni\" placeholder=\"0\">\r\n            <\/div>\r\n            <div class=\"zic2__field\">\r\n              <label class=\"zic2__label\" for=\"zic2-zile-dur\">Zile<\/label>\r\n              <input id=\"zic2-zile-dur\" class=\"zic2__input\" type=\"number\" min=\"0\" max=\"29\" inputmode=\"numeric\" data-field=\"zileDur\" placeholder=\"0\">\r\n            <\/div>\r\n          <\/div>\r\n        <\/div>\r\n\r\n        <div class=\"zic2__grid2\">\r\n          <div class=\"zic2__field\">\r\n            <label class=\"zic2__label\" for=\"zic2-regim\">Regim de executare<\/label>\r\n            <select id=\"zic2-regim\" class=\"zic2__select\" data-field=\"regim\">\r\n              <option value=\"\">Selecteaz\u0103...<\/option>\r\n              <option value=\"maxima\">Maxim\u0103 siguran\u021b\u0103<\/option>\r\n              <option value=\"inchis\">\u00cenchis<\/option>\r\n              <option value=\"semideschis\">Semideschis<\/option>\r\n              <option value=\"deschis\">Deschis<\/option>\r\n            <\/select>\r\n          <\/div>\r\n          <div class=\"zic2__field\">\r\n            <label class=\"zic2__label\" for=\"zic2-recurs\">Zile recurs compensatoriu<\/label>\r\n            <input id=\"zic2-recurs\" class=\"zic2__input\" type=\"number\" min=\"0\" max=\"100000\" inputmode=\"numeric\" data-field=\"recurs\" placeholder=\"0\">\r\n          <\/div>\r\n        <\/div>\r\n      <\/div>\r\n\r\n      <div class=\"zic2__hint\" style=\"margin-top: 16px;\">\r\n        <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><circle cx=\"12\" cy=\"12\" r=\"10\"\/><path d=\"M9.09 9a3 3 0 0 1 5.83 1c0 2-3 3-3 3\"\/><path d=\"M12 17h.01\"\/><\/svg>\r\n        <span><strong>Data \u00eenceperii execut\u0103rii<\/strong> = data punerii \u00een executare, nu data arest\u0103rii preventive. Perioadele anterioare se adaug\u0103 la \"M\u0103suri preventive\".<\/span>\r\n      <\/div>\r\n\r\n      <div class=\"zic2__grid2\" style=\"margin-top: 16px;\">\r\n        <div class=\"zic2__field\">\r\n          <label class=\"zic2__label\" for=\"zic2-data-start\">Data \u00eenceperii execut\u0103rii (op\u021bional)<\/label>\r\n          <input id=\"zic2-data-start\" class=\"zic2__input\" type=\"date\" data-field=\"dataStart\">\r\n        <\/div>\r\n        <div class=\"zic2__field\">\r\n          <label class=\"zic2__label\" for=\"zic2-zile-efective\">Zile executate efectiv<\/label>\r\n          <input id=\"zic2-zile-efective\" class=\"zic2__input\" type=\"number\" min=\"0\" max=\"100000\" inputmode=\"numeric\" data-field=\"zileEfective\" placeholder=\"Dac\u0103 nu folose\u0219ti data\">\r\n        <\/div>\r\n      <\/div>\r\n    <\/section>\r\n\r\n    <!-- Card: Zile c\u00e2\u0219tig -->\r\n    <section class=\"zic2__card\" aria-labelledby=\"zic2-sec-credit\">\r\n      <div class=\"zic2__cardHeader\">\r\n        <div class=\"zic2__cardIcon zic2__cardIcon--blue\">\r\n          <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n            <circle cx=\"12\" cy=\"12\" r=\"10\"\/>\r\n            <polyline points=\"12 6 12 12 16 14\"\/>\r\n          <\/svg>\r\n        <\/div>\r\n        <h3 id=\"zic2-sec-credit\" class=\"zic2__cardTitle\">Zile c\u00e2\u0219tig (munc\u0103 \/ educa\u021bie)<\/h3>\r\n        <div class=\"zic2__spacer\"><\/div>\r\n        <span class=\"zic2__badge zic2__badge--live\">C\u00e2\u0219tig: <strong data-live=\"credit\">0<\/strong> zile<\/span>\r\n      <\/div>\r\n\r\n      <div class=\"zic2__grid2\">\r\n        <div class=\"zic2__field\">\r\n          <label class=\"zic2__label\" for=\"zic2-munca-rem\">Zile munc\u0103 remunerat\u0103<\/label>\r\n          <input id=\"zic2-munca-rem\" class=\"zic2__input\" type=\"number\" min=\"0\" max=\"100000\" inputmode=\"numeric\" data-field=\"muncaRem\" placeholder=\"0\">\r\n          <span class=\"zic2__fieldHint\">+1 zi c\u00e2\u0219tig la 4 zile lucrate<\/span>\r\n        <\/div>\r\n        <div class=\"zic2__field\">\r\n          <label class=\"zic2__label\" for=\"zic2-munca-nerem\">Zile munc\u0103 neremunerat\u0103<\/label>\r\n          <input id=\"zic2-munca-nerem\" class=\"zic2__input\" type=\"number\" min=\"0\" max=\"100000\" inputmode=\"numeric\" data-field=\"muncaNerem\" placeholder=\"0\">\r\n          <span class=\"zic2__fieldHint\">+1 zi c\u00e2\u0219tig la 3 zile lucrate<\/span>\r\n        <\/div>\r\n      <\/div>\r\n\r\n      <div class=\"zic2__grid2\" style=\"margin-top: 12px;\">\r\n        <div class=\"zic2__field\">\r\n          <label class=\"zic2__label\" for=\"zic2-nopti\">Nop\u021bi munc\u0103 de noapte<\/label>\r\n          <input id=\"zic2-nopti\" class=\"zic2__input\" type=\"number\" min=\"0\" max=\"100000\" inputmode=\"numeric\" data-field=\"nopti\" placeholder=\"0\">\r\n          <span class=\"zic2__fieldHint\">+1 zi c\u00e2\u0219tig la 2 nop\u021bi<\/span>\r\n        <\/div>\r\n        <div class=\"zic2__field\">\r\n          <label class=\"zic2__label\" for=\"zic2-an-scolar\">Ani \u0219colari absolvi\u021bi<\/label>\r\n          <input id=\"zic2-an-scolar\" class=\"zic2__input\" type=\"number\" min=\"0\" max=\"50\" inputmode=\"numeric\" data-field=\"anScolar\" placeholder=\"0\">\r\n          <span class=\"zic2__fieldHint\">+30 zile \/ an<\/span>\r\n        <\/div>\r\n      <\/div>\r\n\r\n      <div class=\"zic2__grid2\" style=\"margin-top: 12px;\">\r\n        <div class=\"zic2__field\">\r\n          <label class=\"zic2__label\" for=\"zic2-curs\">Cursuri calificare\/recalificare<\/label>\r\n          <input id=\"zic2-curs\" class=\"zic2__input\" type=\"number\" min=\"0\" max=\"100\" inputmode=\"numeric\" data-field=\"curs\" placeholder=\"0\">\r\n          <span class=\"zic2__fieldHint\">+20 zile \/ curs<\/span>\r\n        <\/div>\r\n        <div class=\"zic2__field\">\r\n          <label class=\"zic2__label\">Lucr\u0103ri \u0219tiin\u021bifice \/ inven\u021bii<\/label>\r\n          <label class=\"zic2__checkbox zic2__checkbox--sm\">\r\n            <input type=\"checkbox\" data-field=\"works20\">\r\n            <span>Adaug\u0103 20 zile (max o singur\u0103 dat\u0103)<\/span>\r\n          <\/label>\r\n        <\/div>\r\n      <\/div>\r\n    <\/section>\r\n\r\n    <!-- Card: M\u0103suri preventive -->\r\n    <section class=\"zic2__card\" aria-labelledby=\"zic2-sec-mp\">\r\n      <div class=\"zic2__cardHeader\">\r\n        <div class=\"zic2__cardIcon zic2__cardIcon--purple\">\r\n          <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n            <path d=\"M12 2l7 4v6c0 5-3 9-7 10-4-1-7-5-7-10V6l7-4Z\"\/>\r\n          <\/svg>\r\n        <\/div>\r\n        <h3 id=\"zic2-sec-mp\" class=\"zic2__cardTitle\">M\u0103suri preventive deduse <span class=\"zic2__optional\">(op\u021bional)<\/span><\/h3>\r\n        <div class=\"zic2__spacer\"><\/div>\r\n        <span class=\"zic2__badge zic2__badge--live\">Total: <strong data-live=\"mpTotal\">0<\/strong> zile<\/span>\r\n      <\/div>\r\n\r\n      <div class=\"zic2__btnGroup\">\r\n        <button type=\"button\" class=\"zic2__btn zic2__btn--outline\" data-action=\"addMp\">\r\n          <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\"><path d=\"M12 5v14M5 12h14\"\/><\/svg>\r\n          Adaug\u0103 perioad\u0103\r\n        <\/button>\r\n      <\/div>\r\n\r\n      <div class=\"zic2__rows\" data-list=\"mp\"><\/div>\r\n\r\n      <div class=\"zic2__emptyState\" data-empty=\"mp\">\r\n        <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\">\r\n          <path d=\"M12 2l7 4v6c0 5-3 9-7 10-4-1-7-5-7-10V6l7-4Z\"\/>\r\n        <\/svg>\r\n        <span>Perioadele suprapuse sunt unite automat<\/span>\r\n      <\/div>\r\n    <\/section>\r\n\r\n    <!-- Card: \u00centreruperi -->\r\n    <section class=\"zic2__card\" aria-labelledby=\"zic2-sec-intr\">\r\n      <div class=\"zic2__cardHeader\">\r\n        <div class=\"zic2__cardIcon zic2__cardIcon--purple\">\r\n          <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n            <path d=\"M6 6l12 12M18 6L6 18\"\/>\r\n          <\/svg>\r\n        <\/div>\r\n        <h3 id=\"zic2-sec-intr\" class=\"zic2__cardTitle\">\u00centreruperi ale execut\u0103rii <span class=\"zic2__optional\">(op\u021bional)<\/span><\/h3>\r\n        <div class=\"zic2__spacer\"><\/div>\r\n        <span class=\"zic2__badge zic2__badge--live\">Total: <strong data-live=\"intrTotal\">0<\/strong> zile<\/span>\r\n      <\/div>\r\n\r\n      <div class=\"zic2__btnGroup\">\r\n        <button type=\"button\" class=\"zic2__btn zic2__btn--outline\" data-action=\"addIntr\">\r\n          <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\"><path d=\"M12 5v14M5 12h14\"\/><\/svg>\r\n          Adaug\u0103 \u00eentrerupere\r\n        <\/button>\r\n      <\/div>\r\n\r\n      <div class=\"zic2__rows\" data-list=\"intr\"><\/div>\r\n\r\n      <div class=\"zic2__emptyState\" data-empty=\"intr\">\r\n        <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\">\r\n          <path d=\"M6 6l12 12M18 6L6 18\"\/>\r\n        <\/svg>\r\n        <span>Se scad din zilele executate (doar cu data de start)<\/span>\r\n      <\/div>\r\n    <\/section>\r\n\r\n    <!-- Actions -->\r\n    <div class=\"zic2__actions\">\r\n      <button type=\"button\" class=\"zic2__btn zic2__btn--primary zic2__btn--large\" data-action=\"calculate\">\r\n        <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\"><polyline points=\"9 11 12 14 22 4\"\/><path d=\"M21 12v7a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h11\"\/><\/svg>\r\n        Calculeaz\u0103\r\n      <\/button>\r\n      <button type=\"button\" class=\"zic2__btn zic2__btn--secondary\" data-action=\"reset\">\r\n        <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><path d=\"M3 12a9 9 0 1 0 9-9 9.75 9.75 0 0 0-6.74 2.74L3 8\"\/><path d=\"M3 3v5h5\"\/><\/svg>\r\n        Reseteaz\u0103\r\n      <\/button>\r\n      <button type=\"button\" class=\"zic2__btn zic2__btn--success\" data-action=\"example\">\r\n        <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><path d=\"M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z\"\/><polyline points=\"14 2 14 8 20 8\"\/><\/svg>\r\n        Exemplu\r\n      <\/button>\r\n      <button type=\"button\" class=\"zic2__btn zic2__btn--secondary\" data-action=\"export-pdf\">\r\n        <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><path d=\"M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z\"\/><polyline points=\"14 2 14 8 20 8\"\/><path d=\"M12 18v-6\"\/><path d=\"M9 15l3 3 3-3\"\/><\/svg>\r\n        Descarc\u0103 PDF\r\n      <\/button>\r\n    <\/div>\r\n\r\n    <!-- Result -->\r\n    <section class=\"zic2__card zic2__resultCard is-hidden\" data-result aria-live=\"polite\">\r\n      <div class=\"zic2__cardHeader\">\r\n        <div class=\"zic2__cardIcon\" data-result-icon>\r\n          <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\"><polyline points=\"20 6 9 17 4 12\"\/><\/svg>\r\n        <\/div>\r\n        <h3 class=\"zic2__cardTitle\">Rezultat (condi\u021bia de timp)<\/h3>\r\n      <\/div>\r\n      <div class=\"zic2__resultBody\" data-result-content><\/div>\r\n    <\/section>\r\n\r\n    <!-- Disclaimer -->\r\n    <div class=\"zic2__disclaimer\">\r\n      <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><path d=\"M10.29 3.86L1.82 18a2 2 0 0 0 1.71 3h16.94a2 2 0 0 0 1.71-3L13.71 3.86a2 2 0 0 0-3.42 0z\"\/><line x1=\"12\" y1=\"9\" x2=\"12\" y2=\"13\"\/><line x1=\"12\" y1=\"17\" x2=\"12.01\" y2=\"17\"\/><\/svg>\r\n      <div>\r\n        <strong>Disclaimer:<\/strong> Acest calculator este oferit exclusiv \u00een scop informativ \u0219i educativ. Acordarea liber\u0103rii condi\u021bionate depinde \u0219i de conduit\u0103, obliga\u021bii civile, aprecierea instan\u021bei etc.\r\n      <\/div>\r\n    <\/div>\r\n\r\n    <!-- Footer -->\r\n    <footer class=\"zic2__footer\">\r\n      <a href=\"https:\/\/zic.legal\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"zic2__footerLink\">\r\n        &copy; 2025 ZIC Legal\r\n      <\/a>\r\n    <\/footer>\r\n  <\/div>\r\n<\/div>\r\n\r\n<style>\r\n\/* ============================================================\r\n   ZIC Calculator v2 - Liberare Condi\u021bionat\u0103\r\n   Theme: Purple\/Mov | Fully Responsive | Optimized | SECURED\r\n   ============================================================ *\/\r\n\r\n\/* === CSS Variables === *\/\r\n#zic-liberare-calculator-v2 {\r\n  --zic-primary: #8A88FF;\r\n  --zic-primary-dark: #6F6CFF;\r\n  --zic-primary-light: rgba(138,136,255,.08);\r\n  --zic-primary-border: rgba(138,136,255,.25);\r\n\r\n  --zic-success: #10B981;\r\n  --zic-success-light: rgba(16,185,129,.08);\r\n  --zic-success-border: rgba(16,185,129,.25);\r\n\r\n  --zic-danger: #EF4444;\r\n  --zic-danger-light: rgba(239,68,68,.08);\r\n  --zic-danger-border: rgba(239,68,68,.25);\r\n\r\n  --zic-warning: #F59E0B;\r\n  --zic-warning-light: rgba(245,158,11,.08);\r\n  --zic-warning-border: rgba(245,158,11,.25);\r\n\r\n  --zic-blue: #3B82F6;\r\n  --zic-blue-light: rgba(59,130,246,.08);\r\n\r\n  --zic-ink: #1F2937;\r\n  --zic-ink-light: #374151;\r\n  --zic-muted: #6B7280;\r\n  --zic-light: #9CA3AF;\r\n\r\n  --zic-bg: #F9FAFB;\r\n  --zic-surface: #FFFFFF;\r\n  --zic-border: #E5E7EB;\r\n\r\n  --zic-shadow-sm: 0 1px 2px rgba(0,0,0,.05);\r\n  --zic-shadow-lg: 0 10px 15px -3px rgba(0,0,0,.1), 0 4px 6px -2px rgba(0,0,0,.05);\r\n\r\n  --zic-radius: 16px;\r\n  --zic-radius-sm: 12px;\r\n  --zic-radius-xs: 8px;\r\n\r\n  --zic-transition: 150ms ease;\r\n\r\n  font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif;\r\n  color: var(--zic-ink);\r\n  line-height: 1.5;\r\n  -webkit-font-smoothing: antialiased;\r\n}\r\n\r\n#zic-liberare-calculator-v2 *, #zic-liberare-calculator-v2 *::before, #zic-liberare-calculator-v2 *::after { box-sizing: border-box; }\r\n\r\n\/* === WordPress\/Avada Override Protection === *\/\r\n#zic-liberare-calculator-v2 input[type=\"checkbox\"],\r\n#zic-liberare-calculator-v2 input[type=\"radio\"] {\r\n  -webkit-appearance: auto !important;\r\n  -moz-appearance: auto !important;\r\n  appearance: auto !important;\r\n  width: 18px !important;\r\n  height: 18px !important;\r\n  margin: 0 !important;\r\n  padding: 0 !important;\r\n  border: none !important;\r\n  background: none !important;\r\n  box-shadow: none !important;\r\n}\r\n\r\n#zic-liberare-calculator-v2 input[type=\"number\"],\r\n#zic-liberare-calculator-v2 input[type=\"text\"],\r\n#zic-liberare-calculator-v2 input[type=\"date\"] {\r\n  -webkit-appearance: none !important;\r\n  -moz-appearance: textfield !important;\r\n  appearance: none !important;\r\n  background-image: none !important;\r\n  box-shadow: none !important;\r\n}\r\n\r\n#zic-liberare-calculator-v2 select {\r\n  background-image: url(\"data:image\/svg+xml,%3Csvg xmlns='http:\/\/www.w3.org\/2000\/svg' width='12' height='12' viewBox='0 0 24 24' fill='none' stroke='%236B7280' stroke-width='2'%3E%3Cpath d='M6 9l6 6 6-6'\/%3E%3C\/svg%3E\") !important;\r\n  background-repeat: no-repeat !important;\r\n  background-position: right 12px center !important;\r\n  padding-right: 36px !important;\r\n}\r\n\r\n#zic-liberare-calculator-v2 button:not(.zic2__btn--primary) {\r\n  background-image: none !important;\r\n}\r\n\r\n#zic-liberare-calculator-v2 button {\r\n  text-shadow: none !important;\r\n  letter-spacing: normal !important;\r\n}\r\n\r\n#zic-liberare-calculator-v2 h2,\r\n#zic-liberare-calculator-v2 h3 {\r\n  text-transform: none !important;\r\n  letter-spacing: normal !important;\r\n}\r\n\r\n#zic-liberare-calculator-v2 a { text-decoration: none; }\r\n#zic-liberare-calculator-v2 a:hover { text-decoration: underline; }\r\n\r\n#zic-liberare-calculator-v2 .zic2__wrap { max-width: 720px; margin: 0 auto; padding: 16px; }\r\n\r\n#zic-liberare-calculator-v2 .zic2__hero { margin-bottom: 16px; }\r\n\r\n#zic-liberare-calculator-v2 .zic2__brandbar {\r\n  display: flex; align-items: center; gap: 14px;\r\n  background: linear-gradient(135deg, var(--zic-primary), var(--zic-primary-dark));\r\n  border-radius: var(--zic-radius); padding: 20px; color: #fff; box-shadow: var(--zic-shadow-lg);\r\n}\r\n\r\n#zic-liberare-calculator-v2 .zic2__mark {\r\n  width: 48px; height: 48px; background: rgba(255,255,255,.2); border-radius: 12px;\r\n  display: flex; align-items: center; justify-content: center; flex-shrink: 0;\r\n}\r\n\r\n#zic-liberare-calculator-v2 .zic2__headerText { flex: 1; min-width: 0; }\r\n#zic-liberare-calculator-v2 .zic2__title { margin: 0; font-size: 20px; font-weight: 700; line-height: 1.2; }\r\n#zic-liberare-calculator-v2 .zic2__subtitle { margin: 4px 0 0; font-size: 14px; opacity: 0.9; }\r\n\r\n#zic-liberare-calculator-v2 .zic2__formula {\r\n  display: flex; align-items: flex-start; gap: 10px;\r\n  background: var(--zic-primary-light); border: 1px solid var(--zic-primary-border);\r\n  border-radius: var(--zic-radius-sm); padding: 12px 14px; margin-bottom: 16px;\r\n  font-size: 14px; color: var(--zic-ink-light);\r\n}\r\n#zic-liberare-calculator-v2 .zic2__formulaIcon { color: var(--zic-primary-dark); flex-shrink: 0; margin-top: 1px; }\r\n#zic-liberare-calculator-v2 .zic2__formulaText strong { color: var(--zic-ink); }\r\n\r\n#zic-liberare-calculator-v2 .zic2__card {\r\n  background: var(--zic-surface); border: 1px solid var(--zic-border);\r\n  border-radius: var(--zic-radius); padding: 20px; margin-bottom: 16px; box-shadow: var(--zic-shadow-sm);\r\n}\r\n\r\n#zic-liberare-calculator-v2 .zic2__cardHeader { display: flex; align-items: center; gap: 12px; margin-bottom: 16px; flex-wrap: wrap; }\r\n\r\n#zic-liberare-calculator-v2 .zic2__cardIcon {\r\n  width: 36px; height: 36px; border-radius: 10px;\r\n  display: flex; align-items: center; justify-content: center; flex-shrink: 0;\r\n}\r\n#zic-liberare-calculator-v2 .zic2__cardIcon--purple { background: var(--zic-primary-light); color: var(--zic-primary-dark); }\r\n#zic-liberare-calculator-v2 .zic2__cardIcon--blue { background: var(--zic-blue-light); color: var(--zic-blue); }\r\n#zic-liberare-calculator-v2 .zic2__cardIcon--green { background: var(--zic-success-light); color: var(--zic-success); }\r\n#zic-liberare-calculator-v2 .zic2__cardIcon--red { background: var(--zic-danger-light); color: var(--zic-danger); }\r\n\r\n#zic-liberare-calculator-v2 .zic2__cardTitle { margin: 0; font-size: 17px; font-weight: 700; color: var(--zic-ink); }\r\n#zic-liberare-calculator-v2 .zic2__spacer { flex: 1; }\r\n#zic-liberare-calculator-v2 .zic2__optional { font-weight: 400; color: var(--zic-muted); font-size: 14px; }\r\n\r\n#zic-liberare-calculator-v2 .zic2__badge {\r\n  display: inline-flex; align-items: center; gap: 6px; padding: 6px 12px;\r\n  background: var(--zic-primary-light); color: var(--zic-primary-dark);\r\n  font-size: 12px; font-weight: 600; border-radius: 999px; white-space: nowrap;\r\n}\r\n#zic-liberare-calculator-v2 .zic2__badge strong { font-weight: 800; }\r\n\r\n#zic-liberare-calculator-v2 .zic2__field { display: flex; flex-direction: column; gap: 4px; }\r\n#zic-liberare-calculator-v2 .zic2__label { font-size: 12px; font-weight: 600; color: var(--zic-muted); }\r\n#zic-liberare-calculator-v2 .zic2__fieldHint { font-size: 11px; color: var(--zic-light); margin-top: 4px; }\r\n\r\n#zic-liberare-calculator-v2 .zic2__input, #zic-liberare-calculator-v2 .zic2__select {\r\n  width: 100%; padding: 10px 12px; font-size: 15px; font-family: inherit;\r\n  color: var(--zic-ink); background: var(--zic-surface);\r\n  border: 2px solid var(--zic-border); border-radius: var(--zic-radius-xs);\r\n  outline: none; transition: border-color var(--zic-transition), box-shadow var(--zic-transition);\r\n}\r\n#zic-liberare-calculator-v2 .zic2__input:focus, #zic-liberare-calculator-v2 .zic2__select:focus {\r\n  border-color: var(--zic-primary); box-shadow: 0 0 0 3px var(--zic-primary-light);\r\n}\r\n#zic-liberare-calculator-v2 .zic2__input:disabled { opacity: 0.6; cursor: not-allowed; }\r\n\r\n#zic-liberare-calculator-v2 .zic2__grid2 { display: grid; gap: 12px; }\r\n#zic-liberare-calculator-v2 .zic2__grid3 { display: grid; gap: 12px; grid-template-columns: repeat(3, 1fr); }\r\n@media (min-width: 640px) { #zic-liberare-calculator-v2 .zic2__grid2 { grid-template-columns: 1fr 1fr; } }\r\n\r\n#zic-liberare-calculator-v2 .zic2__checkbox {\r\n  display: flex; align-items: center; gap: 10px; padding: 10px 12px;\r\n  background: var(--zic-bg); border: 1px solid var(--zic-border);\r\n  border-radius: var(--zic-radius-xs); cursor: pointer; transition: all var(--zic-transition);\r\n}\r\n#zic-liberare-calculator-v2 .zic2__checkbox:hover { background: var(--zic-primary-light); border-color: var(--zic-primary-border); }\r\n#zic-liberare-calculator-v2 .zic2__checkbox input[type=\"checkbox\"] { width: 16px; height: 16px; accent-color: var(--zic-primary); flex-shrink: 0; }\r\n#zic-liberare-calculator-v2 .zic2__checkbox span { font-size: 13px; font-weight: 600; color: var(--zic-ink-light); }\r\n\r\n#zic-liberare-calculator-v2 .zic2__btnGroup { display: flex; flex-wrap: wrap; gap: 8px; margin-bottom: 12px; }\r\n\r\n#zic-liberare-calculator-v2 .zic2__btn {\r\n  display: inline-flex; align-items: center; justify-content: center; gap: 6px;\r\n  padding: 10px 16px; font-size: 14px; font-weight: 600;\r\n  border-radius: var(--zic-radius-sm); border: 1px solid transparent;\r\n  cursor: pointer; transition: all var(--zic-transition); white-space: nowrap; text-decoration: none;\r\n}\r\n#zic-liberare-calculator-v2 .zic2__btn:focus { outline: none; box-shadow: 0 0 0 3px var(--zic-primary-border); }\r\n#zic-liberare-calculator-v2 .zic2__btn:active { transform: translateY(1px); }\r\n\r\n#zic-liberare-calculator-v2 .zic2__btn--primary {\r\n  background: linear-gradient(135deg, var(--zic-primary), var(--zic-primary-dark));\r\n  color: #fff; box-shadow: 0 4px 14px rgba(138,136,255,.35);\r\n}\r\n#zic-liberare-calculator-v2 .zic2__btn--primary:hover { box-shadow: 0 6px 20px rgba(138,136,255,.45); transform: translateY(-1px); }\r\n#zic-liberare-calculator-v2 .zic2__btn--large { padding: 14px 24px; font-size: 15px; }\r\n\r\n#zic-liberare-calculator-v2 .zic2__btn--secondary { background: var(--zic-surface); border-color: var(--zic-border); color: var(--zic-ink-light); }\r\n#zic-liberare-calculator-v2 .zic2__btn--secondary:hover { background: var(--zic-bg); border-color: var(--zic-primary-border); color: var(--zic-primary-dark); }\r\n\r\n#zic-liberare-calculator-v2 .zic2__btn--outline { background: var(--zic-surface); border-color: var(--zic-primary-border); color: var(--zic-primary-dark); }\r\n#zic-liberare-calculator-v2 .zic2__btn--outline:hover { background: var(--zic-primary-light); }\r\n\r\n#zic-liberare-calculator-v2 .zic2__btn--success { background: var(--zic-success-light); border-color: var(--zic-success-border); color: var(--zic-success); }\r\n#zic-liberare-calculator-v2 .zic2__btn--success:hover { background: rgba(16,185,129,.15); }\r\n\r\n#zic-liberare-calculator-v2 .zic2__btn--danger { background: var(--zic-danger-light); border-color: var(--zic-danger-border); color: var(--zic-danger); padding: 8px 12px; font-size: 13px; }\r\n#zic-liberare-calculator-v2 .zic2__btn--danger:hover { background: rgba(239,68,68,.15); }\r\n\r\n#zic-liberare-calculator-v2 .zic2__rows { display: flex; flex-direction: column; gap: 10px; }\r\n\r\n#zic-liberare-calculator-v2 .zic2__row { background: var(--zic-bg); border: 1px solid var(--zic-border); border-radius: var(--zic-radius-sm); padding: 14px; transition: border-color var(--zic-transition); }\r\n#zic-liberare-calculator-v2 .zic2__row:hover { border-color: var(--zic-primary-border); }\r\n\r\n#zic-liberare-calculator-v2 .zic2__rowGrid { display: grid; gap: 10px; }\r\n@media (min-width: 640px) {\r\n  #zic-liberare-calculator-v2 .zic2__rowGrid--mp { grid-template-columns: 1.2fr 1fr 1fr auto; align-items: end; }\r\n  #zic-liberare-calculator-v2 .zic2__rowGrid--intr { grid-template-columns: 1fr 1fr 1.3fr auto; align-items: end; }\r\n}\r\n\r\n#zic-liberare-calculator-v2 .zic2__hint { display: flex; align-items: flex-start; gap: 8px; padding: 10px 12px; background: var(--zic-bg); border-radius: var(--zic-radius-xs); font-size: 12px; color: var(--zic-muted); }\r\n#zic-liberare-calculator-v2 .zic2__hint svg { flex-shrink: 0; margin-top: 1px; }\r\n#zic-liberare-calculator-v2 .zic2__hint strong { color: var(--zic-ink-light); }\r\n\r\n#zic-liberare-calculator-v2 .zic2__emptyState { display: flex; flex-direction: column; align-items: center; justify-content: center; gap: 8px; padding: 24px; background: var(--zic-bg); border: 2px dashed var(--zic-border); border-radius: var(--zic-radius-sm); color: var(--zic-light); font-size: 13px; text-align: center; }\r\n\r\n#zic-liberare-calculator-v2 .zic2__actions { display: flex; flex-wrap: wrap; gap: 10px; margin-bottom: 16px; }\r\n#zic-liberare-calculator-v2 .zic2__actions .zic2__btn--primary { flex: 1; min-width: 200px; }\r\n\r\n#zic-liberare-calculator-v2 .zic2__error { margin-bottom: 16px; padding: 12px; background: var(--zic-danger-light); border: 1px solid var(--zic-danger-border); border-radius: var(--zic-radius-xs); color: var(--zic-danger); font-size: 13px; font-weight: 500; }\r\n#zic-liberare-calculator-v2 .zic2__error ul { margin: 8px 0 0 18px; padding: 0; }\r\n#zic-liberare-calculator-v2 .zic2__error li { margin: 4px 0; }\r\n\r\n#zic-liberare-calculator-v2 .zic2__resultCard { border-color: var(--zic-success-border); background: linear-gradient(135deg, rgba(16,185,129,.02), rgba(16,185,129,.06)); }\r\n#zic-liberare-calculator-v2 .zic2__resultCard--no { border-color: var(--zic-danger-border); background: linear-gradient(135deg, rgba(239,68,68,.02), rgba(239,68,68,.06)); }\r\n\r\n#zic-liberare-calculator-v2 .zic2__resultBody { display: flex; flex-direction: column; gap: 16px; }\r\n\r\n#zic-liberare-calculator-v2 .zic2__kpi { background: var(--zic-surface); border: 1px solid var(--zic-border); border-radius: var(--zic-radius-sm); padding: 16px; }\r\n#zic-liberare-calculator-v2 .zic2__kpiLabel { font-size: 12px; font-weight: 600; color: var(--zic-muted); text-transform: uppercase; letter-spacing: 0.5px; margin-bottom: 6px; }\r\n#zic-liberare-calculator-v2 .zic2__kpiValue { font-size: 22px; font-weight: 800; color: var(--zic-primary-dark); margin: 0; }\r\n#zic-liberare-calculator-v2 .zic2__kpiValue--yes { color: var(--zic-success); }\r\n#zic-liberare-calculator-v2 .zic2__kpiValue--no { color: var(--zic-danger); }\r\n\r\n#zic-liberare-calculator-v2 .zic2__detailsGrid { display: grid; grid-template-columns: 1fr 1fr; gap: 12px; }\r\n#zic-liberare-calculator-v2 .zic2__detailItem { background: var(--zic-surface); border: 1px solid var(--zic-border); border-radius: var(--zic-radius-xs); padding: 12px; }\r\n#zic-liberare-calculator-v2 .zic2__detailLabel { font-size: 11px; font-weight: 600; color: var(--zic-muted); text-transform: uppercase; letter-spacing: 0.05em; margin-bottom: 4px; }\r\n#zic-liberare-calculator-v2 .zic2__detailValue { font-size: 14px; font-weight: 700; color: var(--zic-ink); }\r\n#zic-liberare-calculator-v2 .zic2__detailValue--yes { color: var(--zic-success); }\r\n#zic-liberare-calculator-v2 .zic2__detailValue--no { color: var(--zic-danger); }\r\n\r\n#zic-liberare-calculator-v2 .zic2__disclaimer { display: flex; align-items: flex-start; gap: 10px; padding: 14px; background: var(--zic-bg); border: 1px solid var(--zic-border); border-radius: var(--zic-radius-sm); font-size: 12px; color: var(--zic-muted); line-height: 1.5; margin-bottom: 16px; }\r\n#zic-liberare-calculator-v2 .zic2__disclaimer svg { flex-shrink: 0; color: var(--zic-warning); margin-top: 1px; }\r\n#zic-liberare-calculator-v2 .zic2__disclaimer strong { color: var(--zic-ink-light); }\r\n\r\n#zic-liberare-calculator-v2 .zic2__footer { text-align: center; padding: 8px 0; }\r\n#zic-liberare-calculator-v2 .zic2__footerLink { color: var(--zic-primary-dark); text-decoration: none; font-size: 13px; font-weight: 600; transition: color var(--zic-transition); }\r\n#zic-liberare-calculator-v2 .zic2__footerLink:hover { color: var(--zic-primary); text-decoration: underline; }\r\n\r\n#zic-liberare-calculator-v2 .is-hidden { display: none !important; }\r\n\r\n\/* Small mobile (max 500px) *\/\r\n@media (max-width: 500px) {\r\n  #zic-liberare-calculator-v2 .zic2__actions { flex-direction: column; }\r\n  #zic-liberare-calculator-v2 .zic2__actions .zic2__btn { width: 100%; min-width: unset; }\r\n  #zic-liberare-calculator-v2 .zic2__btnGroup { flex-direction: column; }\r\n  #zic-liberare-calculator-v2 .zic2__btnGroup .zic2__btn { width: 100%; }\r\n  #zic-liberare-calculator-v2 .zic2__grid3 { grid-template-columns: 1fr; }\r\n  #zic-liberare-calculator-v2 .zic2__rowGrid--mp,\r\n  #zic-liberare-calculator-v2 .zic2__rowGrid--intr { grid-template-columns: 1fr; }\r\n}\r\n\r\n@media (min-width: 640px) { #zic-liberare-calculator-v2 .zic2__wrap { padding: 24px; } #zic-liberare-calculator-v2 .zic2__title { font-size: 24px; } }\r\n@media (min-width: 768px) { #zic-liberare-calculator-v2 .zic2__card { padding: 24px; } #zic-liberare-calculator-v2 .zic2__brandbar { padding: 24px; } #zic-liberare-calculator-v2 .zic2__mark { width: 56px; height: 56px; } #zic-liberare-calculator-v2 .zic2__title { font-size: 26px; } }\r\n@media (min-width: 1024px) { #zic-liberare-calculator-v2 .zic2__wrap { max-width: 900px; } }\r\n\r\n@media print {\r\n  #zic-liberare-calculator-v2 .zic2__btnGroup, #zic-liberare-calculator-v2 .zic2__actions, #zic-liberare-calculator-v2 .zic2__hint,\r\n  #zic-liberare-calculator-v2 .zic2__emptyState, #zic-liberare-calculator-v2 .zic2__footer, #zic-liberare-calculator-v2 .zic2__btn--danger { display: none !important; }\r\n  #zic-liberare-calculator-v2 .zic2__card { box-shadow: none; border: 1px solid #ddd; break-inside: avoid; }\r\n}\r\n<\/style>\r\n\r\n<script>\r\n(function() {\r\n  'use strict';\r\n  const ROOT_ID = 'zic-liberare-calculator-v2';\r\n  const MS_DAY = 86400000;\r\n  const root = document.getElementById(ROOT_ID);\r\n  if (!root) return;\r\n\r\n  \/\/ === SECURITY: HTML Escape Function to prevent XSS ===\r\n  function escapeHtml(str) {\r\n    if (str === null || str === undefined) return '';\r\n    const text = String(str);\r\n    const div = document.createElement('div');\r\n    div.textContent = text;\r\n    return div.innerHTML;\r\n  }\r\n\r\n  \/\/ === SECURITY: Sanitize numeric input ===\r\n  function sanitizeNumber(value, min, max) {\r\n    const num = parseInt(value, 10);\r\n    if (!isFinite(num)) return min;\r\n    return Math.max(min, Math.min(max, num));\r\n  }\r\n\r\n  \/\/ === SECURITY: Validate date format (YYYY-MM-DD) with proper day validation ===\r\n  function isValidDateFormat(dateStr) {\r\n    if (!dateStr || typeof dateStr !== 'string') return false;\r\n    const regex = \/^\\d{4}-\\d{2}-\\d{2}$\/;\r\n    if (!regex.test(dateStr)) return false;\r\n    const [y, m, d] = dateStr.split('-').map(Number);\r\n    if (y < 1900 || y > 2100 || m < 1 || m > 12 || d < 1) return false;\r\n    \/\/ Validate day based on month and year (leap year aware)\r\n    const daysInMonth = [31, (y % 4 === 0 && (y % 100 !== 0 || y % 400 === 0)) ? 29 : 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];\r\n    if (d > daysInMonth[m - 1]) return false;\r\n    return true;\r\n  }\r\n\r\n  \/\/ === SECURITY: Sanitize text input (for motiv field) - allows Romanian diacritics ===\r\n  function sanitizeText(str, maxLength) {\r\n    if (str === null || str === undefined) return '';\r\n    \/\/ Only remove dangerous HTML characters, keep Romanian diacritics (\u0103\u00e2\u00ee\u0219\u021b)\r\n    return String(str).substring(0, maxLength || 200).replace(\/[<>\"'&]\/g, function(c) {\r\n      var entities = { '<': '&lt;', '>': '&gt;', '\"': '&quot;', \"'\": '&#39;', '&': '&amp;' };\r\n      return entities[c] || c;\r\n    });\r\n  }\r\n\r\n  \/\/ Helper to decode sanitized text for display\r\n  function displayText(str) {\r\n    if (!str) return '';\r\n    return String(str)\r\n      .replace(\/&lt;\/g, '<')\r\n      .replace(\/&gt;\/g, '>')\r\n      .replace(\/&quot;\/g, '\"')\r\n      .replace(\/&#39;\/g, \"'\")\r\n      .replace(\/&amp;\/g, '&');\r\n  }\r\n\r\n  const $ = (s) => root.querySelector(s);\r\n  const els = {\r\n    errors: $('[data-errors]'), resultCard: $('[data-result]'), resultIcon: $('[data-result-icon]'),\r\n    resultContent: $('[data-result-content]'), mpList: $('[data-list=\"mp\"]'), intrList: $('[data-list=\"intr\"]'),\r\n    mpEmpty: $('[data-empty=\"mp\"]'), intrEmpty: $('[data-empty=\"intr\"]'), onlyInch: $('[data-section=\"onlyInch\"]'),\r\n    liveEffective: $('[data-live=\"effective\"]'), liveCredit: $('[data-live=\"credit\"]'),\r\n    liveMpTotal: $('[data-live=\"mpTotal\"]'), liveIntrTotal: $('[data-live=\"intrTotal\"]')\r\n  };\r\n  let state = { mp: [], intr: [], lastResult: null };\r\n\r\n  \/\/ === SECURITY: Limit array sizes to prevent memory attacks ===\r\n  const MAX_MP_ENTRIES = 50;\r\n  const MAX_INTR_ENTRIES = 50;\r\n\r\n  function getField(n) { return $('[data-field=\"' + n + '\"]'); }\r\n  function numVal(el) {\r\n    if (!el || !el.value) return 0;\r\n    var n = parseInt(el.value, 10);\r\n    return isFinite(n) && n >= 0 ? n : 0;\r\n  }\r\n  function parseISO(v) {\r\n    if (!isValidDateFormat(v)) return null;\r\n    const [y, m, d] = v.split('-').map(Number);\r\n    return y && m && d ? Math.floor(Date.UTC(y, m - 1, d) \/ MS_DAY) : null;\r\n  }\r\n  function dayToISO(day) {\r\n    const sanitizedDay = sanitizeNumber(day, 0, 100000000);\r\n    const dt = new Date(sanitizedDay * MS_DAY);\r\n    return dt.getUTCFullYear() + '-' + String(dt.getUTCMonth() + 1).padStart(2, '0') + '-' + String(dt.getUTCDate()).padStart(2, '0');\r\n  }\r\n  function todayDay() { const now = new Date(); return Math.floor(Date.UTC(now.getFullYear(), now.getMonth(), now.getDate()) \/ MS_DAY); }\r\n  function formatDay(day) {\r\n    if (day === null) return '-';\r\n    const sanitizedDay = sanitizeNumber(day, 0, 100000000);\r\n    const dt = new Date(sanitizedDay * MS_DAY);\r\n    return String(dt.getUTCDate()).padStart(2, '0') + '.' + String(dt.getUTCMonth() + 1).padStart(2, '0') + '.' + dt.getUTCFullYear();\r\n  }\r\n  function addYears(day, y) {\r\n    const sanitizedDay = sanitizeNumber(day, 0, 100000000);\r\n    const sanitizedY = sanitizeNumber(y, 0, 100);\r\n    const dt = new Date(sanitizedDay * MS_DAY);\r\n    dt.setUTCFullYear(dt.getUTCFullYear() + sanitizedY);\r\n    return Math.floor(dt.getTime() \/ MS_DAY);\r\n  }\r\n\r\n  \/\/ === SECURITY: Safe DOM manipulation for errors ===\r\n  function showErrors(msgs) {\r\n    if (!msgs?.length) {\r\n      els.errors.classList.add('is-hidden');\r\n      return;\r\n    }\r\n    els.errors.classList.remove('is-hidden');\r\n\r\n    \/\/ Clear previous content safely\r\n    while (els.errors.firstChild) {\r\n      els.errors.removeChild(els.errors.firstChild);\r\n    }\r\n\r\n    const header = document.createTextNode('Corecta\u021bi:');\r\n    els.errors.appendChild(header);\r\n\r\n    const ul = document.createElement('ul');\r\n    msgs.forEach(function(m) {\r\n      const li = document.createElement('li');\r\n      li.textContent = m; \/\/ Safe: uses textContent, not innerHTML\r\n      ul.appendChild(li);\r\n    });\r\n    els.errors.appendChild(ul);\r\n    els.errors.scrollIntoView({ behavior: 'smooth', block: 'start' });\r\n  }\r\n\r\n  function hideErrors() {\r\n    els.errors.classList.add('is-hidden');\r\n    while (els.errors.firstChild) {\r\n      els.errors.removeChild(els.errors.firstChild);\r\n    }\r\n  }\r\n\r\n  function setModeVis() {\r\n    var isInch = getField('tip')?.value === 'inchisoare';\r\n    if (els.onlyInch) els.onlyInch.style.display = isInch ? '' : 'none';\r\n    \/\/ Clear irrelevant fields when switching to deten\u021biune pe via\u021b\u0103\r\n    if (!isInch) {\r\n      var regimField = getField('regim');\r\n      if (regimField && regimField.value) {\r\n        regimField.value = '';\r\n      }\r\n    }\r\n  }\r\n  function lockManual() { const has = !!getField('dataStart')?.value; const el = getField('zileEfective'); if (el) el.disabled = has; }\r\n  function updateEmpty() { els.mpEmpty?.classList.toggle('is-hidden', state.mp.length > 0); els.intrEmpty?.classList.toggle('is-hidden', state.intr.length > 0); }\r\n\r\n  function mergeSum(intervals) {\r\n    const arr = intervals.filter(function(i) { return i.s !== null && i.e !== null && i.e >= i.s; }).sort(function(a, b) { return a.s - b.s; });\r\n    if (!arr.length) return 0;\r\n    const m = [];\r\n    for (var idx = 0; idx < arr.length; idx++) {\r\n      var c = arr[idx];\r\n      var l = m[m.length - 1];\r\n      if (!l) m.push({ s: c.s, e: c.e });\r\n      else if (c.s <= l.e + 1) l.e = Math.max(l.e, c.e);\r\n      else m.push({ s: c.s, e: c.e });\r\n    }\r\n    return m.reduce(function(sum, i) { return sum + (i.e - i.s + 1); }, 0);\r\n  }\r\n\r\n  function computeSums() {\r\n    return {\r\n      mpSum: mergeSum(state.mp.map(function(i) { return { s: parseISO(i.start), e: parseISO(i.end) }; })),\r\n      intrSum: mergeSum(state.intr.map(function(i) { return { s: parseISO(i.start), e: parseISO(i.end) }; }))\r\n    };\r\n  }\r\n\r\n  function computeCredits() {\r\n    var w = getField('works20');\r\n    return {\r\n      total: Math.floor(numVal(getField('muncaRem')) \/ 4) +\r\n             Math.floor(numVal(getField('muncaNerem')) \/ 3) +\r\n             Math.floor(numVal(getField('nopti')) \/ 2) +\r\n             numVal(getField('anScolar')) * 30 +\r\n             numVal(getField('curs')) * 20 +\r\n             (w?.checked ? 20 : 0) +\r\n             numVal(getField('recurs'))\r\n    };\r\n  }\r\n\r\n  function computeEff(mpSum, intrSum) {\r\n    var startISO = getField('dataStart')?.value || '';\r\n    var manual = numVal(getField('zileEfective'));\r\n    if (startISO) {\r\n      var sDay = parseISO(startISO);\r\n      var tDay = todayDay();\r\n      if (sDay === null || sDay > tDay) return { effective: 0, invalidStart: true };\r\n      return { effective: Math.max(0, tDay - sDay + 1 - intrSum) + mpSum, invalidStart: false };\r\n    }\r\n    return { effective: manual + mpSum, invalidStart: false };\r\n  }\r\n\r\n  \/\/ === SECURITY: Safe DOM creation for dynamic rows ===\r\n  function createMpRow(it, i) {\r\n    var r = document.createElement('div');\r\n    r.className = 'zic2__row';\r\n\r\n    var rowGrid = document.createElement('div');\r\n    rowGrid.className = 'zic2__rowGrid zic2__rowGrid--mp';\r\n\r\n    \/\/ Type field\r\n    var typeField = document.createElement('div');\r\n    typeField.className = 'zic2__field';\r\n    var typeLabel = document.createElement('label');\r\n    typeLabel.className = 'zic2__label';\r\n    typeLabel.textContent = 'Tip';\r\n    var typeSelect = document.createElement('select');\r\n    typeSelect.className = 'zic2__select';\r\n    typeSelect.setAttribute('data-mp-field', 'type');\r\n    typeSelect.setAttribute('data-mp-index', i);\r\n\r\n    var options = [\r\n      { value: 'retinere', text: 'Re\u021binere' },\r\n      { value: 'arest_preventiv', text: 'Arest preventiv' },\r\n      { value: 'arest_domiciliu', text: 'Arest la domiciliu' }\r\n    ];\r\n    options.forEach(function(opt) {\r\n      var option = document.createElement('option');\r\n      option.value = opt.value;\r\n      option.textContent = opt.text;\r\n      if (it.type === opt.value) option.selected = true;\r\n      typeSelect.appendChild(option);\r\n    });\r\n    typeField.appendChild(typeLabel);\r\n    typeField.appendChild(typeSelect);\r\n\r\n    \/\/ Start date field\r\n    var startField = document.createElement('div');\r\n    startField.className = 'zic2__field';\r\n    var startLabel = document.createElement('label');\r\n    startLabel.className = 'zic2__label';\r\n    startLabel.textContent = 'Data \u00eenceput';\r\n    var startInput = document.createElement('input');\r\n    startInput.className = 'zic2__input';\r\n    startInput.type = 'date';\r\n    startInput.value = it.start || '';\r\n    startInput.setAttribute('data-mp-field', 'start');\r\n    startInput.setAttribute('data-mp-index', i);\r\n    startField.appendChild(startLabel);\r\n    startField.appendChild(startInput);\r\n\r\n    \/\/ End date field\r\n    var endField = document.createElement('div');\r\n    endField.className = 'zic2__field';\r\n    var endLabel = document.createElement('label');\r\n    endLabel.className = 'zic2__label';\r\n    endLabel.textContent = 'Data sf\u00e2r\u0219it';\r\n    var endInput = document.createElement('input');\r\n    endInput.className = 'zic2__input';\r\n    endInput.type = 'date';\r\n    endInput.value = it.end || '';\r\n    endInput.setAttribute('data-mp-field', 'end');\r\n    endInput.setAttribute('data-mp-index', i);\r\n    endField.appendChild(endLabel);\r\n    endField.appendChild(endInput);\r\n\r\n    \/\/ Delete button\r\n    var deleteBtn = document.createElement('button');\r\n    deleteBtn.type = 'button';\r\n    deleteBtn.className = 'zic2__btn zic2__btn--danger';\r\n    deleteBtn.setAttribute('data-action', 'deleteMp');\r\n    deleteBtn.setAttribute('data-mp-index', i);\r\n    deleteBtn.textContent = '\u0218terge';\r\n\r\n    rowGrid.appendChild(typeField);\r\n    rowGrid.appendChild(startField);\r\n    rowGrid.appendChild(endField);\r\n    rowGrid.appendChild(deleteBtn);\r\n    r.appendChild(rowGrid);\r\n\r\n    return r;\r\n  }\r\n\r\n  function createIntrRow(it, i) {\r\n    var r = document.createElement('div');\r\n    r.className = 'zic2__row';\r\n\r\n    var rowGrid = document.createElement('div');\r\n    rowGrid.className = 'zic2__rowGrid zic2__rowGrid--intr';\r\n\r\n    \/\/ Start date field\r\n    var startField = document.createElement('div');\r\n    startField.className = 'zic2__field';\r\n    var startLabel = document.createElement('label');\r\n    startLabel.className = 'zic2__label';\r\n    startLabel.textContent = 'Data \u00eenceput';\r\n    var startInput = document.createElement('input');\r\n    startInput.className = 'zic2__input';\r\n    startInput.type = 'date';\r\n    startInput.value = it.start || '';\r\n    startInput.setAttribute('data-intr-field', 'start');\r\n    startInput.setAttribute('data-intr-index', i);\r\n    startField.appendChild(startLabel);\r\n    startField.appendChild(startInput);\r\n\r\n    \/\/ End date field\r\n    var endField = document.createElement('div');\r\n    endField.className = 'zic2__field';\r\n    var endLabel = document.createElement('label');\r\n    endLabel.className = 'zic2__label';\r\n    endLabel.textContent = 'Data sf\u00e2r\u0219it';\r\n    var endInput = document.createElement('input');\r\n    endInput.className = 'zic2__input';\r\n    endInput.type = 'date';\r\n    endInput.value = it.end || '';\r\n    endInput.setAttribute('data-intr-field', 'end');\r\n    endInput.setAttribute('data-intr-index', i);\r\n    endField.appendChild(endLabel);\r\n    endField.appendChild(endInput);\r\n\r\n    \/\/ Motiv field\r\n    var motivField = document.createElement('div');\r\n    motivField.className = 'zic2__field';\r\n    var motivLabel = document.createElement('label');\r\n    motivLabel.className = 'zic2__label';\r\n    motivLabel.textContent = 'Motiv';\r\n    var motivInput = document.createElement('input');\r\n    motivInput.className = 'zic2__input';\r\n    motivInput.type = 'text';\r\n    motivInput.value = displayText(it.motiv) || '';\r\n    motivInput.setAttribute('data-intr-field', 'motiv');\r\n    motivInput.setAttribute('data-intr-index', i);\r\n    motivInput.placeholder = 'ex: boal\u0103';\r\n    motivInput.maxLength = 200;\r\n    motivField.appendChild(motivLabel);\r\n    motivField.appendChild(motivInput);\r\n\r\n    \/\/ Delete button\r\n    var deleteBtn = document.createElement('button');\r\n    deleteBtn.type = 'button';\r\n    deleteBtn.className = 'zic2__btn zic2__btn--danger';\r\n    deleteBtn.setAttribute('data-action', 'deleteIntr');\r\n    deleteBtn.setAttribute('data-intr-index', i);\r\n    deleteBtn.textContent = '\u0218terge';\r\n\r\n    rowGrid.appendChild(startField);\r\n    rowGrid.appendChild(endField);\r\n    rowGrid.appendChild(motivField);\r\n    rowGrid.appendChild(deleteBtn);\r\n    r.appendChild(rowGrid);\r\n\r\n    return r;\r\n  }\r\n\r\n  function renderLists() {\r\n    \/\/ Clear lists safely\r\n    while (els.mpList.firstChild) {\r\n      els.mpList.removeChild(els.mpList.firstChild);\r\n    }\r\n    while (els.intrList.firstChild) {\r\n      els.intrList.removeChild(els.intrList.firstChild);\r\n    }\r\n\r\n    state.mp.forEach(function(it, i) {\r\n      els.mpList.appendChild(createMpRow(it, i));\r\n    });\r\n    state.intr.forEach(function(it, i) {\r\n      els.intrList.appendChild(createIntrRow(it, i));\r\n    });\r\n    updateEmpty();\r\n    updateLive();\r\n  }\r\n\r\n  function updateLive() {\r\n    setModeVis();\r\n    lockManual();\r\n    var s = computeSums(), c = computeCredits(), e = computeEff(s.mpSum, s.intrSum);\r\n    if (els.liveMpTotal) els.liveMpTotal.textContent = s.mpSum;\r\n    if (els.liveIntrTotal) els.liveIntrTotal.textContent = s.intrSum;\r\n    if (els.liveCredit) els.liveCredit.textContent = c.total;\r\n    if (els.liveEffective) els.liveEffective.textContent = e.effective;\r\n  }\r\n\r\n  function calculate() {\r\n    hideErrors();\r\n    els.resultCard.classList.add('is-hidden');\r\n    var errors = [], tip = getField('tip')?.value || 'inchisoare';\r\n\r\n    \/\/ Validate age for both types\r\n    if (!getField('varsta')?.value?.trim()) errors.push('Introduce\u021bi v\u00e2rsta.');\r\n    var varsta = sanitizeNumber(numVal(getField('varsta')), 0, 150);\r\n\r\n    \/\/ Validate execution data\r\n    if (!getField('dataStart')?.value && !getField('zileEfective')?.value?.trim()) errors.push('Completa\u021bi data sau zilele executate.');\r\n\r\n    var durataZile = 0, regim = '';\r\n\r\n    \/\/ For \u00eenchisoare, validate duration and regime\r\n    if (tip === 'inchisoare') {\r\n      durataZile = sanitizeNumber(numVal(getField('ani')), 0, 100) * 365 +\r\n                   sanitizeNumber(numVal(getField('luni')), 0, 11) * 30 +\r\n                   sanitizeNumber(numVal(getField('zileDur')), 0, 29);\r\n      if (durataZile <= 0) errors.push('Introduce\u021bi durata pedepsei.');\r\n      regim = getField('regim')?.value || '';\r\n      if (!regim) errors.push('Selecta\u021bi regimul.');\r\n    }\r\n    \/\/ For deten\u021biune pe via\u021b\u0103, no additional validation needed (no duration\/regime)\r\n\r\n    if (errors.length) { showErrors(errors); return; }\r\n\r\n    var s = computeSums(), c = computeCredits(), e = computeEff(s.mpSum, s.intrSum);\r\n    if (e.invalidStart) { showErrors(['Data de start invalid\u0103 sau \u00een viitor.']); return; }\r\n    var zileEf = e.effective, zileCa = c.total, zileCo = zileEf + zileCa, tDay = todayDay();\r\n    var r;\r\n    if (tip === 'detentiune_viata') {\r\n      var sDay = parseISO(getField('dataStart')?.value || '');\r\n      \/\/ Calculate 20 years in days - use actual date calculation if start date exists\r\n      var prag;\r\n      if (sDay !== null) {\r\n        \/\/ Calculate exact 20 years from start date\r\n        var startDate = new Date(sDay * MS_DAY);\r\n        var endDate = new Date(startDate);\r\n        endDate.setUTCFullYear(endDate.getUTCFullYear() + 20);\r\n        prag = Math.floor((endDate.getTime() - startDate.getTime()) \/ MS_DAY);\r\n      } else {\r\n        \/\/ Approximate: 20 years * 365.25 days (accounting for leap years)\r\n        prag = Math.floor(20 * 365.25);\r\n      }\r\n      r = {\r\n        tip: tip,\r\n        eligibil: zileEf >= prag,\r\n        eligDay: tDay + Math.max(0, prag - zileEf),\r\n        zileEfective: zileEf,\r\n        zileCastig: zileCa,\r\n        zileConsiderate: zileCo,\r\n        zileRamase: Math.max(0, prag - zileEf),\r\n        pragEfectivLabel: prag + ' zile (~20 ani)'\r\n      };\r\n    }\r\n    else {\r\n      var p10 = durataZile > 3650, a60 = varsta >= 60;\r\n      var fr = a60 ? (p10 ? 2\/3 : 1\/2) : (p10 ? 3\/4 : 2\/3);\r\n      var pragCo = Math.ceil(durataZile * fr);\r\n      if (!a60 && p10) pragCo = Math.min(pragCo, 7300);\r\n      var pragEfMin = Math.ceil(durataZile * (a60 ? (p10 ? 1\/2 : 1\/3) : (p10 ? 2\/3 : 1\/2)));\r\n      var regOk = regim === 'semideschis' || regim === 'deschis';\r\n      var defCo = Math.max(0, pragCo - zileCo), defEf = Math.max(0, pragEfMin - zileEf);\r\n      var zileRam = Math.max(defCo, defEf);\r\n      var restZ = Math.max(0, durataZile - zileCo - zileRam);\r\n      r = {\r\n        tip: tip,\r\n        eligibil: defCo === 0 && defEf === 0 && regOk,\r\n        eligDay: tDay + zileRam,\r\n        zileEfective: zileEf,\r\n        zileCastig: zileCa,\r\n        zileConsiderate: zileCo,\r\n        zileRamase: zileRam,\r\n        fractieLabel: (fr * 100).toFixed(0) + '%',\r\n        pragConsiderat: pragCo,\r\n        pragEfectivMin: pragEfMin,\r\n        regimOk: regOk,\r\n        restLabel: Math.floor(restZ \/ 365) + ' ani, ' + Math.floor((restZ % 365) \/ 30) + ' luni, ' + (restZ - Math.floor(restZ \/ 365) * 365 - Math.floor((restZ % 365) \/ 30) * 30) + ' zile',\r\n        necesitaMasuri101: restZ >= 730\r\n      };\r\n    }\r\n    state.lastResult = r;\r\n    renderResult(r);\r\n  }\r\n\r\n  \/\/ === SECURITY: Safe DOM-based result rendering ===\r\n  function renderResult(r) {\r\n    els.resultIcon.className = 'zic2__cardIcon zic2__cardIcon--' + (r.eligibil ? 'green' : 'red');\r\n\r\n    \/\/ Clear and rebuild icon safely\r\n    while (els.resultIcon.firstChild) {\r\n      els.resultIcon.removeChild(els.resultIcon.firstChild);\r\n    }\r\n\r\n    var svg = document.createElementNS('http:\/\/www.w3.org\/2000\/svg', 'svg');\r\n    svg.setAttribute('width', '18');\r\n    svg.setAttribute('height', '18');\r\n    svg.setAttribute('viewBox', '0 0 24 24');\r\n    svg.setAttribute('fill', 'none');\r\n    svg.setAttribute('stroke', 'currentColor');\r\n    svg.setAttribute('stroke-width', '2.5');\r\n\r\n    if (r.eligibil) {\r\n      var polyline = document.createElementNS('http:\/\/www.w3.org\/2000\/svg', 'polyline');\r\n      polyline.setAttribute('points', '20 6 9 17 4 12');\r\n      svg.appendChild(polyline);\r\n    } else {\r\n      var path = document.createElementNS('http:\/\/www.w3.org\/2000\/svg', 'path');\r\n      path.setAttribute('d', 'M18 6L6 18M6 6l12 12');\r\n      svg.appendChild(path);\r\n    }\r\n    els.resultIcon.appendChild(svg);\r\n\r\n    els.resultCard.classList.toggle('zic2__resultCard--no', !r.eligibil);\r\n\r\n    \/\/ Clear result content safely\r\n    while (els.resultContent.firstChild) {\r\n      els.resultContent.removeChild(els.resultContent.firstChild);\r\n    }\r\n\r\n    \/\/ Create KPI for eligibility\r\n    var kpi1 = createKpiElement('Eligibil pentru liberare condi\u021bionat\u0103?', r.eligibil ? 'Da' : 'Nu', r.eligibil);\r\n    els.resultContent.appendChild(kpi1);\r\n\r\n    \/\/ Create KPI for estimated date\r\n    var kpi2 = createKpiElement('Data estimat\u0103 eligibilitate', formatDay(r.eligDay), null);\r\n    els.resultContent.appendChild(kpi2);\r\n\r\n    \/\/ Create details grid\r\n    var detailsGrid = document.createElement('div');\r\n    detailsGrid.className = 'zic2__detailsGrid';\r\n\r\n    \/\/ Helper to safely display numeric values\r\n    function safeNum(val) {\r\n      return isFinite(val) ? val : 0;\r\n    }\r\n\r\n    var details = [\r\n      { label: 'Zile executate efectiv', value: safeNum(r.zileEfective) },\r\n      { label: 'Zile c\u00e2\u0219tig', value: safeNum(r.zileCastig) },\r\n      { label: 'Total zile considerate', value: safeNum(r.zileConsiderate) },\r\n      { label: 'Zile r\u0103mase', value: safeNum(r.zileRamase) }\r\n    ];\r\n\r\n    if (r.tip === 'detentiune_viata') {\r\n      details.push({ label: 'Prag (efectiv)', value: r.pragEfectivLabel || '-' });\r\n      details.push({ label: 'Termen supraveghere', value: '10 ani' });\r\n    } else {\r\n      details.push({ label: 'Frac\u021bie', value: r.fractieLabel || '-' });\r\n      details.push({ label: 'Prag considerate', value: safeNum(r.pragConsiderat) });\r\n      details.push({ label: 'Minim efectiv', value: safeNum(r.pragEfectivMin) });\r\n      details.push({ label: 'Regim ok?', value: r.regimOk ? 'Da' : 'Nu', isBoolean: true, boolValue: r.regimOk });\r\n      details.push({ label: 'Termen supraveghere', value: r.restLabel || '-' });\r\n      details.push({ label: 'M\u0103suri art. 101', value: r.necesitaMasuri101 ? 'Da' : 'Nu' });\r\n    }\r\n\r\n    details.forEach(function(d) {\r\n      var item = document.createElement('div');\r\n      item.className = 'zic2__detailItem';\r\n\r\n      var label = document.createElement('div');\r\n      label.className = 'zic2__detailLabel';\r\n      label.textContent = d.label;\r\n\r\n      var value = document.createElement('div');\r\n      value.className = 'zic2__detailValue';\r\n      if (d.isBoolean) {\r\n        value.classList.add(d.boolValue ? 'zic2__detailValue--yes' : 'zic2__detailValue--no');\r\n      }\r\n      value.textContent = d.value;\r\n\r\n      item.appendChild(label);\r\n      item.appendChild(value);\r\n      detailsGrid.appendChild(item);\r\n    });\r\n\r\n    els.resultContent.appendChild(detailsGrid);\r\n    els.resultCard.classList.remove('is-hidden');\r\n    setTimeout(function() { els.resultCard.scrollIntoView({ behavior: 'smooth', block: 'nearest' }); }, 100);\r\n  }\r\n\r\n  function createKpiElement(labelText, valueText, isPositive) {\r\n    var kpi = document.createElement('div');\r\n    kpi.className = 'zic2__kpi';\r\n\r\n    var label = document.createElement('div');\r\n    label.className = 'zic2__kpiLabel';\r\n    label.textContent = labelText;\r\n\r\n    var value = document.createElement('p');\r\n    value.className = 'zic2__kpiValue';\r\n    if (isPositive === true) value.classList.add('zic2__kpiValue--yes');\r\n    else if (isPositive === false) value.classList.add('zic2__kpiValue--no');\r\n    value.textContent = valueText;\r\n\r\n    kpi.appendChild(label);\r\n    kpi.appendChild(value);\r\n    return kpi;\r\n  }\r\n\r\n  function resetAll() {\r\n    hideErrors();\r\n    els.resultCard.classList.add('is-hidden');\r\n    state = { mp: [], intr: [], lastResult: null };\r\n    ['tip', 'varsta', 'ani', 'luni', 'zileDur', 'regim', 'recurs', 'dataStart', 'zileEfective', 'muncaRem', 'muncaNerem', 'nopti', 'anScolar', 'curs'].forEach(function(n) {\r\n      var el = getField(n);\r\n      if (el) el.value = n === 'tip' ? 'inchisoare' : '';\r\n    });\r\n    var w = getField('works20');\r\n    if (w) w.checked = false;\r\n    renderLists();\r\n  }\r\n\r\n  function fillExample() {\r\n    resetAll();\r\n    getField('tip').value = 'inchisoare';\r\n    getField('varsta').value = String(25 + Math.floor(Math.random() * 35));\r\n    getField('ani').value = String(3 + Math.floor(Math.random() * 7));\r\n    getField('luni').value = String(Math.floor(Math.random() * 12));\r\n    getField('zileDur').value = String(Math.floor(Math.random() * 30));\r\n    getField('regim').value = Math.random() < 0.6 ? 'semideschis' : 'deschis';\r\n    getField('recurs').value = String(Math.floor(Math.random() * 80));\r\n    getField('muncaRem').value = String(Math.floor(Math.random() * 350));\r\n    getField('muncaNerem').value = String(Math.floor(Math.random() * 150));\r\n    getField('nopti').value = String(Math.floor(Math.random() * 60));\r\n    getField('anScolar').value = String(Math.floor(Math.random() * 3));\r\n    getField('curs').value = String(Math.floor(Math.random() * 3));\r\n    var tDay = todayDay();\r\n    var sDay = tDay - 100 - Math.floor(Math.random() * 1200);\r\n    getField('dataStart').value = dayToISO(sDay);\r\n    if (Math.random() < 0.5) {\r\n      var mpDays = 10 + Math.floor(Math.random() * 80);\r\n      state.mp.push({ type: 'arest_preventiv', start: dayToISO(sDay - mpDays), end: dayToISO(sDay - 1) });\r\n    }\r\n    renderLists();\r\n  }\r\n\r\n  \/\/ === SECURITY: Safe PDF export with escaped content ===\r\n  function exportPDF() {\r\n    if (!state.lastResult) {\r\n      alert('Calculeaz\u0103 mai \u00eent\u00e2i rezultatul.');\r\n      return;\r\n    }\r\n    var w = window.open('', '_blank');\r\n    if (!w) {\r\n      alert('Permite pop-up-urile.');\r\n      return;\r\n    }\r\n    var r = state.lastResult;\r\n    var date = new Date().toLocaleDateString('ro-RO', { year: 'numeric', month: 'long', day: 'numeric' });\r\n\r\n    \/\/ Build PDF content with escaped values\r\n    var doc = w.document;\r\n    doc.open();\r\n    doc.write('<!DOCTYPE html><html lang=\"ro\"><head><meta charset=\"UTF-8\"><title>Raport Liberare Condi\u021bionat\u0103 - ZIC Legal<\/title>');\r\n    doc.write('<style>*{box-sizing:border-box;margin:0;padding:0}body{font-family:-apple-system,BlinkMacSystemFont,\\'Segoe UI\\',Roboto,sans-serif;max-width:700px;margin:0 auto;padding:40px 30px;color:#1F2937;line-height:1.6}.header{border-bottom:3px solid #8A88FF;padding-bottom:20px;margin-bottom:30px}.header h1{color:#6F6CFF;font-size:24px;margin-bottom:5px}.header p{color:#6B7280;font-size:14px}.kpi{background:#F9FAFB;border-radius:12px;padding:20px;margin-bottom:20px;text-align:center}.kpi-label{font-size:12px;text-transform:uppercase;color:#6B7280;margin-bottom:8px}.kpi-value{font-size:28px;font-weight:800;color:#6F6CFF}.kpi-value.yes{color:#10B981}.kpi-value.no{color:#EF4444}.grid{display:grid;grid-template-columns:1fr 1fr;gap:15px;margin-bottom:20px}.item{background:#F9FAFB;border-radius:8px;padding:12px}.item-label{font-size:11px;text-transform:uppercase;color:#6B7280;margin-bottom:4px}.item-value{font-size:14px;font-weight:700;color:#1F2937}.item-value.yes{color:#10B981}.item-value.no{color:#EF4444}.footer{margin-top:40px;padding-top:20px;border-top:1px solid #E5E7EB;text-align:center;color:#6B7280;font-size:12px}.footer a{color:#6F6CFF;text-decoration:none}.disclaimer{margin-top:30px;padding:15px;background:#F3F4F6;border-radius:8px;font-size:11px;color:#6B7280}@media print{body{padding:20px}}<\/style>');\r\n    doc.write('<\/head><body>');\r\n    doc.write('<div class=\"header\"><h1>Calculator Liberare Condi\u021bionat\u0103<\/h1><p>Raport generat la ' + escapeHtml(date) + '<\/p><\/div>');\r\n    doc.write('<div class=\"kpi\"><div class=\"kpi-label\">Eligibil?<\/div><div class=\"kpi-value ' + (r.eligibil ? 'yes' : 'no') + '\">' + (r.eligibil ? 'Da' : 'Nu') + '<\/div><\/div>');\r\n    doc.write('<div class=\"kpi\"><div class=\"kpi-label\">Data estimat\u0103<\/div><div class=\"kpi-value\">' + escapeHtml(formatDay(r.eligDay)) + '<\/div><\/div>');\r\n    doc.write('<div class=\"grid\">');\r\n    doc.write('<div class=\"item\"><div class=\"item-label\">Zile executate<\/div><div class=\"item-value\">' + escapeHtml(String(r.zileEfective)) + '<\/div><\/div>');\r\n    doc.write('<div class=\"item\"><div class=\"item-label\">Zile c\u00e2\u0219tig<\/div><div class=\"item-value\">' + escapeHtml(String(r.zileCastig)) + '<\/div><\/div>');\r\n    doc.write('<div class=\"item\"><div class=\"item-label\">Total considerate<\/div><div class=\"item-value\">' + escapeHtml(String(r.zileConsiderate)) + '<\/div><\/div>');\r\n    doc.write('<div class=\"item\"><div class=\"item-label\">Zile r\u0103mase<\/div><div class=\"item-value\">' + escapeHtml(String(r.zileRamase)) + '<\/div><\/div>');\r\n\r\n    if (r.tip === 'detentiune_viata') {\r\n      doc.write('<div class=\"item\"><div class=\"item-label\">Prag<\/div><div class=\"item-value\">' + escapeHtml(r.pragEfectivLabel) + '<\/div><\/div>');\r\n      doc.write('<div class=\"item\"><div class=\"item-label\">Supraveghere<\/div><div class=\"item-value\">10 ani<\/div><\/div>');\r\n    } else {\r\n      doc.write('<div class=\"item\"><div class=\"item-label\">Frac\u021bie<\/div><div class=\"item-value\">' + escapeHtml(r.fractieLabel) + '<\/div><\/div>');\r\n      doc.write('<div class=\"item\"><div class=\"item-label\">Prag considerate<\/div><div class=\"item-value\">' + escapeHtml(String(r.pragConsiderat)) + '<\/div><\/div>');\r\n      doc.write('<div class=\"item\"><div class=\"item-label\">Minim efectiv<\/div><div class=\"item-value\">' + escapeHtml(String(r.pragEfectivMin)) + '<\/div><\/div>');\r\n      doc.write('<div class=\"item\"><div class=\"item-label\">Regim ok<\/div><div class=\"item-value ' + (r.regimOk ? 'yes' : 'no') + '\">' + (r.regimOk ? 'Da' : 'Nu') + '<\/div><\/div>');\r\n      doc.write('<div class=\"item\"><div class=\"item-label\">Supraveghere<\/div><div class=\"item-value\">' + escapeHtml(r.restLabel) + '<\/div><\/div>');\r\n      doc.write('<div class=\"item\"><div class=\"item-label\">M\u0103suri 101<\/div><div class=\"item-value\">' + (r.necesitaMasuri101 ? 'Da' : 'Nu') + '<\/div><\/div>');\r\n    }\r\n\r\n    doc.write('<\/div>');\r\n    doc.write('<div class=\"disclaimer\"><strong>Disclaimer:<\/strong> Acest raport este orientativ.<\/div>');\r\n    doc.write('<div class=\"footer\"><p>Generat cu Calculator Liberare Condi\u021bionat\u0103<\/p><p><a href=\"https:\/\/zic.legal\">ZIC Legal<\/a><\/p><\/div>');\r\n    doc.write('<\/body><\/html>');\r\n    doc.close();\r\n    w.focus();\r\n    setTimeout(function() { w.print(); }, 300);\r\n  }\r\n\r\n  root.addEventListener('click', function(e) {\r\n    var b = e.target.closest('[data-action]');\r\n    if (!b) return;\r\n    var a = b.dataset.action;\r\n    if (a === 'addMp') {\r\n      if (state.mp.length >= MAX_MP_ENTRIES) {\r\n        alert('Num\u0103r maxim de perioade atins (' + MAX_MP_ENTRIES + ').');\r\n        return;\r\n      }\r\n      state.mp.push({ type: 'retinere', start: '', end: '' });\r\n      renderLists();\r\n    } else if (a === 'addIntr') {\r\n      if (state.intr.length >= MAX_INTR_ENTRIES) {\r\n        alert('Num\u0103r maxim de \u00eentreruperi atins (' + MAX_INTR_ENTRIES + ').');\r\n        return;\r\n      }\r\n      state.intr.push({ start: '', end: '', motiv: '' });\r\n      renderLists();\r\n    } else if (a === 'deleteMp') {\r\n      var i = parseInt(b.dataset.mpIndex, 10);\r\n      if (!isNaN(i) && i >= 0 && i < state.mp.length) {\r\n        state.mp.splice(i, 1);\r\n        renderLists();\r\n      }\r\n    } else if (a === 'deleteIntr') {\r\n      var idx = parseInt(b.dataset.intrIndex, 10);\r\n      if (!isNaN(idx) && idx >= 0 && idx < state.intr.length) {\r\n        state.intr.splice(idx, 1);\r\n        renderLists();\r\n      }\r\n    } else if (a === 'calculate') calculate();\r\n    else if (a === 'reset') resetAll();\r\n    else if (a === 'example') fillExample();\r\n    else if (a === 'export-pdf') exportPDF();\r\n  });\r\n\r\n  root.addEventListener('change', function(e) {\r\n    var t = e.target;\r\n    var mpIndex, mpField, intrIndex, intrField, validTypes;\r\n\r\n    if (t.hasAttribute('data-mp-field')) {\r\n      mpIndex = parseInt(t.getAttribute('data-mp-index'), 10);\r\n      mpField = t.getAttribute('data-mp-field');\r\n      if (!isNaN(mpIndex) && mpIndex >= 0 && mpIndex < state.mp.length && state.mp[mpIndex]) {\r\n        if (mpField === 'type') {\r\n          \/\/ Validate type value\r\n          validTypes = ['retinere', 'arest_preventiv', 'arest_domiciliu'];\r\n          if (validTypes.indexOf(t.value) !== -1) {\r\n            state.mp[mpIndex][mpField] = t.value;\r\n          }\r\n        } else if (mpField === 'start' || mpField === 'end') {\r\n          \/\/ Validate date format\r\n          if (t.value === '' || isValidDateFormat(t.value)) {\r\n            state.mp[mpIndex][mpField] = t.value;\r\n          }\r\n        }\r\n        updateLive();\r\n      }\r\n    } else if (t.hasAttribute('data-intr-field')) {\r\n      intrIndex = parseInt(t.getAttribute('data-intr-index'), 10);\r\n      intrField = t.getAttribute('data-intr-field');\r\n      if (!isNaN(intrIndex) && intrIndex >= 0 && intrIndex < state.intr.length && state.intr[intrIndex]) {\r\n        if (intrField === 'start' || intrField === 'end') {\r\n          \/\/ Validate date format\r\n          if (t.value === '' || isValidDateFormat(t.value)) {\r\n            state.intr[intrIndex][intrField] = t.value;\r\n          }\r\n        } else if (intrField === 'motiv') {\r\n          \/\/ Sanitize text input\r\n          state.intr[intrIndex][intrField] = sanitizeText(t.value, 200);\r\n        }\r\n        updateLive();\r\n      }\r\n    } else if (t.hasAttribute('data-field')) updateLive();\r\n  });\r\n\r\n  root.addEventListener('input', function(e) {\r\n    if (e.target?.hasAttribute('data-field') || e.target?.hasAttribute('data-mp-field') || e.target?.hasAttribute('data-intr-field')) updateLive();\r\n  });\r\n\r\n  \/\/ === SECURITY: Validate input on keydown to prevent invalid characters ===\r\n  root.addEventListener('keydown', function(e) {\r\n    var input = e.target;\r\n    if (!input.matches('.zic2__input[type=\"number\"]')) return;\r\n\r\n    \/\/ Allow: backspace, delete, tab, escape, enter, arrows\r\n    var allowedKeys = ['Backspace', 'Delete', 'Tab', 'Escape', 'Enter', 'ArrowLeft', 'ArrowRight', 'ArrowUp', 'ArrowDown', 'Home', 'End'];\r\n    if (allowedKeys.indexOf(e.key) !== -1) return;\r\n\r\n    \/\/ Allow Ctrl+A, Ctrl+C, Ctrl+V, Ctrl+X\r\n    if ((e.ctrlKey || e.metaKey) && ['a', 'c', 'v', 'x'].indexOf(e.key.toLowerCase()) !== -1) return;\r\n\r\n    \/\/ Block non-numeric characters (including dot, minus, etc.)\r\n    if (!\/^[0-9]$\/.test(e.key)) {\r\n      e.preventDefault();\r\n    }\r\n  }, true);\r\n\r\n  \/\/ === SECURITY: Sanitize pasted content ===\r\n  root.addEventListener('paste', function(e) {\r\n    var input = e.target;\r\n    if (!input.matches('.zic2__input[type=\"number\"]')) return;\r\n\r\n    var pastedData = (e.clipboardData || window.clipboardData).getData('text');\r\n    \/\/ Only allow if pasted data contains only digits\r\n    if (!\/^\\d*$\/.test(pastedData)) {\r\n      e.preventDefault();\r\n      \/\/ Extract only digits from pasted content\r\n      var digitsOnly = pastedData.replace(\/\\D\/g, '');\r\n      if (digitsOnly) {\r\n        \/\/ Insert cleaned data at cursor position\r\n        var start = input.selectionStart;\r\n        var end = input.selectionEnd;\r\n        var currentValue = input.value;\r\n        input.value = currentValue.substring(0, start) + digitsOnly + currentValue.substring(end);\r\n        input.setSelectionRange(start + digitsOnly.length, start + digitsOnly.length);\r\n        \/\/ Trigger change event to update state\r\n        input.dispatchEvent(new Event('input', { bubbles: true }));\r\n      }\r\n    }\r\n  }, true);\r\n\r\n  renderLists();\r\n  updateLive();\r\n})();\r\n<\/script>\r\n<\/div>\r\n<\/div>\n<div data-tool-content=\"supraveghere\" style=\"display:none\"><div id=\"zic-supraveghere-calculator-v2\" class=\"zic2\" data-zic2=\"1\">\r\n  <div class=\"zic2__wrap\">\r\n    <!-- Header -->\r\n    <header class=\"zic2__hero\">\r\n      <div class=\"zic2__brandbar\">\r\n        <div class=\"zic2__mark\" aria-hidden=\"true\">\r\n          <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n            <path d=\"M9 12l2 2 4-4\"\/>\r\n            <path d=\"M21 12a9 9 0 1 1-18 0 9 9 0 0 1 18 0Z\"\/>\r\n          <\/svg>\r\n        <\/div>\r\n        <div class=\"zic2__headerText\">\r\n          <h2 class=\"zic2__title\">Calculator suspendare sub supraveghere<\/h2>\r\n          <p class=\"zic2__subtitle\">Verificarea conditiilor pentru suspendarea executarii pedepsei (art. 91 Cod penal)<\/p>\r\n        <\/div>\r\n      <\/div>\r\n    <\/header>\r\n\r\n    <!-- Info box -->\r\n    <div class=\"zic2__formula\">\r\n      <div class=\"zic2__formulaIcon\">\r\n        <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n          <circle cx=\"12\" cy=\"12\" r=\"10\"\/>\r\n          <path d=\"M12 16v-4\"\/>\r\n          <path d=\"M12 8h.01\"\/>\r\n        <\/svg>\r\n      <\/div>\r\n      <div class=\"zic2__formulaText\">\r\n        <strong>Conditii art. 91 C.pen.:<\/strong> Pedeapsa max. 3 ani, fara antecedente si cu acordul de prestare munca neremunerata\r\n      <\/div>\r\n    <\/div>\r\n\r\n    <!-- Card 1: Pedeapsa finala -->\r\n    <section class=\"zic2__card\" aria-labelledby=\"zic2-sec-pedeapsa\">\r\n      <div class=\"zic2__cardHeader\">\r\n        <div class=\"zic2__cardIcon zic2__cardIcon--purple\">\r\n          <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n            <circle cx=\"12\" cy=\"12\" r=\"10\"\/>\r\n            <path d=\"M12 6v6l4 2\"\/>\r\n          <\/svg>\r\n        <\/div>\r\n        <h3 id=\"zic2-sec-pedeapsa\" class=\"zic2__cardTitle\">1. Pedeapsa finala aplicata<\/h3>\r\n      <\/div>\r\n\r\n      <div class=\"zic2__inputGroup zic2__inputGroup--3cols\">\r\n        <div class=\"zic2__field\">\r\n          <label class=\"zic2__label\" for=\"zic2-pedeapsa-ani\">Ani<\/label>\r\n          <input id=\"zic2-pedeapsa-ani\" class=\"zic2__input\" type=\"number\" min=\"0\" max=\"99\" inputmode=\"numeric\" placeholder=\"0\" autocomplete=\"off\" data-field=\"pedeapsa-ani\">\r\n        <\/div>\r\n        <div class=\"zic2__field\">\r\n          <label class=\"zic2__label\" for=\"zic2-pedeapsa-luni\">Luni<\/label>\r\n          <input id=\"zic2-pedeapsa-luni\" class=\"zic2__input\" type=\"number\" min=\"0\" max=\"11\" inputmode=\"numeric\" placeholder=\"0\" autocomplete=\"off\" data-field=\"pedeapsa-luni\">\r\n        <\/div>\r\n        <div class=\"zic2__field\">\r\n          <label class=\"zic2__label\" for=\"zic2-pedeapsa-zile\">Zile<\/label>\r\n          <input id=\"zic2-pedeapsa-zile\" class=\"zic2__input\" type=\"number\" min=\"0\" max=\"29\" inputmode=\"numeric\" placeholder=\"0\" autocomplete=\"off\" data-field=\"pedeapsa-zile\">\r\n        <\/div>\r\n      <\/div>\r\n      <div class=\"zic2__hint\">\r\n        <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><circle cx=\"12\" cy=\"12\" r=\"10\"\/><path d=\"M12 16v-4\"\/><path d=\"M12 8h.01\"\/><\/svg>\r\n        <span>Pedeapsa maxima pentru suspendare: <strong>3 ani inchisoare<\/strong>.<\/span>\r\n      <\/div>\r\n    <\/section>\r\n\r\n    <!-- Card 2: Condamnari anterioare -->\r\n    <section class=\"zic2__card\" aria-labelledby=\"zic2-sec-condamnari\">\r\n      <div class=\"zic2__cardHeader\">\r\n        <div class=\"zic2__cardIcon zic2__cardIcon--blue\">\r\n          <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n            <path d=\"M16 21v-2a4 4 0 0 0-4-4H6a4 4 0 0 0-4 4v2\"\/>\r\n            <circle cx=\"9\" cy=\"7\" r=\"4\"\/>\r\n            <path d=\"M22 21v-2a4 4 0 0 0-3-3.87\"\/>\r\n            <path d=\"M16 3.13a4 4 0 0 1 0 7.75\"\/>\r\n          <\/svg>\r\n        <\/div>\r\n        <h3 id=\"zic2-sec-condamnari\" class=\"zic2__cardTitle\">2. Condamnari anterioare<\/h3>\r\n      <\/div>\r\n\r\n      <label class=\"zic2__checkbox\">\r\n        <input type=\"checkbox\" data-field=\"condamnare-anterioara\">\r\n        <span class=\"zic2__checkmark\"><\/span>\r\n        <span class=\"zic2__checkLabel\">Condamnat anterior la inchisoare mai mare de 12 luni<\/span>\r\n      <\/label>\r\n\r\n      <div class=\"zic2__subSection is-hidden\" data-section=\"detalii-condamnare\">\r\n        <div class=\"zic2__subSectionTitle\">\r\n          <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><path d=\"M9 18l6-6-6-6\"\/><\/svg>\r\n          Exceptii aplicabile:\r\n        <\/div>\r\n        <label class=\"zic2__checkbox zic2__checkbox--sub\">\r\n          <input type=\"checkbox\" data-field=\"din-culpa\">\r\n          <span class=\"zic2__checkmark\"><\/span>\r\n          <span class=\"zic2__checkLabel\">Infractiunea a fost savarsita din culpa<\/span>\r\n        <\/label>\r\n        <label class=\"zic2__checkbox zic2__checkbox--sub\">\r\n          <input type=\"checkbox\" data-field=\"reabilitare\">\r\n          <span class=\"zic2__checkmark\"><\/span>\r\n          <span class=\"zic2__checkLabel\">A operat reabilitarea<\/span>\r\n        <\/label>\r\n        <label class=\"zic2__checkbox zic2__checkbox--sub\">\r\n          <input type=\"checkbox\" data-field=\"termen-reabilitare\">\r\n          <span class=\"zic2__checkmark\"><\/span>\r\n          <span class=\"zic2__checkLabel\">S-a implinit termenul de reabilitare<\/span>\r\n        <\/label>\r\n        <label class=\"zic2__checkbox zic2__checkbox--sub\">\r\n          <input type=\"checkbox\" data-field=\"amnistie\">\r\n          <span class=\"zic2__checkmark\"><\/span>\r\n          <span class=\"zic2__checkLabel\">Infractiunea a fost amnistiata<\/span>\r\n        <\/label>\r\n        <label class=\"zic2__checkbox zic2__checkbox--sub\">\r\n          <input type=\"checkbox\" data-field=\"nu-mai-este-prevazuta\">\r\n          <span class=\"zic2__checkmark\"><\/span>\r\n          <span class=\"zic2__checkLabel\">Infractiunea nu mai este prevazuta de legea penala<\/span>\r\n        <\/label>\r\n      <\/div>\r\n    <\/section>\r\n\r\n    <!-- Card 3: Conduita -->\r\n    <section class=\"zic2__card\" aria-labelledby=\"zic2-sec-conduita\">\r\n      <div class=\"zic2__cardHeader\">\r\n        <div class=\"zic2__cardIcon zic2__cardIcon--green\">\r\n          <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n            <path d=\"M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z\"\/>\r\n            <polyline points=\"14,2 14,8 20,8\"\/>\r\n            <path d=\"M9 15l2 2 4-4\"\/>\r\n          <\/svg>\r\n        <\/div>\r\n        <h3 id=\"zic2-sec-conduita\" class=\"zic2__cardTitle\">3. Conduita inculpatului<\/h3>\r\n      <\/div>\r\n\r\n      <label class=\"zic2__checkbox\">\r\n        <input type=\"checkbox\" data-field=\"acord-prestare\">\r\n        <span class=\"zic2__checkmark\"><\/span>\r\n        <span class=\"zic2__checkLabel\">Inculpatul si-a manifestat acordul de a presta munca neremunerata<\/span>\r\n      <\/label>\r\n    <\/section>\r\n\r\n    <!-- Card 4: Impedimente -->\r\n    <section class=\"zic2__card zic2__card--danger\" aria-labelledby=\"zic2-sec-impedimente\">\r\n      <div class=\"zic2__cardHeader\">\r\n        <div class=\"zic2__cardIcon zic2__cardIcon--danger\">\r\n          <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n            <path d=\"M10.29 3.86L1.82 18a2 2 0 0 0 1.71 3h16.94a2 2 0 0 0 1.71-3L13.71 3.86a2 2 0 0 0-3.42 0z\"\/>\r\n            <line x1=\"12\" y1=\"9\" x2=\"12\" y2=\"13\"\/>\r\n            <line x1=\"12\" y1=\"17\" x2=\"12.01\" y2=\"17\"\/>\r\n          <\/svg>\r\n        <\/div>\r\n        <h3 id=\"zic2-sec-impedimente\" class=\"zic2__cardTitle\">4. Impedimente<\/h3>\r\n      <\/div>\r\n\r\n      <label class=\"zic2__checkbox zic2__checkbox--danger\">\r\n        <input type=\"checkbox\" data-field=\"amanare-revocata\">\r\n        <span class=\"zic2__checkmark\"><\/span>\r\n        <span class=\"zic2__checkLabel\">Aplicarea pedepsei a fost initial amanata, dar ulterior amanarea a fost revocata<\/span>\r\n      <\/label>\r\n      <label class=\"zic2__checkbox zic2__checkbox--danger\">\r\n        <input type=\"checkbox\" data-field=\"sustragere-zadarnicire\">\r\n        <span class=\"zic2__checkmark\"><\/span>\r\n        <span class=\"zic2__checkLabel\">Inculpatul s-a sustras de la urmarire penala\/judecata sau a incercat zadarnicirea aflarii adevarului<\/span>\r\n      <\/label>\r\n      <label class=\"zic2__checkbox zic2__checkbox--danger\">\r\n        <input type=\"checkbox\" data-field=\"infractiuni-rutiere\">\r\n        <span class=\"zic2__checkmark\"><\/span>\r\n        <span class=\"zic2__checkLabel\">Infractiune prevazuta la art. 192 alin. (2) si (3), savarsita in conditiile art. 335 sau 336<\/span>\r\n      <\/label>\r\n      <label class=\"zic2__checkbox zic2__checkbox--danger\">\r\n        <input type=\"checkbox\" data-field=\"infractiuni-minori\">\r\n        <span class=\"zic2__checkmark\"><\/span>\r\n        <span class=\"zic2__checkLabel\">Infractiune prevazuta la art. 209-211<\/span>\r\n      <\/label>\r\n    <\/section>\r\n\r\n    <!-- Actions -->\r\n    <div class=\"zic2__actions\">\r\n      <button type=\"button\" class=\"zic2__btn zic2__btn--primary zic2__btn--large\" data-action=\"calculate\">\r\n        <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\"><polyline points=\"9 11 12 14 22 4\"\/><path d=\"M21 12v7a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h11\"\/><\/svg>\r\n        Verifica conditiile\r\n      <\/button>\r\n      <button type=\"button\" class=\"zic2__btn zic2__btn--secondary\" data-action=\"reset\">\r\n        <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><path d=\"M3 12a9 9 0 1 0 9-9 9.75 9.75 0 0 0-6.74 2.74L3 8\"\/><path d=\"M3 3v5h5\"\/><\/svg>\r\n        Reseteaza\r\n      <\/button>\r\n      <button type=\"button\" class=\"zic2__btn zic2__btn--secondary\" data-action=\"export-pdf\">\r\n        <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><path d=\"M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z\"\/><polyline points=\"14 2 14 8 20 8\"\/><path d=\"M12 18v-6\"\/><path d=\"M9 15l3 3 3-3\"\/><\/svg>\r\n        Descarca PDF\r\n      <\/button>\r\n    <\/div>\r\n\r\n    <!-- Result -->\r\n    <section class=\"zic2__card zic2__resultCard is-hidden\" data-result aria-live=\"polite\">\r\n      <div class=\"zic2__cardHeader\">\r\n        <div class=\"zic2__cardIcon\" data-result-icon>\r\n          <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\"><polyline points=\"20 6 9 17 4 12\"\/><\/svg>\r\n        <\/div>\r\n        <h3 class=\"zic2__cardTitle\">Rezultatul analizei<\/h3>\r\n      <\/div>\r\n      <div class=\"zic2__resultBody\" data-result-content><\/div>\r\n    <\/section>\r\n\r\n    <!-- Disclaimer -->\r\n    <div class=\"zic2__disclaimer\">\r\n      <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><path d=\"M10.29 3.86L1.82 18a2 2 0 0 0 1.71 3h16.94a2 2 0 0 0 1.71-3L13.71 3.86a2 2 0 0 0-3.42 0z\"\/><line x1=\"12\" y1=\"9\" x2=\"12\" y2=\"13\"\/><line x1=\"12\" y1=\"17\" x2=\"12.01\" y2=\"17\"\/><\/svg>\r\n      <div>\r\n        <strong>Disclaimer:<\/strong> Acest calculator este oferit exclusiv in scop informativ si educativ. Rezultatele generate nu constituie consultanta juridica. Decizia finala apartine instantei de judecata.\r\n      <\/div>\r\n    <\/div>\r\n\r\n    <!-- Footer -->\r\n    <footer class=\"zic2__footer\">\r\n      <a href=\"https:\/\/zic.legal\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"zic2__footerLink\">\r\n        &copy; 2025 ZIC Legal\r\n      <\/a>\r\n    <\/footer>\r\n  <\/div>\r\n<\/div>\r\n\r\n<style>\r\n\/* ============================================================\r\n   ZIC Calculator v2 - Suspendare sub Supraveghere\r\n   Theme: Purple\/Mov | Fully Responsive | Optimized | SECURED\r\n   ============================================================ *\/\r\n\r\n\/* === CSS Variables === *\/\r\n#zic-supraveghere-calculator-v2 {\r\n  --zic-primary: #8A88FF;\r\n  --zic-primary-dark: #6F6CFF;\r\n  --zic-primary-light: rgba(138,136,255,.08);\r\n  --zic-primary-border: rgba(138,136,255,.25);\r\n\r\n  --zic-success: #10B981;\r\n  --zic-success-light: rgba(16,185,129,.08);\r\n  --zic-success-border: rgba(16,185,129,.25);\r\n\r\n  --zic-danger: #EF4444;\r\n  --zic-danger-light: rgba(239,68,68,.08);\r\n  --zic-danger-border: rgba(239,68,68,.25);\r\n\r\n  --zic-warning: #F59E0B;\r\n  --zic-warning-light: rgba(245,158,11,.08);\r\n  --zic-warning-border: rgba(245,158,11,.25);\r\n\r\n  --zic-blue: #3B82F6;\r\n  --zic-blue-light: rgba(59,130,246,.08);\r\n\r\n  --zic-ink: #1F2937;\r\n  --zic-ink-light: #374151;\r\n  --zic-muted: #6B7280;\r\n  --zic-light: #9CA3AF;\r\n\r\n  --zic-bg: #F9FAFB;\r\n  --zic-surface: #FFFFFF;\r\n  --zic-border: #E5E7EB;\r\n\r\n  --zic-shadow-sm: 0 1px 2px rgba(0,0,0,.05);\r\n  --zic-shadow: 0 4px 6px -1px rgba(0,0,0,.1), 0 2px 4px -1px rgba(0,0,0,.06);\r\n  --zic-shadow-lg: 0 10px 15px -3px rgba(0,0,0,.1), 0 4px 6px -2px rgba(0,0,0,.05);\r\n\r\n  --zic-radius: 16px;\r\n  --zic-radius-sm: 12px;\r\n  --zic-radius-xs: 8px;\r\n\r\n  --zic-transition: 150ms ease;\r\n\r\n  font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif;\r\n  color: var(--zic-ink);\r\n  line-height: 1.5;\r\n  -webkit-font-smoothing: antialiased;\r\n}\r\n\r\n#zic-supraveghere-calculator-v2 *,\r\n#zic-supraveghere-calculator-v2 *::before,\r\n#zic-supraveghere-calculator-v2 *::after {\r\n  box-sizing: border-box;\r\n}\r\n\r\n\/* === WordPress\/Avada Override Protection === *\/\r\n#zic-supraveghere-calculator-v2 input[type=\"checkbox\"] {\r\n  -webkit-appearance: checkbox !important;\r\n  -moz-appearance: checkbox !important;\r\n  appearance: checkbox !important;\r\n  width: 20px !important;\r\n  height: 20px !important;\r\n  margin: 0 !important;\r\n  padding: 0 !important;\r\n  border: none !important;\r\n  background: none !important;\r\n  box-shadow: none !important;\r\n}\r\n\r\n#zic-supraveghere-calculator-v2 input[type=\"number\"] {\r\n  -webkit-appearance: none !important;\r\n  -moz-appearance: textfield !important;\r\n  appearance: none !important;\r\n  background-image: none !important;\r\n  box-shadow: none !important;\r\n}\r\n\r\n#zic-supraveghere-calculator-v2 button:not(.zic2__btn--primary) {\r\n  background-image: none !important;\r\n}\r\n\r\n#zic-supraveghere-calculator-v2 button {\r\n  text-shadow: none !important;\r\n  letter-spacing: normal !important;\r\n}\r\n\r\n#zic-supraveghere-calculator-v2 h2,\r\n#zic-supraveghere-calculator-v2 h3 {\r\n  text-transform: none !important;\r\n  letter-spacing: normal !important;\r\n}\r\n\r\n#zic-supraveghere-calculator-v2 a {\r\n  text-decoration: none;\r\n}\r\n\r\n#zic-supraveghere-calculator-v2 a:hover {\r\n  text-decoration: underline;\r\n}\r\n\r\n\/* === Layout === *\/\r\n#zic-supraveghere-calculator-v2 .zic2__wrap {\r\n  max-width: 720px;\r\n  margin: 0 auto;\r\n  padding: 16px;\r\n}\r\n\r\n\/* === Header === *\/\r\n#zic-supraveghere-calculator-v2 .zic2__hero {\r\n  margin-bottom: 16px;\r\n}\r\n\r\n#zic-supraveghere-calculator-v2 .zic2__brandbar {\r\n  display: flex;\r\n  align-items: center;\r\n  gap: 14px;\r\n  background: linear-gradient(135deg, var(--zic-primary), var(--zic-primary-dark));\r\n  border-radius: var(--zic-radius);\r\n  padding: 20px;\r\n  color: #fff;\r\n  box-shadow: var(--zic-shadow-lg);\r\n}\r\n\r\n#zic-supraveghere-calculator-v2 .zic2__mark {\r\n  width: 48px;\r\n  height: 48px;\r\n  background: rgba(255,255,255,.2);\r\n  border-radius: 12px;\r\n  display: flex;\r\n  align-items: center;\r\n  justify-content: center;\r\n  flex-shrink: 0;\r\n}\r\n\r\n#zic-supraveghere-calculator-v2 .zic2__headerText {\r\n  flex: 1;\r\n  min-width: 0;\r\n}\r\n\r\n#zic-supraveghere-calculator-v2 .zic2__title {\r\n  margin: 0;\r\n  font-size: 18px;\r\n  font-weight: 700;\r\n  line-height: 1.2;\r\n}\r\n\r\n#zic-supraveghere-calculator-v2 .zic2__subtitle {\r\n  margin: 4px 0 0;\r\n  font-size: 13px;\r\n  opacity: 0.9;\r\n}\r\n\r\n\/* === Formula Box === *\/\r\n#zic-supraveghere-calculator-v2 .zic2__formula {\r\n  display: flex;\r\n  align-items: flex-start;\r\n  gap: 10px;\r\n  background: var(--zic-primary-light);\r\n  border: 1px solid var(--zic-primary-border);\r\n  border-radius: var(--zic-radius-sm);\r\n  padding: 12px 14px;\r\n  margin-bottom: 16px;\r\n  font-size: 14px;\r\n  color: var(--zic-ink-light);\r\n}\r\n\r\n#zic-supraveghere-calculator-v2 .zic2__formulaIcon {\r\n  color: var(--zic-primary-dark);\r\n  flex-shrink: 0;\r\n  margin-top: 1px;\r\n}\r\n\r\n#zic-supraveghere-calculator-v2 .zic2__formulaText strong {\r\n  color: var(--zic-ink);\r\n}\r\n\r\n\/* === Cards === *\/\r\n#zic-supraveghere-calculator-v2 .zic2__card {\r\n  background: var(--zic-surface);\r\n  border: 1px solid var(--zic-border);\r\n  border-radius: var(--zic-radius);\r\n  padding: 20px;\r\n  margin-bottom: 16px;\r\n  box-shadow: var(--zic-shadow-sm);\r\n}\r\n\r\n#zic-supraveghere-calculator-v2 .zic2__card--danger {\r\n  border-left: 4px solid var(--zic-danger);\r\n}\r\n\r\n#zic-supraveghere-calculator-v2 .zic2__cardHeader {\r\n  display: flex;\r\n  align-items: center;\r\n  gap: 12px;\r\n  margin-bottom: 16px;\r\n}\r\n\r\n#zic-supraveghere-calculator-v2 .zic2__cardIcon {\r\n  width: 36px;\r\n  height: 36px;\r\n  border-radius: 10px;\r\n  display: flex;\r\n  align-items: center;\r\n  justify-content: center;\r\n  flex-shrink: 0;\r\n}\r\n\r\n#zic-supraveghere-calculator-v2 .zic2__cardIcon--purple {\r\n  background: var(--zic-primary-light);\r\n  color: var(--zic-primary-dark);\r\n}\r\n\r\n#zic-supraveghere-calculator-v2 .zic2__cardIcon--blue {\r\n  background: var(--zic-blue-light);\r\n  color: var(--zic-blue);\r\n}\r\n\r\n#zic-supraveghere-calculator-v2 .zic2__cardIcon--green {\r\n  background: var(--zic-success-light);\r\n  color: var(--zic-success);\r\n}\r\n\r\n#zic-supraveghere-calculator-v2 .zic2__cardIcon--danger {\r\n  background: var(--zic-danger-light);\r\n  color: var(--zic-danger);\r\n}\r\n\r\n#zic-supraveghere-calculator-v2 .zic2__cardTitle {\r\n  margin: 0;\r\n  font-size: 17px;\r\n  font-weight: 700;\r\n  color: var(--zic-ink);\r\n}\r\n\r\n\/* === Input Group === *\/\r\n#zic-supraveghere-calculator-v2 .zic2__inputGroup {\r\n  display: grid;\r\n  gap: 12px;\r\n}\r\n\r\n#zic-supraveghere-calculator-v2 .zic2__inputGroup--3cols {\r\n  grid-template-columns: 1fr;\r\n}\r\n\r\n#zic-supraveghere-calculator-v2 .zic2__field {\r\n  display: flex;\r\n  flex-direction: column;\r\n  gap: 4px;\r\n}\r\n\r\n#zic-supraveghere-calculator-v2 .zic2__label {\r\n  font-size: 12px;\r\n  font-weight: 600;\r\n  color: var(--zic-muted);\r\n}\r\n\r\n#zic-supraveghere-calculator-v2 .zic2__input {\r\n  width: 100%;\r\n  padding: 10px 12px;\r\n  font-size: 15px;\r\n  font-family: inherit;\r\n  color: var(--zic-ink);\r\n  background: var(--zic-surface);\r\n  border: 2px solid var(--zic-border);\r\n  border-radius: var(--zic-radius-xs);\r\n  outline: none;\r\n  transition: border-color var(--zic-transition), box-shadow var(--zic-transition);\r\n  -moz-appearance: textfield;\r\n}\r\n\r\n#zic-supraveghere-calculator-v2 .zic2__input::-webkit-outer-spin-button,\r\n#zic-supraveghere-calculator-v2 .zic2__input::-webkit-inner-spin-button {\r\n  -webkit-appearance: none;\r\n  margin: 0;\r\n}\r\n\r\n#zic-supraveghere-calculator-v2 .zic2__input::placeholder {\r\n  color: var(--zic-light);\r\n}\r\n\r\n#zic-supraveghere-calculator-v2 .zic2__input:focus {\r\n  border-color: var(--zic-primary);\r\n  box-shadow: 0 0 0 3px var(--zic-primary-light);\r\n}\r\n\r\n\/* === Hint === *\/\r\n#zic-supraveghere-calculator-v2 .zic2__hint {\r\n  display: flex;\r\n  align-items: flex-start;\r\n  gap: 8px;\r\n  padding: 10px 12px;\r\n  background: var(--zic-bg);\r\n  border-radius: var(--zic-radius-xs);\r\n  font-size: 12px;\r\n  color: var(--zic-muted);\r\n  margin-top: 12px;\r\n}\r\n\r\n#zic-supraveghere-calculator-v2 .zic2__hint svg {\r\n  flex-shrink: 0;\r\n  margin-top: 1px;\r\n}\r\n\r\n#zic-supraveghere-calculator-v2 .zic2__hint strong {\r\n  color: var(--zic-ink-light);\r\n}\r\n\r\n\/* === Checkboxes === *\/\r\n#zic-supraveghere-calculator-v2 .zic2__checkbox {\r\n  display: flex;\r\n  align-items: flex-start;\r\n  gap: 12px;\r\n  padding: 14px;\r\n  background: var(--zic-bg);\r\n  border: 1px solid var(--zic-border);\r\n  border-radius: var(--zic-radius-sm);\r\n  cursor: pointer;\r\n  margin-bottom: 10px;\r\n  transition: border-color var(--zic-transition), background var(--zic-transition);\r\n  position: relative;\r\n}\r\n\r\n#zic-supraveghere-calculator-v2 .zic2__checkbox:last-child {\r\n  margin-bottom: 0;\r\n}\r\n\r\n#zic-supraveghere-calculator-v2 .zic2__checkbox:hover {\r\n  border-color: var(--zic-primary-border);\r\n  background: var(--zic-primary-light);\r\n}\r\n\r\n#zic-supraveghere-calculator-v2 .zic2__checkbox--danger:hover {\r\n  border-color: var(--zic-danger-border);\r\n  background: var(--zic-danger-light);\r\n}\r\n\r\n#zic-supraveghere-calculator-v2 .zic2__checkbox--sub {\r\n  background: var(--zic-surface);\r\n}\r\n\r\n#zic-supraveghere-calculator-v2 .zic2__checkbox input[type=\"checkbox\"] {\r\n  width: 20px;\r\n  height: 20px;\r\n  accent-color: var(--zic-primary);\r\n  flex-shrink: 0;\r\n  cursor: pointer;\r\n  margin: 0;\r\n}\r\n\r\n#zic-supraveghere-calculator-v2 .zic2__checkbox--danger input[type=\"checkbox\"] {\r\n  accent-color: var(--zic-danger);\r\n}\r\n\r\n#zic-supraveghere-calculator-v2 .zic2__checkmark {\r\n  display: none;\r\n}\r\n\r\n#zic-supraveghere-calculator-v2 .zic2__checkLabel {\r\n  font-size: 14px;\r\n  font-weight: 600;\r\n  color: var(--zic-ink-light);\r\n  line-height: 1.4;\r\n  cursor: pointer;\r\n}\r\n\r\n\/* === SubSection === *\/\r\n#zic-supraveghere-calculator-v2 .zic2__subSection {\r\n  margin-top: 12px;\r\n  margin-left: 32px;\r\n  padding: 16px;\r\n  background: var(--zic-bg);\r\n  border: 1px solid var(--zic-border);\r\n  border-radius: var(--zic-radius-sm);\r\n}\r\n\r\n#zic-supraveghere-calculator-v2 .zic2__subSectionTitle {\r\n  display: flex;\r\n  align-items: center;\r\n  gap: 6px;\r\n  font-size: 13px;\r\n  font-weight: 700;\r\n  color: var(--zic-muted);\r\n  margin-bottom: 12px;\r\n}\r\n\r\n\/* === Buttons === *\/\r\n#zic-supraveghere-calculator-v2 .zic2__btn {\r\n  display: inline-flex;\r\n  align-items: center;\r\n  justify-content: center;\r\n  gap: 6px;\r\n  padding: 10px 16px;\r\n  font-size: 14px;\r\n  font-weight: 600;\r\n  border-radius: var(--zic-radius-sm);\r\n  border: 1px solid transparent;\r\n  cursor: pointer;\r\n  transition: all var(--zic-transition);\r\n  white-space: nowrap;\r\n  text-decoration: none;\r\n}\r\n\r\n#zic-supraveghere-calculator-v2 .zic2__btn:focus {\r\n  outline: none;\r\n  box-shadow: 0 0 0 3px var(--zic-primary-border);\r\n}\r\n\r\n#zic-supraveghere-calculator-v2 .zic2__btn:active {\r\n  transform: translateY(1px);\r\n}\r\n\r\n#zic-supraveghere-calculator-v2 .zic2__btn--primary {\r\n  background: linear-gradient(135deg, var(--zic-primary), var(--zic-primary-dark));\r\n  color: #fff;\r\n  box-shadow: 0 4px 14px rgba(138,136,255,.35);\r\n}\r\n\r\n#zic-supraveghere-calculator-v2 .zic2__btn--primary:hover {\r\n  box-shadow: 0 6px 20px rgba(138,136,255,.45);\r\n  transform: translateY(-1px);\r\n}\r\n\r\n#zic-supraveghere-calculator-v2 .zic2__btn--large {\r\n  padding: 14px 24px;\r\n  font-size: 15px;\r\n}\r\n\r\n#zic-supraveghere-calculator-v2 .zic2__btn--secondary {\r\n  background: var(--zic-surface);\r\n  border-color: var(--zic-border);\r\n  color: var(--zic-ink-light);\r\n}\r\n\r\n#zic-supraveghere-calculator-v2 .zic2__btn--secondary:hover {\r\n  background: var(--zic-bg);\r\n  border-color: var(--zic-primary-border);\r\n  color: var(--zic-primary-dark);\r\n}\r\n\r\n\/* === Actions === *\/\r\n#zic-supraveghere-calculator-v2 .zic2__actions {\r\n  display: flex;\r\n  flex-wrap: wrap;\r\n  gap: 10px;\r\n  margin-bottom: 16px;\r\n}\r\n\r\n#zic-supraveghere-calculator-v2 .zic2__actions .zic2__btn--primary {\r\n  flex: 1;\r\n  min-width: 200px;\r\n}\r\n\r\n\/* === Result === *\/\r\n#zic-supraveghere-calculator-v2 .zic2__resultCard {\r\n  border-color: var(--zic-border);\r\n}\r\n\r\n#zic-supraveghere-calculator-v2 .zic2__resultCard--success {\r\n  border-color: var(--zic-success-border);\r\n  background: linear-gradient(135deg, rgba(16,185,129,.02), rgba(16,185,129,.06));\r\n}\r\n\r\n#zic-supraveghere-calculator-v2 .zic2__resultCard--danger {\r\n  border-color: var(--zic-danger-border);\r\n  background: linear-gradient(135deg, rgba(239,68,68,.02), rgba(239,68,68,.06));\r\n}\r\n\r\n#zic-supraveghere-calculator-v2 .zic2__resultBody {\r\n  display: flex;\r\n  flex-direction: column;\r\n  gap: 12px;\r\n}\r\n\r\n#zic-supraveghere-calculator-v2 .zic2__condition {\r\n  display: flex;\r\n  align-items: flex-start;\r\n  gap: 10px;\r\n  padding: 12px;\r\n  border-radius: var(--zic-radius-xs);\r\n  font-size: 14px;\r\n  line-height: 1.4;\r\n}\r\n\r\n#zic-supraveghere-calculator-v2 .zic2__condition--ok {\r\n  background: var(--zic-success-light);\r\n  color: var(--zic-success);\r\n}\r\n\r\n#zic-supraveghere-calculator-v2 .zic2__condition--bad {\r\n  background: var(--zic-danger-light);\r\n  color: var(--zic-danger);\r\n}\r\n\r\n#zic-supraveghere-calculator-v2 .zic2__conditionIcon {\r\n  font-weight: 900;\r\n  flex-shrink: 0;\r\n  font-size: 16px;\r\n}\r\n\r\n#zic-supraveghere-calculator-v2 .zic2__conditionText {\r\n  font-weight: 600;\r\n}\r\n\r\n#zic-supraveghere-calculator-v2 .zic2__subCondition {\r\n  margin-left: 32px;\r\n  padding: 8px 12px;\r\n  color: var(--zic-muted);\r\n  font-size: 13px;\r\n  background: var(--zic-bg);\r\n  border-radius: var(--zic-radius-xs);\r\n  margin-top: -4px;\r\n}\r\n\r\n#zic-supraveghere-calculator-v2 .zic2__conclusion {\r\n  margin-top: 8px;\r\n  padding: 16px;\r\n  border-radius: var(--zic-radius-sm);\r\n  font-size: 14px;\r\n  line-height: 1.5;\r\n}\r\n\r\n#zic-supraveghere-calculator-v2 .zic2__conclusion--ok {\r\n  background: var(--zic-success-light);\r\n  border: 1px solid var(--zic-success-border);\r\n}\r\n\r\n#zic-supraveghere-calculator-v2 .zic2__conclusion--bad {\r\n  background: var(--zic-danger-light);\r\n  border: 1px solid var(--zic-danger-border);\r\n}\r\n\r\n#zic-supraveghere-calculator-v2 .zic2__conclusion strong {\r\n  display: block;\r\n  margin-bottom: 6px;\r\n  font-size: 15px;\r\n  color: var(--zic-ink);\r\n}\r\n\r\n#zic-supraveghere-calculator-v2 .zic2__conclusion--ok p {\r\n  color: var(--zic-success);\r\n  font-weight: 600;\r\n  margin: 0;\r\n}\r\n\r\n#zic-supraveghere-calculator-v2 .zic2__conclusion--bad p {\r\n  color: var(--zic-danger);\r\n  font-weight: 600;\r\n  margin: 0;\r\n}\r\n\r\n\/* === Disclaimer === *\/\r\n#zic-supraveghere-calculator-v2 .zic2__disclaimer {\r\n  display: flex;\r\n  align-items: flex-start;\r\n  gap: 10px;\r\n  padding: 14px;\r\n  background: var(--zic-bg);\r\n  border: 1px solid var(--zic-border);\r\n  border-radius: var(--zic-radius-sm);\r\n  font-size: 12px;\r\n  color: var(--zic-muted);\r\n  line-height: 1.5;\r\n  margin-bottom: 16px;\r\n}\r\n\r\n#zic-supraveghere-calculator-v2 .zic2__disclaimer svg {\r\n  flex-shrink: 0;\r\n  color: var(--zic-warning);\r\n  margin-top: 1px;\r\n}\r\n\r\n#zic-supraveghere-calculator-v2 .zic2__disclaimer strong {\r\n  color: var(--zic-ink-light);\r\n}\r\n\r\n\/* === Footer === *\/\r\n#zic-supraveghere-calculator-v2 .zic2__footer {\r\n  text-align: center;\r\n  padding: 8px 0;\r\n}\r\n\r\n#zic-supraveghere-calculator-v2 .zic2__footerLink {\r\n  color: var(--zic-primary-dark);\r\n  text-decoration: none;\r\n  font-size: 13px;\r\n  font-weight: 600;\r\n  transition: color var(--zic-transition);\r\n}\r\n\r\n#zic-supraveghere-calculator-v2 .zic2__footerLink:hover {\r\n  color: var(--zic-primary);\r\n  text-decoration: underline;\r\n}\r\n\r\n\/* === Utility === *\/\r\n#zic-supraveghere-calculator-v2 .is-hidden {\r\n  display: none !important;\r\n}\r\n\r\n\/* === RESPONSIVE === *\/\r\n\r\n\/* Small mobile (max 500px) *\/\r\n@media (max-width: 500px) {\r\n  #zic-supraveghere-calculator-v2 .zic2__actions {\r\n    flex-direction: column;\r\n  }\r\n\r\n  #zic-supraveghere-calculator-v2 .zic2__actions .zic2__btn {\r\n    width: 100%;\r\n    min-width: unset;\r\n  }\r\n\r\n  #zic-supraveghere-calculator-v2 .zic2__subSection {\r\n    margin-left: 0;\r\n  }\r\n}\r\n\r\n\/* Tablet (640px+) *\/\r\n@media (min-width: 640px) {\r\n  #zic-supraveghere-calculator-v2 .zic2__wrap {\r\n    padding: 24px;\r\n  }\r\n\r\n  #zic-supraveghere-calculator-v2 .zic2__title {\r\n    font-size: 22px;\r\n  }\r\n\r\n  #zic-supraveghere-calculator-v2 .zic2__subtitle {\r\n    font-size: 14px;\r\n  }\r\n\r\n  #zic-supraveghere-calculator-v2 .zic2__inputGroup--3cols {\r\n    grid-template-columns: repeat(3, 1fr);\r\n  }\r\n}\r\n\r\n\/* Desktop (768px+) *\/\r\n@media (min-width: 768px) {\r\n  #zic-supraveghere-calculator-v2 .zic2__card {\r\n    padding: 24px;\r\n  }\r\n\r\n  #zic-supraveghere-calculator-v2 .zic2__brandbar {\r\n    padding: 24px;\r\n  }\r\n\r\n  #zic-supraveghere-calculator-v2 .zic2__mark {\r\n    width: 56px;\r\n    height: 56px;\r\n  }\r\n\r\n  #zic-supraveghere-calculator-v2 .zic2__title {\r\n    font-size: 24px;\r\n  }\r\n}\r\n\r\n\/* Large screens (1024px+) *\/\r\n@media (min-width: 1024px) {\r\n  #zic-supraveghere-calculator-v2 .zic2__wrap {\r\n    max-width: 900px;\r\n  }\r\n}\r\n\r\n\/* Print styles *\/\r\n@media print {\r\n  #zic-supraveghere-calculator-v2 .zic2__actions,\r\n  #zic-supraveghere-calculator-v2 .zic2__footer {\r\n    display: none !important;\r\n  }\r\n\r\n  #zic-supraveghere-calculator-v2 .zic2__card {\r\n    box-shadow: none;\r\n    border: 1px solid #ddd;\r\n    break-inside: avoid;\r\n  }\r\n\r\n  #zic-supraveghere-calculator-v2 .zic2__resultCard.is-hidden {\r\n    display: block !important;\r\n  }\r\n}\r\n<\/style>\r\n\r\n<script>\r\n(function() {\r\n  'use strict';\r\n\r\n  \/\/ === SECURITY: HTML Entity Encoding to prevent XSS ===\r\n  const escapeHTML = (str) => {\r\n    if (typeof str !== 'string') return '';\r\n    const escapeMap = {\r\n      '&': '&amp;',\r\n      '<': '&lt;',\r\n      '>': '&gt;',\r\n      '\"': '&quot;',\r\n      \"'\": '&#x27;',\r\n      '\/': '&#x2F;',\r\n      '`': '&#x60;',\r\n      '=': '&#x3D;'\r\n    };\r\n    return str.replace(\/[&<>\"'`=\/]\/g, (char) => escapeMap[char]);\r\n  };\r\n\r\n  \/\/ === SECURITY: Safe DOM element creation ===\r\n  const createSafeElement = (tag, className, textContent) => {\r\n    const el = document.createElement(tag);\r\n    if (className) el.className = className;\r\n    if (textContent) el.textContent = textContent;\r\n    return el;\r\n  };\r\n\r\n  \/\/ === Constants ===\r\n  const ROOT_ID = 'zic-supraveghere-calculator-v2';\r\n  const MONTHS_IN_YEAR = 12;\r\n  const DAYS_IN_MONTH = 30;\r\n  const MAX_SUSPENSION_MONTHS = 36; \/\/ 3 years\r\n\r\n  \/\/ === SECURITY: Input validation limits ===\r\n  const INPUT_LIMITS = {\r\n    'pedeapsa-ani': { min: 0, max: 99 },\r\n    'pedeapsa-luni': { min: 0, max: 11 },\r\n    'pedeapsa-zile': { min: 0, max: 29 }\r\n  };\r\n\r\n  \/\/ === State ===\r\n  let lastResult = null;\r\n\r\n  \/\/ === DOM References ===\r\n  const root = document.getElementById(ROOT_ID);\r\n  if (!root) return;\r\n\r\n  const $ = (sel) => root.querySelector(sel);\r\n  const $$ = (sel) => root.querySelectorAll(sel);\r\n\r\n  const elements = {\r\n    pedeapsaAni: $('[data-field=\"pedeapsa-ani\"]'),\r\n    pedeapsaLuni: $('[data-field=\"pedeapsa-luni\"]'),\r\n    pedeapsaZile: $('[data-field=\"pedeapsa-zile\"]'),\r\n    condamnareAnterioara: $('[data-field=\"condamnare-anterioara\"]'),\r\n    detaliiCondamnare: $('[data-section=\"detalii-condamnare\"]'),\r\n    dinCulpa: $('[data-field=\"din-culpa\"]'),\r\n    reabilitare: $('[data-field=\"reabilitare\"]'),\r\n    termenReabilitare: $('[data-field=\"termen-reabilitare\"]'),\r\n    amnistie: $('[data-field=\"amnistie\"]'),\r\n    nuMaiEstePrevazuta: $('[data-field=\"nu-mai-este-prevazuta\"]'),\r\n    acordPrestare: $('[data-field=\"acord-prestare\"]'),\r\n    amanareRevocata: $('[data-field=\"amanare-revocata\"]'),\r\n    sustragereZadarnicire: $('[data-field=\"sustragere-zadarnicire\"]'),\r\n    infractiuniRutiere: $('[data-field=\"infractiuni-rutiere\"]'),\r\n    infractiuniMinori: $('[data-field=\"infractiuni-minori\"]'),\r\n    resultCard: $('[data-result]'),\r\n    resultIcon: $('[data-result-icon]'),\r\n    resultContent: $('[data-result-content]')\r\n  };\r\n\r\n  \/\/ === Utilities ===\r\n  const toInt = (val) => {\r\n    const n = parseInt(val, 10);\r\n    return Number.isFinite(n) ? n : 0;\r\n  };\r\n\r\n  \/\/ === SECURITY: Enhanced clamp with strict validation ===\r\n  const clamp = (val, min = 0, max = Infinity) => {\r\n    const n = toInt(val);\r\n    if (!Number.isFinite(n) || n < min) return min;\r\n    if (n > max) return max;\r\n    return n;\r\n  };\r\n\r\n  \/\/ === SECURITY: Sanitize and validate numeric input ===\r\n  \/\/ Returns null if input is empty\/invalid, otherwise returns clamped number\r\n  const sanitizeNumericInput = (val, fieldName) => {\r\n    \/\/ Handle empty or whitespace-only input\r\n    if (val === '' || val === null || val === undefined || String(val).trim() === '') {\r\n      return null;\r\n    }\r\n    const limits = INPUT_LIMITS[fieldName] || { min: 0, max: 99999 };\r\n    return clamp(val, limits.min, limits.max);\r\n  };\r\n\r\n  \/\/ Get numeric value for calculations (returns 0 for empty inputs)\r\n  const getNumericValue = (val, fieldName) => {\r\n    const sanitized = sanitizeNumericInput(val, fieldName);\r\n    return sanitized === null ? 0 : sanitized;\r\n  };\r\n\r\n  const isChecked = (el) => el && el.checked === true;\r\n\r\n  \/\/ === Duration Helpers ===\r\n  const toMonths = (years, months, days) => {\r\n    const y = clamp(years, 0, 99);\r\n    const m = clamp(months, 0, 11);\r\n    const d = clamp(days, 0, 29);\r\n    return (y * MONTHS_IN_YEAR) + m + (d \/ DAYS_IN_MONTH);\r\n  };\r\n\r\n  \/\/ === UI Helpers ===\r\n  const toggleDetaliiCondamnare = () => {\r\n    if (!elements.condamnareAnterioara || !elements.detaliiCondamnare) return;\r\n\r\n    if (elements.condamnareAnterioara.checked) {\r\n      elements.detaliiCondamnare.classList.remove('is-hidden');\r\n    } else {\r\n      elements.detaliiCondamnare.classList.add('is-hidden');\r\n      \/\/ Reset checkboxes\r\n      const checkboxes = elements.detaliiCondamnare.querySelectorAll('input[type=\"checkbox\"]');\r\n      checkboxes.forEach(cb => cb.checked = false);\r\n    }\r\n  };\r\n\r\n  \/\/ === SECURITY: Safe DOM element creation for conditions ===\r\n  const createConditionElement = (ok, text) => {\r\n    const container = createSafeElement('div', `zic2__condition zic2__condition--${ok ? 'ok' : 'bad'}`);\r\n\r\n    const icon = createSafeElement('span', 'zic2__conditionIcon');\r\n    icon.textContent = ok ? '\\u2713' : '\\u2717';\r\n\r\n    const textSpan = createSafeElement('span', 'zic2__conditionText');\r\n    textSpan.textContent = text; \/\/ textContent is safe - auto-escapes\r\n\r\n    container.appendChild(icon);\r\n    container.appendChild(textSpan);\r\n\r\n    return container;\r\n  };\r\n\r\n  const createSubConditionElement = (text) => {\r\n    const el = createSafeElement('div', 'zic2__subCondition');\r\n    el.textContent = '\\u2022 ' + text;\r\n    return el;\r\n  };\r\n\r\n  const createConclusionElement = (allOk) => {\r\n    const container = createSafeElement('div', `zic2__conclusion zic2__conclusion--${allOk ? 'ok' : 'bad'}`);\r\n\r\n    const strong = createSafeElement('strong', null, 'Concluzie:');\r\n\r\n    const p = createSafeElement('p');\r\n    p.textContent = allOk\r\n      ? 'Sunt indeplinite conditiile pentru executarea pedepsei sub supraveghere conform art. 91 Cod penal.'\r\n      : 'Nu sunt indeplinite toate conditiile pentru executarea pedepsei sub supraveghere.';\r\n\r\n    container.appendChild(strong);\r\n    container.appendChild(p);\r\n\r\n    return container;\r\n  };\r\n\r\n  \/\/ === Calculation ===\r\n  const calculate = () => {\r\n    \/\/ SECURITY: Sanitize all inputs before processing\r\n    \/\/ Use getNumericValue which returns 0 for empty inputs (safe for calculations)\r\n    const pedeapsaAni = getNumericValue(elements.pedeapsaAni?.value, 'pedeapsa-ani');\r\n    const pedeapsaLuni = getNumericValue(elements.pedeapsaLuni?.value, 'pedeapsa-luni');\r\n    const pedeapsaZile = getNumericValue(elements.pedeapsaZile?.value, 'pedeapsa-zile');\r\n\r\n    \/\/ VALIDATION: Check if penalty is entered\r\n    const pedepsaTotalLuni = toMonths(pedeapsaAni, pedeapsaLuni, pedeapsaZile);\r\n    if (pedepsaTotalLuni === 0) {\r\n      alert('Va rugam sa introduceti pedeapsa aplicata (ani, luni sau zile).');\r\n      if (elements.pedeapsaAni) elements.pedeapsaAni.focus();\r\n      return;\r\n    }\r\n\r\n    const conditiiIndeplinite = [];\r\n    const conditiiNeindeplinite = [];\r\n\r\n    \/\/ Condition 1: Penalty duration (pedepsaTotalLuni already calculated above)\r\n    if (pedepsaTotalLuni <= MAX_SUSPENSION_MONTHS) {\r\n      conditiiIndeplinite.push({ text: 'Pedeapsa aplicata nu depaseste 3 ani', sub: [] });\r\n    } else {\r\n      conditiiNeindeplinite.push({ text: 'Pedeapsa aplicata depaseste 3 ani', sub: [] });\r\n    }\r\n\r\n    \/\/ Condition 2: Prior convictions\r\n    const condamnareAnterioara = isChecked(elements.condamnareAnterioara);\r\n    if (!condamnareAnterioara) {\r\n      conditiiIndeplinite.push({ text: 'Nu exista condamnari anterioare la inchisoare mai mari de 1 an', sub: [] });\r\n    } else {\r\n      const dinCulpa = isChecked(elements.dinCulpa);\r\n      const reabilitare = isChecked(elements.reabilitare);\r\n      const termenReabilitare = isChecked(elements.termenReabilitare);\r\n      const amnistie = isChecked(elements.amnistie);\r\n      const nuMaiEstePrevazuta = isChecked(elements.nuMaiEstePrevazuta);\r\n\r\n      if (dinCulpa || reabilitare || termenReabilitare || amnistie || nuMaiEstePrevazuta) {\r\n        const exceptii = [];\r\n        if (dinCulpa) exceptii.push('Infractiunea anterioara a fost savarsita din culpa');\r\n        if (reabilitare) exceptii.push('A intervenit reabilitarea');\r\n        if (termenReabilitare) exceptii.push('S-a implinit termenul de reabilitare');\r\n        if (amnistie) exceptii.push('Infractiunea anterioara a fost amnistiata');\r\n        if (nuMaiEstePrevazuta) exceptii.push('Infractiunea anterioara nu mai este prevazuta de legea penala');\r\n        conditiiIndeplinite.push({ text: 'Desi exista condamnare anterioara, se aplica o exceptie legala:', sub: exceptii });\r\n      } else {\r\n        conditiiNeindeplinite.push({ text: 'Exista condamnare anterioara la inchisoare mai mare de 1 an si nu se aplica nicio exceptie', sub: [] });\r\n      }\r\n    }\r\n\r\n    \/\/ Condition 3: Consent for unpaid work\r\n    if (isChecked(elements.acordPrestare)) {\r\n      conditiiIndeplinite.push({ text: 'Inculpatul si-a manifestat acordul de a presta munca neremunerata', sub: [] });\r\n    } else {\r\n      conditiiNeindeplinite.push({ text: 'Lipseste acordul de a presta munca neremunerata', sub: [] });\r\n    }\r\n\r\n    \/\/ Impediments\r\n    if (isChecked(elements.amanareRevocata)) {\r\n      conditiiNeindeplinite.push({ text: 'Nu se poate dispune suspendarea deoarece aplicarea pedepsei a fost initial amanata, dar ulterior amanarea a fost revocata', sub: [] });\r\n    }\r\n    if (isChecked(elements.sustragereZadarnicire)) {\r\n      conditiiNeindeplinite.push({ text: 'Nu se poate dispune suspendarea deoarece inculpatul s-a sustras de la urmarire penala\/judecata sau a incercat zadarnicirea aflarii adevarului', sub: [] });\r\n    }\r\n    if (isChecked(elements.infractiuniRutiere)) {\r\n      conditiiNeindeplinite.push({ text: 'Nu se poate dispune suspendarea deoarece este vorba despre o infractiune prevazuta la art. 192 alin. (2) si (3), savarsita in conditiile art. 335 sau 336', sub: [] });\r\n    }\r\n    if (isChecked(elements.infractiuniMinori)) {\r\n      conditiiNeindeplinite.push({ text: 'Nu se poate dispune suspendarea deoarece este vorba despre o infractiune prevazuta la art. 209-211', sub: [] });\r\n    }\r\n\r\n    \/\/ Store result\r\n    lastResult = {\r\n      conditiiIndeplinite,\r\n      conditiiNeindeplinite,\r\n      timestamp: new Date().toISOString()\r\n    };\r\n\r\n    renderResult(conditiiIndeplinite, conditiiNeindeplinite);\r\n  };\r\n\r\n  \/\/ === SECURITY: Safe Render Result using DOM manipulation instead of innerHTML ===\r\n  const renderResult = (ok, bad) => {\r\n    const allOk = bad.length === 0;\r\n\r\n    \/\/ Update card styling\r\n    elements.resultCard.classList.remove('is-hidden', 'zic2__resultCard--success', 'zic2__resultCard--danger');\r\n    elements.resultCard.classList.add(allOk ? 'zic2__resultCard--success' : 'zic2__resultCard--danger');\r\n\r\n    \/\/ Update icon\r\n    elements.resultIcon.classList.remove('zic2__cardIcon--green', 'zic2__cardIcon--danger');\r\n    elements.resultIcon.classList.add(allOk ? 'zic2__cardIcon--green' : 'zic2__cardIcon--danger');\r\n\r\n    \/\/ SECURITY: Clear and rebuild icon using DOM methods\r\n    while (elements.resultIcon.firstChild) {\r\n      elements.resultIcon.removeChild(elements.resultIcon.firstChild);\r\n    }\r\n\r\n    const svg = document.createElementNS('http:\/\/www.w3.org\/2000\/svg', 'svg');\r\n    svg.setAttribute('width', '18');\r\n    svg.setAttribute('height', '18');\r\n    svg.setAttribute('viewBox', '0 0 24 24');\r\n    svg.setAttribute('fill', 'none');\r\n    svg.setAttribute('stroke', 'currentColor');\r\n    svg.setAttribute('stroke-width', allOk ? '2.5' : '2');\r\n\r\n    if (allOk) {\r\n      const polyline = document.createElementNS('http:\/\/www.w3.org\/2000\/svg', 'polyline');\r\n      polyline.setAttribute('points', '20 6 9 17 4 12');\r\n      svg.appendChild(polyline);\r\n    } else {\r\n      const line1 = document.createElementNS('http:\/\/www.w3.org\/2000\/svg', 'line');\r\n      line1.setAttribute('x1', '18');\r\n      line1.setAttribute('y1', '6');\r\n      line1.setAttribute('x2', '6');\r\n      line1.setAttribute('y2', '18');\r\n      svg.appendChild(line1);\r\n\r\n      const line2 = document.createElementNS('http:\/\/www.w3.org\/2000\/svg', 'line');\r\n      line2.setAttribute('x1', '6');\r\n      line2.setAttribute('y1', '6');\r\n      line2.setAttribute('x2', '18');\r\n      line2.setAttribute('y2', '18');\r\n      svg.appendChild(line2);\r\n    }\r\n\r\n    elements.resultIcon.appendChild(svg);\r\n\r\n    \/\/ SECURITY: Clear existing content safely\r\n    while (elements.resultContent.firstChild) {\r\n      elements.resultContent.removeChild(elements.resultContent.firstChild);\r\n    }\r\n\r\n    \/\/ Build content using safe DOM methods\r\n    ok.forEach(cond => {\r\n      elements.resultContent.appendChild(createConditionElement(true, cond.text));\r\n      cond.sub.forEach(sub => {\r\n        elements.resultContent.appendChild(createSubConditionElement(sub));\r\n      });\r\n    });\r\n\r\n    bad.forEach(cond => {\r\n      elements.resultContent.appendChild(createConditionElement(false, cond.text));\r\n      \/\/ Also display sub-conditions for bad conditions (for consistency)\r\n      if (cond.sub && cond.sub.length > 0) {\r\n        cond.sub.forEach(sub => {\r\n          elements.resultContent.appendChild(createSubConditionElement(sub));\r\n        });\r\n      }\r\n    });\r\n\r\n    \/\/ Conclusion\r\n    elements.resultContent.appendChild(createConclusionElement(allOk));\r\n\r\n    setTimeout(() => {\r\n      elements.resultCard.scrollIntoView({ behavior: 'smooth', block: 'nearest' });\r\n    }, 100);\r\n  };\r\n\r\n  \/\/ === Reset ===\r\n  const reset = () => {\r\n    \/\/ Reset inputs\r\n    if (elements.pedeapsaAni) elements.pedeapsaAni.value = '';\r\n    if (elements.pedeapsaLuni) elements.pedeapsaLuni.value = '';\r\n    if (elements.pedeapsaZile) elements.pedeapsaZile.value = '';\r\n\r\n    \/\/ Reset all checkboxes\r\n    $$('input[type=\"checkbox\"]').forEach(cb => cb.checked = false);\r\n\r\n    \/\/ Hide details section\r\n    if (elements.detaliiCondamnare) {\r\n      elements.detaliiCondamnare.classList.add('is-hidden');\r\n    }\r\n\r\n    \/\/ Hide result\r\n    elements.resultCard.classList.add('is-hidden');\r\n\r\n    \/\/ SECURITY: Clear result content safely\r\n    while (elements.resultContent.firstChild) {\r\n      elements.resultContent.removeChild(elements.resultContent.firstChild);\r\n    }\r\n\r\n    lastResult = null;\r\n  };\r\n\r\n  \/\/ === SECURITY: Safe Export PDF using escaped content ===\r\n  const exportPDF = () => {\r\n    if (!lastResult) {\r\n      alert('Verifica mai intai conditiile pentru a genera PDF-ul.');\r\n      return;\r\n    }\r\n\r\n    const printWindow = window.open('', '_blank');\r\n    if (!printWindow) {\r\n      alert('Permite pop-up-urile pentru a genera PDF-ul.');\r\n      return;\r\n    }\r\n\r\n    const { conditiiIndeplinite, conditiiNeindeplinite } = lastResult;\r\n    const allOk = conditiiNeindeplinite.length === 0;\r\n    const date = new Date().toLocaleDateString('ro-RO', {\r\n      year: 'numeric', month: 'long', day: 'numeric'\r\n    });\r\n\r\n    \/\/ SECURITY: Escape all dynamic content\r\n    let conditionsHTML = '';\r\n    conditiiIndeplinite.forEach(cond => {\r\n      conditionsHTML += '<div class=\"condition condition-ok\"><span class=\"icon\">\\u2713<\/span> ' + escapeHTML(cond.text) + '<\/div>';\r\n      cond.sub.forEach(sub => {\r\n        conditionsHTML += '<div class=\"sub-condition\">\\u2022 ' + escapeHTML(sub) + '<\/div>';\r\n      });\r\n    });\r\n    conditiiNeindeplinite.forEach(cond => {\r\n      conditionsHTML += '<div class=\"condition condition-bad\"><span class=\"icon\">\\u2717<\/span> ' + escapeHTML(cond.text) + '<\/div>';\r\n      \/\/ Also include sub-conditions for bad conditions\r\n      if (cond.sub && cond.sub.length > 0) {\r\n        cond.sub.forEach(sub => {\r\n          conditionsHTML += '<div class=\"sub-condition\">\\u2022 ' + escapeHTML(sub) + '<\/div>';\r\n        });\r\n      }\r\n    });\r\n\r\n    \/\/ SECURITY: Date is generated internally, but escape anyway for safety\r\n    const safeDate = escapeHTML(date);\r\n\r\n    const conclusionText = allOk\r\n      ? 'Sunt indeplinite conditiile pentru executarea pedepsei sub supraveghere conform art. 91 Cod penal.'\r\n      : 'Nu sunt indeplinite toate conditiile pentru executarea pedepsei sub supraveghere.';\r\n\r\n    const content = '<!DOCTYPE html>\\n' +\r\n'<html lang=\"ro\">\\n' +\r\n'<head>\\n' +\r\n'  <meta charset=\"UTF-8\">\\n' +\r\n'  <meta http-equiv=\"Content-Security-Policy\" content=\"default-src \\'self\\'; style-src \\'unsafe-inline\\'; script-src \\'none\\';\">\\n' +\r\n'  <title>Raport Suspendare sub Supraveghere - ZIC Legal<\/title>\\n' +\r\n'  <style>\\n' +\r\n'    * { box-sizing: border-box; margin: 0; padding: 0; }\\n' +\r\n'    body {\\n' +\r\n'      font-family: -apple-system, BlinkMacSystemFont, \\'Segoe UI\\', Roboto, sans-serif;\\n' +\r\n'      max-width: 700px;\\n' +\r\n'      margin: 0 auto;\\n' +\r\n'      padding: 40px 30px;\\n' +\r\n'      color: #1F2937;\\n' +\r\n'      line-height: 1.6;\\n' +\r\n'    }\\n' +\r\n'    .header {\\n' +\r\n'      border-bottom: 3px solid #8A88FF;\\n' +\r\n'      padding-bottom: 20px;\\n' +\r\n'      margin-bottom: 30px;\\n' +\r\n'    }\\n' +\r\n'    .header h1 {\\n' +\r\n'      color: #6F6CFF;\\n' +\r\n'      font-size: 24px;\\n' +\r\n'      margin-bottom: 5px;\\n' +\r\n'    }\\n' +\r\n'    .header p {\\n' +\r\n'      color: #6B7280;\\n' +\r\n'      font-size: 14px;\\n' +\r\n'    }\\n' +\r\n'    .section {\\n' +\r\n'      background: #F9FAFB;\\n' +\r\n'      border-radius: 12px;\\n' +\r\n'      padding: 20px;\\n' +\r\n'      margin-bottom: 20px;\\n' +\r\n'    }\\n' +\r\n'    .section h2 {\\n' +\r\n'      font-size: 16px;\\n' +\r\n'      color: #374151;\\n' +\r\n'      margin-bottom: 15px;\\n' +\r\n'      padding-bottom: 10px;\\n' +\r\n'      border-bottom: 1px solid #E5E7EB;\\n' +\r\n'    }\\n' +\r\n'    .condition {\\n' +\r\n'      padding: 12px 15px;\\n' +\r\n'      border-radius: 8px;\\n' +\r\n'      margin-bottom: 8px;\\n' +\r\n'      font-size: 14px;\\n' +\r\n'      display: flex;\\n' +\r\n'      align-items: flex-start;\\n' +\r\n'      gap: 10px;\\n' +\r\n'    }\\n' +\r\n'    .condition-ok {\\n' +\r\n'      background: rgba(16,185,129,.1);\\n' +\r\n'      color: #059669;\\n' +\r\n'    }\\n' +\r\n'    .condition-bad {\\n' +\r\n'      background: rgba(239,68,68,.1);\\n' +\r\n'      color: #DC2626;\\n' +\r\n'    }\\n' +\r\n'    .condition .icon {\\n' +\r\n'      font-weight: bold;\\n' +\r\n'      flex-shrink: 0;\\n' +\r\n'    }\\n' +\r\n'    .sub-condition {\\n' +\r\n'      margin-left: 40px;\\n' +\r\n'      padding: 8px 12px;\\n' +\r\n'      background: #F3F4F6;\\n' +\r\n'      border-radius: 6px;\\n' +\r\n'      font-size: 13px;\\n' +\r\n'      color: #6B7280;\\n' +\r\n'      margin-bottom: 8px;\\n' +\r\n'    }\\n' +\r\n'    .conclusion {\\n' +\r\n'      padding: 16px;\\n' +\r\n'      border-radius: 10px;\\n' +\r\n'      margin-top: 20px;\\n' +\r\n'    }\\n' +\r\n'    .conclusion-ok {\\n' +\r\n'      background: rgba(16,185,129,.1);\\n' +\r\n'      border: 1px solid rgba(16,185,129,.25);\\n' +\r\n'    }\\n' +\r\n'    .conclusion-bad {\\n' +\r\n'      background: rgba(239,68,68,.1);\\n' +\r\n'      border: 1px solid rgba(239,68,68,.25);\\n' +\r\n'    }\\n' +\r\n'    .conclusion strong {\\n' +\r\n'      display: block;\\n' +\r\n'      margin-bottom: 6px;\\n' +\r\n'      color: #1F2937;\\n' +\r\n'    }\\n' +\r\n'    .conclusion-ok p { color: #059669; font-weight: 600; }\\n' +\r\n'    .conclusion-bad p { color: #DC2626; font-weight: 600; }\\n' +\r\n'    .disclaimer {\\n' +\r\n'      margin-top: 30px;\\n' +\r\n'      padding: 15px;\\n' +\r\n'      background: #F3F4F6;\\n' +\r\n'      border-radius: 8px;\\n' +\r\n'      font-size: 11px;\\n' +\r\n'      color: #6B7280;\\n' +\r\n'    }\\n' +\r\n'    .footer {\\n' +\r\n'      margin-top: 40px;\\n' +\r\n'      padding-top: 20px;\\n' +\r\n'      border-top: 1px solid #E5E7EB;\\n' +\r\n'      text-align: center;\\n' +\r\n'      color: #6B7280;\\n' +\r\n'      font-size: 12px;\\n' +\r\n'    }\\n' +\r\n'    .footer a { color: #6F6CFF; text-decoration: none; }\\n' +\r\n'    @media print {\\n' +\r\n'      body { padding: 20px; }\\n' +\r\n'      .section { break-inside: avoid; }\\n' +\r\n'    }\\n' +\r\n'  <\/style>\\n' +\r\n'<\/head>\\n' +\r\n'<body>\\n' +\r\n'  <div class=\"header\">\\n' +\r\n'    <h1>Calculator Suspendare sub Supraveghere<\/h1>\\n' +\r\n'    <p>Raport generat la ' + safeDate + '<\/p>\\n' +\r\n'  <\/div>\\n' +\r\n'  <div class=\"section\">\\n' +\r\n'    <h2>Analiza conditiilor (art. 91 Cod penal)<\/h2>\\n' +\r\n    conditionsHTML + '\\n' +\r\n'    <div class=\"conclusion conclusion-' + (allOk ? 'ok' : 'bad') + '\">\\n' +\r\n'      <strong>Concluzie:<\/strong>\\n' +\r\n'      <p>' + escapeHTML(conclusionText) + '<\/p>\\n' +\r\n'    <\/div>\\n' +\r\n'  <\/div>\\n' +\r\n'  <div class=\"disclaimer\">\\n' +\r\n'    <strong>Disclaimer:<\/strong> Acest raport este oferit exclusiv in scop informativ si educativ.\\n' +\r\n'    Rezultatele generate nu constituie consultanta juridica. Decizia finala apartine instantei de judecata.\\n' +\r\n'  <\/div>\\n' +\r\n'  <div class=\"footer\">\\n' +\r\n'    <p>Generat cu Calculator Suspendare sub Supraveghere<\/p>\\n' +\r\n'    <p><a href=\"https:\/\/zic.legal\">ZIC Legal<\/a><\/p>\\n' +\r\n'  <\/div>\\n' +\r\n'<\/body>\\n' +\r\n'<\/html>';\r\n\r\n    printWindow.document.write(content);\r\n    printWindow.document.close();\r\n    printWindow.focus();\r\n\r\n    setTimeout(() => {\r\n      printWindow.print();\r\n    }, 300);\r\n  };\r\n\r\n  \/\/ === Event Handlers ===\r\n  const handleClick = (e) => {\r\n    const button = e.target.closest('[data-action]');\r\n    if (!button) return;\r\n\r\n    \/\/ SECURITY: Validate action is one of expected values\r\n    const action = button.dataset.action;\r\n    const validActions = ['calculate', 'reset', 'export-pdf'];\r\n\r\n    if (!validActions.includes(action)) {\r\n      return; \/\/ Ignore invalid actions\r\n    }\r\n\r\n    switch (action) {\r\n      case 'calculate':\r\n        calculate();\r\n        break;\r\n      case 'reset':\r\n        reset();\r\n        break;\r\n      case 'export-pdf':\r\n        exportPDF();\r\n        break;\r\n    }\r\n  };\r\n\r\n  const handleChange = (e) => {\r\n    const field = e.target.dataset?.field;\r\n    if (field === 'condamnare-anterioara') {\r\n      toggleDetaliiCondamnare();\r\n    }\r\n  };\r\n\r\n  \/\/ === SECURITY: Enhanced input validation on blur ===\r\n  const handleBlur = (e) => {\r\n    const input = e.target;\r\n    if (!input.matches('.zic2__input')) return;\r\n\r\n    const field = input.dataset.field;\r\n    const limits = INPUT_LIMITS[field];\r\n\r\n    if (limits) {\r\n      const sanitized = sanitizeNumericInput(input.value, field);\r\n      \/\/ Keep empty if input was empty, otherwise show sanitized value\r\n      if (sanitized === null) {\r\n        input.value = '';\r\n      } else {\r\n        input.value = sanitized;\r\n      }\r\n    }\r\n  };\r\n\r\n  \/\/ === SECURITY: Validate input on keydown to prevent invalid characters ===\r\n  const handleKeydown = (e) => {\r\n    const input = e.target;\r\n    if (!input.matches('.zic2__input[type=\"number\"]')) return;\r\n\r\n    \/\/ Allow: backspace, delete, tab, escape, enter, arrows\r\n    const allowedKeys = ['Backspace', 'Delete', 'Tab', 'Escape', 'Enter', 'ArrowLeft', 'ArrowRight', 'ArrowUp', 'ArrowDown', 'Home', 'End'];\r\n    if (allowedKeys.includes(e.key)) return;\r\n\r\n    \/\/ Allow Ctrl+A, Ctrl+C, Ctrl+V, Ctrl+X\r\n    if ((e.ctrlKey || e.metaKey) && ['a', 'c', 'v', 'x'].includes(e.key.toLowerCase())) return;\r\n\r\n    \/\/ Block non-numeric characters\r\n    if (!\/^[0-9]$\/.test(e.key)) {\r\n      e.preventDefault();\r\n    }\r\n  };\r\n\r\n  \/\/ === SECURITY: Sanitize pasted content ===\r\n  const handlePaste = (e) => {\r\n    const input = e.target;\r\n    if (!input.matches('.zic2__input[type=\"number\"]')) return;\r\n\r\n    const pastedData = (e.clipboardData || window.clipboardData).getData('text');\r\n    \/\/ Only allow if pasted data contains only digits\r\n    if (!\/^\\d*$\/.test(pastedData)) {\r\n      e.preventDefault();\r\n      \/\/ Extract only digits from pasted content\r\n      const digitsOnly = pastedData.replace(\/\\D\/g, '');\r\n      if (digitsOnly) {\r\n        \/\/ Insert cleaned data at cursor position\r\n        const start = input.selectionStart;\r\n        const end = input.selectionEnd;\r\n        const currentValue = input.value;\r\n        input.value = currentValue.substring(0, start) + digitsOnly + currentValue.substring(end);\r\n        input.setSelectionRange(start + digitsOnly.length, start + digitsOnly.length);\r\n      }\r\n    }\r\n  };\r\n\r\n  \/\/ === Initialize ===\r\n  const init = () => {\r\n    root.addEventListener('click', handleClick);\r\n    root.addEventListener('change', handleChange);\r\n    root.addEventListener('blur', handleBlur, true);\r\n    root.addEventListener('keydown', handleKeydown, true);\r\n    root.addEventListener('paste', handlePaste, true);\r\n\r\n    \/\/ Initial state\r\n    toggleDetaliiCondamnare();\r\n  };\r\n\r\n  if (document.readyState === 'loading') {\r\n    document.addEventListener('DOMContentLoaded', init);\r\n  } else {\r\n    init();\r\n  }\r\n})();\r\n<\/script>\r\n<\/div>\n<div data-tool-content=\"reducere\" style=\"display:none\"><!--\r\n  ZIC Calculator Limite Pedeaps\u0103 - Procedur\u0103 Abreviat\u0103 & Acord de Recunoa\u0219tere\r\n  Version: 1.0\r\n  Brand: zic.legal\r\n\r\n  INSTRUC\u021aIUNI DE IMPLEMENTARE:\r\n  =============================\r\n  1. WP Admin \u2192 WPCode \u2192 Add Snippet \u2192 HTML Snippet\r\n  2. Paste acest cod complet (DIV + STYLE + SCRIPT)\r\n  3. Location: Shortcode\r\n  4. Insert \u00een Avada: element Shortcode \u2192 [wpcode id=\"XXX\"]\r\n-->\r\n\r\n<div class=\"zic2\" data-zic-penalty-limits=\"1\">\r\n  <!-- Header -->\r\n  <header class=\"zic2__header\">\r\n    <div class=\"zic2__titleRow\">\r\n      <div class=\"zic2__icon\">\r\n        <svg width=\"28\" height=\"28\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n          <path d=\"M12 2L2 7l10 5 10-5-10-5z\"\/>\r\n          <path d=\"M2 17l10 5 10-5\"\/>\r\n          <path d=\"M2 12l10 5 10-5\"\/>\r\n        <\/svg>\r\n      <\/div>\r\n      <div>\r\n        <h2 class=\"zic2__title\">Calculator Limite de Pedeaps\u0103<\/h2>\r\n        <p class=\"zic2__subtitle\">Procedur\u0103 abreviat\u0103 (art. 396 alin. 10 CPP) & Acord de recunoa\u0219tere (art. 480 alin. 4 CPP)<\/p>\r\n      <\/div>\r\n    <\/div>\r\n  <\/header>\r\n\r\n  <!-- Disclaimer -->\r\n  <div class=\"zic2__disclaimer\" role=\"alert\">\r\n    <div class=\"zic2__disclaimerIcon\">\r\n      <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\r\n        <circle cx=\"12\" cy=\"12\" r=\"10\"\/>\r\n        <line x1=\"12\" y1=\"8\" x2=\"12\" y2=\"12\"\/>\r\n        <line x1=\"12\" y1=\"16\" x2=\"12.01\" y2=\"16\"\/>\r\n      <\/svg>\r\n    <\/div>\r\n    <div class=\"zic2__disclaimerText\">\r\n      <strong>Instrument informativ.<\/strong> Calculeaz\u0103 doar limite reduse estimative pe baza datelor introduse \u0219i a regulilor legale parametrizate.\r\n      <strong>Nu reprezint\u0103 consultan\u021b\u0103 juridic\u0103<\/strong> \u0219i nu stabile\u0219te pedeapsa concret\u0103 (individualizarea, concurs\/recidiv\u0103 etc. pot schimba rezultatul).\r\n      Verifica\u021bi \u00eentotdeauna \u00eencadrarea juridic\u0103, legea aplicabil\u0103 \u0219i actele din dosar.\r\n    <\/div>\r\n  <\/div>\r\n\r\n  <!-- Card: Infrac\u021biuni -->\r\n  <section class=\"zic2__card\">\r\n    <div class=\"zic2__cardHeader\">\r\n      <h3 class=\"zic2__cardTitle\">\r\n        <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\r\n          <path d=\"M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z\"\/>\r\n          <polyline points=\"14 2 14 8 20 8\"\/>\r\n          <line x1=\"12\" y1=\"18\" x2=\"12\" y2=\"12\"\/>\r\n          <line x1=\"9\" y1=\"15\" x2=\"15\" y2=\"15\"\/>\r\n        <\/svg>\r\n        Infrac\u021biuni \u0219i limite ini\u021biale\r\n      <\/h3>\r\n      <p class=\"zic2__cardDesc\">Introduce\u021bi limitele speciale min\/max prev\u0103zute de lege pentru \u00eencadrarea aleas\u0103 (dup\u0103 aplicarea eventualelor institu\u021bii care modific\u0103 limitele \u2014 tentativ\u0103\/participa\u021bie etc., dac\u0103 e cazul).<\/p>\r\n    <\/div>\r\n\r\n    <div class=\"zic2__offensesList\" data-offenses-list>\r\n      <!-- Offenses will be rendered here -->\r\n    <\/div>\r\n\r\n    <button type=\"button\" class=\"zic2__btnSecondary\" data-action=\"add-offense\">\r\n      <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\r\n        <line x1=\"12\" y1=\"5\" x2=\"12\" y2=\"19\"\/>\r\n        <line x1=\"5\" y1=\"12\" x2=\"19\" y2=\"12\"\/>\r\n      <\/svg>\r\n      Adaug\u0103 infrac\u021biune\r\n    <\/button>\r\n  <\/section>\r\n\r\n  <!-- Card: Procedur\u0103 -->\r\n  <section class=\"zic2__card\">\r\n    <div class=\"zic2__cardHeader\">\r\n      <h3 class=\"zic2__cardTitle\">\r\n        <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\r\n          <path d=\"M22 11.08V12a10 10 0 1 1-5.93-9.14\"\/>\r\n          <polyline points=\"22 4 12 14.01 9 11.01\"\/>\r\n        <\/svg>\r\n        Alege procedura\r\n      <\/h3>\r\n    <\/div>\r\n    <div class=\"zic2__radioGroup\" role=\"radiogroup\" aria-label=\"Tipul procedurii\">\r\n      <label class=\"zic2__radioLabel\">\r\n        <input type=\"radio\" name=\"procedureType\" value=\"abreviata\" class=\"zic2__radio\" checked data-procedure-type>\r\n        <span class=\"zic2__radioMark\"><\/span>\r\n        <span class=\"zic2__radioText\">\r\n          <strong>Procedur\u0103 abreviat\u0103 (instan\u021b\u0103)<\/strong>\r\n          <small>Reducere conform art. 396 alin. (10) CPP<\/small>\r\n        <\/span>\r\n      <\/label>\r\n      <label class=\"zic2__radioLabel\">\r\n        <input type=\"radio\" name=\"procedureType\" value=\"acord\" class=\"zic2__radio\" data-procedure-type>\r\n        <span class=\"zic2__radioMark\"><\/span>\r\n        <span class=\"zic2__radioText\">\r\n          <strong>Acord de recunoa\u0219tere (UP)<\/strong>\r\n          <small>Reducere conform art. 480 alin. (4) CPP<\/small>\r\n        <\/span>\r\n      <\/label>\r\n      <label class=\"zic2__radioLabel\">\r\n        <input type=\"radio\" name=\"procedureType\" value=\"ambele\" class=\"zic2__radio\" data-procedure-type>\r\n        <span class=\"zic2__radioMark\"><\/span>\r\n        <span class=\"zic2__radioText\">\r\n          <strong>Compar\u0103 ambele<\/strong>\r\n          <small>Afi\u0219eaz\u0103 rezultatele pentru ambele proceduri<\/small>\r\n        <\/span>\r\n      <\/label>\r\n    <\/div>\r\n  <\/section>\r\n\r\n  <!-- Card: Condi\u021bii legale - Procedur\u0103 abreviat\u0103 -->\r\n  <section class=\"zic2__card\" data-conditions-abreviata>\r\n    <div class=\"zic2__cardHeader\">\r\n      <h3 class=\"zic2__cardTitle\">\r\n        <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\r\n          <path d=\"M9 11l3 3L22 4\"\/>\r\n          <path d=\"M21 12v7a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h11\"\/>\r\n        <\/svg>\r\n        Condi\u021bii legale \u2014 Procedur\u0103 abreviat\u0103\r\n      <\/h3>\r\n      <p class=\"zic2__cardDesc\">Verifica\u021bi condi\u021biile pentru aplicarea reducerii conform art. 374-377 \u0219i art. 396 alin. (10) CPP.<\/p>\r\n    <\/div>\r\n\r\n    <div class=\"zic2__checklistGroup\">\r\n      <label class=\"zic2__checkLabel\">\r\n        <input type=\"checkbox\" class=\"zic2__check\" data-condition=\"recunoasteIntegral\">\r\n        <span class=\"zic2__checkMark\"><\/span>\r\n        <span>Inculpatul recunoa\u0219te integral faptele re\u021binute \u00een sarcina sa<\/span>\r\n      <\/label>\r\n      <label class=\"zic2__checkLabel\">\r\n        <input type=\"checkbox\" class=\"zic2__check\" data-condition=\"solicitareInainte\">\r\n        <span class=\"zic2__checkMark\"><\/span>\r\n        <span>Solicitarea a fost formulat\u0103 \u00eenainte de \u00eenceperea cercet\u0103rii judec\u0103tore\u0219ti<\/span>\r\n      <\/label>\r\n      <label class=\"zic2__checkLabel\">\r\n        <input type=\"checkbox\" class=\"zic2__check\" data-condition=\"nuSolicitaProbe\">\r\n        <span class=\"zic2__checkMark\"><\/span>\r\n        <span>Nu se solicit\u0103 administrarea de probe noi (excep\u021bie: \u00eenscrisuri \u00een circumstan\u021biere)<\/span>\r\n      <\/label>\r\n      <label class=\"zic2__checkLabel\">\r\n        <input type=\"checkbox\" class=\"zic2__check\" data-condition=\"minorIncuviintare\">\r\n        <span class=\"zic2__checkMark\"><\/span>\r\n        <span>Dac\u0103 inculpatul este minor: exist\u0103 \u00eencuviin\u021barea reprezentantului legal (art. 375 alin. 2 CPP)<\/span>\r\n      <\/label>\r\n    <\/div>\r\n\r\n    <div class=\"zic2__selectGroup\">\r\n      <label class=\"zic2__selectLabel\">\r\n        <span>Scenariul aplic\u0103rii reducerii (art. 396 alin. 10 CPP):<\/span>\r\n        <select class=\"zic2__select\" data-condition=\"scenariuAbreviata\">\r\n          <option value=\"NECLAR\">-- Selecteaz\u0103 scenariul --<\/option>\r\n          <option value=\"ADMISA_375\">Cererea a fost admis\u0103 conform art. 375 CPP<\/option>\r\n          <option value=\"RESPINSA_DAR_SITUATIE_IDENTICA\">Cererea a fost respins\u0103, dar situa\u021bia de fapt este identic\u0103<\/option>\r\n          <option value=\"CERCETARE_377_5_SAU_395_2\">Cercetare reluat\u0103 (art. 377 alin. 5 sau art. 395 alin. 2), faptele sunt identice<\/option>\r\n        <\/select>\r\n      <\/label>\r\n    <\/div>\r\n  <\/section>\r\n\r\n  <!-- Card: Condi\u021bii legale - Acord de recunoa\u0219tere -->\r\n  <section class=\"zic2__card zic2__hidden\" data-conditions-acord>\r\n    <div class=\"zic2__cardHeader\">\r\n      <h3 class=\"zic2__cardTitle\">\r\n        <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\r\n          <path d=\"M9 11l3 3L22 4\"\/>\r\n          <path d=\"M21 12v7a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h11\"\/>\r\n        <\/svg>\r\n        Condi\u021bii legale \u2014 Acord de recunoa\u0219tere\r\n      <\/h3>\r\n      <p class=\"zic2__cardDesc\">Verifica\u021bi condi\u021biile pentru \u00eencheierea acordului conform art. 478-485 CPP.<\/p>\r\n    <\/div>\r\n\r\n    <div class=\"zic2__alertInfo\">\r\n      <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\r\n        <circle cx=\"12\" cy=\"12\" r=\"10\"\/>\r\n        <line x1=\"12\" y1=\"16\" x2=\"12\" y2=\"12\"\/>\r\n        <line x1=\"12\" y1=\"8\" x2=\"12.01\" y2=\"8\"\/>\r\n      <\/svg>\r\n      <span><strong>Aten\u021bie:<\/strong> Acordul nu poate privi infrac\u021biuni pedepsite cu deten\u021biune pe via\u021b\u0103 sau cu \u00eenchisoare mai mare de 15 ani. Instan\u021ba poate respinge acordul dac\u0103 pedeapsa este nejustificat de bl\u00e2nd\u0103 (art. 485 alin. 1 lit. b CPP).<\/span>\r\n    <\/div>\r\n\r\n    <div class=\"zic2__checklistGroup\">\r\n      <label class=\"zic2__checkLabel\">\r\n        <input type=\"checkbox\" class=\"zic2__check\" data-condition=\"actiunePenala\">\r\n        <span class=\"zic2__checkMark\"><\/span>\r\n        <span>Ac\u021biunea penal\u0103 a fost pus\u0103 \u00een mi\u0219care<\/span>\r\n      <\/label>\r\n      <label class=\"zic2__checkLabel\">\r\n        <input type=\"checkbox\" class=\"zic2__check\" data-condition=\"probeSuficiente\">\r\n        <span class=\"zic2__checkMark\"><\/span>\r\n        <span>Exist\u0103 probe suficiente cu privire la vinov\u0103\u021bie<\/span>\r\n      <\/label>\r\n      <label class=\"zic2__checkLabel\">\r\n        <input type=\"checkbox\" class=\"zic2__check\" data-condition=\"asistentaJuridica\">\r\n        <span class=\"zic2__checkMark\"><\/span>\r\n        <span>Este asigurat\u0103 asisten\u021ba juridic\u0103 obligatorie<\/span>\r\n      <\/label>\r\n      <label class=\"zic2__checkLabel\">\r\n        <input type=\"checkbox\" class=\"zic2__check\" data-condition=\"avizProcuror\">\r\n        <span class=\"zic2__checkMark\"><\/span>\r\n        <span>Exist\u0103 avizul procurorului ierarhic superior<\/span>\r\n      <\/label>\r\n      <label class=\"zic2__checkLabel\">\r\n        <input type=\"checkbox\" class=\"zic2__check\" data-condition=\"acordSemnat\">\r\n        <span class=\"zic2__checkMark\"><\/span>\r\n        <span>Acordul este \u00eencheiat \u00een form\u0103 scris\u0103 \u0219i semnat<\/span>\r\n      <\/label>\r\n    <\/div>\r\n  <\/section>\r\n\r\n  <!-- Actions -->\r\n  <div class=\"zic2__actions\">\r\n    <button type=\"button\" class=\"zic2__btnPrimary\" data-action=\"calculate\">\r\n      <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\r\n        <rect x=\"4\" y=\"2\" width=\"16\" height=\"20\" rx=\"2\"\/>\r\n        <line x1=\"8\" y1=\"6\" x2=\"16\" y2=\"6\"\/>\r\n        <line x1=\"8\" y1=\"10\" x2=\"16\" y2=\"10\"\/>\r\n        <line x1=\"8\" y1=\"14\" x2=\"12\" y2=\"14\"\/>\r\n        <line x1=\"8\" y1=\"18\" x2=\"10\" y2=\"18\"\/>\r\n      <\/svg>\r\n      Calculeaz\u0103 limitele reduse\r\n    <\/button>\r\n    <button type=\"button\" class=\"zic2__btnSecondary\" data-action=\"reset\">\r\n      <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\r\n        <path d=\"M3 12a9 9 0 1 0 9-9 9.75 9.75 0 0 0-6.74 2.74L3 8\"\/>\r\n        <path d=\"M3 3v5h5\"\/>\r\n      <\/svg>\r\n      Reseteaz\u0103\r\n    <\/button>\r\n    <button type=\"button\" class=\"zic2__btnTertiary\" data-action=\"example\">\r\n      <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\r\n        <path d=\"M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z\"\/>\r\n        <polyline points=\"14 2 14 8 20 8\"\/>\r\n        <line x1=\"16\" y1=\"13\" x2=\"8\" y2=\"13\"\/>\r\n        <line x1=\"16\" y1=\"17\" x2=\"8\" y2=\"17\"\/>\r\n      <\/svg>\r\n      \u00cencarc\u0103 exemplu\r\n    <\/button>\r\n  <\/div>\r\n\r\n  <!-- Options -->\r\n  <div class=\"zic2__options\">\r\n    <label class=\"zic2__checkLabel zic2__checkLabel--inline\">\r\n      <input type=\"checkbox\" class=\"zic2__check\" data-option=\"showRounding\" checked>\r\n      <span class=\"zic2__checkMark\"><\/span>\r\n      <span>Afi\u0219eaz\u0103 \u0219i rotunjiri (interval sigur pentru valori \u00eentregi)<\/span>\r\n    <\/label>\r\n  <\/div>\r\n\r\n  <!-- Results Container -->\r\n  <div class=\"zic2__results zic2__hidden\" data-results-container>\r\n    <!-- Results will be rendered here -->\r\n  <\/div>\r\n\r\n  <!-- Error Container -->\r\n  <div class=\"zic2__errorContainer zic2__hidden\" role=\"alert\" aria-live=\"polite\" data-error-container>\r\n    <!-- Errors will be rendered here -->\r\n  <\/div>\r\n\r\n  <!-- Legal References -->\r\n  <details class=\"zic2__details\">\r\n    <summary class=\"zic2__summary\">\r\n      <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\r\n        <path d=\"M4 19.5A2.5 2.5 0 0 1 6.5 17H20\"\/>\r\n        <path d=\"M6.5 2H20v20H6.5A2.5 2.5 0 0 1 4 19.5v-15A2.5 2.5 0 0 1 6.5 2z\"\/>\r\n      <\/svg>\r\n      Baz\u0103 legal\u0103 (articole de referin\u021b\u0103)\r\n    <\/summary>\r\n    <div class=\"zic2__detailsContent\">\r\n      <div class=\"zic2__legalSection\">\r\n        <h4>Procedur\u0103 abreviat\u0103 (instan\u021b\u0103)<\/h4>\r\n        <ul>\r\n          <li><strong>Art. 374 alin. (4) CPP<\/strong> \u2014 Condi\u021bie de admisibilitate (nu e deten\u021biune pe via\u021b\u0103 + solicitare + recunoa\u0219tere integral\u0103 + judecat\u0103 pe probele UP)<\/li>\r\n          <li><strong>Art. 375 alin. (1)-(2) CPP<\/strong> \u2014 Procedura cererii \u0219i solu\u021bionarea ei; pentru minori este necesar\u0103 \u00eencuviin\u021barea reprezentantului legal<\/li>\r\n          <li><strong>Art. 377 CPP<\/strong> \u2014 Reguli probatorii specifice<\/li>\r\n          <li><strong>Art. 396 alin. (10) CPP<\/strong> \u2014 Efectul asupra limitelor: reducere cu 1\/3 (\u00eenchisoare) \u0219i 1\/4 (amend\u0103); se aplic\u0103 \u0219i la renun\u021bare\/am\u00e2nare<\/li>\r\n        <\/ul>\r\n      <\/div>\r\n      <div class=\"zic2__legalSection\">\r\n        <h4>Acord de recunoa\u0219tere (urm\u0103rire penal\u0103)<\/h4>\r\n        <ul>\r\n          <li><strong>Art. 478 alin. (1) CPP<\/strong> \u2014 Titulari + moment: dup\u0103 punerea \u00een mi\u0219care a ac\u021biunii penale, \u00een cursul UP<\/li>\r\n          <li><strong>Art. 479 CPP<\/strong> \u2014 Obiectul acordului (inclusiv felul, cuantumul \u0219i forma de executare a pedepsei)<\/li>\r\n          <li><strong>Art. 480 alin. (1)-(2) CPP<\/strong> \u2014 Condi\u021bii + prag (max 15 ani) + probe suficiente + asisten\u021b\u0103 juridic\u0103 obligatorie<\/li>\r\n          <li><strong>Art. 480 alin. (4) CPP<\/strong> \u2014 Reducerea limitelor (\u00eenchisoare 1\/3, amend\u0103 1\/4)<\/li>\r\n          <li><strong>Art. 482 CPP<\/strong> \u2014 Con\u021binutul acordului (pedeapsa, probe, declara\u021bie expres\u0103, semn\u0103turi)<\/li>\r\n          <li><strong>Art. 485 alin. (1) lit. b) CPP<\/strong> \u2014 Instan\u021ba respinge acordul dac\u0103 pedeapsa e prea bl\u00e2nd\u0103 sau nejustificat\u0103<\/li>\r\n        <\/ul>\r\n      <\/div>\r\n    <\/div>\r\n  <\/details>\r\n<\/div>\r\n\r\n<style>\r\n\/* ============================================================\r\n   ZIC Calculator Limite Pedeaps\u0103 - Scoped CSS\r\n   Brand: zic.legal | Purple #8A88FF | Teal #308D98\r\n   ============================================================ *\/\r\n\r\n[data-zic-penalty-limits=\"1\"] {\r\n  --zic-primary: #8A88FF;\r\n  --zic-primary-dark: #6F6CFF;\r\n  --zic-primary-light: rgba(138, 136, 255, 0.08);\r\n  --zic-primary-glow: rgba(138, 136, 255, 0.25);\r\n\r\n  --zic-teal: #308D98;\r\n  --zic-teal-dark: #267a83;\r\n  --zic-teal-light: rgba(48, 141, 152, 0.08);\r\n\r\n  --zic-success: #10B981;\r\n  --zic-success-light: rgba(16, 185, 129, 0.1);\r\n  --zic-warning: #F59E0B;\r\n  --zic-warning-light: rgba(245, 158, 11, 0.1);\r\n  --zic-error: #EF4444;\r\n  --zic-error-light: rgba(239, 68, 68, 0.1);\r\n\r\n  --zic-ink: #1F2937;\r\n  --zic-ink-light: #374151;\r\n  --zic-muted: #6B7280;\r\n  --zic-light: #9CA3AF;\r\n\r\n  --zic-bg: #F9FAFB;\r\n  --zic-surface: #FFFFFF;\r\n  --zic-border: #E5E7EB;\r\n\r\n  --zic-shadow-sm: 0 1px 2px rgba(0,0,0,0.05);\r\n  --zic-shadow: 0 4px 6px -1px rgba(0,0,0,0.1), 0 2px 4px -1px rgba(0,0,0,0.06);\r\n  --zic-shadow-lg: 0 10px 15px -3px rgba(0,0,0,0.1), 0 4px 6px -2px rgba(0,0,0,0.05);\r\n\r\n  --zic-radius: 16px;\r\n  --zic-radius-sm: 10px;\r\n  --zic-radius-xs: 6px;\r\n\r\n  --zic-font: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Oxygen, Ubuntu, sans-serif;\r\n\r\n  font-family: var(--zic-font);\r\n  font-size: 15px;\r\n  line-height: 1.6;\r\n  color: var(--zic-ink);\r\n  background: var(--zic-bg);\r\n  padding: 24px;\r\n  border-radius: var(--zic-radius);\r\n  max-width: 900px;\r\n  margin: 0 auto;\r\n  box-sizing: border-box;\r\n}\r\n\r\n[data-zic-penalty-limits=\"1\"] *,\r\n[data-zic-penalty-limits=\"1\"] *::before,\r\n[data-zic-penalty-limits=\"1\"] *::after {\r\n  box-sizing: border-box;\r\n}\r\n\r\n\/* Override Protection for Form Controls *\/\r\n[data-zic-penalty-limits=\"1\"] input,\r\n[data-zic-penalty-limits=\"1\"] select,\r\n[data-zic-penalty-limits=\"1\"] button,\r\n[data-zic-penalty-limits=\"1\"] textarea {\r\n  font-family: inherit;\r\n  font-size: inherit;\r\n  line-height: inherit;\r\n  margin: 0;\r\n}\r\n\r\n[data-zic-penalty-limits=\"1\"] button {\r\n  cursor: pointer;\r\n  border: none;\r\n  background: none;\r\n}\r\n\r\n\/* Hidden utility *\/\r\n[data-zic-penalty-limits=\"1\"] .zic2__hidden {\r\n  display: none !important;\r\n}\r\n\r\n\/* Header *\/\r\n[data-zic-penalty-limits=\"1\"] .zic2__header {\r\n  margin-bottom: 20px;\r\n}\r\n\r\n[data-zic-penalty-limits=\"1\"] .zic2__titleRow {\r\n  display: flex;\r\n  align-items: flex-start;\r\n  gap: 16px;\r\n}\r\n\r\n[data-zic-penalty-limits=\"1\"] .zic2__icon {\r\n  flex-shrink: 0;\r\n  width: 48px;\r\n  height: 48px;\r\n  background: linear-gradient(135deg, var(--zic-primary), var(--zic-primary-dark));\r\n  border-radius: 12px;\r\n  display: flex;\r\n  align-items: center;\r\n  justify-content: center;\r\n  color: white;\r\n  box-shadow: 0 4px 12px var(--zic-primary-glow);\r\n}\r\n\r\n[data-zic-penalty-limits=\"1\"] .zic2__title {\r\n  font-size: 1.5rem;\r\n  font-weight: 700;\r\n  color: var(--zic-ink);\r\n  margin: 0 0 4px 0;\r\n  line-height: 1.3;\r\n}\r\n\r\n[data-zic-penalty-limits=\"1\"] .zic2__subtitle {\r\n  font-size: 0.9rem;\r\n  color: var(--zic-muted);\r\n  margin: 0;\r\n}\r\n\r\n\/* Disclaimer *\/\r\n[data-zic-penalty-limits=\"1\"] .zic2__disclaimer {\r\n  display: flex;\r\n  gap: 12px;\r\n  padding: 16px;\r\n  background: var(--zic-warning-light);\r\n  border: 1px solid rgba(245, 158, 11, 0.3);\r\n  border-radius: var(--zic-radius-sm);\r\n  margin-bottom: 24px;\r\n}\r\n\r\n[data-zic-penalty-limits=\"1\"] .zic2__disclaimerIcon {\r\n  flex-shrink: 0;\r\n  color: var(--zic-warning);\r\n}\r\n\r\n[data-zic-penalty-limits=\"1\"] .zic2__disclaimerText {\r\n  font-size: 0.875rem;\r\n  color: var(--zic-ink-light);\r\n  line-height: 1.5;\r\n}\r\n\r\n\/* Card *\/\r\n[data-zic-penalty-limits=\"1\"] .zic2__card {\r\n  background: var(--zic-surface);\r\n  border: 1px solid var(--zic-border);\r\n  border-radius: var(--zic-radius);\r\n  padding: 24px;\r\n  margin-bottom: 20px;\r\n  box-shadow: var(--zic-shadow-sm);\r\n}\r\n\r\n[data-zic-penalty-limits=\"1\"] .zic2__cardHeader {\r\n  margin-bottom: 20px;\r\n}\r\n\r\n[data-zic-penalty-limits=\"1\"] .zic2__cardTitle {\r\n  display: flex;\r\n  align-items: center;\r\n  gap: 10px;\r\n  font-size: 1.1rem;\r\n  font-weight: 600;\r\n  color: var(--zic-ink);\r\n  margin: 0 0 8px 0;\r\n}\r\n\r\n[data-zic-penalty-limits=\"1\"] .zic2__cardTitle svg {\r\n  color: var(--zic-primary);\r\n}\r\n\r\n[data-zic-penalty-limits=\"1\"] .zic2__cardDesc {\r\n  font-size: 0.875rem;\r\n  color: var(--zic-muted);\r\n  margin: 0;\r\n}\r\n\r\n\/* Offense Item *\/\r\n[data-zic-penalty-limits=\"1\"] .zic2__offenseItem {\r\n  background: var(--zic-bg);\r\n  border: 1px solid var(--zic-border);\r\n  border-radius: var(--zic-radius-sm);\r\n  padding: 20px;\r\n  margin-bottom: 16px;\r\n  position: relative;\r\n}\r\n\r\n[data-zic-penalty-limits=\"1\"] .zic2__offenseHeader {\r\n  display: flex;\r\n  justify-content: space-between;\r\n  align-items: center;\r\n  margin-bottom: 16px;\r\n}\r\n\r\n[data-zic-penalty-limits=\"1\"] .zic2__offenseNumber {\r\n  font-size: 0.75rem;\r\n  font-weight: 600;\r\n  color: var(--zic-primary);\r\n  text-transform: uppercase;\r\n  letter-spacing: 0.5px;\r\n}\r\n\r\n[data-zic-penalty-limits=\"1\"] .zic2__offenseRemove {\r\n  width: 28px;\r\n  height: 28px;\r\n  border-radius: 6px;\r\n  display: flex;\r\n  align-items: center;\r\n  justify-content: center;\r\n  color: var(--zic-muted);\r\n  transition: all 0.2s ease;\r\n}\r\n\r\n[data-zic-penalty-limits=\"1\"] .zic2__offenseRemove:hover {\r\n  background: var(--zic-error-light);\r\n  color: var(--zic-error);\r\n}\r\n\r\n[data-zic-penalty-limits=\"1\"] .zic2__formRow {\r\n  display: grid;\r\n  grid-template-columns: 1fr;\r\n  gap: 16px;\r\n  margin-bottom: 16px;\r\n}\r\n\r\n@media (min-width: 600px) {\r\n  [data-zic-penalty-limits=\"1\"] .zic2__formRow {\r\n    grid-template-columns: 1fr 1fr;\r\n  }\r\n\r\n  [data-zic-penalty-limits=\"1\"] .zic2__formRow--full {\r\n    grid-template-columns: 1fr;\r\n  }\r\n}\r\n\r\n[data-zic-penalty-limits=\"1\"] .zic2__formGroup {\r\n  display: flex;\r\n  flex-direction: column;\r\n  gap: 6px;\r\n}\r\n\r\n[data-zic-penalty-limits=\"1\"] .zic2__label {\r\n  font-size: 0.8rem;\r\n  font-weight: 500;\r\n  color: var(--zic-ink-light);\r\n}\r\n\r\n[data-zic-penalty-limits=\"1\"] .zic2__input {\r\n  height: 44px;\r\n  padding: 0 14px;\r\n  border: 1px solid var(--zic-border);\r\n  border-radius: var(--zic-radius-xs);\r\n  background: var(--zic-surface);\r\n  color: var(--zic-ink);\r\n  font-size: 0.95rem;\r\n  transition: border-color 0.2s ease, box-shadow 0.2s ease;\r\n  -webkit-appearance: none;\r\n  appearance: none;\r\n}\r\n\r\n[data-zic-penalty-limits=\"1\"] .zic2__input:focus {\r\n  outline: none;\r\n  border-color: var(--zic-primary);\r\n  box-shadow: 0 0 0 3px var(--zic-primary-light);\r\n}\r\n\r\n[data-zic-penalty-limits=\"1\"] .zic2__input::placeholder {\r\n  color: var(--zic-light);\r\n}\r\n\r\n[data-zic-penalty-limits=\"1\"] .zic2__input--small {\r\n  width: 70px;\r\n}\r\n\r\n[data-zic-penalty-limits=\"1\"] .zic2__inputGroup {\r\n  display: flex;\r\n  align-items: center;\r\n  gap: 6px;\r\n  flex-wrap: wrap;\r\n}\r\n\r\n[data-zic-penalty-limits=\"1\"] .zic2__inputSuffix {\r\n  font-size: 0.8rem;\r\n  color: var(--zic-muted);\r\n  white-space: nowrap;\r\n  min-width: 30px;\r\n}\r\n\r\n\/* Select *\/\r\n[data-zic-penalty-limits=\"1\"] .zic2__select {\r\n  height: 44px;\r\n  padding: 0 36px 0 14px;\r\n  border: 1px solid var(--zic-border);\r\n  border-radius: var(--zic-radius-xs);\r\n  background: var(--zic-surface) url(\"data:image\/svg+xml,%3Csvg xmlns='http:\/\/www.w3.org\/2000\/svg' width='16' height='16' viewBox='0 0 24 24' fill='none' stroke='%236B7280' stroke-width='2'%3E%3Cpath d='M6 9l6 6 6-6'\/%3E%3C\/svg%3E\") no-repeat right 12px center;\r\n  color: var(--zic-ink);\r\n  font-size: 0.95rem;\r\n  cursor: pointer;\r\n  -webkit-appearance: none;\r\n  appearance: none;\r\n  transition: border-color 0.2s ease, box-shadow 0.2s ease;\r\n}\r\n\r\n[data-zic-penalty-limits=\"1\"] .zic2__select:focus {\r\n  outline: none;\r\n  border-color: var(--zic-primary);\r\n  box-shadow: 0 0 0 3px var(--zic-primary-light);\r\n}\r\n\r\n[data-zic-penalty-limits=\"1\"] .zic2__selectGroup {\r\n  margin-top: 16px;\r\n}\r\n\r\n[data-zic-penalty-limits=\"1\"] .zic2__selectLabel {\r\n  display: flex;\r\n  flex-direction: column;\r\n  gap: 8px;\r\n  font-size: 0.875rem;\r\n  color: var(--zic-ink-light);\r\n}\r\n\r\n[data-zic-penalty-limits=\"1\"] .zic2__selectLabel .zic2__select {\r\n  width: 100%;\r\n}\r\n\r\n\/* Checkbox styling *\/\r\n[data-zic-penalty-limits=\"1\"] .zic2__checkLabel {\r\n  display: flex;\r\n  align-items: flex-start;\r\n  gap: 12px;\r\n  padding: 12px 0;\r\n  cursor: pointer;\r\n  font-size: 0.95rem;\r\n  color: var(--zic-ink-light);\r\n  border-bottom: 1px solid var(--zic-border);\r\n}\r\n\r\n[data-zic-penalty-limits=\"1\"] .zic2__checkLabel:last-child {\r\n  border-bottom: none;\r\n}\r\n\r\n[data-zic-penalty-limits=\"1\"] .zic2__checkLabel--inline {\r\n  display: inline-flex;\r\n  padding: 0;\r\n  border: none;\r\n  font-size: 0.875rem;\r\n}\r\n\r\n[data-zic-penalty-limits=\"1\"] .zic2__check {\r\n  position: absolute;\r\n  opacity: 0;\r\n  width: 0;\r\n  height: 0;\r\n}\r\n\r\n[data-zic-penalty-limits=\"1\"] .zic2__checkMark {\r\n  flex-shrink: 0;\r\n  width: 20px;\r\n  height: 20px;\r\n  border: 2px solid var(--zic-border);\r\n  border-radius: 4px;\r\n  background: var(--zic-surface);\r\n  position: relative;\r\n  transition: all 0.2s ease;\r\n}\r\n\r\n[data-zic-penalty-limits=\"1\"] .zic2__check:checked + .zic2__checkMark {\r\n  background: var(--zic-primary);\r\n  border-color: var(--zic-primary);\r\n}\r\n\r\n[data-zic-penalty-limits=\"1\"] .zic2__check:checked + .zic2__checkMark::after {\r\n  content: '';\r\n  position: absolute;\r\n  left: 6px;\r\n  top: 2px;\r\n  width: 5px;\r\n  height: 10px;\r\n  border: solid white;\r\n  border-width: 0 2px 2px 0;\r\n  transform: rotate(45deg);\r\n}\r\n\r\n[data-zic-penalty-limits=\"1\"] .zic2__check:focus + .zic2__checkMark {\r\n  box-shadow: 0 0 0 3px var(--zic-primary-light);\r\n}\r\n\r\n\/* Radio styling *\/\r\n[data-zic-penalty-limits=\"1\"] .zic2__radioGroup {\r\n  display: flex;\r\n  flex-direction: column;\r\n  gap: 12px;\r\n}\r\n\r\n[data-zic-penalty-limits=\"1\"] .zic2__radioLabel {\r\n  display: flex;\r\n  align-items: flex-start;\r\n  gap: 12px;\r\n  padding: 16px;\r\n  cursor: pointer;\r\n  border: 1px solid var(--zic-border);\r\n  border-radius: var(--zic-radius-sm);\r\n  background: var(--zic-surface);\r\n  transition: all 0.2s ease;\r\n}\r\n\r\n[data-zic-penalty-limits=\"1\"] .zic2__radioLabel:hover {\r\n  border-color: var(--zic-primary);\r\n  background: var(--zic-primary-light);\r\n}\r\n\r\n[data-zic-penalty-limits=\"1\"] .zic2__radio {\r\n  position: absolute;\r\n  opacity: 0;\r\n  width: 0;\r\n  height: 0;\r\n}\r\n\r\n[data-zic-penalty-limits=\"1\"] .zic2__radioMark {\r\n  flex-shrink: 0;\r\n  width: 20px;\r\n  height: 20px;\r\n  border: 2px solid var(--zic-border);\r\n  border-radius: 50%;\r\n  background: var(--zic-surface);\r\n  position: relative;\r\n  transition: all 0.2s ease;\r\n  margin-top: 2px;\r\n}\r\n\r\n[data-zic-penalty-limits=\"1\"] .zic2__radio:checked + .zic2__radioMark {\r\n  border-color: var(--zic-primary);\r\n}\r\n\r\n[data-zic-penalty-limits=\"1\"] .zic2__radio:checked + .zic2__radioMark::after {\r\n  content: '';\r\n  position: absolute;\r\n  left: 4px;\r\n  top: 4px;\r\n  width: 8px;\r\n  height: 8px;\r\n  background: var(--zic-primary);\r\n  border-radius: 50%;\r\n}\r\n\r\n[data-zic-penalty-limits=\"1\"] .zic2__radio:focus + .zic2__radioMark {\r\n  box-shadow: 0 0 0 3px var(--zic-primary-light);\r\n}\r\n\r\n[data-zic-penalty-limits=\"1\"] .zic2__radioText {\r\n  display: flex;\r\n  flex-direction: column;\r\n  gap: 2px;\r\n}\r\n\r\n[data-zic-penalty-limits=\"1\"] .zic2__radioText strong {\r\n  color: var(--zic-ink);\r\n  font-weight: 600;\r\n}\r\n\r\n[data-zic-penalty-limits=\"1\"] .zic2__radioText small {\r\n  color: var(--zic-muted);\r\n  font-size: 0.8rem;\r\n}\r\n\r\n\/* Alert Info *\/\r\n[data-zic-penalty-limits=\"1\"] .zic2__alertInfo {\r\n  display: flex;\r\n  align-items: flex-start;\r\n  gap: 10px;\r\n  padding: 14px 16px;\r\n  background: var(--zic-teal-light);\r\n  border: 1px solid rgba(48, 141, 152, 0.3);\r\n  border-radius: var(--zic-radius-xs);\r\n  margin-bottom: 16px;\r\n  font-size: 0.875rem;\r\n  color: var(--zic-ink-light);\r\n}\r\n\r\n[data-zic-penalty-limits=\"1\"] .zic2__alertInfo svg {\r\n  flex-shrink: 0;\r\n  color: var(--zic-teal);\r\n  margin-top: 1px;\r\n}\r\n\r\n\/* Buttons *\/\r\n[data-zic-penalty-limits=\"1\"] .zic2__actions {\r\n  display: flex;\r\n  flex-wrap: wrap;\r\n  gap: 12px;\r\n  margin-bottom: 16px;\r\n}\r\n\r\n[data-zic-penalty-limits=\"1\"] .zic2__btnPrimary {\r\n  display: inline-flex;\r\n  align-items: center;\r\n  gap: 8px;\r\n  padding: 14px 24px;\r\n  background: linear-gradient(135deg, var(--zic-primary), var(--zic-primary-dark));\r\n  color: white;\r\n  font-weight: 600;\r\n  font-size: 0.95rem;\r\n  border-radius: var(--zic-radius-sm);\r\n  box-shadow: 0 4px 12px var(--zic-primary-glow);\r\n  transition: all 0.2s ease;\r\n}\r\n\r\n[data-zic-penalty-limits=\"1\"] .zic2__btnPrimary:hover {\r\n  transform: translateY(-1px);\r\n  box-shadow: 0 6px 16px var(--zic-primary-glow);\r\n}\r\n\r\n[data-zic-penalty-limits=\"1\"] .zic2__btnPrimary:active {\r\n  transform: translateY(0);\r\n}\r\n\r\n[data-zic-penalty-limits=\"1\"] .zic2__btnSecondary {\r\n  display: inline-flex;\r\n  align-items: center;\r\n  gap: 8px;\r\n  padding: 12px 20px;\r\n  background: var(--zic-surface);\r\n  color: var(--zic-ink-light);\r\n  font-weight: 500;\r\n  font-size: 0.9rem;\r\n  border: 1px solid var(--zic-border);\r\n  border-radius: var(--zic-radius-sm);\r\n  transition: all 0.2s ease;\r\n}\r\n\r\n[data-zic-penalty-limits=\"1\"] .zic2__btnSecondary:hover {\r\n  border-color: var(--zic-primary);\r\n  color: var(--zic-primary);\r\n  background: var(--zic-primary-light);\r\n}\r\n\r\n[data-zic-penalty-limits=\"1\"] .zic2__btnTertiary {\r\n  display: inline-flex;\r\n  align-items: center;\r\n  gap: 8px;\r\n  padding: 12px 20px;\r\n  background: transparent;\r\n  color: var(--zic-muted);\r\n  font-weight: 500;\r\n  font-size: 0.9rem;\r\n  border-radius: var(--zic-radius-sm);\r\n  transition: all 0.2s ease;\r\n}\r\n\r\n[data-zic-penalty-limits=\"1\"] .zic2__btnTertiary:hover {\r\n  color: var(--zic-primary);\r\n  background: var(--zic-primary-light);\r\n}\r\n\r\n\/* Options *\/\r\n[data-zic-penalty-limits=\"1\"] .zic2__options {\r\n  margin-bottom: 24px;\r\n}\r\n\r\n\/* Results *\/\r\n[data-zic-penalty-limits=\"1\"] .zic2__results {\r\n  margin-top: 24px;\r\n}\r\n\r\n[data-zic-penalty-limits=\"1\"] .zic2__resultCard {\r\n  background: var(--zic-surface);\r\n  border: 1px solid var(--zic-border);\r\n  border-radius: var(--zic-radius);\r\n  padding: 24px;\r\n  margin-bottom: 20px;\r\n  box-shadow: var(--zic-shadow);\r\n}\r\n\r\n[data-zic-penalty-limits=\"1\"] .zic2__resultHeader {\r\n  display: flex;\r\n  align-items: center;\r\n  gap: 12px;\r\n  margin-bottom: 20px;\r\n  padding-bottom: 16px;\r\n  border-bottom: 1px solid var(--zic-border);\r\n}\r\n\r\n[data-zic-penalty-limits=\"1\"] .zic2__resultTitle {\r\n  font-size: 1.1rem;\r\n  font-weight: 600;\r\n  color: var(--zic-ink);\r\n  margin: 0;\r\n}\r\n\r\n[data-zic-penalty-limits=\"1\"] .zic2__badge {\r\n  display: inline-flex;\r\n  align-items: center;\r\n  gap: 6px;\r\n  padding: 6px 12px;\r\n  border-radius: 20px;\r\n  font-size: 0.8rem;\r\n  font-weight: 600;\r\n}\r\n\r\n[data-zic-penalty-limits=\"1\"] .zic2__badge--success {\r\n  background: var(--zic-success-light);\r\n  color: var(--zic-success);\r\n}\r\n\r\n[data-zic-penalty-limits=\"1\"] .zic2__badge--warning {\r\n  background: var(--zic-warning-light);\r\n  color: #B45309;\r\n}\r\n\r\n[data-zic-penalty-limits=\"1\"] .zic2__badge--error {\r\n  background: var(--zic-error-light);\r\n  color: var(--zic-error);\r\n}\r\n\r\n\/* Table *\/\r\n[data-zic-penalty-limits=\"1\"] .zic2__table {\r\n  width: 100%;\r\n  border-collapse: collapse;\r\n  font-size: 0.875rem;\r\n  margin-bottom: 16px;\r\n}\r\n\r\n[data-zic-penalty-limits=\"1\"] .zic2__table th,\r\n[data-zic-penalty-limits=\"1\"] .zic2__table td {\r\n  padding: 12px 14px;\r\n  text-align: left;\r\n  border-bottom: 1px solid var(--zic-border);\r\n}\r\n\r\n[data-zic-penalty-limits=\"1\"] .zic2__table th {\r\n  background: var(--zic-bg);\r\n  font-weight: 600;\r\n  color: var(--zic-ink-light);\r\n  font-size: 0.75rem;\r\n  text-transform: uppercase;\r\n  letter-spacing: 0.5px;\r\n}\r\n\r\n[data-zic-penalty-limits=\"1\"] .zic2__table td {\r\n  color: var(--zic-ink);\r\n}\r\n\r\n[data-zic-penalty-limits=\"1\"] .zic2__table tr:last-child td {\r\n  border-bottom: none;\r\n}\r\n\r\n[data-zic-penalty-limits=\"1\"] .zic2__cellHighlight {\r\n  font-weight: 600;\r\n  color: var(--zic-primary);\r\n}\r\n\r\n[data-zic-penalty-limits=\"1\"] .zic2__cellWarning {\r\n  color: var(--zic-warning);\r\n}\r\n\r\n[data-zic-penalty-limits=\"1\"] .zic2__cellError {\r\n  color: var(--zic-error);\r\n}\r\n\r\n\/* Explanation list *\/\r\n[data-zic-penalty-limits=\"1\"] .zic2__explainList {\r\n  list-style: none;\r\n  padding: 0;\r\n  margin: 16px 0 0 0;\r\n}\r\n\r\n[data-zic-penalty-limits=\"1\"] .zic2__explainItem {\r\n  display: flex;\r\n  align-items: flex-start;\r\n  gap: 10px;\r\n  padding: 10px 0;\r\n  font-size: 0.875rem;\r\n  color: var(--zic-ink-light);\r\n  border-bottom: 1px solid var(--zic-border);\r\n}\r\n\r\n[data-zic-penalty-limits=\"1\"] .zic2__explainItem:last-child {\r\n  border-bottom: none;\r\n}\r\n\r\n[data-zic-penalty-limits=\"1\"] .zic2__explainIcon {\r\n  flex-shrink: 0;\r\n  width: 20px;\r\n  height: 20px;\r\n  border-radius: 50%;\r\n  display: flex;\r\n  align-items: center;\r\n  justify-content: center;\r\n  font-size: 0.7rem;\r\n}\r\n\r\n[data-zic-penalty-limits=\"1\"] .zic2__explainIcon--info {\r\n  background: var(--zic-primary-light);\r\n  color: var(--zic-primary);\r\n}\r\n\r\n[data-zic-penalty-limits=\"1\"] .zic2__explainIcon--warning {\r\n  background: var(--zic-warning-light);\r\n  color: var(--zic-warning);\r\n}\r\n\r\n[data-zic-penalty-limits=\"1\"] .zic2__explainIcon--error {\r\n  background: var(--zic-error-light);\r\n  color: var(--zic-error);\r\n}\r\n\r\n\/* Notes box *\/\r\n[data-zic-penalty-limits=\"1\"] .zic2__notesBox {\r\n  background: var(--zic-bg);\r\n  border: 1px solid var(--zic-border);\r\n  border-radius: var(--zic-radius-xs);\r\n  padding: 16px;\r\n  margin-top: 16px;\r\n}\r\n\r\n[data-zic-penalty-limits=\"1\"] .zic2__notesTitle {\r\n  font-size: 0.85rem;\r\n  font-weight: 600;\r\n  color: var(--zic-ink);\r\n  margin: 0 0 8px 0;\r\n}\r\n\r\n[data-zic-penalty-limits=\"1\"] .zic2__notesList {\r\n  list-style: none;\r\n  padding: 0;\r\n  margin: 0;\r\n}\r\n\r\n[data-zic-penalty-limits=\"1\"] .zic2__notesList li {\r\n  font-size: 0.8rem;\r\n  color: var(--zic-muted);\r\n  padding: 4px 0;\r\n  padding-left: 16px;\r\n  position: relative;\r\n}\r\n\r\n[data-zic-penalty-limits=\"1\"] .zic2__notesList li::before {\r\n  content: '\u2022';\r\n  position: absolute;\r\n  left: 0;\r\n  color: var(--zic-light);\r\n}\r\n\r\n\/* Error container *\/\r\n[data-zic-penalty-limits=\"1\"] .zic2__errorContainer {\r\n  padding: 16px;\r\n  background: var(--zic-error-light);\r\n  border: 1px solid rgba(239, 68, 68, 0.3);\r\n  border-radius: var(--zic-radius-sm);\r\n  margin-top: 16px;\r\n}\r\n\r\n[data-zic-penalty-limits=\"1\"] .zic2__errorTitle {\r\n  display: flex;\r\n  align-items: center;\r\n  gap: 8px;\r\n  font-weight: 600;\r\n  color: var(--zic-error);\r\n  margin: 0 0 8px 0;\r\n  font-size: 0.95rem;\r\n}\r\n\r\n[data-zic-penalty-limits=\"1\"] .zic2__errorList {\r\n  list-style: none;\r\n  padding: 0;\r\n  margin: 0;\r\n}\r\n\r\n[data-zic-penalty-limits=\"1\"] .zic2__errorList li {\r\n  font-size: 0.875rem;\r\n  color: var(--zic-ink-light);\r\n  padding: 4px 0;\r\n}\r\n\r\n\/* Details\/Summary *\/\r\n[data-zic-penalty-limits=\"1\"] .zic2__details {\r\n  margin-top: 24px;\r\n  border: 1px solid var(--zic-border);\r\n  border-radius: var(--zic-radius-sm);\r\n  background: var(--zic-surface);\r\n}\r\n\r\n[data-zic-penalty-limits=\"1\"] .zic2__summary {\r\n  display: flex;\r\n  align-items: center;\r\n  gap: 10px;\r\n  padding: 16px 20px;\r\n  cursor: pointer;\r\n  font-weight: 500;\r\n  color: var(--zic-ink-light);\r\n  list-style: none;\r\n  transition: all 0.2s ease;\r\n}\r\n\r\n[data-zic-penalty-limits=\"1\"] .zic2__summary::-webkit-details-marker {\r\n  display: none;\r\n}\r\n\r\n[data-zic-penalty-limits=\"1\"] .zic2__summary::after {\r\n  content: '';\r\n  margin-left: auto;\r\n  width: 0;\r\n  height: 0;\r\n  border-left: 5px solid transparent;\r\n  border-right: 5px solid transparent;\r\n  border-top: 5px solid var(--zic-muted);\r\n  transition: transform 0.2s ease;\r\n}\r\n\r\n[data-zic-penalty-limits=\"1\"] .zic2__details[open] .zic2__summary::after {\r\n  transform: rotate(180deg);\r\n}\r\n\r\n[data-zic-penalty-limits=\"1\"] .zic2__summary:hover {\r\n  background: var(--zic-bg);\r\n}\r\n\r\n[data-zic-penalty-limits=\"1\"] .zic2__summary svg {\r\n  color: var(--zic-primary);\r\n}\r\n\r\n[data-zic-penalty-limits=\"1\"] .zic2__detailsContent {\r\n  padding: 0 20px 20px;\r\n}\r\n\r\n[data-zic-penalty-limits=\"1\"] .zic2__legalSection {\r\n  margin-bottom: 20px;\r\n}\r\n\r\n[data-zic-penalty-limits=\"1\"] .zic2__legalSection:last-child {\r\n  margin-bottom: 0;\r\n}\r\n\r\n[data-zic-penalty-limits=\"1\"] .zic2__legalSection h4 {\r\n  font-size: 0.95rem;\r\n  font-weight: 600;\r\n  color: var(--zic-ink);\r\n  margin: 0 0 12px 0;\r\n}\r\n\r\n[data-zic-penalty-limits=\"1\"] .zic2__legalSection ul {\r\n  list-style: none;\r\n  padding: 0;\r\n  margin: 0;\r\n}\r\n\r\n[data-zic-penalty-limits=\"1\"] .zic2__legalSection li {\r\n  font-size: 0.85rem;\r\n  color: var(--zic-muted);\r\n  padding: 6px 0;\r\n  padding-left: 16px;\r\n  position: relative;\r\n}\r\n\r\n[data-zic-penalty-limits=\"1\"] .zic2__legalSection li::before {\r\n  content: '\u2014';\r\n  position: absolute;\r\n  left: 0;\r\n  color: var(--zic-primary);\r\n}\r\n\r\n[data-zic-penalty-limits=\"1\"] .zic2__legalSection li strong {\r\n  color: var(--zic-ink-light);\r\n}\r\n\r\n\/* Responsive table wrapper *\/\r\n[data-zic-penalty-limits=\"1\"] .zic2__tableWrapper {\r\n  overflow-x: auto;\r\n  -webkit-overflow-scrolling: touch;\r\n}\r\n\r\n@media (max-width: 600px) {\r\n  [data-zic-penalty-limits=\"1\"] {\r\n    padding: 16px;\r\n  }\r\n\r\n  [data-zic-penalty-limits=\"1\"] .zic2__card {\r\n    padding: 16px;\r\n  }\r\n\r\n  [data-zic-penalty-limits=\"1\"] .zic2__actions {\r\n    flex-direction: column;\r\n  }\r\n\r\n  [data-zic-penalty-limits=\"1\"] .zic2__btnPrimary,\r\n  [data-zic-penalty-limits=\"1\"] .zic2__btnSecondary,\r\n  [data-zic-penalty-limits=\"1\"] .zic2__btnTertiary {\r\n    width: 100%;\r\n    justify-content: center;\r\n  }\r\n\r\n  [data-zic-penalty-limits=\"1\"] .zic2__table {\r\n    font-size: 0.8rem;\r\n  }\r\n\r\n  [data-zic-penalty-limits=\"1\"] .zic2__table th,\r\n  [data-zic-penalty-limits=\"1\"] .zic2__table td {\r\n    padding: 10px 8px;\r\n  }\r\n}\r\n<\/style>\r\n\r\n<script>\r\n(function() {\r\n  'use strict';\r\n\r\n  \/\/ Constants\r\n  var MAX_OFFENSES = 50;\r\n  var MAX_MONTHS = 10000;\r\n  var MAX_FINE_UNITS = 100000;\r\n  var MAX_TEXT_LENGTH = 200;\r\n  var PRISON_REDUCTION_FACTOR = 2 \/ 3;\r\n  var FINE_REDUCTION_FACTOR = 3 \/ 4;\r\n  var ACORD_MAX_PRISON_MONTHS = 15 * 12; \/\/ 15 years in months\r\n\r\n  \/\/ Initialize all instances\r\n  var roots = document.querySelectorAll('[data-zic-penalty-limits=\"1\"]');\r\n\r\n  roots.forEach(function(root) {\r\n    initCalculator(root);\r\n  });\r\n\r\n  function initCalculator(root) {\r\n    \/\/ State\r\n    var state = {\r\n      offenses: [],\r\n      procedureType: 'abreviata',\r\n      conditionsAbreviata: {\r\n        recunoasteIntegral: false,\r\n        solicitareInainte: false,\r\n        nuSolicitaProbe: false,\r\n        minorIncuviintare: true, \/\/ defaults to true (not applicable unless minor)\r\n        scenariuAbreviata: 'NECLAR'\r\n      },\r\n      conditionsAcord: {\r\n        actiunePenala: false,\r\n        probeSuficiente: false,\r\n        asistentaJuridica: false,\r\n        avizProcuror: false,\r\n        acordSemnat: false\r\n      },\r\n      showRounding: true\r\n    };\r\n\r\n    \/\/ DOM References\r\n    var offensesList = root.querySelector('[data-offenses-list]');\r\n    var conditionsAbreviata = root.querySelector('[data-conditions-abreviata]');\r\n    var conditionsAcord = root.querySelector('[data-conditions-acord]');\r\n    var resultsContainer = root.querySelector('[data-results-container]');\r\n    var errorContainer = root.querySelector('[data-error-container]');\r\n\r\n    \/\/ Initialize with one empty offense\r\n    addOffense();\r\n\r\n    \/\/ Event listeners\r\n    root.querySelector('[data-action=\"add-offense\"]').addEventListener('click', function() {\r\n      addOffense();\r\n    });\r\n\r\n    root.querySelector('[data-action=\"calculate\"]').addEventListener('click', function() {\r\n      calculate();\r\n    });\r\n\r\n    root.querySelector('[data-action=\"reset\"]').addEventListener('click', function() {\r\n      resetAll();\r\n    });\r\n\r\n    root.querySelector('[data-action=\"example\"]').addEventListener('click', function() {\r\n      loadExample();\r\n    });\r\n\r\n    \/\/ Procedure type change\r\n    var procedureRadios = root.querySelectorAll('[data-procedure-type]');\r\n    procedureRadios.forEach(function(radio) {\r\n      radio.addEventListener('change', function() {\r\n        state.procedureType = this.value;\r\n        updateConditionsVisibility();\r\n      });\r\n    });\r\n\r\n    \/\/ Conditions checkboxes\r\n    root.querySelectorAll('[data-condition]').forEach(function(input) {\r\n      input.addEventListener('change', function() {\r\n        var conditionName = this.getAttribute('data-condition');\r\n        if (this.type === 'checkbox') {\r\n          if (state.conditionsAbreviata.hasOwnProperty(conditionName)) {\r\n            state.conditionsAbreviata[conditionName] = this.checked;\r\n          } else if (state.conditionsAcord.hasOwnProperty(conditionName)) {\r\n            state.conditionsAcord[conditionName] = this.checked;\r\n          }\r\n        } else if (this.tagName === 'SELECT') {\r\n          state.conditionsAbreviata[conditionName] = this.value;\r\n        }\r\n      });\r\n    });\r\n\r\n    \/\/ Show rounding option\r\n    root.querySelector('[data-option=\"showRounding\"]').addEventListener('change', function() {\r\n      state.showRounding = this.checked;\r\n    });\r\n\r\n    \/\/ Functions\r\n    function sanitizeNumber(value, min, max) {\r\n      var num = parseFloat(value);\r\n      if (isNaN(num) || num < min) return min;\r\n      if (num > max) return max;\r\n      return num;\r\n    }\r\n\r\n    function sanitizeText(text, maxLength) {\r\n      if (typeof text !== 'string') return '';\r\n      \/\/ Only truncate - textContent handles escaping automatically\r\n      return text.substring(0, maxLength);\r\n    }\r\n\r\n    function createElement(tag, className, textContent) {\r\n      var el = document.createElement(tag);\r\n      if (className) el.className = className;\r\n      if (textContent !== undefined) el.textContent = textContent;\r\n      return el;\r\n    }\r\n\r\n    function generateOffenseId() {\r\n      return 'offense_' + Date.now() + '_' + Math.random().toString(36).substr(2, 9);\r\n    }\r\n\r\n    function addOffense(data) {\r\n      if (state.offenses.length >= MAX_OFFENSES) {\r\n        showError(['Num\u0103r maxim de infrac\u021biuni atins (' + MAX_OFFENSES + ')']);\r\n        return;\r\n      }\r\n\r\n      var offense = {\r\n        id: generateOffenseId(),\r\n        label: data ? sanitizeText(data.label, MAX_TEXT_LENGTH) : '',\r\n        hasLifeImprisonment: data ? !!data.hasLifeImprisonment : false,\r\n        prisonMinYears: data ? sanitizeNumber(data.prisonMinYears, 0, 100) : 0,\r\n        prisonMinMonths: data ? sanitizeNumber(data.prisonMinMonths, 0, 11) : 0,\r\n        prisonMaxYears: data ? sanitizeNumber(data.prisonMaxYears, 0, 100) : 0,\r\n        prisonMaxMonths: data ? sanitizeNumber(data.prisonMaxMonths, 0, 11) : 0,\r\n        fineMinUnits: data ? sanitizeNumber(data.fineMinUnits, 0, MAX_FINE_UNITS) : 0,\r\n        fineMaxUnits: data ? sanitizeNumber(data.fineMaxUnits, 0, MAX_FINE_UNITS) : 0,\r\n        fineUnit: data ? data.fineUnit || 'ZILE_AMENDA' : 'ZILE_AMENDA',\r\n        notes: data ? sanitizeText(data.notes, MAX_TEXT_LENGTH) : ''\r\n      };\r\n\r\n      state.offenses.push(offense);\r\n      renderOffenses();\r\n    }\r\n\r\n    function removeOffense(id) {\r\n      state.offenses = state.offenses.filter(function(o) { return o.id !== id; });\r\n      if (state.offenses.length === 0) {\r\n        addOffense();\r\n      } else {\r\n        renderOffenses();\r\n      }\r\n    }\r\n\r\n    function updateOffense(id, field, value) {\r\n      var offense = state.offenses.find(function(o) { return o.id === id; });\r\n      if (!offense) return;\r\n\r\n      if (field === 'label' || field === 'notes') {\r\n        offense[field] = sanitizeText(value, MAX_TEXT_LENGTH);\r\n      } else if (field === 'hasLifeImprisonment') {\r\n        offense[field] = !!value;\r\n      } else if (field === 'fineUnit') {\r\n        offense[field] = value;\r\n      } else if (field === 'prisonMinYears' || field === 'prisonMaxYears') {\r\n        offense[field] = sanitizeNumber(value, 0, 100);\r\n      } else if (field === 'prisonMinMonths' || field === 'prisonMaxMonths') {\r\n        offense[field] = sanitizeNumber(value, 0, 11);\r\n      } else {\r\n        var max = field.includes('fine') ? MAX_FINE_UNITS : MAX_MONTHS;\r\n        offense[field] = sanitizeNumber(value, 0, max);\r\n      }\r\n    }\r\n\r\n    function renderOffenses() {\r\n      \/\/ Clear container\r\n      while (offensesList.firstChild) {\r\n        offensesList.removeChild(offensesList.firstChild);\r\n      }\r\n\r\n      state.offenses.forEach(function(offense, index) {\r\n        var item = createElement('div', 'zic2__offenseItem');\r\n        item.setAttribute('data-offense-id', offense.id);\r\n\r\n        \/\/ Header\r\n        var header = createElement('div', 'zic2__offenseHeader');\r\n        var numberSpan = createElement('span', 'zic2__offenseNumber', 'Infrac\u021biunea ' + (index + 1));\r\n        header.appendChild(numberSpan);\r\n\r\n        var removeBtn = createElement('button', 'zic2__offenseRemove');\r\n        removeBtn.type = 'button';\r\n        removeBtn.setAttribute('aria-label', '\u0218terge infrac\u021biunea');\r\n        \/\/ Create SVG using DOM methods for security\r\n        var removeSvg = document.createElementNS('http:\/\/www.w3.org\/2000\/svg', 'svg');\r\n        removeSvg.setAttribute('width', '18');\r\n        removeSvg.setAttribute('height', '18');\r\n        removeSvg.setAttribute('viewBox', '0 0 24 24');\r\n        removeSvg.setAttribute('fill', 'none');\r\n        removeSvg.setAttribute('stroke', 'currentColor');\r\n        removeSvg.setAttribute('stroke-width', '2');\r\n        var line1 = document.createElementNS('http:\/\/www.w3.org\/2000\/svg', 'line');\r\n        line1.setAttribute('x1', '18');\r\n        line1.setAttribute('y1', '6');\r\n        line1.setAttribute('x2', '6');\r\n        line1.setAttribute('y2', '18');\r\n        var line2 = document.createElementNS('http:\/\/www.w3.org\/2000\/svg', 'line');\r\n        line2.setAttribute('x1', '6');\r\n        line2.setAttribute('y1', '6');\r\n        line2.setAttribute('x2', '18');\r\n        line2.setAttribute('y2', '18');\r\n        removeSvg.appendChild(line1);\r\n        removeSvg.appendChild(line2);\r\n        removeBtn.appendChild(removeSvg);\r\n        removeBtn.addEventListener('click', function() {\r\n          removeOffense(offense.id);\r\n        });\r\n        header.appendChild(removeBtn);\r\n        item.appendChild(header);\r\n\r\n        \/\/ Label row\r\n        var labelRow = createElement('div', 'zic2__formRow zic2__formRow--full');\r\n        var labelGroup = createElement('div', 'zic2__formGroup');\r\n        var labelLabel = createElement('label', 'zic2__label', 'Denumirea infrac\u021biunii');\r\n        var labelInput = createElement('input', 'zic2__input');\r\n        labelInput.type = 'text';\r\n        labelInput.placeholder = 'ex. Furt calificat';\r\n        labelInput.value = offense.label;\r\n        labelInput.maxLength = MAX_TEXT_LENGTH;\r\n        labelInput.addEventListener('input', function() {\r\n          updateOffense(offense.id, 'label', this.value);\r\n        });\r\n        labelGroup.appendChild(labelLabel);\r\n        labelGroup.appendChild(labelInput);\r\n        labelRow.appendChild(labelGroup);\r\n        item.appendChild(labelRow);\r\n\r\n        \/\/ Life imprisonment checkbox\r\n        var lifeRow = createElement('div', 'zic2__formRow zic2__formRow--full');\r\n        var lifeLabel = createElement('label', 'zic2__checkLabel zic2__checkLabel--inline');\r\n        var lifeCheck = createElement('input', 'zic2__check');\r\n        lifeCheck.type = 'checkbox';\r\n        lifeCheck.checked = offense.hasLifeImprisonment;\r\n        lifeCheck.addEventListener('change', function() {\r\n          updateOffense(offense.id, 'hasLifeImprisonment', this.checked);\r\n        });\r\n        var lifeMark = createElement('span', 'zic2__checkMark');\r\n        var lifeText = createElement('span', '', 'Infrac\u021biunea se pedepse\u0219te alternativ cu deten\u021biune pe via\u021b\u0103');\r\n        lifeLabel.appendChild(lifeCheck);\r\n        lifeLabel.appendChild(lifeMark);\r\n        lifeLabel.appendChild(lifeText);\r\n        lifeRow.appendChild(lifeLabel);\r\n        item.appendChild(lifeRow);\r\n\r\n        \/\/ Prison limits\r\n        var prisonRow = createElement('div', 'zic2__formRow');\r\n\r\n        var prisonMinGroup = createElement('div', 'zic2__formGroup');\r\n        var prisonMinLabel = createElement('label', 'zic2__label', '\u00cenchisoare MIN');\r\n        var prisonMinInputGroup = createElement('div', 'zic2__inputGroup');\r\n        var prisonMinYearsInput = createElement('input', 'zic2__input zic2__input--small');\r\n        prisonMinYearsInput.type = 'number';\r\n        prisonMinYearsInput.min = '0';\r\n        prisonMinYearsInput.max = '100';\r\n        prisonMinYearsInput.placeholder = '0';\r\n        prisonMinYearsInput.value = offense.prisonMinYears || '';\r\n        prisonMinYearsInput.addEventListener('input', function() {\r\n          updateOffense(offense.id, 'prisonMinYears', this.value);\r\n        });\r\n        var prisonMinYearsSuffix = createElement('span', 'zic2__inputSuffix', 'ani');\r\n        var prisonMinMonthsInput = createElement('input', 'zic2__input zic2__input--small');\r\n        prisonMinMonthsInput.type = 'number';\r\n        prisonMinMonthsInput.min = '0';\r\n        prisonMinMonthsInput.max = '11';\r\n        prisonMinMonthsInput.placeholder = '0';\r\n        prisonMinMonthsInput.value = offense.prisonMinMonths || '';\r\n        prisonMinMonthsInput.addEventListener('input', function() {\r\n          updateOffense(offense.id, 'prisonMinMonths', this.value);\r\n        });\r\n        var prisonMinMonthsSuffix = createElement('span', 'zic2__inputSuffix', 'luni');\r\n        prisonMinInputGroup.appendChild(prisonMinYearsInput);\r\n        prisonMinInputGroup.appendChild(prisonMinYearsSuffix);\r\n        prisonMinInputGroup.appendChild(prisonMinMonthsInput);\r\n        prisonMinInputGroup.appendChild(prisonMinMonthsSuffix);\r\n        prisonMinGroup.appendChild(prisonMinLabel);\r\n        prisonMinGroup.appendChild(prisonMinInputGroup);\r\n        prisonRow.appendChild(prisonMinGroup);\r\n\r\n        var prisonMaxGroup = createElement('div', 'zic2__formGroup');\r\n        var prisonMaxLabel = createElement('label', 'zic2__label', '\u00cenchisoare MAX');\r\n        var prisonMaxInputGroup = createElement('div', 'zic2__inputGroup');\r\n        var prisonMaxYearsInput = createElement('input', 'zic2__input zic2__input--small');\r\n        prisonMaxYearsInput.type = 'number';\r\n        prisonMaxYearsInput.min = '0';\r\n        prisonMaxYearsInput.max = '100';\r\n        prisonMaxYearsInput.placeholder = '0';\r\n        prisonMaxYearsInput.value = offense.prisonMaxYears || '';\r\n        prisonMaxYearsInput.addEventListener('input', function() {\r\n          updateOffense(offense.id, 'prisonMaxYears', this.value);\r\n        });\r\n        var prisonMaxYearsSuffix = createElement('span', 'zic2__inputSuffix', 'ani');\r\n        var prisonMaxMonthsInput = createElement('input', 'zic2__input zic2__input--small');\r\n        prisonMaxMonthsInput.type = 'number';\r\n        prisonMaxMonthsInput.min = '0';\r\n        prisonMaxMonthsInput.max = '11';\r\n        prisonMaxMonthsInput.placeholder = '0';\r\n        prisonMaxMonthsInput.value = offense.prisonMaxMonths || '';\r\n        prisonMaxMonthsInput.addEventListener('input', function() {\r\n          updateOffense(offense.id, 'prisonMaxMonths', this.value);\r\n        });\r\n        var prisonMaxMonthsSuffix = createElement('span', 'zic2__inputSuffix', 'luni');\r\n        prisonMaxInputGroup.appendChild(prisonMaxYearsInput);\r\n        prisonMaxInputGroup.appendChild(prisonMaxYearsSuffix);\r\n        prisonMaxInputGroup.appendChild(prisonMaxMonthsInput);\r\n        prisonMaxInputGroup.appendChild(prisonMaxMonthsSuffix);\r\n        prisonMaxGroup.appendChild(prisonMaxLabel);\r\n        prisonMaxGroup.appendChild(prisonMaxInputGroup);\r\n        prisonRow.appendChild(prisonMaxGroup);\r\n\r\n        item.appendChild(prisonRow);\r\n\r\n        \/\/ Fine limits\r\n        var fineRow = createElement('div', 'zic2__formRow');\r\n\r\n        var fineMinGroup = createElement('div', 'zic2__formGroup');\r\n        var fineMinLabel = createElement('label', 'zic2__label', 'Amend\u0103 MIN');\r\n        var fineMinInputGroup = createElement('div', 'zic2__inputGroup');\r\n        var fineMinInput = createElement('input', 'zic2__input zic2__input--small');\r\n        fineMinInput.type = 'number';\r\n        fineMinInput.min = '0';\r\n        fineMinInput.max = MAX_FINE_UNITS.toString();\r\n        fineMinInput.placeholder = '0';\r\n        fineMinInput.value = offense.fineMinUnits || '';\r\n        fineMinInput.addEventListener('input', function() {\r\n          updateOffense(offense.id, 'fineMinUnits', this.value);\r\n        });\r\n        var fineMinSuffix = createElement('span', 'zic2__inputSuffix', 'unit\u0103\u021bi');\r\n        fineMinInputGroup.appendChild(fineMinInput);\r\n        fineMinInputGroup.appendChild(fineMinSuffix);\r\n        fineMinGroup.appendChild(fineMinLabel);\r\n        fineMinGroup.appendChild(fineMinInputGroup);\r\n        fineRow.appendChild(fineMinGroup);\r\n\r\n        var fineMaxGroup = createElement('div', 'zic2__formGroup');\r\n        var fineMaxLabel = createElement('label', 'zic2__label', 'Amend\u0103 MAX');\r\n        var fineMaxInputGroup = createElement('div', 'zic2__inputGroup');\r\n        var fineMaxInput = createElement('input', 'zic2__input zic2__input--small');\r\n        fineMaxInput.type = 'number';\r\n        fineMaxInput.min = '0';\r\n        fineMaxInput.max = MAX_FINE_UNITS.toString();\r\n        fineMaxInput.placeholder = '0';\r\n        fineMaxInput.value = offense.fineMaxUnits || '';\r\n        fineMaxInput.addEventListener('input', function() {\r\n          updateOffense(offense.id, 'fineMaxUnits', this.value);\r\n        });\r\n        var fineMaxSuffix = createElement('span', 'zic2__inputSuffix', 'unit\u0103\u021bi');\r\n        fineMaxInputGroup.appendChild(fineMaxInput);\r\n        fineMaxInputGroup.appendChild(fineMaxSuffix);\r\n        fineMaxGroup.appendChild(fineMaxLabel);\r\n        fineMaxGroup.appendChild(fineMaxInputGroup);\r\n        fineRow.appendChild(fineMaxGroup);\r\n\r\n        item.appendChild(fineRow);\r\n\r\n        \/\/ Fine unit select\r\n        var unitRow = createElement('div', 'zic2__formRow');\r\n        var unitGroup = createElement('div', 'zic2__formGroup');\r\n        var unitLabel = createElement('label', 'zic2__label', 'Unitate amend\u0103');\r\n        var unitSelect = createElement('select', 'zic2__select');\r\n        var unitOptions = [\r\n          { value: 'ZILE_AMENDA', label: 'Zile-amend\u0103' },\r\n          { value: 'LEI', label: 'Lei' },\r\n          { value: 'ALT', label: 'Alt\u0103 unitate' }\r\n        ];\r\n        unitOptions.forEach(function(opt) {\r\n          var option = createElement('option', '', opt.label);\r\n          option.value = opt.value;\r\n          if (opt.value === offense.fineUnit) option.selected = true;\r\n          unitSelect.appendChild(option);\r\n        });\r\n        unitSelect.addEventListener('change', function() {\r\n          updateOffense(offense.id, 'fineUnit', this.value);\r\n        });\r\n        unitGroup.appendChild(unitLabel);\r\n        unitGroup.appendChild(unitSelect);\r\n        unitRow.appendChild(unitGroup);\r\n        item.appendChild(unitRow);\r\n\r\n        offensesList.appendChild(item);\r\n      });\r\n    }\r\n\r\n    function updateConditionsVisibility() {\r\n      var showAbreviata = state.procedureType === 'abreviata' || state.procedureType === 'ambele';\r\n      var showAcord = state.procedureType === 'acord' || state.procedureType === 'ambele';\r\n\r\n      if (showAbreviata) {\r\n        conditionsAbreviata.classList.remove('zic2__hidden');\r\n      } else {\r\n        conditionsAbreviata.classList.add('zic2__hidden');\r\n      }\r\n\r\n      if (showAcord) {\r\n        conditionsAcord.classList.remove('zic2__hidden');\r\n      } else {\r\n        conditionsAcord.classList.add('zic2__hidden');\r\n      }\r\n    }\r\n\r\n    \/\/ Core calculation functions\r\n\r\n    \/\/ Helper: convert years + months to total months\r\n    function toTotalMonths(years, months) {\r\n      return (years || 0) * 12 + (months || 0);\r\n    }\r\n\r\n    \/\/ Helper: get total months for min\/max prison from offense\r\n    function getPrisonMinTotalMonths(offense) {\r\n      return toTotalMonths(offense.prisonMinYears, offense.prisonMinMonths);\r\n    }\r\n\r\n    function getPrisonMaxTotalMonths(offense) {\r\n      return toTotalMonths(offense.prisonMaxYears, offense.prisonMaxMonths);\r\n    }\r\n\r\n    function reduceRange(min, max, factor) {\r\n      var exactMin = min * factor;\r\n      var exactMax = max * factor;\r\n      return {\r\n        exactMin: exactMin,\r\n        exactMax: exactMax,\r\n        roundedMin: Math.ceil(exactMin),\r\n        roundedMax: Math.floor(exactMax)\r\n      };\r\n    }\r\n\r\n    function monthsToYMD(monthsFloat, showFraction) {\r\n      var totalMonths = Math.round(monthsFloat);\r\n      var years = Math.floor(totalMonths \/ 12);\r\n      var months = totalMonths % 12;\r\n\r\n      var parts = [];\r\n      if (years > 0) parts.push(years + (years === 1 ? ' an' : ' ani'));\r\n      if (months > 0) parts.push(months + (months === 1 ? ' lun\u0103' : ' luni'));\r\n\r\n      if (parts.length === 0) return '0 luni';\r\n\r\n      var result = parts.join(' ');\r\n      \/\/ Show exact fraction if requested and there's a non-integer part\r\n      if (showFraction && Math.abs(monthsFloat - totalMonths) > 0.001) {\r\n        var exactYears = Math.floor(monthsFloat \/ 12);\r\n        var exactMonths = monthsFloat - exactYears * 12;\r\n        var exactParts = [];\r\n        if (exactYears > 0) exactParts.push(exactYears + (exactYears === 1 ? ' an' : ' ani'));\r\n        if (exactMonths > 0.001) exactParts.push(formatNumber(exactMonths, 2) + ' luni');\r\n        if (exactParts.length === 0) return '0 luni';\r\n        return exactParts.join(' \u0219i ');\r\n      }\r\n      return result;\r\n    }\r\n\r\n    \/\/ Format months with exact fractional display\r\n    function monthsToYMDExact(monthsFloat) {\r\n      var years = Math.floor(monthsFloat \/ 12);\r\n      var months = monthsFloat - years * 12;\r\n\r\n      var parts = [];\r\n      if (years > 0) parts.push(years + (years === 1 ? ' an' : ' ani'));\r\n\r\n      \/\/ Show fractional months with 2 decimals if not a whole number\r\n      if (months > 0.001) {\r\n        if (Number.isInteger(months)) {\r\n          parts.push(months + (months === 1 ? ' lun\u0103' : ' luni'));\r\n        } else {\r\n          parts.push(formatNumber(months, 2) + ' luni');\r\n        }\r\n      }\r\n\r\n      if (parts.length === 0) return '0 luni';\r\n      return parts.join(' \u0219i ');\r\n    }\r\n\r\n    function formatNumber(num, decimals) {\r\n      if (Number.isInteger(num)) return num.toString();\r\n      return num.toFixed(decimals);\r\n    }\r\n\r\n    function validateOffense(offense) {\r\n      var warnings = [];\r\n\r\n      var prisonMin = getPrisonMinTotalMonths(offense);\r\n      var prisonMax = getPrisonMaxTotalMonths(offense);\r\n\r\n      if (prisonMin > prisonMax && prisonMax > 0) {\r\n        warnings.push('Limita minim\u0103 a \u00eenchisorii este mai mare dec\u00e2t limita maxim\u0103');\r\n      }\r\n\r\n      if (offense.fineMinUnits > offense.fineMaxUnits && offense.fineMaxUnits > 0) {\r\n        warnings.push('Limita minim\u0103 a amenzii este mai mare dec\u00e2t limita maxim\u0103');\r\n      }\r\n\r\n      if (prisonMax === 0 && offense.fineMaxUnits === 0 && !offense.hasLifeImprisonment) {\r\n        warnings.push('Nu au fost introduse limite de pedeaps\u0103');\r\n      }\r\n\r\n      return warnings;\r\n    }\r\n\r\n    function checkEligibilityAbreviata(offenses) {\r\n      var result = {\r\n        eligible: 'OK',\r\n        reasons: [],\r\n        warnings: []\r\n      };\r\n\r\n      \/\/ Check for life imprisonment\r\n      var hasLife = offenses.some(function(o) { return o.hasLifeImprisonment; });\r\n      if (hasLife) {\r\n        result.eligible = 'NU';\r\n        result.reasons.push('Exist\u0103 cel pu\u021bin o infrac\u021biune pedepsit\u0103 cu deten\u021biune pe via\u021b\u0103 (art. 374 alin. 4 CPP)');\r\n      }\r\n\r\n      \/\/ Check procedural conditions\r\n      if (!state.conditionsAbreviata.recunoasteIntegral) {\r\n        result.warnings.push('Inculpatul nu a recunoscut integral faptele');\r\n      }\r\n      if (!state.conditionsAbreviata.solicitareInainte) {\r\n        result.warnings.push('Solicitarea nu a fost formulat\u0103 \u00eenainte de cercetarea judec\u0103toreasc\u0103');\r\n      }\r\n      if (!state.conditionsAbreviata.nuSolicitaProbe) {\r\n        result.warnings.push('Se solicit\u0103 administrarea de probe noi');\r\n      }\r\n      if (!state.conditionsAbreviata.minorIncuviintare) {\r\n        result.warnings.push('Pentru inculpatul minor lipse\u0219te \u00eencuviin\u021barea reprezentantului legal (art. 375 alin. 2 CPP)');\r\n      }\r\n\r\n      \/\/ Check scenario\r\n      var scenario = state.conditionsAbreviata.scenariuAbreviata;\r\n      if (scenario === 'NECLAR') {\r\n        if (result.eligible !== 'NU') result.eligible = 'NECLAR';\r\n        result.warnings.push('Nu a fost selectat scenariul aplic\u0103rii reducerii');\r\n      } else if (scenario === 'RESPINSA_DAR_SITUATIE_IDENTICA') {\r\n        result.warnings.push('Cererea a fost respins\u0103, dar situa\u021bia de fapt este identic\u0103 - reducerea poate opera (art. 396 alin. 10 CPP)');\r\n      } else if (scenario === 'CERCETARE_377_5_SAU_395_2') {\r\n        result.warnings.push('Cercetare reluat\u0103 conform art. 377 alin. 5 sau art. 395 alin. 2 - reducerea poate opera dac\u0103 faptele sunt identice');\r\n      }\r\n\r\n      return result;\r\n    }\r\n\r\n    function checkEligibilityAcord(offenses) {\r\n      var result = {\r\n        eligible: 'OK',\r\n        reasons: [],\r\n        warnings: [],\r\n        eligibleOffenses: [],\r\n        ineligibleOffenses: []\r\n      };\r\n\r\n      offenses.forEach(function(offense) {\r\n        var isEligible = true;\r\n        var offenseReasons = [];\r\n\r\n        if (offense.hasLifeImprisonment) {\r\n          isEligible = false;\r\n          offenseReasons.push('Pedepsit\u0103 cu deten\u021biune pe via\u021b\u0103');\r\n        }\r\n\r\n        var prisonMax = getPrisonMaxTotalMonths(offense);\r\n        if (prisonMax > ACORD_MAX_PRISON_MONTHS) {\r\n          isEligible = false;\r\n          offenseReasons.push('Dep\u0103\u0219e\u0219te pragul de 15 ani (art. 480 alin. 1 CPP)');\r\n        }\r\n\r\n        if (isEligible) {\r\n          result.eligibleOffenses.push(offense);\r\n        } else {\r\n          result.ineligibleOffenses.push({\r\n            offense: offense,\r\n            reasons: offenseReasons\r\n          });\r\n        }\r\n      });\r\n\r\n      if (result.eligibleOffenses.length === 0) {\r\n        result.eligible = 'NU';\r\n        result.reasons.push('Nicio infrac\u021biune nu \u00eendepline\u0219te condi\u021biile pentru acord');\r\n      } else if (result.ineligibleOffenses.length > 0) {\r\n        result.warnings.push('Unele infrac\u021biuni nu pot face obiectul acordului');\r\n      }\r\n\r\n      \/\/ Check procedural conditions\r\n      if (!state.conditionsAcord.actiunePenala) {\r\n        if (result.eligible !== 'NU') result.eligible = 'NECLAR';\r\n        result.warnings.push('Ac\u021biunea penal\u0103 nu a fost pus\u0103 \u00een mi\u0219care');\r\n      }\r\n      if (!state.conditionsAcord.probeSuficiente) {\r\n        result.warnings.push('Nu exist\u0103 probe suficiente cu privire la vinov\u0103\u021bie');\r\n      }\r\n      if (!state.conditionsAcord.asistentaJuridica) {\r\n        result.eligible = 'NU';\r\n        result.reasons.push('Nu este asigurat\u0103 asisten\u021ba juridic\u0103 obligatorie (art. 480 alin. 2 CPP)');\r\n      }\r\n      if (!state.conditionsAcord.avizProcuror) {\r\n        result.warnings.push('Nu exist\u0103 avizul procurorului ierarhic superior');\r\n      }\r\n      if (!state.conditionsAcord.acordSemnat) {\r\n        result.warnings.push('Acordul nu este \u00eencheiat \u00een form\u0103 scris\u0103 \u0219i semnat');\r\n      }\r\n\r\n      return result;\r\n    }\r\n\r\n    function calculate() {\r\n      hideError();\r\n      resultsContainer.classList.add('zic2__hidden');\r\n\r\n      \/\/ Validate offenses\r\n      var allErrors = [];\r\n      state.offenses.forEach(function(offense, index) {\r\n        var warnings = validateOffense(offense);\r\n        warnings.forEach(function(w) {\r\n          allErrors.push('Infrac\u021biunea ' + (index + 1) + ': ' + w);\r\n        });\r\n      });\r\n\r\n      if (allErrors.length > 0) {\r\n        showError(allErrors);\r\n        return;\r\n      }\r\n\r\n      \/\/ Clear results\r\n      while (resultsContainer.firstChild) {\r\n        resultsContainer.removeChild(resultsContainer.firstChild);\r\n      }\r\n\r\n      var procedures = [];\r\n      if (state.procedureType === 'abreviata' || state.procedureType === 'ambele') {\r\n        procedures.push('abreviata');\r\n      }\r\n      if (state.procedureType === 'acord' || state.procedureType === 'ambele') {\r\n        procedures.push('acord');\r\n      }\r\n\r\n      procedures.forEach(function(proc) {\r\n        var resultCard = renderProcedureResult(proc);\r\n        resultsContainer.appendChild(resultCard);\r\n      });\r\n\r\n      resultsContainer.classList.remove('zic2__hidden');\r\n      resultsContainer.scrollIntoView({ behavior: 'smooth', block: 'start' });\r\n    }\r\n\r\n    function renderProcedureResult(procedureType) {\r\n      var card = createElement('div', 'zic2__resultCard');\r\n\r\n      var header = createElement('div', 'zic2__resultHeader');\r\n      var title = createElement('h3', 'zic2__resultTitle');\r\n      title.textContent = procedureType === 'abreviata'\r\n        ? 'Procedur\u0103 abreviat\u0103 (art. 396 alin. 10 CPP)'\r\n        : 'Acord de recunoa\u0219tere (art. 480 alin. 4 CPP)';\r\n\r\n      var eligibility = procedureType === 'abreviata'\r\n        ? checkEligibilityAbreviata(state.offenses)\r\n        : checkEligibilityAcord(state.offenses);\r\n\r\n      var badge = createElement('span', 'zic2__badge');\r\n      if (eligibility.eligible === 'OK') {\r\n        badge.classList.add('zic2__badge--success');\r\n        badge.textContent = 'ELIGIBIL';\r\n      } else if (eligibility.eligible === 'NECLAR') {\r\n        badge.classList.add('zic2__badge--warning');\r\n        badge.textContent = 'NECLAR';\r\n      } else {\r\n        badge.classList.add('zic2__badge--error');\r\n        badge.textContent = 'NEELIGIBIL';\r\n      }\r\n\r\n      header.appendChild(title);\r\n      header.appendChild(badge);\r\n      card.appendChild(header);\r\n\r\n      \/\/ Explain list\r\n      if (eligibility.reasons.length > 0 || eligibility.warnings.length > 0) {\r\n        var explainList = createElement('ul', 'zic2__explainList');\r\n\r\n        eligibility.reasons.forEach(function(reason) {\r\n          var item = createElement('li', 'zic2__explainItem');\r\n          var icon = createElement('span', 'zic2__explainIcon zic2__explainIcon--error', '!');\r\n          var text = createElement('span', '', reason);\r\n          item.appendChild(icon);\r\n          item.appendChild(text);\r\n          explainList.appendChild(item);\r\n        });\r\n\r\n        eligibility.warnings.forEach(function(warning) {\r\n          var item = createElement('li', 'zic2__explainItem');\r\n          var icon = createElement('span', 'zic2__explainIcon zic2__explainIcon--warning', '!');\r\n          var text = createElement('span', '', warning);\r\n          item.appendChild(icon);\r\n          item.appendChild(text);\r\n          explainList.appendChild(item);\r\n        });\r\n\r\n        card.appendChild(explainList);\r\n      }\r\n\r\n      \/\/ Table with results\r\n      var offensesToShow = procedureType === 'acord' && eligibility.eligibleOffenses\r\n        ? eligibility.eligibleOffenses\r\n        : state.offenses;\r\n\r\n      if (offensesToShow.length > 0) {\r\n        var tableWrapper = createElement('div', 'zic2__tableWrapper');\r\n        var table = createElement('table', 'zic2__table');\r\n\r\n        var thead = createElement('thead');\r\n        var headerRow = createElement('tr');\r\n        var headers = ['Infrac\u021biune', 'Limite ini\u021biale', 'Limite reduse'];\r\n        if (state.showRounding) headers.push('Interval sigur (\u00eentregi)');\r\n\r\n        headers.forEach(function(h) {\r\n          var th = createElement('th', '', h);\r\n          headerRow.appendChild(th);\r\n        });\r\n        thead.appendChild(headerRow);\r\n        table.appendChild(thead);\r\n\r\n        var tbody = createElement('tbody');\r\n\r\n        offensesToShow.forEach(function(offense, index) {\r\n          var row = createElement('tr');\r\n\r\n          \/\/ Offense name\r\n          var nameCell = createElement('td');\r\n          nameCell.textContent = offense.label || ('Infrac\u021biunea ' + (index + 1));\r\n          row.appendChild(nameCell);\r\n\r\n          \/\/ Get total months for calculations\r\n          var prisonMin = getPrisonMinTotalMonths(offense);\r\n          var prisonMax = getPrisonMaxTotalMonths(offense);\r\n\r\n          \/\/ Initial limits\r\n          var initialCell = createElement('td');\r\n          var initialText = [];\r\n          if (prisonMax > 0) {\r\n            initialText.push('\u00cenchisoare: ' + monthsToYMD(prisonMin) + ' \u2014 ' + monthsToYMD(prisonMax));\r\n          }\r\n          if (offense.fineMaxUnits > 0) {\r\n            var unit = offense.fineUnit === 'ZILE_AMENDA' ? 'zile-amend\u0103' : (offense.fineUnit === 'LEI' ? 'lei' : 'unit\u0103\u021bi');\r\n            initialText.push('Amend\u0103: ' + offense.fineMinUnits + ' \u2014 ' + offense.fineMaxUnits + ' ' + unit);\r\n          }\r\n          if (offense.hasLifeImprisonment) {\r\n            initialText.push('(sau deten\u021biune pe via\u021b\u0103)');\r\n          }\r\n          initialCell.textContent = initialText.join('\\n') || '-';\r\n          initialCell.style.whiteSpace = 'pre-line';\r\n          row.appendChild(initialCell);\r\n\r\n          \/\/ Reduced limits\r\n          var reducedCell = createElement('td', 'zic2__cellHighlight');\r\n          var reducedText = [];\r\n\r\n          if (prisonMax > 0) {\r\n            var prisonReduced = reduceRange(prisonMin, prisonMax, PRISON_REDUCTION_FACTOR);\r\n            reducedText.push('\u00cenchisoare: ' + monthsToYMDExact(prisonReduced.exactMin) + ' \u2014 ' + monthsToYMDExact(prisonReduced.exactMax));\r\n          }\r\n          if (offense.fineMaxUnits > 0) {\r\n            var fineReduced = reduceRange(offense.fineMinUnits, offense.fineMaxUnits, FINE_REDUCTION_FACTOR);\r\n            var unit = offense.fineUnit === 'ZILE_AMENDA' ? 'zile-amend\u0103' : (offense.fineUnit === 'LEI' ? 'lei' : 'unit\u0103\u021bi');\r\n            reducedText.push('Amend\u0103: ' + formatNumber(fineReduced.exactMin, 2) + ' \u2014 ' + formatNumber(fineReduced.exactMax, 2) + ' ' + unit);\r\n          }\r\n          reducedCell.textContent = reducedText.join('\\n') || '-';\r\n          reducedCell.style.whiteSpace = 'pre-line';\r\n          row.appendChild(reducedCell);\r\n\r\n          \/\/ Rounded limits\r\n          if (state.showRounding) {\r\n            var roundedCell = createElement('td');\r\n            var roundedText = [];\r\n            var hasWarning = false;\r\n\r\n            if (prisonMax > 0) {\r\n              var prisonReduced = reduceRange(prisonMin, prisonMax, PRISON_REDUCTION_FACTOR);\r\n              if (prisonReduced.roundedMin > prisonReduced.roundedMax) {\r\n                roundedText.push('\u00cenchisoare: verifica\u021bi limitele');\r\n                hasWarning = true;\r\n              } else {\r\n                roundedText.push('\u00cenchisoare: ' + monthsToYMD(prisonReduced.roundedMin) + ' \u2014 ' + monthsToYMD(prisonReduced.roundedMax));\r\n              }\r\n            }\r\n            if (offense.fineMaxUnits > 0) {\r\n              var fineReduced = reduceRange(offense.fineMinUnits, offense.fineMaxUnits, FINE_REDUCTION_FACTOR);\r\n              var unit = offense.fineUnit === 'ZILE_AMENDA' ? 'zile-amend\u0103' : (offense.fineUnit === 'LEI' ? 'lei' : 'unit\u0103\u021bi');\r\n              if (fineReduced.roundedMin > fineReduced.roundedMax) {\r\n                roundedText.push('Amend\u0103: verifica\u021bi limitele');\r\n                hasWarning = true;\r\n              } else {\r\n                roundedText.push('Amend\u0103: ' + fineReduced.roundedMin + ' \u2014 ' + fineReduced.roundedMax + ' ' + unit);\r\n              }\r\n            }\r\n\r\n            roundedCell.textContent = roundedText.join('\\n') || '-';\r\n            roundedCell.style.whiteSpace = 'pre-line';\r\n            if (hasWarning) roundedCell.classList.add('zic2__cellWarning');\r\n            row.appendChild(roundedCell);\r\n          }\r\n\r\n          tbody.appendChild(row);\r\n        });\r\n\r\n        table.appendChild(tbody);\r\n        tableWrapper.appendChild(table);\r\n        card.appendChild(tableWrapper);\r\n      }\r\n\r\n      \/\/ Ineligible offenses for acord\r\n      if (procedureType === 'acord' && eligibility.ineligibleOffenses && eligibility.ineligibleOffenses.length > 0) {\r\n        var ineligibleBox = createElement('div', 'zic2__notesBox');\r\n        var ineligibleTitle = createElement('h4', 'zic2__notesTitle', 'Infrac\u021biuni neeligibile pentru acord:');\r\n        ineligibleBox.appendChild(ineligibleTitle);\r\n\r\n        var ineligibleList = createElement('ul', 'zic2__notesList');\r\n        eligibility.ineligibleOffenses.forEach(function(item) {\r\n          var li = createElement('li');\r\n          li.textContent = (item.offense.label || 'Infrac\u021biune') + ': ' + item.reasons.join(', ');\r\n          ineligibleList.appendChild(li);\r\n        });\r\n        ineligibleBox.appendChild(ineligibleList);\r\n        card.appendChild(ineligibleBox);\r\n      }\r\n\r\n      \/\/ Important notes\r\n      var notesBox = createElement('div', 'zic2__notesBox');\r\n      var notesTitle = createElement('h4', 'zic2__notesTitle', 'Note importante:');\r\n      notesBox.appendChild(notesTitle);\r\n\r\n      var notesList = createElement('ul', 'zic2__notesList');\r\n      var notes = [\r\n        'Limitele reduse sunt calculate matematic. Pedeapsa concret\u0103 depinde de individualizare.',\r\n        '\u00cen caz de concurs de infrac\u021biuni, recidiv\u0103 sau pluralitate, regulile de stabilire a pedepsei rezultante se aplic\u0103 separat.',\r\n        'Verifica\u021bi \u00eentotdeauna \u00eencadrarea juridic\u0103, legea aplicabil\u0103 \u0219i actele din dosar.',\r\n        'Acest instrument are caracter informativ \u0219i nu \u00eenlocuie\u0219te consultan\u021ba juridic\u0103.'\r\n      ];\r\n\r\n      if (procedureType === 'abreviata') {\r\n        notes.push('Reducerea se aplic\u0103 indiferent de solu\u021bia la care se opre\u0219te instan\u021ba (condamnare, renun\u021bare la aplicarea pedepsei, am\u00e2narea aplic\u0103rii pedepsei), cu excep\u021bia achit\u0103rii (art. 396 alin. 10 CPP).');\r\n      } else {\r\n        notes.push('Acordul poate privi doar unele infrac\u021biuni din dosar. Pentru celelalte, se dispune trimiterea \u00een judecat\u0103 separat\u0103.');\r\n      }\r\n\r\n      notes.forEach(function(note) {\r\n        var li = createElement('li', '', note);\r\n        notesList.appendChild(li);\r\n      });\r\n      notesBox.appendChild(notesList);\r\n      card.appendChild(notesBox);\r\n\r\n      return card;\r\n    }\r\n\r\n    function showError(errors) {\r\n      while (errorContainer.firstChild) {\r\n        errorContainer.removeChild(errorContainer.firstChild);\r\n      }\r\n\r\n      var title = createElement('h4', 'zic2__errorTitle');\r\n      \/\/ Create SVG using DOM methods for security\r\n      var errorSvg = document.createElementNS('http:\/\/www.w3.org\/2000\/svg', 'svg');\r\n      errorSvg.setAttribute('width', '18');\r\n      errorSvg.setAttribute('height', '18');\r\n      errorSvg.setAttribute('viewBox', '0 0 24 24');\r\n      errorSvg.setAttribute('fill', 'none');\r\n      errorSvg.setAttribute('stroke', 'currentColor');\r\n      errorSvg.setAttribute('stroke-width', '2');\r\n      var circle = document.createElementNS('http:\/\/www.w3.org\/2000\/svg', 'circle');\r\n      circle.setAttribute('cx', '12');\r\n      circle.setAttribute('cy', '12');\r\n      circle.setAttribute('r', '10');\r\n      var errLine1 = document.createElementNS('http:\/\/www.w3.org\/2000\/svg', 'line');\r\n      errLine1.setAttribute('x1', '12');\r\n      errLine1.setAttribute('y1', '8');\r\n      errLine1.setAttribute('x2', '12');\r\n      errLine1.setAttribute('y2', '12');\r\n      var errLine2 = document.createElementNS('http:\/\/www.w3.org\/2000\/svg', 'line');\r\n      errLine2.setAttribute('x1', '12');\r\n      errLine2.setAttribute('y1', '16');\r\n      errLine2.setAttribute('x2', '12.01');\r\n      errLine2.setAttribute('y2', '16');\r\n      errorSvg.appendChild(circle);\r\n      errorSvg.appendChild(errLine1);\r\n      errorSvg.appendChild(errLine2);\r\n      title.appendChild(errorSvg);\r\n      var titleText = document.createTextNode(' Erori de validare');\r\n      title.appendChild(titleText);\r\n      errorContainer.appendChild(title);\r\n\r\n      var list = createElement('ul', 'zic2__errorList');\r\n      errors.forEach(function(err) {\r\n        var li = createElement('li', '', err);\r\n        list.appendChild(li);\r\n      });\r\n      errorContainer.appendChild(list);\r\n\r\n      errorContainer.classList.remove('zic2__hidden');\r\n    }\r\n\r\n    function hideError() {\r\n      errorContainer.classList.add('zic2__hidden');\r\n    }\r\n\r\n    function resetAll() {\r\n      \/\/ Reset state\r\n      state.offenses = [];\r\n      state.procedureType = 'abreviata';\r\n      state.conditionsAbreviata = {\r\n        recunoasteIntegral: false,\r\n        solicitareInainte: false,\r\n        nuSolicitaProbe: false,\r\n        minorIncuviintare: true,\r\n        scenariuAbreviata: 'NECLAR'\r\n      };\r\n      state.conditionsAcord = {\r\n        actiunePenala: false,\r\n        probeSuficiente: false,\r\n        asistentaJuridica: false,\r\n        avizProcuror: false,\r\n        acordSemnat: false\r\n      };\r\n\r\n      \/\/ Reset UI\r\n      root.querySelectorAll('input[type=\"checkbox\"]').forEach(function(cb) {\r\n        if (cb.getAttribute('data-option') === 'showRounding') {\r\n          cb.checked = true;\r\n        } else {\r\n          cb.checked = false;\r\n        }\r\n      });\r\n\r\n      root.querySelectorAll('input[type=\"radio\"]').forEach(function(radio) {\r\n        radio.checked = radio.value === 'abreviata';\r\n      });\r\n\r\n      root.querySelectorAll('select[data-condition]').forEach(function(select) {\r\n        select.value = 'NECLAR';\r\n      });\r\n\r\n      updateConditionsVisibility();\r\n      hideError();\r\n      resultsContainer.classList.add('zic2__hidden');\r\n\r\n      addOffense();\r\n    }\r\n\r\n    function loadExample() {\r\n      state.offenses = [];\r\n\r\n      addOffense({\r\n        label: 'Furt calificat (art. 229 alin. 1 lit. b CP)',\r\n        hasLifeImprisonment: false,\r\n        prisonMinYears: 2,\r\n        prisonMinMonths: 0,\r\n        prisonMaxYears: 7,\r\n        prisonMaxMonths: 0,\r\n        fineMinUnits: 0,\r\n        fineMaxUnits: 0,\r\n        fineUnit: 'ZILE_AMENDA'\r\n      });\r\n\r\n      addOffense({\r\n        label: 'Conducere f\u0103r\u0103 permis (art. 335 alin. 1 CP)',\r\n        hasLifeImprisonment: false,\r\n        prisonMinYears: 1,\r\n        prisonMinMonths: 0,\r\n        prisonMaxYears: 5,\r\n        prisonMaxMonths: 0,\r\n        fineMinUnits: 0,\r\n        fineMaxUnits: 0,\r\n        fineUnit: 'ZILE_AMENDA'\r\n      });\r\n\r\n      \/\/ Set some conditions\r\n      state.conditionsAbreviata.recunoasteIntegral = true;\r\n      state.conditionsAbreviata.solicitareInainte = true;\r\n      state.conditionsAbreviata.nuSolicitaProbe = true;\r\n      state.conditionsAbreviata.minorIncuviintare = true;\r\n      state.conditionsAbreviata.scenariuAbreviata = 'ADMISA_375';\r\n\r\n      state.conditionsAcord.actiunePenala = true;\r\n      state.conditionsAcord.probeSuficiente = true;\r\n      state.conditionsAcord.asistentaJuridica = true;\r\n      state.conditionsAcord.avizProcuror = true;\r\n      state.conditionsAcord.acordSemnat = true;\r\n\r\n      \/\/ Update UI\r\n      root.querySelectorAll('[data-condition]').forEach(function(input) {\r\n        var conditionName = input.getAttribute('data-condition');\r\n        if (input.type === 'checkbox') {\r\n          if (state.conditionsAbreviata.hasOwnProperty(conditionName)) {\r\n            input.checked = state.conditionsAbreviata[conditionName];\r\n          } else if (state.conditionsAcord.hasOwnProperty(conditionName)) {\r\n            input.checked = state.conditionsAcord[conditionName];\r\n          }\r\n        } else if (input.tagName === 'SELECT') {\r\n          input.value = state.conditionsAbreviata[conditionName];\r\n        }\r\n      });\r\n\r\n      \/\/ Set procedure to compare both\r\n      state.procedureType = 'ambele';\r\n      root.querySelectorAll('[data-procedure-type]').forEach(function(radio) {\r\n        radio.checked = radio.value === 'ambele';\r\n      });\r\n\r\n      updateConditionsVisibility();\r\n      hideError();\r\n      resultsContainer.classList.add('zic2__hidden');\r\n    }\r\n  }\r\n})();\r\n<\/script>\r\n<\/div>\n<div data-tool-content=\"reabilitare\" style=\"display:none\"><div id=\"zic-reabilitare-calculator-v2\" class=\"zic2\" data-zic2=\"1\">\r\n  <div class=\"zic2__wrap\">\r\n    <!-- Header -->\r\n    <header class=\"zic2__hero\">\r\n      <div class=\"zic2__brandbar\">\r\n        <div class=\"zic2__mark\" aria-hidden=\"true\">\r\n          <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n            <path d=\"M12 2l7 4v6c0 5-3 9-7 10-4-1-7-5-7-10V6l7-4Z\"\/>\r\n            <path d=\"M9 12l2 2 4-4\"\/>\r\n          <\/svg>\r\n        <\/div>\r\n        <div class=\"zic2__headerText\">\r\n          <h2 class=\"zic2__title\">Calculator reabilitare<\/h2>\r\n          <p class=\"zic2__subtitle\">Reabilitare de drept \u0219i judec\u0103toreasc\u0103 (art. 165-171 Cod penal)<\/p>\r\n        <\/div>\r\n      <\/div>\r\n    <\/header>\r\n\r\n    <!-- Info box -->\r\n    <div class=\"zic2__formula\">\r\n      <div class=\"zic2__formulaIcon\">\r\n        <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n          <circle cx=\"12\" cy=\"12\" r=\"10\"\/>\r\n          <path d=\"M12 16v-4\"\/>\r\n          <path d=\"M12 8h.01\"\/>\r\n        <\/svg>\r\n      <\/div>\r\n      <div class=\"zic2__formulaText\">\r\n        <strong>Reabilitarea<\/strong> \u0219terge condamnarea din cazierul judiciar. Poate fi <em>de drept<\/em> (automat\u0103, dup\u0103 3 ani) sau <em>judec\u0103toreasc\u0103<\/em> (la cerere, dup\u0103 4-10 ani).\r\n      <\/div>\r\n    <\/div>\r\n\r\n    <!-- Error Box -->\r\n    <div class=\"zic2__error is-hidden\" role=\"alert\" aria-live=\"polite\" data-errors><\/div>\r\n\r\n    <!-- Card 1: Tipul pedepsei -->\r\n    <section class=\"zic2__card\" aria-labelledby=\"zic2-sec-pedeapsa\">\r\n      <div class=\"zic2__cardHeader\">\r\n        <div class=\"zic2__cardIcon zic2__cardIcon--purple\">\r\n          <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n            <path d=\"M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z\"\/>\r\n            <polyline points=\"14 2 14 8 20 8\"\/>\r\n            <line x1=\"16\" y1=\"13\" x2=\"8\" y2=\"13\"\/>\r\n            <line x1=\"16\" y1=\"17\" x2=\"8\" y2=\"17\"\/>\r\n          <\/svg>\r\n        <\/div>\r\n        <h3 id=\"zic2-sec-pedeapsa\" class=\"zic2__cardTitle\">1. Datele condamn\u0103rii<\/h3>\r\n      <\/div>\r\n\r\n      <div class=\"zic2__field\" style=\"margin-bottom: 16px;\">\r\n        <label class=\"zic2__label\" for=\"zic2-tip-pedeapsa\">Tipul pedepsei<\/label>\r\n        <select id=\"zic2-tip-pedeapsa\" class=\"zic2__select\" data-field=\"tipPedeapsa\">\r\n          <option value=\"\">Selecta\u021bi...<\/option>\r\n          <option value=\"amenda\">Amend\u0103 penal\u0103<\/option>\r\n          <option value=\"inchisoare\">\u00cenchisoare<\/option>\r\n          <option value=\"suspendare\">\u00cenchisoare cu suspendare sub supraveghere<\/option>\r\n          <option value=\"detentiune\">Deten\u021biune pe via\u021b\u0103<\/option>\r\n        <\/select>\r\n      <\/div>\r\n\r\n      <div class=\"zic2__grid2\" style=\"margin-bottom: 16px;\">\r\n        <div class=\"zic2__field\">\r\n          <label class=\"zic2__label\" for=\"zic2-data-definitiv\">Data r\u0103m\u00e2nerii definitive a hot\u0103r\u00e2rii<\/label>\r\n          <input id=\"zic2-data-definitiv\" class=\"zic2__input\" type=\"date\" data-field=\"dataDefinitiv\">\r\n        <\/div>\r\n        <div class=\"zic2__field\" data-show-for=\"inchisoare,suspendare\" style=\"display:none;\">\r\n          <label class=\"zic2__label\">Durata pedepsei<\/label>\r\n          <div class=\"zic2__inputGroup zic2__inputGroup--3cols\">\r\n            <div class=\"zic2__field\">\r\n              <label class=\"zic2__label\" for=\"zic2-durata-ani\">Ani<\/label>\r\n              <input id=\"zic2-durata-ani\" class=\"zic2__input\" type=\"number\" min=\"0\" max=\"99\" inputmode=\"numeric\" placeholder=\"0\" autocomplete=\"off\" data-field=\"durataAni\">\r\n            <\/div>\r\n            <div class=\"zic2__field\">\r\n              <label class=\"zic2__label\" for=\"zic2-durata-luni\">Luni<\/label>\r\n              <input id=\"zic2-durata-luni\" class=\"zic2__input\" type=\"number\" min=\"0\" max=\"11\" inputmode=\"numeric\" placeholder=\"0\" autocomplete=\"off\" data-field=\"durataLuni\">\r\n            <\/div>\r\n            <div class=\"zic2__field\">\r\n              <label class=\"zic2__label\" for=\"zic2-durata-zile\">Zile<\/label>\r\n              <input id=\"zic2-durata-zile\" class=\"zic2__input\" type=\"number\" min=\"0\" max=\"29\" inputmode=\"numeric\" placeholder=\"0\" autocomplete=\"off\" data-field=\"durataZile\">\r\n            <\/div>\r\n          <\/div>\r\n        <\/div>\r\n      <\/div>\r\n\r\n      <!-- Sec\u021biune amend\u0103 -->\r\n      <div class=\"zic2__conditionalSection\" data-show-for=\"amenda\" style=\"display:none;\">\r\n        <div class=\"zic2__field\">\r\n          <label class=\"zic2__label\" for=\"zic2-data-amenda\">Data achit\u0103rii integrale a amenzii<\/label>\r\n          <input id=\"zic2-data-amenda\" class=\"zic2__input\" type=\"date\" data-field=\"dataAmenda\">\r\n          <span class=\"zic2__fieldHint\">Termenul de reabilitare curge de la aceast\u0103 dat\u0103<\/span>\r\n        <\/div>\r\n      <\/div>\r\n\r\n      <!-- Sec\u021biune suspendare -->\r\n      <div class=\"zic2__conditionalSection\" data-show-for=\"suspendare\" style=\"display:none;\">\r\n        <div class=\"zic2__field\">\r\n          <label class=\"zic2__label\" for=\"zic2-data-supraveghere\">Data \u00eemplinirii termenului de supraveghere<\/label>\r\n          <input id=\"zic2-data-supraveghere\" class=\"zic2__input\" type=\"date\" data-field=\"dataSupraveghere\">\r\n          <span class=\"zic2__fieldHint\">Termenul de reabilitare curge de la aceast\u0103 dat\u0103<\/span>\r\n        <\/div>\r\n      <\/div>\r\n\r\n      <!-- Sec\u021biune \u00eenchisoare (nu deten\u021biune) -->\r\n      <div class=\"zic2__conditionalSection\" data-show-for=\"inchisoare\" style=\"display:none;\">\r\n        <div class=\"zic2__hint\" style=\"margin-bottom: 16px;\">\r\n          <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><circle cx=\"12\" cy=\"12\" r=\"10\"\/><path d=\"M9.09 9a3 3 0 0 1 5.83 1c0 2-3 3-3 3\"\/><path d=\"M12 17h.01\"\/><\/svg>\r\n          <span>Selecta\u021bi modalitatea de stingere a pedepsei.<\/span>\r\n        <\/div>\r\n\r\n        <!-- Executare integral\u0103 -->\r\n        <div class=\"zic2__toggleField\">\r\n          <div class=\"zic2__field\">\r\n            <label class=\"zic2__label\" for=\"zic2-are-executare\">Pedeapsa a fost executat\u0103 integral?<\/label>\r\n            <select id=\"zic2-are-executare\" class=\"zic2__select\" data-field=\"areExecutare\" data-toggle-target=\"executare\">\r\n              <option value=\"\">Selecta\u021bi...<\/option>\r\n              <option value=\"da\">Da<\/option>\r\n              <option value=\"nu\">Nu<\/option>\r\n            <\/select>\r\n          <\/div>\r\n          <div class=\"zic2__field zic2__conditionalDate\" data-toggle-show=\"executare\" style=\"display:none;\">\r\n            <label class=\"zic2__label\" for=\"zic2-data-executare\">Data liber\u0103rii din penitenciar<\/label>\r\n            <input id=\"zic2-data-executare\" class=\"zic2__input\" type=\"date\" data-field=\"dataExecutare\">\r\n          <\/div>\r\n        <\/div>\r\n\r\n        <!-- Liberare condi\u021bionat\u0103 -->\r\n        <div class=\"zic2__toggleField\" style=\"margin-top: 12px;\">\r\n          <div class=\"zic2__field\">\r\n            <label class=\"zic2__label\" for=\"zic2-are-liberare\">A beneficiat de liberare condi\u021bionat\u0103?<\/label>\r\n            <select id=\"zic2-are-liberare\" class=\"zic2__select\" data-field=\"areLiberare\" data-toggle-target=\"liberare\">\r\n              <option value=\"\">Selecta\u021bi...<\/option>\r\n              <option value=\"da\">Da<\/option>\r\n              <option value=\"nu\">Nu<\/option>\r\n            <\/select>\r\n          <\/div>\r\n          <div class=\"zic2__field zic2__conditionalDate\" data-toggle-show=\"liberare\" style=\"display:none;\">\r\n            <label class=\"zic2__label\" for=\"zic2-data-liberare\">Data expir\u0103rii termenului de supraveghere<\/label>\r\n            <input id=\"zic2-data-liberare\" class=\"zic2__input\" type=\"date\" data-field=\"dataLiberare\">\r\n          <\/div>\r\n        <\/div>\r\n\r\n        <!-- Prescrip\u021bie -->\r\n        <div class=\"zic2__toggleField\" style=\"margin-top: 12px;\">\r\n          <div class=\"zic2__field\">\r\n            <label class=\"zic2__label\" for=\"zic2-are-prescriptie\">A intervenit prescrip\u021bia execut\u0103rii?<\/label>\r\n            <select id=\"zic2-are-prescriptie\" class=\"zic2__select\" data-field=\"arePrescriptie\" data-toggle-target=\"prescriptie\">\r\n              <option value=\"\">Selecta\u021bi...<\/option>\r\n              <option value=\"da\">Da<\/option>\r\n              <option value=\"nu\">Nu<\/option>\r\n            <\/select>\r\n          <\/div>\r\n          <div class=\"zic2__field zic2__conditionalDate\" data-toggle-show=\"prescriptie\" style=\"display:none;\">\r\n            <label class=\"zic2__label\" for=\"zic2-data-prescriptie\">Data \u00eemplinirii prescrip\u021biei<\/label>\r\n            <input id=\"zic2-data-prescriptie\" class=\"zic2__input\" type=\"date\" data-field=\"dataPrescriptie\">\r\n          <\/div>\r\n        <\/div>\r\n\r\n        <!-- Gra\u021biere -->\r\n        <div class=\"zic2__toggleField\" style=\"margin-top: 12px;\">\r\n          <div class=\"zic2__field\">\r\n            <label class=\"zic2__label\" for=\"zic2-are-gratiere\">A intervenit gra\u021bierea?<\/label>\r\n            <select id=\"zic2-are-gratiere\" class=\"zic2__select\" data-field=\"areGratiere\" data-toggle-target=\"gratiere\">\r\n              <option value=\"\">Selecta\u021bi...<\/option>\r\n              <option value=\"da\">Da<\/option>\r\n              <option value=\"nu\">Nu<\/option>\r\n            <\/select>\r\n          <\/div>\r\n          <div class=\"zic2__conditionalDate\" data-toggle-show=\"gratiere\" style=\"display:none;\">\r\n            <div class=\"zic2__field\">\r\n              <label class=\"zic2__label\" for=\"zic2-data-gratiere\">Data gra\u021bierii<\/label>\r\n              <input id=\"zic2-data-gratiere\" class=\"zic2__input\" type=\"date\" data-field=\"dataGratiere\">\r\n            <\/div>\r\n            <div class=\"zic2__field\" style=\"margin-top: 8px;\">\r\n              <label class=\"zic2__label\" for=\"zic2-gratiere-curs\">Gra\u021bierea s-a aplicat cauzelor \u00een curs de judecat\u0103?<\/label>\r\n              <select id=\"zic2-gratiere-curs\" class=\"zic2__select\" data-field=\"gratiereCurs\">\r\n                <option value=\"\">Selecta\u021bi...<\/option>\r\n                <option value=\"da\">Da<\/option>\r\n                <option value=\"nu\">Nu<\/option>\r\n              <\/select>\r\n            <\/div>\r\n          <\/div>\r\n        <\/div>\r\n      <\/div>\r\n\r\n      <!-- Sec\u021biune deten\u021biune pe via\u021b\u0103 (op\u021biuni specifice) -->\r\n      <div class=\"zic2__conditionalSection\" data-show-for=\"detentiune\" style=\"display:none;\">\r\n        <div class=\"zic2__hint\" style=\"margin-bottom: 16px;\">\r\n          <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><circle cx=\"12\" cy=\"12\" r=\"10\"\/><path d=\"M9.09 9a3 3 0 0 1 5.83 1c0 2-3 3-3 3\"\/><path d=\"M12 17h.01\"\/><\/svg>\r\n          <span>Selecta\u021bi modalitatea prin care a \u00eencetat deten\u021biunea pe via\u021b\u0103.<\/span>\r\n        <\/div>\r\n\r\n        <!-- Comutare\/\u00cenlocuire -->\r\n        <div class=\"zic2__toggleField\">\r\n          <div class=\"zic2__field\">\r\n            <label class=\"zic2__label\" for=\"zic2-are-comutare\">Deten\u021biunea a fost comutat\u0103 sau \u00eenlocuit\u0103 cu \u00eenchisoare?<\/label>\r\n            <select id=\"zic2-are-comutare\" class=\"zic2__select\" data-field=\"areComutare\" data-toggle-target=\"comutare\">\r\n              <option value=\"\">Selecta\u021bi...<\/option>\r\n              <option value=\"da\">Da<\/option>\r\n              <option value=\"nu\">Nu<\/option>\r\n            <\/select>\r\n          <\/div>\r\n          <div class=\"zic2__field zic2__conditionalDate\" data-toggle-show=\"comutare\" style=\"display:none;\">\r\n            <label class=\"zic2__label\" for=\"zic2-data-comutare\">Data execut\u0103rii pedepsei rezultate din comutare<\/label>\r\n            <input id=\"zic2-data-comutare\" class=\"zic2__input\" type=\"date\" data-field=\"dataComutare\">\r\n          <\/div>\r\n        <\/div>\r\n\r\n        <!-- Gra\u021biere total\u0103 -->\r\n        <div class=\"zic2__toggleField\" style=\"margin-top: 12px;\">\r\n          <div class=\"zic2__field\">\r\n            <label class=\"zic2__label\" for=\"zic2-are-gratiere-det\">A intervenit gra\u021bierea total\u0103?<\/label>\r\n            <select id=\"zic2-are-gratiere-det\" class=\"zic2__select\" data-field=\"areGratiereDet\" data-toggle-target=\"gratiere-det\">\r\n              <option value=\"\">Selecta\u021bi...<\/option>\r\n              <option value=\"da\">Da<\/option>\r\n              <option value=\"nu\">Nu<\/option>\r\n            <\/select>\r\n          <\/div>\r\n          <div class=\"zic2__field zic2__conditionalDate\" data-toggle-show=\"gratiere-det\" style=\"display:none;\">\r\n            <label class=\"zic2__label\" for=\"zic2-data-gratiere-det\">Data gra\u021bierii<\/label>\r\n            <input id=\"zic2-data-gratiere-det\" class=\"zic2__input\" type=\"date\" data-field=\"dataGratiereDet\">\r\n          <\/div>\r\n        <\/div>\r\n\r\n        <!-- Prescrip\u021bie -->\r\n        <div class=\"zic2__toggleField\" style=\"margin-top: 12px;\">\r\n          <div class=\"zic2__field\">\r\n            <label class=\"zic2__label\" for=\"zic2-are-prescriptie-det\">A intervenit prescrip\u021bia execut\u0103rii?<\/label>\r\n            <select id=\"zic2-are-prescriptie-det\" class=\"zic2__select\" data-field=\"arePrescriptieDet\" data-toggle-target=\"prescriptie-det\">\r\n              <option value=\"\">Selecta\u021bi...<\/option>\r\n              <option value=\"da\">Da<\/option>\r\n              <option value=\"nu\">Nu<\/option>\r\n            <\/select>\r\n          <\/div>\r\n          <div class=\"zic2__field zic2__conditionalDate\" data-toggle-show=\"prescriptie-det\" style=\"display:none;\">\r\n            <label class=\"zic2__label\" for=\"zic2-data-prescriptie-det\">Data \u00eemplinirii prescrip\u021biei<\/label>\r\n            <input id=\"zic2-data-prescriptie-det\" class=\"zic2__input\" type=\"date\" data-field=\"dataPrescriptieDet\">\r\n          <\/div>\r\n        <\/div>\r\n      <\/div>\r\n    <\/section>\r\n\r\n    <!-- Card 2: Condi\u021bii -->\r\n    <section class=\"zic2__card\" aria-labelledby=\"zic2-sec-conditii\">\r\n      <div class=\"zic2__cardHeader\">\r\n        <div class=\"zic2__cardIcon zic2__cardIcon--blue\">\r\n          <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n            <path d=\"M22 11.08V12a10 10 0 1 1-5.93-9.14\"\/>\r\n            <polyline points=\"22 4 12 14.01 9 11.01\"\/>\r\n          <\/svg>\r\n        <\/div>\r\n        <h3 id=\"zic2-sec-conditii\" class=\"zic2__cardTitle\">2. Condi\u021bii pentru reabilitare<\/h3>\r\n      <\/div>\r\n\r\n      <div class=\"zic2__grid2\">\r\n        <div class=\"zic2__field\">\r\n          <label class=\"zic2__label\" for=\"zic2-infractiune\">A s\u0103v\u00e2r\u0219it o nou\u0103 infrac\u021biune \u00een cursul termenului?<\/label>\r\n          <select id=\"zic2-infractiune\" class=\"zic2__select\" data-field=\"infractiuneNoua\">\r\n            <option value=\"\">Nu \u0219tiu \/ Nu r\u0103spund<\/option>\r\n            <option value=\"nu\">Nu<\/option>\r\n            <option value=\"da\">Da<\/option>\r\n          <\/select>\r\n        <\/div>\r\n        <div class=\"zic2__field\">\r\n          <label class=\"zic2__label\" for=\"zic2-obligatii\">Obliga\u021biile civile au fost achitate?<\/label>\r\n          <select id=\"zic2-obligatii\" class=\"zic2__select\" data-field=\"obligatiiCivile\">\r\n            <option value=\"\">Nu \u0219tiu \/ Nu se aplic\u0103<\/option>\r\n            <option value=\"da\">Da, integral<\/option>\r\n            <option value=\"partial\">Par\u021bial<\/option>\r\n            <option value=\"nu\">Nu<\/option>\r\n          <\/select>\r\n        <\/div>\r\n      <\/div>\r\n\r\n      <div class=\"zic2__grid2\" style=\"margin-top: 12px;\">\r\n        <div class=\"zic2__field\">\r\n          <label class=\"zic2__label\" for=\"zic2-cheltuieli\">Cheltuielile de judecat\u0103 au fost achitate?<\/label>\r\n          <select id=\"zic2-cheltuieli\" class=\"zic2__select\" data-field=\"cheltuieliJudecata\">\r\n            <option value=\"\">Nu \u0219tiu \/ Nu se aplic\u0103<\/option>\r\n            <option value=\"da\">Da, integral<\/option>\r\n            <option value=\"partial\">Par\u021bial<\/option>\r\n            <option value=\"nu\">Nu<\/option>\r\n          <\/select>\r\n        <\/div>\r\n        <div class=\"zic2__field\">\r\n          <label class=\"zic2__label\" for=\"zic2-imposibilitate\">S-a dovedit imposibilitatea de plat\u0103?<\/label>\r\n          <select id=\"zic2-imposibilitate\" class=\"zic2__select\" data-field=\"imposibilitatePlata\">\r\n            <option value=\"\">Nu \u0219tiu \/ Nu se aplic\u0103<\/option>\r\n            <option value=\"da\">Da<\/option>\r\n            <option value=\"nu\">Nu<\/option>\r\n          <\/select>\r\n        <\/div>\r\n      <\/div>\r\n\r\n      <div class=\"zic2__grid2\" style=\"margin-top: 12px;\">\r\n        <div class=\"zic2__field\">\r\n          <label class=\"zic2__label\" for=\"zic2-renuntare\">Victima a renun\u021bat la desp\u0103gubiri?<\/label>\r\n          <select id=\"zic2-renuntare\" class=\"zic2__select\" data-field=\"victimaRenuntat\">\r\n            <option value=\"\">Nu \u0219tiu \/ Nu se aplic\u0103<\/option>\r\n            <option value=\"da\">Da<\/option>\r\n            <option value=\"nu\">Nu<\/option>\r\n          <\/select>\r\n        <\/div>\r\n        <div class=\"zic2__field\">\r\n          <label class=\"zic2__label\" for=\"zic2-are-respingere\">A existat o cerere de reabilitare respins\u0103 anterior?<\/label>\r\n          <select id=\"zic2-are-respingere\" class=\"zic2__select\" data-field=\"areRespingere\" data-toggle-target=\"respingere\">\r\n            <option value=\"\">Selecta\u021bi...<\/option>\r\n            <option value=\"da\">Da<\/option>\r\n            <option value=\"nu\">Nu<\/option>\r\n          <\/select>\r\n        <\/div>\r\n      <\/div>\r\n\r\n      <div class=\"zic2__field zic2__conditionalDate\" data-toggle-show=\"respingere\" style=\"display:none; margin-top: 12px;\">\r\n        <label class=\"zic2__label\" for=\"zic2-respingere\">Data respingerii definitive (art. 170 CP)<\/label>\r\n        <input id=\"zic2-respingere\" class=\"zic2__input\" type=\"date\" data-field=\"dataRespingere\">\r\n      <\/div>\r\n    <\/section>\r\n\r\n    <!-- Ac\u021biuni -->\r\n    <div class=\"zic2__actions\">\r\n      <button type=\"button\" class=\"zic2__btn zic2__btn--primary zic2__btn--large\" data-action=\"calculate\">\r\n        <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\"><polyline points=\"9 11 12 14 22 4\"\/><path d=\"M21 12v7a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h11\"\/><\/svg>\r\n        Calculeaz\u0103 eligibilitatea\r\n      <\/button>\r\n      <button type=\"button\" class=\"zic2__btn zic2__btn--secondary\" data-action=\"reset\">\r\n        <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><path d=\"M3 12a9 9 0 1 0 9-9 9.75 9.75 0 0 0-6.74 2.74L3 8\"\/><path d=\"M3 3v5h5\"\/><\/svg>\r\n        Reseteaz\u0103\r\n      <\/button>\r\n      <button type=\"button\" class=\"zic2__btn zic2__btn--success\" data-action=\"example\">\r\n        <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><path d=\"M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z\"\/><polyline points=\"14 2 14 8 20 8\"\/><\/svg>\r\n        Exemplu\r\n      <\/button>\r\n      <button type=\"button\" class=\"zic2__btn zic2__btn--secondary\" data-action=\"export-pdf\">\r\n        <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><path d=\"M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z\"\/><polyline points=\"14 2 14 8 20 8\"\/><path d=\"M12 18v-6\"\/><path d=\"M9 15l3 3 3-3\"\/><\/svg>\r\n        Descarc\u0103 PDF\r\n      <\/button>\r\n    <\/div>\r\n\r\n    <!-- Rezultat: de drept -->\r\n    <section class=\"zic2__card zic2__resultCard is-hidden\" data-result=\"deDrept\" aria-live=\"polite\">\r\n      <div class=\"zic2__cardHeader\">\r\n        <div class=\"zic2__cardIcon zic2__cardIcon--green\" data-result-icon=\"deDrept\">\r\n          <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\"><polyline points=\"20 6 9 17 4 12\"\/><\/svg>\r\n        <\/div>\r\n        <h3 class=\"zic2__cardTitle\">Reabilitare de drept (art. 165 CP)<\/h3>\r\n        <div class=\"zic2__spacer\"><\/div>\r\n        <span class=\"zic2__badge\" data-badge=\"deDrept\">-<\/span>\r\n      <\/div>\r\n      <div class=\"zic2__resultBody\" data-result-content=\"deDrept\"><\/div>\r\n    <\/section>\r\n\r\n    <!-- Rezultat: judec\u0103toreasc\u0103 -->\r\n    <section class=\"zic2__card zic2__resultCard is-hidden\" data-result=\"judecatoreasca\" aria-live=\"polite\">\r\n      <div class=\"zic2__cardHeader\">\r\n        <div class=\"zic2__cardIcon zic2__cardIcon--purple\" data-result-icon=\"judecatoreasca\">\r\n          <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\"><polyline points=\"20 6 9 17 4 12\"\/><\/svg>\r\n        <\/div>\r\n        <h3 class=\"zic2__cardTitle\">Reabilitare judec\u0103toreasc\u0103 (art. 166 CP)<\/h3>\r\n        <div class=\"zic2__spacer\"><\/div>\r\n        <span class=\"zic2__badge\" data-badge=\"judecatoreasca\">-<\/span>\r\n      <\/div>\r\n      <div class=\"zic2__resultBody\" data-result-content=\"judecatoreasca\"><\/div>\r\n      <div class=\"zic2__proceduralGuide is-hidden\" data-procedural-guide>\r\n        <div class=\"zic2__guideHeader\">\r\n          <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><path d=\"M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z\"\/><polyline points=\"14 2 14 8 20 8\"\/><\/svg>\r\n          <strong>Ghid procedural<\/strong>\r\n        <\/div>\r\n        <div class=\"zic2__guideContent\">\r\n          <p><strong>Instan\u021ba competent\u0103:<\/strong> Judec\u0103toria \u00een a c\u0103rei circumscrip\u021bie domiciliaz\u0103 condamnatul (art. 529 CPP)<\/p>\r\n          <p><strong>Documente necesare:<\/strong><\/p>\r\n          <ul>\r\n            <li>Cererea de reabilitare (\u00een dublu exemplar)<\/li>\r\n            <li>Copie dup\u0103 hot\u0103r\u00e2rea de condamnare (definitiv\u0103)<\/li>\r\n            <li>Dovada achit\u0103rii cheltuielilor de judecat\u0103 \u0219i a desp\u0103gubirilor civile<\/li>\r\n            <li>Certificat de cazier judiciar<\/li>\r\n            <li>Adeverin\u021b\u0103 de la locul de munc\u0103 sau alte documente privind situa\u021bia profesional\u0103<\/li>\r\n            <li>Tax\u0103 judiciar\u0103 de timbru<\/li>\r\n          <\/ul>\r\n          <p><strong>Informa\u021bii suplimentare:<\/strong><\/p>\r\n          <ul>\r\n            <li>Cererea se judec\u0103 \u00een camera de consiliu, cu citarea p\u0103r\u021bilor<\/li>\r\n            <li>Hot\u0103r\u00e2rea poate fi atacat\u0103 cu contesta\u021bie \u00een 10 zile de la comunicare<\/li>\r\n            <li>O nou\u0103 cerere poate fi depus\u0103 dup\u0103 1 an de la respingerea definitiv\u0103<\/li>\r\n          <\/ul>\r\n        <\/div>\r\n      <\/div>\r\n    <\/section>\r\n\r\n    <!-- Disclaimer -->\r\n    <div class=\"zic2__disclaimer\">\r\n      <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><path d=\"M10.29 3.86L1.82 18a2 2 0 0 0 1.71 3h16.94a2 2 0 0 0 1.71-3L13.71 3.86a2 2 0 0 0-3.42 0z\"\/><line x1=\"12\" y1=\"9\" x2=\"12\" y2=\"13\"\/><line x1=\"12\" y1=\"17\" x2=\"12.01\" y2=\"17\"\/><\/svg>\r\n      <div>\r\n        <strong>Disclaimer:<\/strong> Acest calculator este oferit exclusiv \u00een scop informativ \u0219i educativ. Rezultatele sunt estimative \u0219i nu reprezint\u0103 consultan\u021b\u0103 juridic\u0103. Verifica\u021bi situa\u021bia oficial\u0103 prin certificat de cazier judiciar sau consulta\u021bi un avocat.\r\n      <\/div>\r\n    <\/div>\r\n\r\n    <!-- Footer -->\r\n    <footer class=\"zic2__footer\">\r\n      <a href=\"https:\/\/zic.legal\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"zic2__footerLink\">\r\n        &copy; 2025 ZIC Legal\r\n      <\/a>\r\n    <\/footer>\r\n  <\/div>\r\n<\/div>\r\n\r\n<style>\r\n\/* ============================================================\r\n   ZIC Calculator v2 - Reabilitare\r\n   Theme: Purple\/Mov | Fully Responsive | Optimized | SECURED\r\n   ============================================================ *\/\r\n\r\n\/* === CSS Variables === *\/\r\n#zic-reabilitare-calculator-v2 {\r\n  --zic-primary: #8A88FF;\r\n  --zic-primary-dark: #6F6CFF;\r\n  --zic-primary-light: rgba(138,136,255,.08);\r\n  --zic-primary-border: rgba(138,136,255,.25);\r\n\r\n  --zic-success: #10B981;\r\n  --zic-success-light: rgba(16,185,129,.08);\r\n  --zic-success-border: rgba(16,185,129,.25);\r\n\r\n  --zic-danger: #EF4444;\r\n  --zic-danger-light: rgba(239,68,68,.08);\r\n  --zic-danger-border: rgba(239,68,68,.25);\r\n\r\n  --zic-warning: #F59E0B;\r\n  --zic-warning-light: rgba(245,158,11,.08);\r\n  --zic-warning-border: rgba(245,158,11,.25);\r\n\r\n  --zic-blue: #3B82F6;\r\n  --zic-blue-light: rgba(59,130,246,.08);\r\n\r\n  --zic-ink: #1F2937;\r\n  --zic-ink-light: #374151;\r\n  --zic-muted: #6B7280;\r\n  --zic-light: #9CA3AF;\r\n\r\n  --zic-bg: #F9FAFB;\r\n  --zic-surface: #FFFFFF;\r\n  --zic-border: #E5E7EB;\r\n\r\n  --zic-shadow-sm: 0 1px 2px rgba(0,0,0,.05);\r\n  --zic-shadow-lg: 0 10px 15px -3px rgba(0,0,0,.1), 0 4px 6px -2px rgba(0,0,0,.05);\r\n\r\n  --zic-radius: 16px;\r\n  --zic-radius-sm: 12px;\r\n  --zic-radius-xs: 8px;\r\n\r\n  --zic-transition: 150ms ease;\r\n\r\n  font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif;\r\n  color: var(--zic-ink);\r\n  line-height: 1.5;\r\n  -webkit-font-smoothing: antialiased;\r\n}\r\n\r\n#zic-reabilitare-calculator-v2 *, #zic-reabilitare-calculator-v2 *::before, #zic-reabilitare-calculator-v2 *::after { box-sizing: border-box; }\r\n\r\n\/* === WordPress\/Avada Override Protection === *\/\r\n#zic-reabilitare-calculator-v2 input[type=\"checkbox\"],\r\n#zic-reabilitare-calculator-v2 input[type=\"radio\"] {\r\n  -webkit-appearance: auto !important;\r\n  -moz-appearance: auto !important;\r\n  appearance: auto !important;\r\n  width: 18px !important;\r\n  height: 18px !important;\r\n  margin: 0 !important;\r\n  padding: 0 !important;\r\n  border: none !important;\r\n  background: none !important;\r\n  box-shadow: none !important;\r\n}\r\n\r\n#zic-reabilitare-calculator-v2 input[type=\"number\"],\r\n#zic-reabilitare-calculator-v2 input[type=\"text\"],\r\n#zic-reabilitare-calculator-v2 input[type=\"date\"] {\r\n  -webkit-appearance: none !important;\r\n  -moz-appearance: textfield !important;\r\n  appearance: none !important;\r\n  background-image: none !important;\r\n  box-shadow: none !important;\r\n}\r\n\r\n#zic-reabilitare-calculator-v2 select {\r\n  background-image: url(\"data:image\/svg+xml,%3Csvg xmlns='http:\/\/www.w3.org\/2000\/svg' width='12' height='12' viewBox='0 0 24 24' fill='none' stroke='%236B7280' stroke-width='2'%3E%3Cpath d='M6 9l6 6 6-6'\/%3E%3C\/svg%3E\") !important;\r\n  background-repeat: no-repeat !important;\r\n  background-position: right 12px center !important;\r\n  padding-right: 36px !important;\r\n}\r\n\r\n#zic-reabilitare-calculator-v2 button:not(.zic2__btn--primary) { background-image: none !important; }\r\n#zic-reabilitare-calculator-v2 button { text-shadow: none !important; letter-spacing: normal !important; }\r\n#zic-reabilitare-calculator-v2 h2, #zic-reabilitare-calculator-v2 h3 { text-transform: none !important; letter-spacing: normal !important; }\r\n#zic-reabilitare-calculator-v2 a { text-decoration: none; }\r\n#zic-reabilitare-calculator-v2 a:hover { text-decoration: underline; }\r\n\r\n\/* === Layout === *\/\r\n#zic-reabilitare-calculator-v2 .zic2__wrap { max-width: 720px; margin: 0 auto; padding: 16px; }\r\n#zic-reabilitare-calculator-v2 .zic2__hero { margin-bottom: 16px; }\r\n\r\n#zic-reabilitare-calculator-v2 .zic2__brandbar {\r\n  display: flex; align-items: center; gap: 14px;\r\n  background: linear-gradient(135deg, var(--zic-primary), var(--zic-primary-dark));\r\n  border-radius: var(--zic-radius); padding: 20px; color: #fff; box-shadow: var(--zic-shadow-lg);\r\n}\r\n\r\n#zic-reabilitare-calculator-v2 .zic2__mark {\r\n  width: 48px; height: 48px; background: rgba(255,255,255,.2); border-radius: 12px;\r\n  display: flex; align-items: center; justify-content: center; flex-shrink: 0;\r\n}\r\n\r\n#zic-reabilitare-calculator-v2 .zic2__headerText { flex: 1; min-width: 0; }\r\n#zic-reabilitare-calculator-v2 .zic2__title { margin: 0; font-size: 20px; font-weight: 700; line-height: 1.2; }\r\n#zic-reabilitare-calculator-v2 .zic2__subtitle { margin: 4px 0 0; font-size: 14px; opacity: 0.9; }\r\n\r\n\/* === Formula Box === *\/\r\n#zic-reabilitare-calculator-v2 .zic2__formula {\r\n  display: flex; align-items: flex-start; gap: 10px;\r\n  background: var(--zic-primary-light); border: 1px solid var(--zic-primary-border);\r\n  border-radius: var(--zic-radius-sm); padding: 12px 14px; margin-bottom: 16px;\r\n  font-size: 14px; color: var(--zic-ink-light);\r\n}\r\n#zic-reabilitare-calculator-v2 .zic2__formulaIcon { color: var(--zic-primary-dark); flex-shrink: 0; margin-top: 1px; }\r\n#zic-reabilitare-calculator-v2 .zic2__formulaText strong { color: var(--zic-ink); }\r\n#zic-reabilitare-calculator-v2 .zic2__formulaText em { font-style: italic; color: var(--zic-primary-dark); }\r\n\r\n\/* === Cards === *\/\r\n#zic-reabilitare-calculator-v2 .zic2__card {\r\n  background: var(--zic-surface); border: 1px solid var(--zic-border);\r\n  border-radius: var(--zic-radius); padding: 20px; margin-bottom: 16px; box-shadow: var(--zic-shadow-sm);\r\n}\r\n\r\n#zic-reabilitare-calculator-v2 .zic2__cardHeader { display: flex; align-items: center; gap: 12px; margin-bottom: 16px; flex-wrap: wrap; }\r\n\r\n#zic-reabilitare-calculator-v2 .zic2__cardIcon {\r\n  width: 36px; height: 36px; border-radius: 10px;\r\n  display: flex; align-items: center; justify-content: center; flex-shrink: 0;\r\n}\r\n#zic-reabilitare-calculator-v2 .zic2__cardIcon--purple { background: var(--zic-primary-light); color: var(--zic-primary-dark); }\r\n#zic-reabilitare-calculator-v2 .zic2__cardIcon--blue { background: var(--zic-blue-light); color: var(--zic-blue); }\r\n#zic-reabilitare-calculator-v2 .zic2__cardIcon--green { background: var(--zic-success-light); color: var(--zic-success); }\r\n#zic-reabilitare-calculator-v2 .zic2__cardIcon--red { background: var(--zic-danger-light); color: var(--zic-danger); }\r\n\r\n#zic-reabilitare-calculator-v2 .zic2__cardTitle { margin: 0; font-size: 17px; font-weight: 700; color: var(--zic-ink); }\r\n#zic-reabilitare-calculator-v2 .zic2__spacer { flex: 1; }\r\n\r\n\/* === Badge === *\/\r\n#zic-reabilitare-calculator-v2 .zic2__badge {\r\n  display: inline-flex; align-items: center; gap: 6px; padding: 6px 12px;\r\n  background: var(--zic-primary-light); color: var(--zic-primary-dark);\r\n  font-size: 12px; font-weight: 600; border-radius: 999px; white-space: nowrap;\r\n}\r\n#zic-reabilitare-calculator-v2 .zic2__badge--yes { background: var(--zic-success-light); color: var(--zic-success); }\r\n#zic-reabilitare-calculator-v2 .zic2__badge--no { background: var(--zic-danger-light); color: var(--zic-danger); }\r\n#zic-reabilitare-calculator-v2 .zic2__badge--warning { background: var(--zic-warning-light); color: #92400E; }\r\n\r\n\/* === Form Elements === *\/\r\n#zic-reabilitare-calculator-v2 .zic2__field { display: flex; flex-direction: column; gap: 4px; }\r\n#zic-reabilitare-calculator-v2 .zic2__label { font-size: 12px; font-weight: 600; color: var(--zic-muted); }\r\n#zic-reabilitare-calculator-v2 .zic2__fieldHint { font-size: 11px; color: var(--zic-light); margin-top: 4px; }\r\n\r\n#zic-reabilitare-calculator-v2 .zic2__input, #zic-reabilitare-calculator-v2 .zic2__select {\r\n  width: 100%; padding: 10px 12px; font-size: 15px; font-family: inherit;\r\n  color: var(--zic-ink); background: var(--zic-surface);\r\n  border: 2px solid var(--zic-border); border-radius: var(--zic-radius-xs);\r\n  outline: none; transition: border-color var(--zic-transition), box-shadow var(--zic-transition);\r\n}\r\n#zic-reabilitare-calculator-v2 .zic2__input:focus, #zic-reabilitare-calculator-v2 .zic2__select:focus {\r\n  border-color: var(--zic-primary); box-shadow: 0 0 0 3px var(--zic-primary-light);\r\n}\r\n\r\n#zic-reabilitare-calculator-v2 .zic2__grid2 { display: grid; gap: 12px; }\r\n@media (min-width: 640px) { #zic-reabilitare-calculator-v2 .zic2__grid2 { grid-template-columns: 1fr 1fr; } }\r\n\r\n#zic-reabilitare-calculator-v2 .zic2__inputGroup { display: grid; gap: 8px; }\r\n#zic-reabilitare-calculator-v2 .zic2__inputGroup--3cols { grid-template-columns: repeat(3, 1fr); }\r\n\r\n\/* === Hint === *\/\r\n#zic-reabilitare-calculator-v2 .zic2__hint {\r\n  display: flex; align-items: flex-start; gap: 8px; padding: 10px 12px;\r\n  background: var(--zic-bg); border-radius: var(--zic-radius-xs); font-size: 12px; color: var(--zic-muted);\r\n}\r\n#zic-reabilitare-calculator-v2 .zic2__hint svg { flex-shrink: 0; margin-top: 1px; }\r\n#zic-reabilitare-calculator-v2 .zic2__hint strong { color: var(--zic-ink-light); }\r\n\r\n\/* === Toggle Field (Question + Conditional Date) === *\/\r\n#zic-reabilitare-calculator-v2 .zic2__toggleField {\r\n  display: grid; gap: 8px; padding: 12px; background: var(--zic-bg);\r\n  border-radius: var(--zic-radius-xs); border: 1px solid var(--zic-border);\r\n}\r\n@media (min-width: 640px) {\r\n  #zic-reabilitare-calculator-v2 .zic2__toggleField { grid-template-columns: 1fr 1fr; gap: 16px; }\r\n}\r\n#zic-reabilitare-calculator-v2 .zic2__conditionalDate {\r\n  padding: 10px; background: var(--zic-surface); border-radius: var(--zic-radius-xs);\r\n  border: 1px dashed var(--zic-primary-border);\r\n}\r\n\r\n\/* === Error === *\/\r\n#zic-reabilitare-calculator-v2 .zic2__error {\r\n  margin-bottom: 16px; padding: 12px; background: var(--zic-danger-light);\r\n  border: 1px solid var(--zic-danger-border); border-radius: var(--zic-radius-xs);\r\n  color: var(--zic-danger); font-size: 13px; font-weight: 500;\r\n}\r\n#zic-reabilitare-calculator-v2 .zic2__error ul { margin: 8px 0 0 18px; padding: 0; }\r\n#zic-reabilitare-calculator-v2 .zic2__error li { margin: 4px 0; }\r\n\r\n\/* === Buttons === *\/\r\n#zic-reabilitare-calculator-v2 .zic2__actions { display: flex; flex-wrap: wrap; gap: 10px; margin-bottom: 16px; }\r\n#zic-reabilitare-calculator-v2 .zic2__actions .zic2__btn--primary { flex: 1; min-width: 200px; }\r\n\r\n#zic-reabilitare-calculator-v2 .zic2__btn {\r\n  display: inline-flex; align-items: center; justify-content: center; gap: 6px;\r\n  padding: 10px 16px; font-size: 14px; font-weight: 600;\r\n  border-radius: var(--zic-radius-sm); border: 1px solid transparent;\r\n  cursor: pointer; transition: all var(--zic-transition); white-space: nowrap; text-decoration: none;\r\n}\r\n#zic-reabilitare-calculator-v2 .zic2__btn:focus { outline: none; box-shadow: 0 0 0 3px var(--zic-primary-border); }\r\n#zic-reabilitare-calculator-v2 .zic2__btn:active { transform: translateY(1px); }\r\n\r\n#zic-reabilitare-calculator-v2 .zic2__btn--primary {\r\n  background: linear-gradient(135deg, var(--zic-primary), var(--zic-primary-dark));\r\n  color: #fff; box-shadow: 0 4px 14px rgba(138,136,255,.35);\r\n}\r\n#zic-reabilitare-calculator-v2 .zic2__btn--primary:hover { box-shadow: 0 6px 20px rgba(138,136,255,.45); transform: translateY(-1px); }\r\n#zic-reabilitare-calculator-v2 .zic2__btn--large { padding: 14px 24px; font-size: 15px; }\r\n\r\n#zic-reabilitare-calculator-v2 .zic2__btn--secondary { background: var(--zic-surface); border-color: var(--zic-border); color: var(--zic-ink-light); }\r\n#zic-reabilitare-calculator-v2 .zic2__btn--secondary:hover { background: var(--zic-bg); border-color: var(--zic-primary-border); color: var(--zic-primary-dark); }\r\n\r\n#zic-reabilitare-calculator-v2 .zic2__btn--success { background: var(--zic-success-light); border-color: var(--zic-success-border); color: var(--zic-success); }\r\n#zic-reabilitare-calculator-v2 .zic2__btn--success:hover { background: rgba(16,185,129,.15); }\r\n\r\n\/* === Result Cards === *\/\r\n#zic-reabilitare-calculator-v2 .zic2__resultCard { border-color: var(--zic-border); }\r\n#zic-reabilitare-calculator-v2 .zic2__resultCard--success { border-color: var(--zic-success-border); background: linear-gradient(135deg, rgba(16,185,129,.02), rgba(16,185,129,.06)); }\r\n#zic-reabilitare-calculator-v2 .zic2__resultCard--danger { border-color: var(--zic-danger-border); background: linear-gradient(135deg, rgba(239,68,68,.02), rgba(239,68,68,.06)); }\r\n#zic-reabilitare-calculator-v2 .zic2__resultCard--warning { border-color: var(--zic-warning-border); background: linear-gradient(135deg, rgba(245,158,11,.02), rgba(245,158,11,.06)); }\r\n\r\n#zic-reabilitare-calculator-v2 .zic2__resultBody { display: flex; flex-direction: column; gap: 12px; }\r\n\r\n\/* === KPI === *\/\r\n#zic-reabilitare-calculator-v2 .zic2__kpi { background: var(--zic-surface); border: 1px solid var(--zic-border); border-radius: var(--zic-radius-sm); padding: 16px; }\r\n#zic-reabilitare-calculator-v2 .zic2__kpiLabel { font-size: 12px; font-weight: 600; color: var(--zic-muted); text-transform: uppercase; letter-spacing: 0.5px; margin-bottom: 6px; }\r\n#zic-reabilitare-calculator-v2 .zic2__kpiValue { font-size: 22px; font-weight: 800; color: var(--zic-primary-dark); margin: 0; }\r\n#zic-reabilitare-calculator-v2 .zic2__kpiValue--yes { color: var(--zic-success); }\r\n#zic-reabilitare-calculator-v2 .zic2__kpiValue--no { color: var(--zic-danger); }\r\n#zic-reabilitare-calculator-v2 .zic2__kpiValue--warning { color: #92400E; }\r\n\r\n\/* === Details Grid === *\/\r\n#zic-reabilitare-calculator-v2 .zic2__detailsGrid { display: grid; grid-template-columns: 1fr 1fr; gap: 12px; }\r\n#zic-reabilitare-calculator-v2 .zic2__detailItem { background: var(--zic-surface); border: 1px solid var(--zic-border); border-radius: var(--zic-radius-xs); padding: 12px; }\r\n#zic-reabilitare-calculator-v2 .zic2__detailLabel { font-size: 11px; font-weight: 600; color: var(--zic-muted); text-transform: uppercase; letter-spacing: 0.05em; margin-bottom: 4px; }\r\n#zic-reabilitare-calculator-v2 .zic2__detailValue { font-size: 14px; font-weight: 700; color: var(--zic-ink); }\r\n#zic-reabilitare-calculator-v2 .zic2__detailValue--yes { color: var(--zic-success); }\r\n#zic-reabilitare-calculator-v2 .zic2__detailValue--no { color: var(--zic-danger); }\r\n\r\n\/* === Explanations === *\/\r\n#zic-reabilitare-calculator-v2 .zic2__explanations { background: var(--zic-bg); border-radius: var(--zic-radius-xs); padding: 14px; margin-top: 12px; }\r\n#zic-reabilitare-calculator-v2 .zic2__explanationsTitle { font-size: 12px; font-weight: 700; color: var(--zic-ink); margin-bottom: 10px; text-transform: uppercase; letter-spacing: 0.5px; }\r\n#zic-reabilitare-calculator-v2 .zic2__explanationItem { display: flex; gap: 8px; padding: 6px 0; font-size: 13px; color: var(--zic-ink-light); border-bottom: 1px dashed var(--zic-border); }\r\n#zic-reabilitare-calculator-v2 .zic2__explanationItem:last-child { border-bottom: none; }\r\n#zic-reabilitare-calculator-v2 .zic2__explanationBasis { font-size: 11px; font-weight: 600; color: var(--zic-primary-dark); white-space: nowrap; }\r\n\r\n\/* === Procedural Guide === *\/\r\n#zic-reabilitare-calculator-v2 .zic2__proceduralGuide { background: var(--zic-bg); border-radius: var(--zic-radius-sm); padding: 16px; margin-top: 16px; }\r\n#zic-reabilitare-calculator-v2 .zic2__guideHeader { display: flex; align-items: center; gap: 8px; font-size: 14px; color: var(--zic-primary-dark); margin-bottom: 12px; }\r\n#zic-reabilitare-calculator-v2 .zic2__guideContent { font-size: 13px; color: var(--zic-ink-light); }\r\n#zic-reabilitare-calculator-v2 .zic2__guideContent p { margin: 0 0 10px 0; }\r\n#zic-reabilitare-calculator-v2 .zic2__guideContent ul { margin: 6px 0 12px 18px; padding: 0; }\r\n#zic-reabilitare-calculator-v2 .zic2__guideContent li { margin: 4px 0; }\r\n\r\n\/* === Disclaimer === *\/\r\n#zic-reabilitare-calculator-v2 .zic2__disclaimer {\r\n  display: flex; align-items: flex-start; gap: 10px; padding: 14px;\r\n  background: var(--zic-bg); border: 1px solid var(--zic-border); border-radius: var(--zic-radius-sm);\r\n  font-size: 12px; color: var(--zic-muted); line-height: 1.5; margin-bottom: 16px;\r\n}\r\n#zic-reabilitare-calculator-v2 .zic2__disclaimer svg { flex-shrink: 0; color: var(--zic-warning); margin-top: 1px; }\r\n#zic-reabilitare-calculator-v2 .zic2__disclaimer strong { color: var(--zic-ink-light); }\r\n\r\n\/* === Footer === *\/\r\n#zic-reabilitare-calculator-v2 .zic2__footer { text-align: center; padding: 8px 0; }\r\n#zic-reabilitare-calculator-v2 .zic2__footerLink { color: var(--zic-primary-dark); text-decoration: none; font-size: 13px; font-weight: 600; transition: color var(--zic-transition); }\r\n#zic-reabilitare-calculator-v2 .zic2__footerLink:hover { color: var(--zic-primary); text-decoration: underline; }\r\n\r\n\/* === Utility === *\/\r\n#zic-reabilitare-calculator-v2 .is-hidden { display: none !important; }\r\n\r\n\/* === Responsive === *\/\r\n@media (max-width: 500px) {\r\n  #zic-reabilitare-calculator-v2 .zic2__actions { flex-direction: column; }\r\n  #zic-reabilitare-calculator-v2 .zic2__actions .zic2__btn { width: 100%; min-width: unset; }\r\n  #zic-reabilitare-calculator-v2 .zic2__inputGroup--3cols { grid-template-columns: 1fr; }\r\n  #zic-reabilitare-calculator-v2 .zic2__detailsGrid { grid-template-columns: 1fr; }\r\n}\r\n\r\n@media (min-width: 640px) { #zic-reabilitare-calculator-v2 .zic2__wrap { padding: 24px; } #zic-reabilitare-calculator-v2 .zic2__title { font-size: 24px; } }\r\n@media (min-width: 768px) { #zic-reabilitare-calculator-v2 .zic2__card { padding: 24px; } #zic-reabilitare-calculator-v2 .zic2__brandbar { padding: 24px; } #zic-reabilitare-calculator-v2 .zic2__mark { width: 56px; height: 56px; } #zic-reabilitare-calculator-v2 .zic2__title { font-size: 26px; } }\r\n@media (min-width: 1024px) { #zic-reabilitare-calculator-v2 .zic2__wrap { max-width: 900px; } }\r\n\r\n@media print {\r\n  #zic-reabilitare-calculator-v2 .zic2__actions, #zic-reabilitare-calculator-v2 .zic2__footer { display: none !important; }\r\n  #zic-reabilitare-calculator-v2 .zic2__card { box-shadow: none; border: 1px solid #ddd; break-inside: avoid; }\r\n}\r\n<\/style>\r\n\r\n<script>\r\n(function() {\r\n  'use strict';\r\n\r\n  var ROOT_ID = 'zic-reabilitare-calculator-v2';\r\n  var MS_DAY = 86400000;\r\n\r\n  \/\/ === SECURITY: HTML Escape Function ===\r\n  function escapeHtml(str) {\r\n    if (str === null || str === undefined) return '';\r\n    var text = String(str);\r\n    var div = document.createElement('div');\r\n    div.textContent = text;\r\n    return div.innerHTML;\r\n  }\r\n\r\n  \/\/ === SECURITY: Validate date format ===\r\n  function isValidDateFormat(dateStr) {\r\n    if (!dateStr || typeof dateStr !== 'string') return false;\r\n    var regex = \/^\\d{4}-\\d{2}-\\d{2}$\/;\r\n    if (!regex.test(dateStr)) return false;\r\n    var parts = dateStr.split('-').map(Number);\r\n    var y = parts[0], m = parts[1], d = parts[2];\r\n    if (y < 1900 || y > 2100 || m < 1 || m > 12 || d < 1) return false;\r\n    var daysInMonth = [31, (y % 4 === 0 && (y % 100 !== 0 || y % 400 === 0)) ? 29 : 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];\r\n    if (d > daysInMonth[m - 1]) return false;\r\n    return true;\r\n  }\r\n\r\n  \/\/ === SECURITY: Sanitize numeric input ===\r\n  function sanitizeNumber(val, min, max) {\r\n    var num = parseInt(val, 10);\r\n    if (!isFinite(num)) return min;\r\n    return Math.max(min, Math.min(max, num));\r\n  }\r\n\r\n  var root = document.getElementById(ROOT_ID);\r\n  if (!root) return;\r\n\r\n  function $(s) { return root.querySelector(s); }\r\n  function $$(s) { return root.querySelectorAll(s); }\r\n\r\n  var els = {\r\n    errors: $('[data-errors]'),\r\n    resultDeDrept: $('[data-result=\"deDrept\"]'),\r\n    resultJudecatoreasca: $('[data-result=\"judecatoreasca\"]'),\r\n    contentDeDrept: $('[data-result-content=\"deDrept\"]'),\r\n    contentJudecatoreasca: $('[data-result-content=\"judecatoreasca\"]'),\r\n    iconDeDrept: $('[data-result-icon=\"deDrept\"]'),\r\n    iconJudecatoreasca: $('[data-result-icon=\"judecatoreasca\"]'),\r\n    badgeDeDrept: $('[data-badge=\"deDrept\"]'),\r\n    badgeJudecatoreasca: $('[data-badge=\"judecatoreasca\"]'),\r\n    proceduralGuide: $('[data-procedural-guide]')\r\n  };\r\n\r\n  var state = { lastResult: null };\r\n\r\n  function getField(n) { return $('[data-field=\"' + n + '\"]'); }\r\n  function numVal(el) {\r\n    if (!el || !el.value) return 0;\r\n    var n = parseInt(el.value, 10);\r\n    return isFinite(n) && n >= 0 ? n : 0;\r\n  }\r\n\r\n  function parseISO(v) {\r\n    if (!isValidDateFormat(v)) return null;\r\n    var parts = v.split('-').map(Number);\r\n    return Math.floor(Date.UTC(parts[0], parts[1] - 1, parts[2]) \/ MS_DAY);\r\n  }\r\n\r\n  function dayToISO(day) {\r\n    var dt = new Date(day * MS_DAY);\r\n    return dt.getUTCFullYear() + '-' + String(dt.getUTCMonth() + 1).padStart(2, '0') + '-' + String(dt.getUTCDate()).padStart(2, '0');\r\n  }\r\n\r\n  function todayDay() {\r\n    var now = new Date();\r\n    return Math.floor(Date.UTC(now.getFullYear(), now.getMonth(), now.getDate()) \/ MS_DAY);\r\n  }\r\n\r\n  function formatDay(day) {\r\n    if (day === null) return '-';\r\n    var dt = new Date(day * MS_DAY);\r\n    return String(dt.getUTCDate()).padStart(2, '0') + '.' + String(dt.getUTCMonth() + 1).padStart(2, '0') + '.' + dt.getUTCFullYear();\r\n  }\r\n\r\n  function addYears(day, y) {\r\n    var dt = new Date(day * MS_DAY);\r\n    dt.setUTCFullYear(dt.getUTCFullYear() + y);\r\n    return Math.floor(dt.getTime() \/ MS_DAY);\r\n  }\r\n\r\n  \/\/ === REGULI LEGALE ===\r\n  var REGULI = {\r\n    DE_DREPT_TERMEN: 3,      \/\/ ani - Art. 165 CP\r\n    DE_DREPT_MAX_LUNI: 24,   \/\/ 2 ani max pentru inchisoare\r\n    JUDECATOREASCA: [\r\n      { maxLuni: 60, ani: 4 },    \/\/ > 2 ani si <= 5 ani -> 4 ani\r\n      { maxLuni: 120, ani: 5 },   \/\/ > 5 ani si <= 10 ani -> 5 ani\r\n      { maxLuni: Infinity, ani: 7 } \/\/ > 10 ani -> 7 ani\r\n    ],\r\n    DETENTIUNE_COMUTATA: 7,  \/\/ ani - Art. 166 alin. (1) lit. c) CP\r\n    DETENTIUNE_EXECUTATA: 10, \/\/ ani - Art. 166 alin. (1) lit. d) CP\r\n    REINNOIRE: 1             \/\/ ani - Art. 170 CP\r\n  };\r\n\r\n  \/\/ === SECURITY: Safe DOM manipulation for errors ===\r\n  function showErrors(msgs) {\r\n    if (!msgs || !msgs.length) {\r\n      els.errors.classList.add('is-hidden');\r\n      return;\r\n    }\r\n    els.errors.classList.remove('is-hidden');\r\n    while (els.errors.firstChild) els.errors.removeChild(els.errors.firstChild);\r\n    var header = document.createTextNode('Corecta\u021bi:');\r\n    els.errors.appendChild(header);\r\n    var ul = document.createElement('ul');\r\n    msgs.forEach(function(m) {\r\n      var li = document.createElement('li');\r\n      li.textContent = m;\r\n      ul.appendChild(li);\r\n    });\r\n    els.errors.appendChild(ul);\r\n    els.errors.scrollIntoView({ behavior: 'smooth', block: 'start' });\r\n  }\r\n\r\n  function hideErrors() {\r\n    els.errors.classList.add('is-hidden');\r\n    while (els.errors.firstChild) els.errors.removeChild(els.errors.firstChild);\r\n  }\r\n\r\n  function updateConditionalSections() {\r\n    var tip = getField('tipPedeapsa')?.value || '';\r\n    var sections = $$('[data-show-for]');\r\n    sections.forEach(function(sec) {\r\n      var showFor = sec.dataset.showFor || '';\r\n      var types = showFor.split(',').map(function(t) { return t.trim(); });\r\n      sec.style.display = types.indexOf(tip) !== -1 ? '' : 'none';\r\n    });\r\n  }\r\n\r\n  function updateToggleFields() {\r\n    \/\/ Handle all toggle fields (data-toggle-target -> data-toggle-show)\r\n    var toggleSelects = $$('[data-toggle-target]');\r\n    toggleSelects.forEach(function(select) {\r\n      var target = select.dataset.toggleTarget;\r\n      var conditionalField = $('[data-toggle-show=\"' + target + '\"]');\r\n      if (conditionalField) {\r\n        var show = select.value === 'da';\r\n        conditionalField.style.display = show ? '' : 'none';\r\n        \/\/ Clear date field when hiding\r\n        if (!show) {\r\n          var dateInput = conditionalField.querySelector('.zic2__input[type=\"date\"]');\r\n          if (dateInput) dateInput.value = '';\r\n        }\r\n      }\r\n    });\r\n  }\r\n\r\n  \/\/ === CALCUL DATA DE START (Art. 167 CP) ===\r\n  function computeStartDate(data) {\r\n    var tip = data.tipPedeapsa;\r\n\r\n    \/\/ 1. Suspendare sub supraveghere - Art. 167 alin. (4)\r\n    if (tip === 'suspendare') {\r\n      if (data.dataSupraveghere) {\r\n        return { startDay: parseISO(data.dataSupraveghere), motiv: 'Termenul \u00eencepe de la \u00eemplinirea termenului de supraveghere.', baza: 'Art. 167 alin. (4) CP' };\r\n      }\r\n      return { startDay: null, motiv: 'Data finaliz\u0103rii supravegherii nu este specificat\u0103.', baza: 'Art. 167 CP' };\r\n    }\r\n\r\n    \/\/ 2. Amend\u0103 - Art. 167 alin. (3)\r\n    if (tip === 'amenda') {\r\n      if (data.dataAmenda) {\r\n        return { startDay: parseISO(data.dataAmenda), motiv: 'Termenul \u00eencepe de la data achit\u0103rii amenzii.', baza: 'Art. 167 alin. (3) CP' };\r\n      }\r\n      return { startDay: null, motiv: 'Data achit\u0103rii amenzii nu este specificat\u0103.', baza: 'Art. 167 CP' };\r\n    }\r\n\r\n    \/\/ 3. Deten\u021biune pe via\u021b\u0103 - c\u00e2mpuri specifice\r\n    if (tip === 'detentiune') {\r\n      \/\/ Comutare\/\u00cenlocuire - Art. 166 alin. (1) lit. c) CP\r\n      if (data.dataComutare) {\r\n        return { startDay: parseISO(data.dataComutare), motiv: 'Termenul \u00eencepe de la executarea pedepsei rezultate din comutare\/\u00eenlocuire.', baza: 'Art. 166 alin. (1) lit. c) CP' };\r\n      }\r\n      \/\/ Gra\u021biere total\u0103 - Art. 167 alin. (2) CP\r\n      if (data.dataGratiereDet) {\r\n        return { startDay: parseISO(data.dataGratiereDet), motiv: 'Termenul \u00eencepe de la data gra\u021bierii totale.', baza: 'Art. 167 alin. (2) CP' };\r\n      }\r\n      \/\/ Prescrip\u021bie - Art. 167 alin. (2) CP\r\n      if (data.dataPrescriptieDet) {\r\n        return { startDay: parseISO(data.dataPrescriptieDet), motiv: 'Termenul \u00eencepe de la data prescrip\u021biei execut\u0103rii.', baza: 'Art. 167 alin. (2) CP' };\r\n      }\r\n      return { startDay: null, motiv: 'Nu se poate determina data de start pentru deten\u021biunea pe via\u021b\u0103. Completa\u021bi datele necesare.', baza: 'Art. 167 CP' };\r\n    }\r\n\r\n    \/\/ 4. Gra\u021bierea (\u00eenchisoare) - Art. 167 alin. (2)\r\n    if (data.dataGratiere) {\r\n      var gratiereDay = parseISO(data.dataGratiere);\r\n      if (data.gratiereCurs === 'da') {\r\n        return { startDay: parseISO(data.dataDefinitiv), motiv: 'Termenul \u00eencepe de la data r\u0103m\u00e2nerii definitive (gra\u021bierea a vizat cauze \u00een curs).', baza: 'Art. 167 alin. (2) CP' };\r\n      }\r\n      return { startDay: gratiereDay, motiv: 'Termenul \u00eencepe de la data gra\u021bierii.', baza: 'Art. 167 alin. (2) CP' };\r\n    }\r\n\r\n    \/\/ 5. Liberare condi\u021bionat\u0103 - Art. 167 alin. (1) + (4)\r\n    if (data.dataLiberare) {\r\n      return { startDay: parseISO(data.dataLiberare), motiv: 'Termenul \u00eencepe de la expirarea termenului de supraveghere (liberare condi\u021bionat\u0103).', baza: 'Art. 167 alin. (1) \u0219i (4) CP' };\r\n    }\r\n\r\n    \/\/ 6. Executare efectiv\u0103 - Art. 167 alin. (1)\r\n    if (data.dataExecutare) {\r\n      return { startDay: parseISO(data.dataExecutare), motiv: 'Termenul \u00eencepe de la data finaliz\u0103rii execut\u0103rii pedepsei.', baza: 'Art. 167 alin. (1) CP' };\r\n    }\r\n\r\n    \/\/ 7. Prescrip\u021bie (\u00eenchisoare) - Art. 167 alin. (2)\r\n    if (data.dataPrescriptie) {\r\n      return { startDay: parseISO(data.dataPrescriptie), motiv: 'Termenul \u00eencepe de la data prescrip\u021biei execut\u0103rii.', baza: 'Art. 167 alin. (2) CP' };\r\n    }\r\n\r\n    return { startDay: null, motiv: 'Nu se poate determina data de start. Completa\u021bi datele necesare.', baza: 'Art. 167 CP' };\r\n  }\r\n\r\n  \/\/ === EVALUARE CONDITII ===\r\n  function evaluateConditions(data, isJudecatoreasca) {\r\n    var result = { infractiuneNoua: 'neclar', obligatiiCivile: 'neaplicabil', cheltuieli: 'neaplicabil', overall: 'neclar' };\r\n\r\n    if (data.infractiuneNoua === 'da') result.infractiuneNoua = 'neindeplinit';\r\n    else if (data.infractiuneNoua === 'nu') result.infractiuneNoua = 'indeplinit';\r\n\r\n    if (isJudecatoreasca) {\r\n      \/\/ Obliga\u021bii civile - Art. 168 alin. (1) lit. b) CP\r\n      if (data.obligatiiCivile === 'da' || data.victimaRenuntat === 'da' || data.imposibilitatePlata === 'da') {\r\n        result.obligatiiCivile = 'indeplinit';\r\n      } else if (data.obligatiiCivile === 'nu') {\r\n        result.obligatiiCivile = 'neindeplinit';\r\n      } else {\r\n        result.obligatiiCivile = 'neclar';\r\n      }\r\n\r\n      \/\/ Cheltuieli de judecat\u0103\r\n      if (data.cheltuieliJudecata === 'da' || data.imposibilitatePlata === 'da') {\r\n        result.cheltuieli = 'indeplinit';\r\n      } else if (data.cheltuieliJudecata === 'nu') {\r\n        result.cheltuieli = 'neindeplinit';\r\n      } else {\r\n        result.cheltuieli = 'neclar';\r\n      }\r\n    }\r\n\r\n    var all = [result.infractiuneNoua];\r\n    if (isJudecatoreasca) all.push(result.obligatiiCivile, result.cheltuieli);\r\n\r\n    if (all.some(function(c) { return c === 'neindeplinit'; })) result.overall = 'neindeplinit';\r\n    else if (all.some(function(c) { return c === 'neclar'; })) result.overall = 'neclar';\r\n    else result.overall = 'indeplinit';\r\n\r\n    return result;\r\n  }\r\n\r\n  \/\/ === CALCUL REABILITARE DE DREPT (Art. 165 CP) ===\r\n  function computeDeDrept(data, today) {\r\n    var tip = data.tipPedeapsa;\r\n    var durataLuni = data.durataLuni;\r\n    var explain = [];\r\n\r\n    \/\/ Verific\u0103 eligibilitatea\r\n    if (tip === 'detentiune') {\r\n      return { aplicabil: false, motiv: 'Deten\u021biunea pe via\u021b\u0103 nu este eligibil\u0103 pentru reabilitare de drept.', explain: [{ text: 'Deten\u021biunea pe via\u021b\u0103 nu este eligibil\u0103 pentru reabilitare de drept.', baza: 'Art. 165 CP' }] };\r\n    }\r\n\r\n    if (tip === 'inchisoare' && durataLuni > REGULI.DE_DREPT_MAX_LUNI) {\r\n      return { aplicabil: false, motiv: 'Pedeapsa de ' + durataLuni + ' luni dep\u0103\u0219e\u0219te limita de 24 luni (2 ani).', explain: [{ text: 'Pedeapsa dep\u0103\u0219e\u0219te 2 ani - se aplic\u0103 reabilitarea judec\u0103toreasc\u0103.', baza: 'Art. 165 alin. (1) lit. b) CP' }] };\r\n    }\r\n\r\n    var startResult = computeStartDate(data);\r\n    explain.push({ text: startResult.motiv, baza: startResult.baza });\r\n\r\n    if (!startResult.startDay) {\r\n      return { aplicabil: true, startDay: null, earliestDay: null, eligibil: null, conditions: evaluateConditions(data, false), explain: explain };\r\n    }\r\n\r\n    \/\/ Verific\u0103 c\u0103 data de start nu e \u00een viitor\r\n    if (startResult.startDay > today) {\r\n      explain.push({ text: 'Data de start a termenului este \u00een viitor.', baza: '' });\r\n      return { aplicabil: true, startDay: startResult.startDay, earliestDay: null, eligibil: false, conditions: evaluateConditions(data, false), explain: explain };\r\n    }\r\n\r\n    var earliestDay = addYears(startResult.startDay, REGULI.DE_DREPT_TERMEN);\r\n    var eligibil = today >= earliestDay;\r\n\r\n    explain.push({ text: 'Termenul de reabilitare de drept este de ' + REGULI.DE_DREPT_TERMEN + ' ani.', baza: 'Art. 165 CP' });\r\n\r\n    if (eligibil) {\r\n      explain.push({ text: 'Termenul s-a \u00eemplinit la data de ' + formatDay(earliestDay) + '.', baza: '' });\r\n      explain.push({ text: 'La \u00eemplinirea termenului, men\u021biunile se \u0219terg din oficiu din cazier.', baza: 'Art. 528 CPP' });\r\n    } else {\r\n      explain.push({ text: 'Termenul se va \u00eemplini la data de ' + formatDay(earliestDay) + '.', baza: '' });\r\n    }\r\n\r\n    var conditions = evaluateConditions(data, false);\r\n    if (conditions.infractiuneNoua === 'neindeplinit') {\r\n      explain.push({ text: 'S\u0103v\u00e2r\u0219irea unei infrac\u021biuni noi \u00eempiedic\u0103 reabilitarea de drept.', baza: 'Art. 165 CP' });\r\n    }\r\n\r\n    return { aplicabil: true, startDay: startResult.startDay, earliestDay: earliestDay, eligibil: eligibil, conditions: conditions, explain: explain };\r\n  }\r\n\r\n  \/\/ === CALCUL REABILITARE JUDEC\u0102TOREASC\u0102 (Art. 166 CP) ===\r\n  function computeJudecatoreasca(data, today) {\r\n    var tip = data.tipPedeapsa;\r\n    var durataLuni = data.durataLuni;\r\n    var explain = [];\r\n\r\n    \/\/ Verific\u0103 dac\u0103 se aplic\u0103 judec\u0103toreasca\r\n    if (tip === 'amenda') {\r\n      return { aplicabil: false, motiv: 'Pentru amend\u0103 se aplic\u0103 reabilitarea de drept.', explain: [{ text: 'Pentru amend\u0103 se aplic\u0103 reabilitarea de drept.', baza: 'Art. 165 CP' }] };\r\n    }\r\n\r\n    if (tip === 'suspendare') {\r\n      return { aplicabil: false, motiv: 'Pentru suspendare sub supraveghere se aplic\u0103 reabilitarea de drept.', explain: [{ text: 'Pentru suspendare sub supraveghere se aplic\u0103 reabilitarea de drept.', baza: 'Art. 165 alin. (1) lit. c) CP' }] };\r\n    }\r\n\r\n    if (tip === 'inchisoare' && durataLuni <= REGULI.DE_DREPT_MAX_LUNI) {\r\n      return { aplicabil: false, motiv: 'Pedeapsa de ' + durataLuni + ' luni beneficiaz\u0103 de reabilitare de drept.', explain: [{ text: 'Pedeapsa de ' + durataLuni + ' luni (sub 2 ani) beneficiaz\u0103 de reabilitare de drept.', baza: 'Art. 165 alin. (1) lit. b) CP' }] };\r\n    }\r\n\r\n    \/\/ Calculeaz\u0103 termenul\r\n    var termenAni;\r\n    if (tip === 'detentiune') {\r\n      \/\/ Diferen\u021biem \u00eentre comutat\u0103\/\u00eenlocuit\u0103 \u0219i stins\u0103 prin gra\u021biere\/prescrip\u021bie\r\n      if (data.dataGratiereDet || data.dataPrescriptieDet) {\r\n        \/\/ Art. 166 alin. (1) lit. d) - deten\u021biunea stins\u0103 prin gra\u021biere total\u0103 sau prescrip\u021bie\r\n        termenAni = REGULI.DETENTIUNE_EXECUTATA;\r\n        explain.push({ text: 'Pentru deten\u021biune pe via\u021b\u0103 stins\u0103 prin gra\u021biere total\u0103 sau prescrip\u021bie, termenul este de ' + termenAni + ' ani.', baza: 'Art. 166 alin. (1) lit. d) CP' });\r\n      } else if (data.dataComutare) {\r\n        \/\/ Art. 166 alin. (1) lit. c) - deten\u021biunea comutat\u0103 sau \u00eenlocuit\u0103\r\n        termenAni = REGULI.DETENTIUNE_COMUTATA;\r\n        explain.push({ text: 'Pentru deten\u021biune pe via\u021b\u0103 comutat\u0103 sau \u00eenlocuit\u0103 cu \u00eenchisoare, termenul este de ' + termenAni + ' ani.', baza: 'Art. 166 alin. (1) lit. c) CP' });\r\n      } else {\r\n        \/\/ Fallback dac\u0103 nu avem date complete\r\n        termenAni = REGULI.DETENTIUNE_COMUTATA;\r\n        explain.push({ text: 'Pentru deten\u021biune pe via\u021b\u0103, termenul minim este de ' + termenAni + ' ani.', baza: 'Art. 166 alin. (1) lit. c) CP' });\r\n      }\r\n    } else {\r\n      \/\/ \u00cenchisoare > 2 ani\r\n      for (var i = 0; i < REGULI.JUDECATOREASCA.length; i++) {\r\n        if (durataLuni <= REGULI.JUDECATOREASCA[i].maxLuni) {\r\n          termenAni = REGULI.JUDECATOREASCA[i].ani;\r\n          break;\r\n        }\r\n      }\r\n      var ani = Math.floor(durataLuni \/ 12);\r\n      var luni = durataLuni % 12;\r\n      var durataText = ani + ' ani' + (luni > 0 ? ' \u0219i ' + luni + ' luni' : '');\r\n      explain.push({ text: 'Pentru pedeapsa de ' + durataText + ', termenul de reabilitare este de ' + termenAni + ' ani.', baza: 'Art. 166 alin. (1) CP' });\r\n    }\r\n\r\n    var startResult = computeStartDate(data);\r\n    explain.push({ text: startResult.motiv, baza: startResult.baza });\r\n\r\n    if (!startResult.startDay) {\r\n      return { aplicabil: true, startDay: null, termenAni: termenAni, earliestDay: null, eligibil: null, conditions: evaluateConditions(data, true), explain: explain };\r\n    }\r\n\r\n    \/\/ Verific\u0103 c\u0103 data de start nu e \u00een viitor\r\n    if (startResult.startDay > today) {\r\n      explain.push({ text: 'Data de start a termenului este \u00een viitor.', baza: '' });\r\n      return { aplicabil: true, startDay: startResult.startDay, termenAni: termenAni, earliestDay: null, eligibil: false, conditions: evaluateConditions(data, true), explain: explain };\r\n    }\r\n\r\n    var earliestDay = addYears(startResult.startDay, termenAni);\r\n\r\n    \/\/ Verific\u0103 re\u00eennoire cerere (Art. 170 CP)\r\n    if (data.dataRespingere) {\r\n      var respingereDay = parseISO(data.dataRespingere);\r\n      if (respingereDay) {\r\n        var reinnoireDay = addYears(respingereDay, REGULI.REINNOIRE);\r\n        if (reinnoireDay > earliestDay) {\r\n          earliestDay = reinnoireDay;\r\n          explain.push({ text: 'Data de depunere ajustat\u0103 la ' + formatDay(earliestDay) + ' (re\u00eennoire cerere dup\u0103 respingere).', baza: 'Art. 170 CP' });\r\n        }\r\n      }\r\n    }\r\n\r\n    var eligibil = today >= earliestDay;\r\n    if (eligibil) {\r\n      explain.push({ text: 'Termenul minim pentru depunerea cererii s-a \u00eemplinit.', baza: '' });\r\n    } else {\r\n      explain.push({ text: 'Cererea poate fi depus\u0103 \u00eencep\u00e2nd cu ' + formatDay(earliestDay) + '.', baza: '' });\r\n    }\r\n\r\n    var conditions = evaluateConditions(data, true);\r\n    if (conditions.infractiuneNoua === 'neindeplinit') {\r\n      explain.push({ text: 'S\u0103v\u00e2r\u0219irea unei infrac\u021biuni noi \u00eempiedic\u0103 reabilitarea.', baza: 'Art. 168 alin. (1) lit. a) CP' });\r\n    }\r\n    if (conditions.obligatiiCivile === 'neindeplinit') {\r\n      explain.push({ text: 'Obliga\u021biile civile nu au fost \u00eendeplinite.', baza: 'Art. 168 alin. (1) lit. b) CP' });\r\n    }\r\n    if (conditions.cheltuieli === 'neindeplinit') {\r\n      explain.push({ text: 'Cheltuielile de judecat\u0103 nu au fost achitate.', baza: 'Art. 168 alin. (1) lit. b) CP' });\r\n    }\r\n\r\n    return { aplicabil: true, startDay: startResult.startDay, termenAni: termenAni, earliestDay: earliestDay, eligibil: eligibil, conditions: conditions, explain: explain };\r\n  }\r\n\r\n  function collectData() {\r\n    var tip = getField('tipPedeapsa')?.value || '';\r\n    var durataLuni = numVal(getField('durataAni')) * 12 + numVal(getField('durataLuni')) + Math.ceil(numVal(getField('durataZile')) \/ 30);\r\n\r\n    return {\r\n      tipPedeapsa: tip,\r\n      durataLuni: durataLuni,\r\n      dataDefinitiv: getField('dataDefinitiv')?.value || '',\r\n      dataAmenda: getField('dataAmenda')?.value || '',\r\n      dataSupraveghere: getField('dataSupraveghere')?.value || '',\r\n      \/\/ Toggle fields - \u00eenchisoare\r\n      areExecutare: getField('areExecutare')?.value || '',\r\n      dataExecutare: getField('dataExecutare')?.value || '',\r\n      areLiberare: getField('areLiberare')?.value || '',\r\n      dataLiberare: getField('dataLiberare')?.value || '',\r\n      arePrescriptie: getField('arePrescriptie')?.value || '',\r\n      dataPrescriptie: getField('dataPrescriptie')?.value || '',\r\n      areGratiere: getField('areGratiere')?.value || '',\r\n      dataGratiere: getField('dataGratiere')?.value || '',\r\n      gratiereCurs: getField('gratiereCurs')?.value || '',\r\n      \/\/ Toggle fields - deten\u021biune pe via\u021b\u0103\r\n      areComutare: getField('areComutare')?.value || '',\r\n      dataComutare: getField('dataComutare')?.value || '',\r\n      areGratiereDet: getField('areGratiereDet')?.value || '',\r\n      dataGratiereDet: getField('dataGratiereDet')?.value || '',\r\n      arePrescriptieDet: getField('arePrescriptieDet')?.value || '',\r\n      dataPrescriptieDet: getField('dataPrescriptieDet')?.value || '',\r\n      \/\/ Condi\u021bii\r\n      infractiuneNoua: getField('infractiuneNoua')?.value || '',\r\n      obligatiiCivile: getField('obligatiiCivile')?.value || '',\r\n      cheltuieliJudecata: getField('cheltuieliJudecata')?.value || '',\r\n      imposibilitatePlata: getField('imposibilitatePlata')?.value || '',\r\n      victimaRenuntat: getField('victimaRenuntat')?.value || '',\r\n      areRespingere: getField('areRespingere')?.value || '',\r\n      dataRespingere: getField('dataRespingere')?.value || ''\r\n    };\r\n  }\r\n\r\n  function validate(data) {\r\n    var errors = [];\r\n    if (!data.tipPedeapsa) errors.push('Selecta\u021bi tipul pedepsei.');\r\n    if (!data.dataDefinitiv) errors.push('Introduce\u021bi data r\u0103m\u00e2nerii definitive.');\r\n\r\n    if (data.tipPedeapsa === 'amenda' && !data.dataAmenda) {\r\n      errors.push('Introduce\u021bi data achit\u0103rii amenzii.');\r\n    }\r\n\r\n    if (data.tipPedeapsa === 'suspendare' && !data.dataSupraveghere) {\r\n      errors.push('Introduce\u021bi data \u00eemplinirii termenului de supraveghere.');\r\n    }\r\n\r\n    if ((data.tipPedeapsa === 'inchisoare' || data.tipPedeapsa === 'suspendare') && data.durataLuni <= 0) {\r\n      errors.push('Introduce\u021bi durata pedepsei.');\r\n    }\r\n\r\n    \/\/ Validate toggle fields pentru \u00eenchisoare\r\n    if (data.tipPedeapsa === 'inchisoare') {\r\n      if (data.areExecutare === 'da' && !data.dataExecutare) {\r\n        errors.push('Introduce\u021bi data liber\u0103rii din penitenciar.');\r\n      }\r\n      if (data.areLiberare === 'da' && !data.dataLiberare) {\r\n        errors.push('Introduce\u021bi data expir\u0103rii termenului de supraveghere (liberare condi\u021bionat\u0103).');\r\n      }\r\n      if (data.arePrescriptie === 'da' && !data.dataPrescriptie) {\r\n        errors.push('Introduce\u021bi data \u00eemplinirii prescrip\u021biei.');\r\n      }\r\n      if (data.areGratiere === 'da' && !data.dataGratiere) {\r\n        errors.push('Introduce\u021bi data gra\u021bierii.');\r\n      }\r\n\r\n      \/\/ Verific\u0103 c\u0103 cel pu\u021bin o modalitate este selectat\u0103\r\n      var hasModality = data.areExecutare === 'da' || data.areLiberare === 'da' ||\r\n                        data.arePrescriptie === 'da' || data.areGratiere === 'da';\r\n      if (!hasModality) {\r\n        errors.push('Selecta\u021bi cel pu\u021bin o modalitate de stingere a pedepsei.');\r\n      }\r\n    }\r\n\r\n    \/\/ Validate toggle fields pentru deten\u021biune pe via\u021b\u0103\r\n    if (data.tipPedeapsa === 'detentiune') {\r\n      if (data.areComutare === 'da' && !data.dataComutare) {\r\n        errors.push('Introduce\u021bi data execut\u0103rii pedepsei rezultate din comutare.');\r\n      }\r\n      if (data.areGratiereDet === 'da' && !data.dataGratiereDet) {\r\n        errors.push('Introduce\u021bi data gra\u021bierii.');\r\n      }\r\n      if (data.arePrescriptieDet === 'da' && !data.dataPrescriptieDet) {\r\n        errors.push('Introduce\u021bi data \u00eemplinirii prescrip\u021biei.');\r\n      }\r\n\r\n      \/\/ Verific\u0103 c\u0103 cel pu\u021bin o modalitate este selectat\u0103\r\n      var hasModalityDet = data.areComutare === 'da' || data.areGratiereDet === 'da' ||\r\n                           data.arePrescriptieDet === 'da';\r\n      if (!hasModalityDet) {\r\n        errors.push('Selecta\u021bi modalitatea prin care a \u00eencetat deten\u021biunea pe via\u021b\u0103.');\r\n      }\r\n    }\r\n\r\n    \/\/ Validate respingere toggle\r\n    if (data.areRespingere === 'da' && !data.dataRespingere) {\r\n      errors.push('Introduce\u021bi data respingerii cererii anterioare.');\r\n    }\r\n\r\n    return errors;\r\n  }\r\n\r\n  \/\/ === RENDER RESULT (safe DOM manipulation) ===\r\n  function renderResult(container, icon, badge, result, isJudecatoreasca) {\r\n    while (container.firstChild) container.removeChild(container.firstChild);\r\n\r\n    \/\/ Update icon\r\n    while (icon.firstChild) icon.removeChild(icon.firstChild);\r\n    icon.className = 'zic2__cardIcon';\r\n\r\n    var svg = document.createElementNS('http:\/\/www.w3.org\/2000\/svg', 'svg');\r\n    svg.setAttribute('width', '18');\r\n    svg.setAttribute('height', '18');\r\n    svg.setAttribute('viewBox', '0 0 24 24');\r\n    svg.setAttribute('fill', 'none');\r\n    svg.setAttribute('stroke', 'currentColor');\r\n    svg.setAttribute('stroke-width', '2.5');\r\n\r\n    if (!result.aplicabil) {\r\n      icon.classList.add('zic2__cardIcon--red');\r\n      var path = document.createElementNS('http:\/\/www.w3.org\/2000\/svg', 'path');\r\n      path.setAttribute('d', 'M18 6L6 18M6 6l12 12');\r\n      svg.appendChild(path);\r\n    } else if (result.eligibil === true && result.conditions?.overall === 'indeplinit') {\r\n      icon.classList.add('zic2__cardIcon--green');\r\n      var polyline = document.createElementNS('http:\/\/www.w3.org\/2000\/svg', 'polyline');\r\n      polyline.setAttribute('points', '20 6 9 17 4 12');\r\n      svg.appendChild(polyline);\r\n    } else if (result.eligibil === false || result.conditions?.overall === 'neindeplinit') {\r\n      icon.classList.add('zic2__cardIcon--red');\r\n      var path2 = document.createElementNS('http:\/\/www.w3.org\/2000\/svg', 'path');\r\n      path2.setAttribute('d', 'M18 6L6 18M6 6l12 12');\r\n      svg.appendChild(path2);\r\n    } else {\r\n      icon.classList.add('zic2__cardIcon--purple');\r\n      var circle = document.createElementNS('http:\/\/www.w3.org\/2000\/svg', 'circle');\r\n      circle.setAttribute('cx', '12');\r\n      circle.setAttribute('cy', '12');\r\n      circle.setAttribute('r', '10');\r\n      svg.appendChild(circle);\r\n      var path3 = document.createElementNS('http:\/\/www.w3.org\/2000\/svg', 'path');\r\n      path3.setAttribute('d', 'M9.09 9a3 3 0 0 1 5.83 1c0 2-3 3-3 3');\r\n      svg.appendChild(path3);\r\n      var path4 = document.createElementNS('http:\/\/www.w3.org\/2000\/svg', 'path');\r\n      path4.setAttribute('d', 'M12 17h.01');\r\n      svg.appendChild(path4);\r\n    }\r\n    icon.appendChild(svg);\r\n\r\n    \/\/ Update badge\r\n    badge.className = 'zic2__badge';\r\n    if (!result.aplicabil) {\r\n      badge.textContent = 'Nu se aplic\u0103';\r\n      badge.classList.add('zic2__badge--no');\r\n    } else if (result.eligibil === true && result.conditions?.overall === 'indeplinit') {\r\n      badge.textContent = 'Eligibil';\r\n      badge.classList.add('zic2__badge--yes');\r\n    } else if (result.eligibil === false) {\r\n      badge.textContent = '\u00cen curs';\r\n      badge.classList.add('zic2__badge--warning');\r\n    } else if (result.conditions?.overall === 'neindeplinit') {\r\n      badge.textContent = 'Condi\u021bii ne\u00eendeplinite';\r\n      badge.classList.add('zic2__badge--no');\r\n    } else {\r\n      badge.textContent = 'Neclar';\r\n      badge.classList.add('zic2__badge--warning');\r\n    }\r\n\r\n    \/\/ Content\r\n    if (!result.aplicabil) {\r\n      var motiv = document.createElement('div');\r\n      motiv.className = 'zic2__kpi';\r\n      var motivLabel = document.createElement('div');\r\n      motivLabel.className = 'zic2__kpiLabel';\r\n      motivLabel.textContent = 'Motiv';\r\n      var motivValue = document.createElement('p');\r\n      motivValue.className = 'zic2__kpiValue zic2__kpiValue--no';\r\n      motivValue.style.fontSize = '16px';\r\n      motivValue.textContent = result.motiv || 'Nu se aplic\u0103';\r\n      motiv.appendChild(motivLabel);\r\n      motiv.appendChild(motivValue);\r\n      container.appendChild(motiv);\r\n    } else {\r\n      \/\/ KPI Eligibilitate\r\n      var kpi1 = document.createElement('div');\r\n      kpi1.className = 'zic2__kpi';\r\n      var kpi1Label = document.createElement('div');\r\n      kpi1Label.className = 'zic2__kpiLabel';\r\n      kpi1Label.textContent = 'Eligibil calendaristic?';\r\n      var kpi1Value = document.createElement('p');\r\n      kpi1Value.className = 'zic2__kpiValue';\r\n      if (result.eligibil === true) { kpi1Value.textContent = 'Da'; kpi1Value.classList.add('zic2__kpiValue--yes'); }\r\n      else if (result.eligibil === false) { kpi1Value.textContent = 'Nu'; kpi1Value.classList.add('zic2__kpiValue--no'); }\r\n      else { kpi1Value.textContent = 'Neclar'; kpi1Value.classList.add('zic2__kpiValue--warning'); }\r\n      kpi1.appendChild(kpi1Label);\r\n      kpi1.appendChild(kpi1Value);\r\n      container.appendChild(kpi1);\r\n\r\n      \/\/ KPI Data\r\n      if (result.earliestDay) {\r\n        var kpi2 = document.createElement('div');\r\n        kpi2.className = 'zic2__kpi';\r\n        var kpi2Label = document.createElement('div');\r\n        kpi2Label.className = 'zic2__kpiLabel';\r\n        kpi2Label.textContent = isJudecatoreasca ? 'Data minim\u0103 depunere cerere' : 'Data minim\u0103 reabilitare';\r\n        var kpi2Value = document.createElement('p');\r\n        kpi2Value.className = 'zic2__kpiValue';\r\n        kpi2Value.textContent = formatDay(result.earliestDay);\r\n        kpi2.appendChild(kpi2Label);\r\n        kpi2.appendChild(kpi2Value);\r\n        container.appendChild(kpi2);\r\n      }\r\n\r\n      \/\/ Details Grid\r\n      var grid = document.createElement('div');\r\n      grid.className = 'zic2__detailsGrid';\r\n\r\n      var details = [];\r\n      if (result.startDay) details.push({ label: 'Data de start', value: formatDay(result.startDay) });\r\n      if (result.termenAni) details.push({ label: 'Termen', value: result.termenAni + ' ani' });\r\n\r\n      var condLabels = { indeplinit: { text: 'Da', cls: 'yes' }, neindeplinit: { text: 'Nu', cls: 'no' }, neclar: { text: 'Neclar', cls: '' }, neaplicabil: { text: 'N\/A', cls: '' } };\r\n      if (result.conditions) {\r\n        details.push({ label: 'F\u0103r\u0103 infrac\u021biune nou\u0103', value: condLabels[result.conditions.infractiuneNoua].text, cls: condLabels[result.conditions.infractiuneNoua].cls });\r\n        if (isJudecatoreasca) {\r\n          details.push({ label: 'Obliga\u021bii civile', value: condLabels[result.conditions.obligatiiCivile].text, cls: condLabels[result.conditions.obligatiiCivile].cls });\r\n          details.push({ label: 'Cheltuieli de judecat\u0103', value: condLabels[result.conditions.cheltuieli].text, cls: condLabels[result.conditions.cheltuieli].cls });\r\n        }\r\n      }\r\n\r\n      details.forEach(function(d) {\r\n        var item = document.createElement('div');\r\n        item.className = 'zic2__detailItem';\r\n        var label = document.createElement('div');\r\n        label.className = 'zic2__detailLabel';\r\n        label.textContent = d.label;\r\n        var value = document.createElement('div');\r\n        value.className = 'zic2__detailValue';\r\n        if (d.cls === 'yes') value.classList.add('zic2__detailValue--yes');\r\n        if (d.cls === 'no') value.classList.add('zic2__detailValue--no');\r\n        value.textContent = d.value;\r\n        item.appendChild(label);\r\n        item.appendChild(value);\r\n        grid.appendChild(item);\r\n      });\r\n      container.appendChild(grid);\r\n\r\n      \/\/ Explanations\r\n      if (result.explain && result.explain.length > 0) {\r\n        var explainDiv = document.createElement('div');\r\n        explainDiv.className = 'zic2__explanations';\r\n        var explainTitle = document.createElement('div');\r\n        explainTitle.className = 'zic2__explanationsTitle';\r\n        explainTitle.textContent = 'Explica\u021bii';\r\n        explainDiv.appendChild(explainTitle);\r\n\r\n        result.explain.forEach(function(e) {\r\n          var item = document.createElement('div');\r\n          item.className = 'zic2__explanationItem';\r\n          var text = document.createElement('span');\r\n          text.textContent = e.text;\r\n          item.appendChild(text);\r\n          if (e.baza) {\r\n            var basis = document.createElement('span');\r\n            basis.className = 'zic2__explanationBasis';\r\n            basis.textContent = e.baza;\r\n            item.appendChild(basis);\r\n          }\r\n          explainDiv.appendChild(item);\r\n        });\r\n        container.appendChild(explainDiv);\r\n      }\r\n    }\r\n  }\r\n\r\n  function calculate() {\r\n    hideErrors();\r\n    els.resultDeDrept.classList.add('is-hidden');\r\n    els.resultJudecatoreasca.classList.add('is-hidden');\r\n    els.proceduralGuide.classList.add('is-hidden');\r\n\r\n    var data = collectData();\r\n    var errors = validate(data);\r\n\r\n    if (errors.length) {\r\n      showErrors(errors);\r\n      return;\r\n    }\r\n\r\n    var today = todayDay();\r\n\r\n    \/\/ De Drept\r\n    var deDrept = computeDeDrept(data, today);\r\n    renderResult(els.contentDeDrept, els.iconDeDrept, els.badgeDeDrept, deDrept, false);\r\n    els.resultDeDrept.classList.remove('is-hidden');\r\n    els.resultDeDrept.className = 'zic2__card zic2__resultCard';\r\n    if (!deDrept.aplicabil) {\r\n      els.resultDeDrept.classList.add('zic2__resultCard--no');\r\n    } else if (deDrept.eligibil === true && deDrept.conditions?.overall === 'indeplinit') {\r\n      els.resultDeDrept.classList.add('zic2__resultCard--yes');\r\n    } else if (deDrept.eligibil === false || deDrept.conditions?.overall === 'neindeplinit') {\r\n      els.resultDeDrept.classList.add('zic2__resultCard--no');\r\n    } else {\r\n      els.resultDeDrept.classList.add('zic2__resultCard--warning');\r\n    }\r\n\r\n    \/\/ Judecatoreasca\r\n    var judecatoreasca = computeJudecatoreasca(data, today);\r\n    renderResult(els.contentJudecatoreasca, els.iconJudecatoreasca, els.badgeJudecatoreasca, judecatoreasca, true);\r\n    els.resultJudecatoreasca.classList.remove('is-hidden');\r\n    els.resultJudecatoreasca.className = 'zic2__card zic2__resultCard';\r\n    if (!judecatoreasca.aplicabil) {\r\n      els.resultJudecatoreasca.classList.add('zic2__resultCard--no');\r\n    } else if (judecatoreasca.eligibil === true && judecatoreasca.conditions?.overall === 'indeplinit') {\r\n      els.resultJudecatoreasca.classList.add('zic2__resultCard--yes');\r\n    } else if (judecatoreasca.eligibil === false || judecatoreasca.conditions?.overall === 'neindeplinit') {\r\n      els.resultJudecatoreasca.classList.add('zic2__resultCard--no');\r\n    } else {\r\n      els.resultJudecatoreasca.classList.add('zic2__resultCard--warning');\r\n    }\r\n\r\n    \/\/ Ghid procedural\r\n    renderProceduralGuide(deDrept, judecatoreasca, data);\r\n\r\n    \/\/ Store last result for PDF\r\n    state.lastResult = { deDrept: deDrept, judecatoreasca: judecatoreasca, data: data };\r\n\r\n    \/\/ Scroll to results\r\n    setTimeout(function() {\r\n      els.resultDeDrept.scrollIntoView({ behavior: 'smooth', block: 'nearest' });\r\n    }, 100);\r\n  }\r\n\r\n  function renderProceduralGuide(deDrept, judecatoreasca, data) {\r\n    \/\/ Show procedural guide only if judecatoreasca is applicable and eligible\r\n    \/\/ The guide contains static content for the judicial rehabilitation procedure\r\n    var showGuide = judecatoreasca.aplicabil && judecatoreasca.eligibil === true;\r\n\r\n    if (showGuide) {\r\n      els.proceduralGuide.classList.remove('is-hidden');\r\n    } else {\r\n      els.proceduralGuide.classList.add('is-hidden');\r\n    }\r\n  }\r\n\r\n  function reset() {\r\n    \/\/ Reset all fields\r\n    var inputs = $$('.zic2__input');\r\n    inputs.forEach(function(input) {\r\n      if (input.type === 'date') input.value = '';\r\n      else if (input.type === 'number') input.value = '';\r\n    });\r\n\r\n    var selects = $$('.zic2__select');\r\n    selects.forEach(function(select) {\r\n      select.value = '';\r\n    });\r\n\r\n    hideErrors();\r\n    els.resultDeDrept.classList.add('is-hidden');\r\n    els.resultJudecatoreasca.classList.add('is-hidden');\r\n    els.proceduralGuide.classList.add('is-hidden');\r\n    state.lastResult = null;\r\n\r\n    updateConditionalSections();\r\n    updateToggleFields();\r\n  }\r\n\r\n  function fillExample() {\r\n    \/\/ Exemplu: \u00cenchisoare 3 ani, executat\u0103 integral\r\n    getField('tipPedeapsa').value = 'inchisoare';\r\n    getField('durataAni').value = '3';\r\n    getField('durataLuni').value = '0';\r\n    getField('durataZile').value = '0';\r\n    getField('dataDefinitiv').value = '2018-06-15';\r\n\r\n    \/\/ Toggle fields\r\n    getField('areExecutare').value = 'da';\r\n    getField('dataExecutare').value = '2021-06-15';\r\n    getField('areLiberare').value = 'nu';\r\n    getField('arePrescriptie').value = 'nu';\r\n    getField('areGratiere').value = 'nu';\r\n\r\n    \/\/ Condi\u021bii\r\n    getField('infractiuneNoua').value = 'nu';\r\n    getField('obligatiiCivile').value = 'da';\r\n    getField('cheltuieliJudecata').value = 'da';\r\n    getField('areRespingere').value = 'nu';\r\n\r\n    updateConditionalSections();\r\n    updateToggleFields();\r\n    hideErrors();\r\n    els.resultDeDrept.classList.add('is-hidden');\r\n    els.resultJudecatoreasca.classList.add('is-hidden');\r\n    els.proceduralGuide.classList.add('is-hidden');\r\n  }\r\n\r\n  function exportPDF() {\r\n    if (!state.lastResult) {\r\n      alert('Calcula\u021bi mai \u00eent\u00e2i rezultatul pentru a genera PDF-ul.');\r\n      return;\r\n    }\r\n\r\n    var printWindow = window.open('', '_blank');\r\n    if (!printWindow) {\r\n      alert('Permite\u021bi pop-up-urile pentru a genera PDF-ul.');\r\n      return;\r\n    }\r\n\r\n    var deDrept = state.lastResult.deDrept;\r\n    var judecatoreasca = state.lastResult.judecatoreasca;\r\n    var data = state.lastResult.data;\r\n\r\n    var dateStr = new Date().toLocaleDateString('ro-RO', {\r\n      year: 'numeric', month: 'long', day: 'numeric'\r\n    });\r\n\r\n    var tipLabels = {\r\n      'amenda': 'Amend\u0103 penal\u0103',\r\n      'inchisoare': '\u00cenchisoare',\r\n      'suspendare': '\u00cenchisoare cu suspendare sub supraveghere',\r\n      'detentiune': 'Deten\u021biune pe via\u021b\u0103'\r\n    };\r\n\r\n    var doc = printWindow.document;\r\n    doc.open();\r\n    doc.write('<!DOCTYPE html><html lang=\"ro\"><head><meta charset=\"UTF-8\"><title>Raport calculator reabilitare - ZIC Legal<\/title>');\r\n    doc.write('<style>');\r\n    doc.write('* { box-sizing: border-box; margin: 0; padding: 0; }');\r\n    doc.write('body { font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif; max-width: 700px; margin: 0 auto; padding: 40px 30px; color: #1F2937; line-height: 1.6; }');\r\n    doc.write('.header { border-bottom: 3px solid #8A88FF; padding-bottom: 20px; margin-bottom: 30px; }');\r\n    doc.write('.header h1 { color: #6F6CFF; font-size: 24px; margin-bottom: 5px; }');\r\n    doc.write('.header p { color: #6B7280; font-size: 14px; }');\r\n    doc.write('.section { margin-bottom: 25px; }');\r\n    doc.write('.section h2 { color: #374151; font-size: 18px; margin-bottom: 10px; border-bottom: 1px solid #E5E7EB; padding-bottom: 8px; }');\r\n    doc.write('.info { background: #F9FAFB; border-radius: 8px; padding: 15px; margin-bottom: 20px; font-size: 14px; }');\r\n    doc.write('.info-row { margin-bottom: 8px; }');\r\n    doc.write('.info-row strong { color: #374151; }');\r\n    doc.write('.result { padding: 15px; border-radius: 8px; margin-bottom: 15px; }');\r\n    doc.write('.result--yes { background: #ECFDF5; border: 1px solid #10B981; }');\r\n    doc.write('.result--no { background: #FEF2F2; border: 1px solid #EF4444; }');\r\n    doc.write('.result--warning { background: #FFFBEB; border: 1px solid #F59E0B; }');\r\n    doc.write('.result h3 { font-size: 16px; margin-bottom: 10px; }');\r\n    doc.write('.result p { font-size: 14px; margin-bottom: 5px; }');\r\n    doc.write('.yes { color: #10B981; font-weight: 600; }');\r\n    doc.write('.no { color: #EF4444; font-weight: 600; }');\r\n    doc.write('.warning { color: #F59E0B; font-weight: 600; }');\r\n    doc.write('.explanation { font-size: 13px; color: #6B7280; margin-top: 10px; padding-top: 10px; border-top: 1px dashed #E5E7EB; }');\r\n    doc.write('.explanation-item { margin-bottom: 5px; }');\r\n    doc.write('.basis { font-style: italic; color: #8B5CF6; margin-left: 5px; }');\r\n    doc.write('.footer { margin-top: 40px; padding-top: 20px; border-top: 1px solid #E5E7EB; text-align: center; color: #6B7280; font-size: 12px; }');\r\n    doc.write('.footer a { color: #6F6CFF; text-decoration: none; }');\r\n    doc.write('.disclaimer { margin-top: 30px; padding: 15px; background: #F3F4F6; border-radius: 8px; font-size: 11px; color: #6B7280; }');\r\n    doc.write('@media print { body { padding: 20px; } }');\r\n    doc.write('<\/style><\/head><body>');\r\n    doc.close();\r\n\r\n    var body = doc.body;\r\n\r\n    \/\/ Header\r\n    var header = doc.createElement('div');\r\n    header.className = 'header';\r\n    var h1 = doc.createElement('h1');\r\n    h1.textContent = 'Calculator reabilitare';\r\n    header.appendChild(h1);\r\n    var datePara = doc.createElement('p');\r\n    datePara.textContent = 'Raport generat la ' + dateStr;\r\n    header.appendChild(datePara);\r\n    body.appendChild(header);\r\n\r\n    \/\/ Info section\r\n    var info = doc.createElement('div');\r\n    info.className = 'info';\r\n\r\n    var tipRow = doc.createElement('div');\r\n    tipRow.className = 'info-row';\r\n    var tipStrong = doc.createElement('strong');\r\n    tipStrong.textContent = 'Tipul pedepsei: ';\r\n    tipRow.appendChild(tipStrong);\r\n    tipRow.appendChild(doc.createTextNode(tipLabels[data.tipPedeapsa] || data.tipPedeapsa));\r\n    info.appendChild(tipRow);\r\n\r\n    if (data.durataLuni > 0) {\r\n      var durataRow = doc.createElement('div');\r\n      durataRow.className = 'info-row';\r\n      var durataStrong = doc.createElement('strong');\r\n      durataStrong.textContent = 'Durata: ';\r\n      durataRow.appendChild(durataStrong);\r\n      var ani = Math.floor(data.durataLuni \/ 12);\r\n      var luni = data.durataLuni % 12;\r\n      var durataText = ani > 0 ? ani + ' ani' : '';\r\n      if (luni > 0) durataText += (durataText ? ' \u0219i ' : '') + luni + ' luni';\r\n      durataRow.appendChild(doc.createTextNode(durataText));\r\n      info.appendChild(durataRow);\r\n    }\r\n\r\n    body.appendChild(info);\r\n\r\n    \/\/ De Drept Result\r\n    var sectionDeDrept = doc.createElement('div');\r\n    sectionDeDrept.className = 'section';\r\n    var h2DeDrept = doc.createElement('h2');\r\n    h2DeDrept.textContent = 'Reabilitare de drept (Art. 165 CP)';\r\n    sectionDeDrept.appendChild(h2DeDrept);\r\n\r\n    var resultDeDrept = doc.createElement('div');\r\n    resultDeDrept.className = 'result';\r\n    if (!deDrept.aplicabil) {\r\n      resultDeDrept.classList.add('result--no');\r\n    } else if (deDrept.eligibil === true && deDrept.conditions?.overall === 'indeplinit') {\r\n      resultDeDrept.classList.add('result--yes');\r\n    } else {\r\n      resultDeDrept.classList.add('result--warning');\r\n    }\r\n\r\n    var statusDeDrept = doc.createElement('p');\r\n    if (!deDrept.aplicabil) {\r\n      statusDeDrept.className = 'no';\r\n      statusDeDrept.textContent = 'Nu se aplic\u0103: ' + (deDrept.motiv || '');\r\n    } else if (deDrept.eligibil === true && deDrept.conditions?.overall === 'indeplinit') {\r\n      statusDeDrept.className = 'yes';\r\n      statusDeDrept.textContent = 'Eligibil - Reabilitarea opereaz\u0103 de drept';\r\n    } else if (deDrept.eligibil === false) {\r\n      statusDeDrept.className = 'warning';\r\n      statusDeDrept.textContent = 'Termenul nu s-a \u00eemplinit \u00eenc\u0103';\r\n    } else {\r\n      statusDeDrept.className = 'warning';\r\n      statusDeDrept.textContent = 'Verifica\u021bi condi\u021biile';\r\n    }\r\n    resultDeDrept.appendChild(statusDeDrept);\r\n\r\n    if (deDrept.earliestDay) {\r\n      var dataDeDrept = doc.createElement('p');\r\n      dataDeDrept.textContent = 'Data eligibilit\u0103\u021bii: ' + formatDay(deDrept.earliestDay);\r\n      resultDeDrept.appendChild(dataDeDrept);\r\n    }\r\n\r\n    if (deDrept.explain && deDrept.explain.length > 0) {\r\n      var explDeDrept = doc.createElement('div');\r\n      explDeDrept.className = 'explanation';\r\n      deDrept.explain.forEach(function(e) {\r\n        var item = doc.createElement('div');\r\n        item.className = 'explanation-item';\r\n        item.textContent = e.text;\r\n        if (e.baza) {\r\n          var basis = doc.createElement('span');\r\n          basis.className = 'basis';\r\n          basis.textContent = '(' + e.baza + ')';\r\n          item.appendChild(basis);\r\n        }\r\n        explDeDrept.appendChild(item);\r\n      });\r\n      resultDeDrept.appendChild(explDeDrept);\r\n    }\r\n    sectionDeDrept.appendChild(resultDeDrept);\r\n    body.appendChild(sectionDeDrept);\r\n\r\n    \/\/ Judecatoreasca Result\r\n    var sectionJud = doc.createElement('div');\r\n    sectionJud.className = 'section';\r\n    var h2Jud = doc.createElement('h2');\r\n    h2Jud.textContent = 'Reabilitare judec\u0103toreasc\u0103 (Art. 166 CP)';\r\n    sectionJud.appendChild(h2Jud);\r\n\r\n    var resultJud = doc.createElement('div');\r\n    resultJud.className = 'result';\r\n    if (!judecatoreasca.aplicabil) {\r\n      resultJud.classList.add('result--no');\r\n    } else if (judecatoreasca.eligibil === true && judecatoreasca.conditions?.overall === 'indeplinit') {\r\n      resultJud.classList.add('result--yes');\r\n    } else {\r\n      resultJud.classList.add('result--warning');\r\n    }\r\n\r\n    var statusJud = doc.createElement('p');\r\n    if (!judecatoreasca.aplicabil) {\r\n      statusJud.className = 'no';\r\n      statusJud.textContent = 'Nu se aplic\u0103: ' + (judecatoreasca.motiv || '');\r\n    } else if (judecatoreasca.eligibil === true && judecatoreasca.conditions?.overall === 'indeplinit') {\r\n      statusJud.className = 'yes';\r\n      statusJud.textContent = 'Eligibil - Cererea poate fi depus\u0103';\r\n    } else if (judecatoreasca.eligibil === false) {\r\n      statusJud.className = 'warning';\r\n      statusJud.textContent = 'Termenul nu s-a \u00eemplinit \u00eenc\u0103';\r\n    } else {\r\n      statusJud.className = 'warning';\r\n      statusJud.textContent = 'Verifica\u021bi condi\u021biile';\r\n    }\r\n    resultJud.appendChild(statusJud);\r\n\r\n    if (judecatoreasca.earliestDay) {\r\n      var dataJud = doc.createElement('p');\r\n      dataJud.textContent = 'Data eligibilit\u0103\u021bii: ' + formatDay(judecatoreasca.earliestDay);\r\n      resultJud.appendChild(dataJud);\r\n    }\r\n\r\n    if (judecatoreasca.explain && judecatoreasca.explain.length > 0) {\r\n      var explJud = doc.createElement('div');\r\n      explJud.className = 'explanation';\r\n      judecatoreasca.explain.forEach(function(e) {\r\n        var item = doc.createElement('div');\r\n        item.className = 'explanation-item';\r\n        item.textContent = e.text;\r\n        if (e.baza) {\r\n          var basis = doc.createElement('span');\r\n          basis.className = 'basis';\r\n          basis.textContent = '(' + e.baza + ')';\r\n          item.appendChild(basis);\r\n        }\r\n        explJud.appendChild(item);\r\n      });\r\n      resultJud.appendChild(explJud);\r\n    }\r\n    sectionJud.appendChild(resultJud);\r\n    body.appendChild(sectionJud);\r\n\r\n    \/\/ Disclaimer\r\n    var disclaimer = doc.createElement('div');\r\n    disclaimer.className = 'disclaimer';\r\n    var discStrong = doc.createElement('strong');\r\n    discStrong.textContent = 'Disclaimer: ';\r\n    disclaimer.appendChild(discStrong);\r\n    disclaimer.appendChild(doc.createTextNode('Acest raport este oferit exclusiv \u00een scop informativ \u0219i educativ. Rezultatele generate nu constituie consultan\u021b\u0103 juridic\u0103 \u0219i nu pot \u00eenlocui sfatul unui avocat specializat. Termenele calculate pot varia \u00een func\u021bie de circumstan\u021bele specifice ale fiec\u0103rui caz.'));\r\n    body.appendChild(disclaimer);\r\n\r\n    \/\/ Footer\r\n    var footer = doc.createElement('div');\r\n    footer.className = 'footer';\r\n    var footerP1 = doc.createElement('p');\r\n    footerP1.textContent = 'Generat cu Calculator reabilitare';\r\n    footer.appendChild(footerP1);\r\n    var footerP2 = doc.createElement('p');\r\n    var footerLink = doc.createElement('a');\r\n    footerLink.href = 'https:\/\/zic.legal';\r\n    footerLink.textContent = 'ZIC Legal';\r\n    footerLink.rel = 'noopener noreferrer';\r\n    footerP2.appendChild(footerLink);\r\n    footer.appendChild(footerP2);\r\n    body.appendChild(footer);\r\n\r\n    printWindow.focus();\r\n    setTimeout(function() {\r\n      printWindow.print();\r\n    }, 300);\r\n  }\r\n\r\n  \/\/ === Event Handlers ===\r\n  function handleClick(e) {\r\n    var button = e.target.closest('[data-action]');\r\n    if (!button) return;\r\n\r\n    var action = button.dataset.action;\r\n\r\n    switch (action) {\r\n      case 'calculate':\r\n        calculate();\r\n        break;\r\n      case 'reset':\r\n        reset();\r\n        break;\r\n      case 'example':\r\n        fillExample();\r\n        break;\r\n      case 'export-pdf':\r\n        exportPDF();\r\n        break;\r\n    }\r\n  }\r\n\r\n  function handleChange(e) {\r\n    var target = e.target;\r\n    var field = target.dataset.field;\r\n    if (!field) return;\r\n\r\n    \/\/ Update conditional sections when tipPedeapsa changes\r\n    if (field === 'tipPedeapsa') {\r\n      updateConditionalSections();\r\n    }\r\n\r\n    \/\/ Update toggle fields when toggle selects change\r\n    if (target.dataset.toggleTarget) {\r\n      updateToggleFields();\r\n    }\r\n  }\r\n\r\n  \/\/ === SECURITY: Validate input on keydown to prevent invalid characters ===\r\n  function handleKeydown(e) {\r\n    var input = e.target;\r\n    if (!input.matches('.zic2__input[type=\"number\"]')) return;\r\n\r\n    var allowedKeys = ['Backspace', 'Delete', 'Tab', 'Escape', 'Enter', 'ArrowLeft', 'ArrowRight', 'ArrowUp', 'ArrowDown', 'Home', 'End'];\r\n    if (allowedKeys.indexOf(e.key) !== -1) return;\r\n\r\n    if ((e.ctrlKey || e.metaKey) && ['a', 'c', 'v', 'x'].indexOf(e.key.toLowerCase()) !== -1) return;\r\n\r\n    if (!\/^[0-9]$\/.test(e.key)) {\r\n      e.preventDefault();\r\n    }\r\n  }\r\n\r\n  \/\/ === SECURITY: Sanitize pasted content ===\r\n  function handlePaste(e) {\r\n    var input = e.target;\r\n    if (!input.matches('.zic2__input[type=\"number\"]')) return;\r\n\r\n    var pastedData = (e.clipboardData || window.clipboardData).getData('text');\r\n    if (!\/^\\d*$\/.test(pastedData)) {\r\n      e.preventDefault();\r\n      var digitsOnly = pastedData.replace(\/\\D\/g, '');\r\n      if (digitsOnly) {\r\n        var start = input.selectionStart;\r\n        var end = input.selectionEnd;\r\n        var currentValue = input.value;\r\n        input.value = currentValue.substring(0, start) + digitsOnly + currentValue.substring(end);\r\n        input.setSelectionRange(start + digitsOnly.length, start + digitsOnly.length);\r\n        input.dispatchEvent(new Event('change', { bubbles: true }));\r\n      }\r\n    }\r\n  }\r\n\r\n  \/\/ === Initialize ===\r\n  function init() {\r\n    root.addEventListener('click', handleClick);\r\n    root.addEventListener('change', handleChange);\r\n    root.addEventListener('input', handleChange);\r\n    root.addEventListener('keydown', handleKeydown, true);\r\n    root.addEventListener('paste', handlePaste, true);\r\n\r\n    updateConditionalSections();\r\n    updateToggleFields();\r\n  }\r\n\r\n  if (document.readyState === 'loading') {\r\n    document.addEventListener('DOMContentLoaded', init);\r\n  } else {\r\n    init();\r\n  }\r\n})();\r\n<\/script>\r\n<\/div><\/div>\n<div data-tool-content=\"cazier\" style=\"display:none\"><div id=\"zic-cazier-calculator-v2\" class=\"zic2\" data-zic2=\"1\">\r\n  <div class=\"zic2__wrap\">\r\n    <!-- Header -->\r\n    <header class=\"zic2__hero\">\r\n      <div class=\"zic2__brandbar\">\r\n        <div class=\"zic2__mark\" aria-hidden=\"true\">\r\n          <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n            <path d=\"M3 6h18M3 12h18M3 18h18\"\/>\r\n            <circle cx=\"17\" cy=\"6\" r=\"2\" fill=\"currentColor\"\/>\r\n            <circle cx=\"7\" cy=\"12\" r=\"2\" fill=\"currentColor\"\/>\r\n            <circle cx=\"14\" cy=\"18\" r=\"2\" fill=\"currentColor\"\/>\r\n          <\/svg>\r\n        <\/div>\r\n        <div class=\"zic2__headerText\">\r\n          <h2 class=\"zic2__title\">Calculator pedeaps\u0103 rezultant\u0103<\/h2>\r\n          <p class=\"zic2__subtitle\">Analiz\u0103 cazier + dosar curent | Concurs, recidiv\u0103, pluralitate intermediar\u0103<\/p>\r\n        <\/div>\r\n      <\/div>\r\n    <\/header>\r\n\r\n    <!-- Info box -->\r\n    <div class=\"zic2__formula\">\r\n      <div class=\"zic2__formulaIcon\">\r\n        <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n          <circle cx=\"12\" cy=\"12\" r=\"10\"\/>\r\n          <path d=\"M12 16v-4\"\/>\r\n          <path d=\"M12 8h.01\"\/>\r\n        <\/svg>\r\n      <\/div>\r\n      <div class=\"zic2__formulaText\">\r\n        <strong>Format date:<\/strong> <code>dd.mm.yyyy<\/code> (sau <code>dd\/mm\/yyyy<\/code>, <code>yyyy-mm-dd<\/code>) | <strong>Informativ:<\/strong> nu consultan\u021b\u0103 juridic\u0103\r\n      <\/div>\r\n    <\/div>\r\n\r\n    <!-- Top bar -->\r\n    <div class=\"zic2__topBar\">\r\n      <div class=\"zic2__field zic2__field--grow\">\r\n        <label class=\"zic2__label\" for=\"zic2-personType\">Tip subiect (pentru amenzi)<\/label>\r\n        <select id=\"zic2-personType\" class=\"zic2__select\" data-field=\"personType\">\r\n          <option value=\"fizica\" selected>Persoan\u0103 fizic\u0103 (max 400 zile-amend\u0103)<\/option>\r\n          <option value=\"juridica\">Persoan\u0103 juridic\u0103 (max 600 zile-amend\u0103)<\/option>\r\n        <\/select>\r\n      <\/div>\r\n      <div class=\"zic2__btnGroup\">\r\n        <button type=\"button\" class=\"zic2__btn zic2__btn--success\" data-action=\"loadSample\">\r\n          <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><path d=\"M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z\"\/><polyline points=\"14 2 14 8 20 8\"\/><\/svg>\r\n          Exemplu\r\n        <\/button>\r\n      <\/div>\r\n    <\/div>\r\n\r\n    <!-- Card 1: Condamn\u0103ri anterioare -->\r\n    <section class=\"zic2__card\" aria-labelledby=\"zic2-sec-conv\">\r\n      <div class=\"zic2__cardHeader\">\r\n        <div class=\"zic2__cardIcon zic2__cardIcon--purple\">\r\n          <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n            <path d=\"M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z\"\/>\r\n            <polyline points=\"14,2 14,8 20,8\"\/>\r\n          <\/svg>\r\n        <\/div>\r\n        <h3 id=\"zic2-sec-conv\" class=\"zic2__cardTitle\">1. Condamn\u0103ri anterioare (cazier)<\/h3>\r\n        <div class=\"zic2__spacer\"><\/div>\r\n        <div class=\"zic2__btnGroup\">\r\n          <button type=\"button\" class=\"zic2__btn zic2__btn--outline zic2__btn--small\" data-action=\"addConv\">+ Adaug\u0103<\/button>\r\n          <button type=\"button\" class=\"zic2__btn zic2__btn--outline zic2__btn--small\" data-action=\"resetConv\">Reset<\/button>\r\n        <\/div>\r\n      <\/div>\r\n      <div class=\"zic2__list\" data-list=\"conv\"><\/div>\r\n    <\/section>\r\n\r\n    <!-- Card 2: Fapte dosar curent -->\r\n    <section class=\"zic2__card\" aria-labelledby=\"zic2-sec-off\">\r\n      <div class=\"zic2__cardHeader\">\r\n        <div class=\"zic2__cardIcon zic2__cardIcon--blue\">\r\n          <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n            <circle cx=\"12\" cy=\"12\" r=\"10\"\/>\r\n            <path d=\"M12 6v6l4 2\"\/>\r\n          <\/svg>\r\n        <\/div>\r\n        <h3 id=\"zic2-sec-off\" class=\"zic2__cardTitle\">2. Fapte \u00een dosarul curent<\/h3>\r\n        <div class=\"zic2__spacer\"><\/div>\r\n        <div class=\"zic2__btnGroup\">\r\n          <button type=\"button\" class=\"zic2__btn zic2__btn--outline zic2__btn--small\" data-action=\"addOff\">+ Adaug\u0103<\/button>\r\n          <button type=\"button\" class=\"zic2__btn zic2__btn--outline zic2__btn--small\" data-action=\"resetOff\">Reset<\/button>\r\n        <\/div>\r\n      <\/div>\r\n      <div class=\"zic2__list\" data-list=\"off\"><\/div>\r\n    <\/section>\r\n\r\n    <!-- Card 3: Timeline -->\r\n    <section class=\"zic2__card\" aria-labelledby=\"zic2-sec-timeline\">\r\n      <div class=\"zic2__cardHeader\">\r\n        <div class=\"zic2__cardIcon zic2__cardIcon--green\">\r\n          <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n            <circle cx=\"12\" cy=\"12\" r=\"10\"\/>\r\n            <path d=\"M12 6v6l4 2\"\/>\r\n            <path d=\"M3 12h2\"\/>\r\n          <\/svg>\r\n        <\/div>\r\n        <h3 id=\"zic2-sec-timeline\" class=\"zic2__cardTitle\">3. Timeline<\/h3>\r\n        <div class=\"zic2__spacer\"><\/div>\r\n        <label class=\"zic2__toggle\">\r\n          <input type=\"checkbox\" data-field=\"showTimeline\" checked>\r\n          <span>Afi\u0219eaz\u0103<\/span>\r\n        <\/label>\r\n      <\/div>\r\n      <div data-timeline-wrap>\r\n        <div class=\"zic2__timeline\" data-timeline><\/div>\r\n      <\/div>\r\n    <\/section>\r\n\r\n    <!-- Card 4: Calcul -->\r\n    <section class=\"zic2__card\" aria-labelledby=\"zic2-sec-calc\">\r\n      <div class=\"zic2__cardHeader\">\r\n        <div class=\"zic2__cardIcon zic2__cardIcon--purple\">\r\n          <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n            <polyline points=\"9 11 12 14 22 4\"\/>\r\n            <path d=\"M21 12v7a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h11\"\/>\r\n          <\/svg>\r\n        <\/div>\r\n        <h3 id=\"zic2-sec-calc\" class=\"zic2__cardTitle\">4. Calculeaz\u0103<\/h3>\r\n      <\/div>\r\n\r\n      <!-- Actions -->\r\n      <div class=\"zic2__actions\">\r\n        <button type=\"button\" class=\"zic2__btn zic2__btn--primary zic2__btn--large\" data-action=\"calculate\">\r\n          <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\"><polyline points=\"9 11 12 14 22 4\"\/><path d=\"M21 12v7a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h11\"\/><\/svg>\r\n          Calculeaz\u0103\r\n        <\/button>\r\n        <button type=\"button\" class=\"zic2__btn zic2__btn--secondary\" data-action=\"exportPdf\">\r\n          <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><path d=\"M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z\"\/><polyline points=\"14 2 14 8 20 8\"\/><path d=\"M12 18v-6\"\/><path d=\"M9 15l3 3 3-3\"\/><\/svg>\r\n          Descarc\u0103 PDF\r\n        <\/button>\r\n        <button type=\"button\" class=\"zic2__btn zic2__btn--secondary\" data-action=\"resetAll\">\r\n          <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><path d=\"M3 12a9 9 0 1 0 9-9 9.75 9.75 0 0 0-6.74 2.74L3 8\"\/><path d=\"M3 3v5h5\"\/><\/svg>\r\n          Reset tot\r\n        <\/button>\r\n      <\/div>\r\n\r\n      <!-- Results -->\r\n      <div class=\"zic2__results\" data-results>\r\n        <div class=\"zic2__resultGrid\">\r\n          <div class=\"zic2__finalBox\">\r\n            <div class=\"zic2__finalLabel\">Rezultat final<\/div>\r\n            <div class=\"zic2__finalValue\" data-final>\u2014<\/div>\r\n            <div class=\"zic2__finalMeta\" data-final-meta><\/div>\r\n          <\/div>\r\n\r\n          <div class=\"zic2__explainBox\">\r\n            <div class=\"zic2__explainHead\">\r\n              <span class=\"zic2__explainTitle\">Explica\u021bie<\/span>\r\n              <span class=\"zic2__status\" data-status><\/span>\r\n            <\/div>\r\n            <ol class=\"zic2__steps\" data-steps>\r\n              <li>Completeaz\u0103 datele \u0219i apas\u0103 \"Calculeaz\u0103\".<\/li>\r\n            <\/ol>\r\n            <details class=\"zic2__techDetails\">\r\n              <summary>Detalii tehnice (audit)<\/summary>\r\n              <pre class=\"zic2__techPre\" data-audit><\/pre>\r\n            <\/details>\r\n          <\/div>\r\n        <\/div>\r\n      <\/div>\r\n    <\/section>\r\n\r\n    <!-- Disclaimer -->\r\n    <div class=\"zic2__disclaimer\">\r\n      <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><path d=\"M10.29 3.86L1.82 18a2 2 0 0 0 1.71 3h16.94a2 2 0 0 0 1.71-3L13.71 3.86a2 2 0 0 0-3.42 0z\"\/><line x1=\"12\" y1=\"9\" x2=\"12\" y2=\"13\"\/><line x1=\"12\" y1=\"17\" x2=\"12.01\" y2=\"17\"\/><\/svg>\r\n      <div>\r\n        <strong>Disclaimer:<\/strong> Acest calculator este oferit exclusiv \u00een scop informativ \u0219i educativ. Rezultatele generate nu constituie consultan\u021b\u0103 juridic\u0103 \u0219i trebuie verificate \u00een contextul specific al fiec\u0103rei spe\u021be.\r\n      <\/div>\r\n    <\/div>\r\n\r\n    <!-- Footer -->\r\n    <footer class=\"zic2__footer\">\r\n      <a href=\"https:\/\/zic.legal\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"zic2__footerLink\">\r\n        \u00a9 2025 ZIC Legal\r\n      <\/a>\r\n    <\/footer>\r\n  <\/div>\r\n<\/div>\r\n\r\n<style>\r\n\/* ============================================================\r\n   ZIC Calculator v2 - Calculator Cazier \/ Pedeaps\u0103 Rezultant\u0103\r\n   Theme: Purple\/Mov | Fully Responsive | Optimized\r\n   ============================================================ *\/\r\n\r\n\/* === CSS Variables === *\/\r\n#zic-cazier-calculator-v2 {\r\n  --zic-primary: #8A88FF;\r\n  --zic-primary-dark: #6F6CFF;\r\n  --zic-primary-light: rgba(138,136,255,.08);\r\n  --zic-primary-border: rgba(138,136,255,.25);\r\n\r\n  --zic-success: #10B981;\r\n  --zic-success-light: rgba(16,185,129,.08);\r\n  --zic-success-border: rgba(16,185,129,.25);\r\n\r\n  --zic-danger: #EF4444;\r\n  --zic-danger-light: rgba(239,68,68,.08);\r\n  --zic-danger-border: rgba(239,68,68,.25);\r\n\r\n  --zic-warning: #F59E0B;\r\n  --zic-warning-light: rgba(245,158,11,.08);\r\n  --zic-warning-border: rgba(245,158,11,.25);\r\n\r\n  --zic-blue: #3B82F6;\r\n  --zic-blue-light: rgba(59,130,246,.08);\r\n\r\n  --zic-ink: #1F2937;\r\n  --zic-ink-light: #374151;\r\n  --zic-muted: #6B7280;\r\n  --zic-light: #9CA3AF;\r\n\r\n  --zic-bg: #F9FAFB;\r\n  --zic-surface: #FFFFFF;\r\n  --zic-border: #E5E7EB;\r\n\r\n  --zic-shadow-sm: 0 1px 2px rgba(0,0,0,.05);\r\n  --zic-shadow: 0 4px 6px -1px rgba(0,0,0,.1), 0 2px 4px -1px rgba(0,0,0,.06);\r\n  --zic-shadow-lg: 0 10px 15px -3px rgba(0,0,0,.1), 0 4px 6px -2px rgba(0,0,0,.05);\r\n\r\n  --zic-radius: 16px;\r\n  --zic-radius-sm: 12px;\r\n  --zic-radius-xs: 8px;\r\n\r\n  --zic-transition: 150ms ease;\r\n\r\n  font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif;\r\n  color: var(--zic-ink);\r\n  line-height: 1.5;\r\n  -webkit-font-smoothing: antialiased;\r\n}\r\n\r\n#zic-cazier-calculator-v2 *,\r\n#zic-cazier-calculator-v2 *::before,\r\n#zic-cazier-calculator-v2 *::after {\r\n  box-sizing: border-box;\r\n}\r\n\r\n\/* === Layout === *\/\r\n#zic-cazier-calculator-v2 .zic2__wrap {\r\n  max-width: 900px;\r\n  margin: 0 auto;\r\n  padding: 16px;\r\n}\r\n\r\n\/* === Header === *\/\r\n#zic-cazier-calculator-v2 .zic2__hero {\r\n  margin-bottom: 16px;\r\n}\r\n\r\n#zic-cazier-calculator-v2 .zic2__brandbar {\r\n  display: flex;\r\n  align-items: center;\r\n  gap: 14px;\r\n  background: linear-gradient(135deg, var(--zic-primary), var(--zic-primary-dark));\r\n  border-radius: var(--zic-radius);\r\n  padding: 20px;\r\n  color: #fff;\r\n  box-shadow: var(--zic-shadow-lg);\r\n}\r\n\r\n#zic-cazier-calculator-v2 .zic2__mark {\r\n  width: 48px;\r\n  height: 48px;\r\n  background: rgba(255,255,255,.2);\r\n  border-radius: 12px;\r\n  display: flex;\r\n  align-items: center;\r\n  justify-content: center;\r\n  flex-shrink: 0;\r\n}\r\n\r\n#zic-cazier-calculator-v2 .zic2__headerText {\r\n  flex: 1;\r\n  min-width: 0;\r\n}\r\n\r\n#zic-cazier-calculator-v2 .zic2__title {\r\n  margin: 0;\r\n  font-size: 18px;\r\n  font-weight: 700;\r\n  line-height: 1.2;\r\n}\r\n\r\n#zic-cazier-calculator-v2 .zic2__subtitle {\r\n  margin: 4px 0 0;\r\n  font-size: 13px;\r\n  opacity: 0.9;\r\n}\r\n\r\n\/* === Formula Box === *\/\r\n#zic-cazier-calculator-v2 .zic2__formula {\r\n  display: flex;\r\n  align-items: flex-start;\r\n  gap: 10px;\r\n  background: var(--zic-primary-light);\r\n  border: 1px solid var(--zic-primary-border);\r\n  border-radius: var(--zic-radius-sm);\r\n  padding: 12px 14px;\r\n  margin-bottom: 16px;\r\n  font-size: 13px;\r\n  color: var(--zic-ink-light);\r\n}\r\n\r\n#zic-cazier-calculator-v2 .zic2__formulaIcon {\r\n  color: var(--zic-primary-dark);\r\n  flex-shrink: 0;\r\n  margin-top: 1px;\r\n}\r\n\r\n#zic-cazier-calculator-v2 .zic2__formulaText strong {\r\n  color: var(--zic-ink);\r\n}\r\n\r\n#zic-cazier-calculator-v2 .zic2__formulaText code {\r\n  background: var(--zic-primary-light);\r\n  padding: 2px 6px;\r\n  border-radius: 4px;\r\n  font-size: 12px;\r\n}\r\n\r\n\/* === Top Bar === *\/\r\n#zic-cazier-calculator-v2 .zic2__topBar {\r\n  display: flex;\r\n  gap: 12px;\r\n  align-items: flex-end;\r\n  flex-wrap: wrap;\r\n  margin-bottom: 16px;\r\n}\r\n\r\n#zic-cazier-calculator-v2 .zic2__field--grow {\r\n  flex: 1;\r\n  min-width: 240px;\r\n}\r\n\r\n\/* === Cards === *\/\r\n#zic-cazier-calculator-v2 .zic2__card {\r\n  background: var(--zic-surface);\r\n  border: 1px solid var(--zic-border);\r\n  border-radius: var(--zic-radius);\r\n  padding: 20px;\r\n  margin-bottom: 16px;\r\n  box-shadow: var(--zic-shadow-sm);\r\n}\r\n\r\n#zic-cazier-calculator-v2 .zic2__cardHeader {\r\n  display: flex;\r\n  align-items: center;\r\n  gap: 12px;\r\n  margin-bottom: 16px;\r\n  flex-wrap: wrap;\r\n}\r\n\r\n#zic-cazier-calculator-v2 .zic2__spacer {\r\n  flex: 1 1 auto;\r\n}\r\n\r\n#zic-cazier-calculator-v2 .zic2__cardIcon {\r\n  width: 36px;\r\n  height: 36px;\r\n  border-radius: 10px;\r\n  display: flex;\r\n  align-items: center;\r\n  justify-content: center;\r\n  flex-shrink: 0;\r\n}\r\n\r\n#zic-cazier-calculator-v2 .zic2__cardIcon--purple {\r\n  background: var(--zic-primary-light);\r\n  color: var(--zic-primary-dark);\r\n}\r\n\r\n#zic-cazier-calculator-v2 .zic2__cardIcon--blue {\r\n  background: var(--zic-blue-light);\r\n  color: var(--zic-blue);\r\n}\r\n\r\n#zic-cazier-calculator-v2 .zic2__cardIcon--green {\r\n  background: var(--zic-success-light);\r\n  color: var(--zic-success);\r\n}\r\n\r\n#zic-cazier-calculator-v2 .zic2__cardTitle {\r\n  margin: 0;\r\n  font-size: 17px;\r\n  font-weight: 700;\r\n  color: var(--zic-ink);\r\n}\r\n\r\n\/* === Fields === *\/\r\n#zic-cazier-calculator-v2 .zic2__field {\r\n  display: flex;\r\n  flex-direction: column;\r\n  gap: 4px;\r\n}\r\n\r\n#zic-cazier-calculator-v2 .zic2__label {\r\n  font-size: 12px;\r\n  font-weight: 600;\r\n  color: var(--zic-muted);\r\n}\r\n\r\n#zic-cazier-calculator-v2 .zic2__input,\r\n#zic-cazier-calculator-v2 .zic2__select {\r\n  width: 100%;\r\n  padding: 10px 12px;\r\n  font-size: 15px;\r\n  font-family: inherit;\r\n  color: var(--zic-ink);\r\n  background: var(--zic-surface);\r\n  border: 2px solid var(--zic-border);\r\n  border-radius: var(--zic-radius-xs);\r\n  outline: none;\r\n  transition: border-color var(--zic-transition), box-shadow var(--zic-transition);\r\n}\r\n\r\n#zic-cazier-calculator-v2 .zic2__input:focus,\r\n#zic-cazier-calculator-v2 .zic2__select:focus {\r\n  border-color: var(--zic-primary);\r\n  box-shadow: 0 0 0 3px var(--zic-primary-light);\r\n}\r\n\r\n#zic-cazier-calculator-v2 .zic2__input::placeholder {\r\n  color: var(--zic-light);\r\n}\r\n\r\n\/* === Grid === *\/\r\n#zic-cazier-calculator-v2 .zic2__grid2 { display: grid; gap: 12px; }\r\n#zic-cazier-calculator-v2 .zic2__grid3 { display: grid; gap: 12px; }\r\n#zic-cazier-calculator-v2 .zic2__grid4 { display: grid; gap: 12px; }\r\n\r\n\/* === Buttons === *\/\r\n#zic-cazier-calculator-v2 .zic2__btnGroup {\r\n  display: flex;\r\n  gap: 8px;\r\n  flex-wrap: wrap;\r\n}\r\n\r\n#zic-cazier-calculator-v2 .zic2__btn {\r\n  display: inline-flex;\r\n  align-items: center;\r\n  justify-content: center;\r\n  gap: 6px;\r\n  padding: 10px 16px;\r\n  font-size: 14px;\r\n  font-weight: 600;\r\n  border-radius: var(--zic-radius-sm);\r\n  border: 1px solid transparent;\r\n  cursor: pointer;\r\n  transition: all var(--zic-transition);\r\n  white-space: nowrap;\r\n  text-decoration: none;\r\n}\r\n\r\n#zic-cazier-calculator-v2 .zic2__btn:focus {\r\n  outline: none;\r\n  box-shadow: 0 0 0 3px var(--zic-primary-border);\r\n}\r\n\r\n#zic-cazier-calculator-v2 .zic2__btn:active {\r\n  transform: translateY(1px);\r\n}\r\n\r\n#zic-cazier-calculator-v2 .zic2__btn--primary {\r\n  background: linear-gradient(135deg, var(--zic-primary), var(--zic-primary-dark));\r\n  color: #fff;\r\n  box-shadow: 0 4px 14px rgba(138,136,255,.35);\r\n}\r\n\r\n#zic-cazier-calculator-v2 .zic2__btn--primary:hover {\r\n  box-shadow: 0 6px 20px rgba(138,136,255,.45);\r\n  transform: translateY(-1px);\r\n}\r\n\r\n#zic-cazier-calculator-v2 .zic2__btn--large {\r\n  padding: 14px 24px;\r\n  font-size: 15px;\r\n}\r\n\r\n#zic-cazier-calculator-v2 .zic2__btn--secondary {\r\n  background: var(--zic-surface);\r\n  border-color: var(--zic-border);\r\n  color: var(--zic-ink-light);\r\n}\r\n\r\n#zic-cazier-calculator-v2 .zic2__btn--secondary:hover {\r\n  background: var(--zic-bg);\r\n  border-color: var(--zic-primary-border);\r\n  color: var(--zic-primary-dark);\r\n}\r\n\r\n#zic-cazier-calculator-v2 .zic2__btn--outline {\r\n  background: var(--zic-surface);\r\n  border-color: var(--zic-primary-border);\r\n  color: var(--zic-primary-dark);\r\n}\r\n\r\n#zic-cazier-calculator-v2 .zic2__btn--outline:hover {\r\n  background: var(--zic-primary-light);\r\n}\r\n\r\n#zic-cazier-calculator-v2 .zic2__btn--success {\r\n  background: var(--zic-success-light);\r\n  border-color: var(--zic-success-border);\r\n  color: var(--zic-success);\r\n}\r\n\r\n#zic-cazier-calculator-v2 .zic2__btn--success:hover {\r\n  background: rgba(16,185,129,.15);\r\n}\r\n\r\n#zic-cazier-calculator-v2 .zic2__btn--danger {\r\n  background: var(--zic-danger-light);\r\n  border-color: var(--zic-danger-border);\r\n  color: var(--zic-danger);\r\n}\r\n\r\n#zic-cazier-calculator-v2 .zic2__btn--danger:hover {\r\n  background: rgba(239,68,68,.15);\r\n}\r\n\r\n#zic-cazier-calculator-v2 .zic2__btn--small {\r\n  padding: 8px 12px;\r\n  font-size: 13px;\r\n}\r\n\r\n\/* === List & Rows === *\/\r\n#zic-cazier-calculator-v2 .zic2__list {\r\n  display: grid;\r\n  gap: 12px;\r\n}\r\n\r\n#zic-cazier-calculator-v2 .zic2__row {\r\n  background: var(--zic-bg);\r\n  border: 1px solid var(--zic-border);\r\n  border-radius: var(--zic-radius-sm);\r\n  overflow: hidden;\r\n}\r\n\r\n#zic-cazier-calculator-v2 .zic2__rowHead {\r\n  padding: 12px 14px;\r\n  background: var(--zic-surface);\r\n  display: flex;\r\n  align-items: center;\r\n  gap: 10px;\r\n  flex-wrap: wrap;\r\n  border-bottom: 1px solid var(--zic-border);\r\n}\r\n\r\n#zic-cazier-calculator-v2 .zic2__rowTitle {\r\n  font-weight: 700;\r\n  font-size: 14px;\r\n  color: var(--zic-ink);\r\n}\r\n\r\n#zic-cazier-calculator-v2 .zic2__rowMeta {\r\n  color: var(--zic-muted);\r\n  font-size: 12px;\r\n}\r\n\r\n#zic-cazier-calculator-v2 .zic2__rowBody {\r\n  padding: 14px;\r\n  display: grid;\r\n  gap: 12px;\r\n}\r\n\r\n#zic-cazier-calculator-v2 .zic2__rowSection {\r\n  padding: 12px;\r\n  background: var(--zic-surface);\r\n  border: 1px solid var(--zic-border);\r\n  border-radius: var(--zic-radius-xs);\r\n}\r\n\r\n#zic-cazier-calculator-v2 .zic2__rowSectionTitle {\r\n  font-size: 11px;\r\n  font-weight: 700;\r\n  color: var(--zic-muted);\r\n  text-transform: uppercase;\r\n  letter-spacing: 0.05em;\r\n  margin-bottom: 10px;\r\n}\r\n\r\n#zic-cazier-calculator-v2 .zic2__adv {\r\n  max-height: 0;\r\n  opacity: 0;\r\n  overflow: hidden;\r\n  transition: max-height .25s ease, opacity .25s ease, padding .25s ease;\r\n  padding: 0 14px;\r\n}\r\n\r\n#zic-cazier-calculator-v2 .zic2__adv.is-open {\r\n  max-height: 400px;\r\n  opacity: 1;\r\n  padding: 14px;\r\n  border-top: 1px dashed var(--zic-border);\r\n}\r\n\r\n\/* === Checkbox === *\/\r\n#zic-cazier-calculator-v2 .zic2__checkbox-group {\r\n  display: flex;\r\n  align-items: center;\r\n  gap: 10px;\r\n  padding: 10px 12px;\r\n  background: var(--zic-surface);\r\n  border: 1px solid var(--zic-border);\r\n  border-radius: var(--zic-radius-xs);\r\n  cursor: pointer;\r\n  transition: border-color var(--zic-transition), background var(--zic-transition);\r\n}\r\n\r\n#zic-cazier-calculator-v2 .zic2__checkbox-group:hover {\r\n  border-color: var(--zic-primary-border);\r\n  background: var(--zic-primary-light);\r\n}\r\n\r\n#zic-cazier-calculator-v2 .zic2__checkbox {\r\n  width: 18px;\r\n  height: 18px;\r\n  accent-color: var(--zic-primary);\r\n  flex-shrink: 0;\r\n}\r\n\r\n#zic-cazier-calculator-v2 .zic2__checkbox-label {\r\n  font-size: 13px;\r\n  font-weight: 600;\r\n  color: var(--zic-ink-light);\r\n}\r\n\r\n#zic-cazier-calculator-v2 .zic2__chip {\r\n  display: inline-flex;\r\n  align-items: center;\r\n  gap: 6px;\r\n  padding: 6px 10px;\r\n  border-radius: 999px;\r\n  border: 1px solid var(--zic-border);\r\n  background: var(--zic-bg);\r\n  font-weight: 700;\r\n  font-size: 12px;\r\n  color: var(--zic-ink-light);\r\n  white-space: nowrap;\r\n}\r\n\r\n#zic-cazier-calculator-v2 .zic2__help {\r\n  font-size: 12px;\r\n  color: var(--zic-muted);\r\n  line-height: 1.35;\r\n}\r\n\r\n\/* === Toggle === *\/\r\n#zic-cazier-calculator-v2 .zic2__toggle {\r\n  display: inline-flex;\r\n  align-items: center;\r\n  gap: 8px;\r\n  font-size: 13px;\r\n  color: var(--zic-muted);\r\n  cursor: pointer;\r\n}\r\n\r\n#zic-cazier-calculator-v2 .zic2__toggle input {\r\n  width: 18px;\r\n  height: 18px;\r\n  accent-color: var(--zic-primary);\r\n}\r\n\r\n\/* === Timeline === *\/\r\n#zic-cazier-calculator-v2 .zic2__timeline {\r\n  padding: 14px;\r\n  background: var(--zic-surface);\r\n  border: 1px solid var(--zic-border);\r\n  border-radius: var(--zic-radius-sm);\r\n}\r\n\r\n#zic-cazier-calculator-v2 .zic2__tlLegend {\r\n  display: flex;\r\n  gap: 10px;\r\n  flex-wrap: wrap;\r\n  margin-bottom: 12px;\r\n}\r\n\r\n#zic-cazier-calculator-v2 .zic2__tlTag {\r\n  display: inline-flex;\r\n  align-items: center;\r\n  gap: 6px;\r\n  padding: 4px 10px;\r\n  border-radius: 999px;\r\n  border: 1px solid var(--zic-border);\r\n  background: var(--zic-surface);\r\n  font-size: 12px;\r\n  color: var(--zic-muted);\r\n}\r\n\r\n#zic-cazier-calculator-v2 .zic2__tlTag::before {\r\n  content: \"\";\r\n  width: 10px;\r\n  height: 10px;\r\n  border-radius: 999px;\r\n}\r\n\r\n#zic-cazier-calculator-v2 .zic2__tlTag--conv::before { background: var(--zic-primary); }\r\n#zic-cazier-calculator-v2 .zic2__tlTag--exec::before { background: var(--zic-success); }\r\n#zic-cazier-calculator-v2 .zic2__tlTag--off::before { background: var(--zic-warning); }\r\n\r\n#zic-cazier-calculator-v2 .zic2__tlList {\r\n  position: relative;\r\n  padding-left: 20px;\r\n}\r\n\r\n#zic-cazier-calculator-v2 .zic2__tlList::before {\r\n  content: \"\";\r\n  position: absolute;\r\n  left: 7px;\r\n  top: 8px;\r\n  bottom: 8px;\r\n  width: 2px;\r\n  background: var(--zic-border);\r\n  border-radius: 2px;\r\n}\r\n\r\n#zic-cazier-calculator-v2 .zic2__tlItem {\r\n  display: grid;\r\n  grid-template-columns: 16px 1fr;\r\n  gap: 10px;\r\n  align-items: flex-start;\r\n  margin-bottom: 10px;\r\n}\r\n\r\n#zic-cazier-calculator-v2 .zic2__tlItem:last-child { margin-bottom: 0; }\r\n\r\n#zic-cazier-calculator-v2 .zic2__tlDot {\r\n  width: 16px;\r\n  height: 16px;\r\n  border-radius: 999px;\r\n  border: 2px solid var(--zic-surface);\r\n  box-shadow: 0 0 0 1px var(--zic-border);\r\n  margin-top: 2px;\r\n}\r\n\r\n#zic-cazier-calculator-v2 .zic2__tlDot--conv { background: var(--zic-primary); }\r\n#zic-cazier-calculator-v2 .zic2__tlDot--exec { background: var(--zic-success); }\r\n#zic-cazier-calculator-v2 .zic2__tlDot--off { background: var(--zic-warning); }\r\n\r\n#zic-cazier-calculator-v2 .zic2__tlTitle {\r\n  font-weight: 700;\r\n  font-size: 13px;\r\n  color: var(--zic-ink);\r\n}\r\n\r\n#zic-cazier-calculator-v2 .zic2__tlMeta {\r\n  color: var(--zic-muted);\r\n  font-size: 12px;\r\n  margin-top: 2px;\r\n}\r\n\r\n#zic-cazier-calculator-v2 .zic2__tlEmpty {\r\n  color: var(--zic-light);\r\n  font-size: 13px;\r\n  text-align: center;\r\n  padding: 20px;\r\n}\r\n\r\n\/* === Actions === *\/\r\n#zic-cazier-calculator-v2 .zic2__actions {\r\n  display: flex;\r\n  flex-wrap: wrap;\r\n  gap: 10px;\r\n  margin-bottom: 20px;\r\n}\r\n\r\n#zic-cazier-calculator-v2 .zic2__actions .zic2__btn--primary {\r\n  flex: 1;\r\n  min-width: 200px;\r\n}\r\n\r\n\/* === Results === *\/\r\n#zic-cazier-calculator-v2 .zic2__resultGrid {\r\n  display: grid;\r\n  gap: 14px;\r\n}\r\n\r\n#zic-cazier-calculator-v2 .zic2__finalBox {\r\n  background: linear-gradient(135deg, var(--zic-primary-light), rgba(138,136,255,.15));\r\n  border: 1px solid var(--zic-primary-border);\r\n  border-radius: var(--zic-radius-sm);\r\n  padding: 16px;\r\n}\r\n\r\n#zic-cazier-calculator-v2 .zic2__finalLabel {\r\n  font-size: 12px;\r\n  font-weight: 700;\r\n  color: var(--zic-muted);\r\n  text-transform: uppercase;\r\n  letter-spacing: 0.05em;\r\n}\r\n\r\n#zic-cazier-calculator-v2 .zic2__finalValue {\r\n  font-size: 20px;\r\n  font-weight: 800;\r\n  margin-top: 8px;\r\n  color: var(--zic-primary-dark);\r\n}\r\n\r\n#zic-cazier-calculator-v2 .zic2__finalMeta {\r\n  margin-top: 12px;\r\n  font-size: 13px;\r\n  color: var(--zic-muted);\r\n}\r\n\r\n#zic-cazier-calculator-v2 .zic2__finalMeta div {\r\n  margin-bottom: 4px;\r\n}\r\n\r\n#zic-cazier-calculator-v2 .zic2__explainBox {\r\n  background: var(--zic-surface);\r\n  border: 1px solid var(--zic-border);\r\n  border-radius: var(--zic-radius-sm);\r\n  overflow: hidden;\r\n}\r\n\r\n#zic-cazier-calculator-v2 .zic2__explainHead {\r\n  padding: 12px 14px;\r\n  background: var(--zic-bg);\r\n  display: flex;\r\n  align-items: center;\r\n  justify-content: space-between;\r\n  gap: 10px;\r\n  border-bottom: 1px solid var(--zic-border);\r\n}\r\n\r\n#zic-cazier-calculator-v2 .zic2__explainTitle {\r\n  font-weight: 700;\r\n  font-size: 14px;\r\n  color: var(--zic-ink);\r\n}\r\n\r\n#zic-cazier-calculator-v2 .zic2__status {\r\n  font-size: 13px;\r\n  color: var(--zic-muted);\r\n}\r\n\r\n#zic-cazier-calculator-v2 .zic2__status--ok { color: var(--zic-success); }\r\n#zic-cazier-calculator-v2 .zic2__status--error { color: var(--zic-danger); }\r\n\r\n#zic-cazier-calculator-v2 .zic2__steps {\r\n  margin: 0;\r\n  padding: 14px 14px 14px 32px;\r\n  font-size: 13px;\r\n  line-height: 1.5;\r\n  color: var(--zic-ink-light);\r\n}\r\n\r\n#zic-cazier-calculator-v2 .zic2__steps li {\r\n  margin-bottom: 8px;\r\n}\r\n\r\n#zic-cazier-calculator-v2 .zic2__steps li:last-child { margin-bottom: 0; }\r\n\r\n#zic-cazier-calculator-v2 .zic2__techDetails {\r\n  border-top: 1px solid var(--zic-border);\r\n  padding: 12px 14px;\r\n}\r\n\r\n#zic-cazier-calculator-v2 .zic2__techDetails summary {\r\n  cursor: pointer;\r\n  font-weight: 700;\r\n  font-size: 13px;\r\n  color: var(--zic-muted);\r\n}\r\n\r\n#zic-cazier-calculator-v2 .zic2__techPre {\r\n  margin: 10px 0 0;\r\n  padding: 12px;\r\n  background: var(--zic-bg);\r\n  border: 1px solid var(--zic-border);\r\n  border-radius: var(--zic-radius-xs);\r\n  font-size: 11px;\r\n  white-space: pre-wrap;\r\n  word-break: break-word;\r\n  color: var(--zic-muted);\r\n  max-height: 300px;\r\n  overflow-y: auto;\r\n}\r\n\r\n\/* === Disclaimer === *\/\r\n#zic-cazier-calculator-v2 .zic2__disclaimer {\r\n  display: flex;\r\n  align-items: flex-start;\r\n  gap: 10px;\r\n  padding: 14px;\r\n  background: var(--zic-bg);\r\n  border: 1px solid var(--zic-border);\r\n  border-radius: var(--zic-radius-sm);\r\n  font-size: 12px;\r\n  color: var(--zic-muted);\r\n  line-height: 1.5;\r\n  margin-bottom: 16px;\r\n}\r\n\r\n#zic-cazier-calculator-v2 .zic2__disclaimer svg {\r\n  flex-shrink: 0;\r\n  color: var(--zic-warning);\r\n  margin-top: 1px;\r\n}\r\n\r\n#zic-cazier-calculator-v2 .zic2__disclaimer strong {\r\n  color: var(--zic-ink-light);\r\n}\r\n\r\n\/* === Footer === *\/\r\n#zic-cazier-calculator-v2 .zic2__footer {\r\n  text-align: center;\r\n  padding: 8px 0;\r\n}\r\n\r\n#zic-cazier-calculator-v2 .zic2__footerLink {\r\n  color: var(--zic-primary-dark);\r\n  text-decoration: none;\r\n  font-size: 13px;\r\n  font-weight: 600;\r\n  transition: color var(--zic-transition);\r\n}\r\n\r\n#zic-cazier-calculator-v2 .zic2__footerLink:hover {\r\n  color: var(--zic-primary);\r\n  text-decoration: underline;\r\n}\r\n\r\n\/* === Utility === *\/\r\n#zic-cazier-calculator-v2 .zic2__hidden { display: none !important; }\r\n\r\n\/* === RESPONSIVE === *\/\r\n@media (min-width: 640px) {\r\n  #zic-cazier-calculator-v2 .zic2__wrap { padding: 24px; }\r\n  #zic-cazier-calculator-v2 .zic2__title { font-size: 22px; }\r\n  #zic-cazier-calculator-v2 .zic2__subtitle { font-size: 14px; }\r\n  #zic-cazier-calculator-v2 .zic2__grid2 { grid-template-columns: 1fr 1fr; }\r\n  #zic-cazier-calculator-v2 .zic2__grid3 { grid-template-columns: 1fr 1fr 1fr; }\r\n  #zic-cazier-calculator-v2 .zic2__grid4 { grid-template-columns: 1fr 1fr 1fr 1fr; }\r\n}\r\n\r\n@media (min-width: 768px) {\r\n  #zic-cazier-calculator-v2 .zic2__card { padding: 24px; }\r\n  #zic-cazier-calculator-v2 .zic2__brandbar { padding: 24px; }\r\n  #zic-cazier-calculator-v2 .zic2__mark { width: 56px; height: 56px; }\r\n  #zic-cazier-calculator-v2 .zic2__title { font-size: 24px; }\r\n  #zic-cazier-calculator-v2 .zic2__resultGrid { grid-template-columns: 280px 1fr; }\r\n}\r\n\r\n\/* Print styles *\/\r\n@media print {\r\n  #zic-cazier-calculator-v2 .zic2__actions,\r\n  #zic-cazier-calculator-v2 .zic2__topBar,\r\n  #zic-cazier-calculator-v2 .zic2__footer { display: none !important; }\r\n  #zic-cazier-calculator-v2 .zic2__card { box-shadow: none; border: 1px solid #ddd; break-inside: avoid; }\r\n}\r\n<\/style>\r\n\r\n<script>\r\n(function(){\r\n  'use strict';\r\n\r\n  \/\/ === CONSTANTS ===\r\n  const ROOT_ID = 'zic-cazier-calculator-v2';\r\n  const DAY_PER_MONTH = 30;\r\n  const MONTH_PER_YEAR = 12;\r\n  const MAX_PRISON_DAYS = 30 * MONTH_PER_YEAR * DAY_PER_MONTH;\r\n\r\n  const PERSON_CFG = {\r\n    fizica: { label: 'Persoan\u0103 fizic\u0103', maxDayFines: 400, minLeiPerDay: 60, maxLeiPerDay: 600 },\r\n    juridica: { label: 'Persoan\u0103 juridic\u0103', maxDayFines: 600, minLeiPerDay: 100, maxLeiPerDay: 5000 }\r\n  };\r\n\r\n  \/\/ === STATE ===\r\n  let state = { convictions: [], offences: [], lastResult: null };\r\n  let convCounter = 0, offCounter = 0;\r\n\r\n  \/\/ === DOM ===\r\n  const root = document.getElementById(ROOT_ID);\r\n  if (!root) return;\r\n\r\n  const $ = (sel) => root.querySelector(sel);\r\n  const $$ = (sel) => root.querySelectorAll(sel);\r\n\r\n  \/\/ === UTILS ===\r\n  const uid = () => 'zc_' + Math.random().toString(36).slice(2, 8) + Date.now().toString(36).slice(-4);\r\n  const safeText = (s) => String(s || '').replace(\/\\s+\/g, ' ').trim();\r\n  const toInt = (v) => { const n = parseInt(String(v || '').trim(), 10); return isNaN(n) ? 0 : n; };\r\n  const toFloat = (v) => { const n = parseFloat(String(v || '').trim().replace(',', '.')); return isNaN(n) ? 0 : n; };\r\n\r\n  const normalizeYMD = (y, m, d) => {\r\n    y = Math.max(0, toInt(y)); m = Math.max(0, toInt(m)); d = Math.max(0, toInt(d));\r\n    if (d >= DAY_PER_MONTH) { m += Math.floor(d \/ DAY_PER_MONTH); d = d % DAY_PER_MONTH; }\r\n    if (m >= MONTH_PER_YEAR) { y += Math.floor(m \/ MONTH_PER_YEAR); m = m % MONTH_PER_YEAR; }\r\n    return { y, m, d };\r\n  };\r\n\r\n  const ymdToDays = (y, m, d) => { const n = normalizeYMD(y, m, d); return (n.y * MONTH_PER_YEAR * DAY_PER_MONTH) + (n.m * DAY_PER_MONTH) + n.d; };\r\n\r\n  const daysToYMD = (days) => {\r\n    days = Math.max(0, Math.floor(days));\r\n    const totalMonths = Math.floor(days \/ DAY_PER_MONTH);\r\n    const d = days % DAY_PER_MONTH;\r\n    const y = Math.floor(totalMonths \/ MONTH_PER_YEAR);\r\n    const m = totalMonths % MONTH_PER_YEAR;\r\n    return { y, m, d };\r\n  };\r\n\r\n  const fmtYMD = (n) => {\r\n    n = normalizeYMD(n.y, n.m, n.d);\r\n    const parts = [];\r\n    if (n.y) parts.push(`${n.y} ${n.y === 1 ? 'an' : 'ani'}`);\r\n    if (n.m) parts.push(`${n.m} ${n.m === 1 ? 'lun\u0103' : 'luni'}`);\r\n    if (n.d || parts.length === 0) parts.push(`${n.d} ${n.d === 1 ? 'zi' : 'zile'}`);\r\n    return parts.join(' ');\r\n  };\r\n\r\n  const fmtDays = (days) => fmtYMD(daysToYMD(days));\r\n\r\n  const makeTs = (y, m, d) => {\r\n    if (m < 1 || m > 12 || d < 1 || d > 31) return null;\r\n    const dt = new Date(y, m - 1, d, 0, 0, 0, 0);\r\n    if (dt.getFullYear() !== y || dt.getMonth() !== (m - 1) || dt.getDate() !== d) return null;\r\n    return dt.getTime();\r\n  };\r\n\r\n  const parseRoDateTs = (s) => {\r\n    s = safeText(s);\r\n    if (!s) return null;\r\n    let mt = s.match(\/^(\\d{4})-(\\d{1,2})-(\\d{1,2})$\/);\r\n    if (mt) return makeTs(toInt(mt[1]), toInt(mt[2]), toInt(mt[3]));\r\n    mt = s.match(\/^(\\d{1,2})[.\\-\\\/](\\d{1,2})[.\\-\\\/](\\d{4})$\/);\r\n    if (mt) return makeTs(toInt(mt[3]), toInt(mt[2]), toInt(mt[1]));\r\n    return null;\r\n  };\r\n\r\n  const fmtDate = (ts) => {\r\n    if (!ts) return '\u2014';\r\n    const dt = new Date(ts);\r\n    const dd = String(dt.getDate()).padStart(2, '0');\r\n    const mm = String(dt.getMonth() + 1).padStart(2, '0');\r\n    return `${dd}.${mm}.${dt.getFullYear()}`;\r\n  };\r\n\r\n  const leiToBani = (lei) => Math.round(toFloat(lei) * 100);\r\n  const baniToLeiStr = (bani) => (Math.round(bani) \/ 100).toFixed(2).replace('.', ',') + ' lei';\r\n  const escapeHtml = (str) => String(str || '').replace(\/&\/g, '&amp;').replace(\/<\/g, '&lt;').replace(\/>\/g, '&gt;').replace(\/\"\/g, '&quot;');\r\n\r\n  const el = (tag, cls, txt) => {\r\n    const n = document.createElement(tag);\r\n    if (cls) n.className = cls;\r\n    if (typeof txt === 'string') n.textContent = txt;\r\n    return n;\r\n  };\r\n\r\n  const getCfg = () => {\r\n    const sel = $('[data-field=\"personType\"]');\r\n    const type = sel ? sel.value : 'fizica';\r\n    return PERSON_CFG[type] || PERSON_CFG.fizica;\r\n  };\r\n\r\n  \/\/ === PENALTY HELPERS ===\r\n  const emptyPenalty = () => ({ life: false, prisonDays: 0, fine: null });\r\n\r\n  const penaltySummary = (p) => {\r\n    const parts = [];\r\n    if (p.life) parts.push('Deten\u021biune pe via\u021b\u0103');\r\n    else if (p.prisonDays > 0) parts.push('\u00cenchisoare: ' + fmtDays(p.prisonDays));\r\n    if (p.fine && p.fine.dayFines > 0) parts.push('Amend\u0103: ' + p.fine.dayFines + ' zile \u00d7 ' + baniToLeiStr(p.fine.baniPerDay) + ' = ' + baniToLeiStr(p.fine.totalBani));\r\n    return parts.length ? parts.join(' | ') : '\u2014';\r\n  };\r\n\r\n  \/\/ === CONCURS ENGINE ===\r\n  const computeConcurs = (components, cfg) => {\r\n    const prisons = [], fines = [];\r\n    let hasLife = false;\r\n\r\n    components.forEach(c => {\r\n      if (!c) return;\r\n      if (c.life) hasLife = true;\r\n      if (c.prisonDays > 0) prisons.push(c.prisonDays);\r\n      if (c.fine && c.fine.dayFines > 0) fines.push(c.fine);\r\n    });\r\n\r\n    let prisonRes = null, fineRes = null;\r\n\r\n    if (hasLife) {\r\n      prisonRes = { kind: 'life' };\r\n    } else if (prisons.length) {\r\n      const sum = prisons.reduce((a, b) => a + b, 0);\r\n      const max = Math.max(...prisons);\r\n      const others = sum - max;\r\n      const spor = Math.floor(others \/ 3);\r\n      const raw = max + spor;\r\n      const finalDays = Math.min(raw, MAX_PRISON_DAYS);\r\n      prisonRes = { kind: 'prison', maxDays: max, othersDays: others, sporDays: spor, rawDays: raw, finalDays, capped: raw > MAX_PRISON_DAYS };\r\n    }\r\n\r\n    if (fines.length) {\r\n      let maxIdx = 0;\r\n      fines.forEach((f, i) => { if (f.totalBani > fines[maxIdx].totalBani) maxIdx = i; });\r\n      const sumBani = fines.reduce((a, f) => a + f.totalBani, 0);\r\n      const sumDays = fines.reduce((a, f) => a + f.dayFines, 0);\r\n      const maxBani = fines[maxIdx].totalBani;\r\n      const maxDayFines = fines[maxIdx].dayFines;\r\n      const othersBani = sumBani - maxBani;\r\n      const othersDays = sumDays - maxDayFines;\r\n      const sporBani = Math.floor(othersBani \/ 3);\r\n      const sporDays = Math.floor(othersDays \/ 3);\r\n      fineRes = { rawTotalBani: maxBani + sporBani, rawDayFines: maxDayFines + sporDays };\r\n    }\r\n\r\n    return { prison: prisonRes, fine: fineRes };\r\n  };\r\n\r\n  const penaltyFromConcursResult = (res) => {\r\n    const p = emptyPenalty();\r\n    if (res.prison) {\r\n      if (res.prison.kind === 'life') p.life = true;\r\n      if (res.prison.kind === 'prison') p.prisonDays = res.prison.finalDays;\r\n    }\r\n    if (res.fine) {\r\n      const baniPerDay = res.fine.rawDayFines > 0 ? Math.round(res.fine.rawTotalBani \/ res.fine.rawDayFines) : 0;\r\n      p.fine = { dayFines: res.fine.rawDayFines, baniPerDay, totalBani: res.fine.rawTotalBani };\r\n    }\r\n    return p;\r\n  };\r\n\r\n  \/\/ === BUILD ROW UI ===\r\n  const buildConvRow = (idx, id) => {\r\n    const row = el('div', 'zic2__row');\r\n    row.setAttribute('data-row', 'conv');\r\n    row.setAttribute('data-id', id);\r\n\r\n    row.innerHTML = `\r\n      <div class=\"zic2__rowHead\">\r\n        <span class=\"zic2__rowTitle\">Condamnare #${idx}<\/span>\r\n        <span class=\"zic2__rowMeta\" data-summary>\u2014<\/span>\r\n        <div class=\"zic2__spacer\"><\/div>\r\n        <button type=\"button\" class=\"zic2__btn zic2__btn--outline zic2__btn--small\" data-action=\"toggleAdv\">Avansat<\/button>\r\n        <button type=\"button\" class=\"zic2__btn zic2__btn--danger zic2__btn--small\" data-action=\"removeConv\">\u0218terge<\/button>\r\n      <\/div>\r\n      <div class=\"zic2__rowBody\">\r\n        <div class=\"zic2__rowSection\">\r\n          <div class=\"zic2__rowSectionTitle\">Date principale<\/div>\r\n          <div class=\"zic2__grid3\">\r\n            <div class=\"zic2__field\"><label class=\"zic2__label\">Data definitiv\u0103<\/label><input class=\"zic2__input\" type=\"text\" placeholder=\"dd.mm.yyyy\" data-field=\"conv_def\"><\/div>\r\n            <div class=\"zic2__field\"><label class=\"zic2__label\">Tip pedeaps\u0103<\/label><select class=\"zic2__select\" data-field=\"pen_type\"><option value=\"prison\">\u00cenchisoare<\/option><option value=\"fine\">Amend\u0103<\/option><option value=\"mix\">\u00cenchisoare + amend\u0103<\/option><option value=\"life\">Deten\u021biune pe via\u021b\u0103<\/option><\/select><\/div>\r\n            <div class=\"zic2__field\"><label class=\"zic2__label\">Data considerat\u0103 executat\u0103<\/label><input class=\"zic2__input\" type=\"text\" placeholder=\"dd.mm.yyyy\" data-field=\"conv_exec\"><\/div>\r\n          <\/div>\r\n        <\/div>\r\n        <div class=\"zic2__rowSection\" data-pen-section>\r\n          <div class=\"zic2__rowSectionTitle\">Pedeaps\u0103<\/div>\r\n          <div data-panel=\"prison\">\r\n            <div class=\"zic2__help\" style=\"margin-bottom:8px\">\u00cenchisoare<\/div>\r\n            <div class=\"zic2__grid3\">\r\n              <div class=\"zic2__field\"><label class=\"zic2__label\">Ani<\/label><input class=\"zic2__input\" type=\"number\" min=\"0\" value=\"0\" data-field=\"pr_y\"><\/div>\r\n              <div class=\"zic2__field\"><label class=\"zic2__label\">Luni<\/label><input class=\"zic2__input\" type=\"number\" min=\"0\" value=\"0\" data-field=\"pr_m\"><\/div>\r\n              <div class=\"zic2__field\"><label class=\"zic2__label\">Zile<\/label><input class=\"zic2__input\" type=\"number\" min=\"0\" value=\"0\" data-field=\"pr_d\"><\/div>\r\n            <\/div>\r\n          <\/div>\r\n          <div data-panel=\"fine\" class=\"zic2__hidden\">\r\n            <div class=\"zic2__help\" style=\"margin-bottom:8px\">Amend\u0103<\/div>\r\n            <div class=\"zic2__grid3\">\r\n              <div class=\"zic2__field\"><label class=\"zic2__label\">Zile-amend\u0103<\/label><input class=\"zic2__input\" type=\"number\" min=\"0\" value=\"0\" data-field=\"fi_df\"><\/div>\r\n              <div class=\"zic2__field\"><label class=\"zic2__label\">Lei\/zi<\/label><input class=\"zic2__input\" type=\"number\" min=\"0\" value=\"0\" data-field=\"fi_lpd\"><\/div>\r\n              <div class=\"zic2__field\"><label class=\"zic2__label\">Total<\/label><div class=\"zic2__help\">= zile \u00d7 lei\/zi<\/div><\/div>\r\n            <\/div>\r\n          <\/div>\r\n          <div data-panel=\"life\" class=\"zic2__hidden\"><div class=\"zic2__help\">Deten\u021biune pe via\u021b\u0103 selectat\u0103.<\/div><\/div>\r\n        <\/div>\r\n      <\/div>\r\n      <div class=\"zic2__adv\" data-adv>\r\n        <div class=\"zic2__rowSectionTitle\">Set\u0103ri avansate<\/div>\r\n        <div class=\"zic2__grid2\" style=\"margin-bottom:12px\">\r\n          <label class=\"zic2__checkbox-group\"><input type=\"checkbox\" class=\"zic2__checkbox\" data-field=\"conv_eligrec\" checked><span class=\"zic2__checkbox-label\">Se ia \u00een considerare la recidiv\u0103<\/span><\/label>\r\n          <label class=\"zic2__checkbox-group\"><input type=\"checkbox\" class=\"zic2__checkbox\" data-field=\"conv_revoked\"><span class=\"zic2__checkbox-label\">Revocare\/anulare (rest = integral)<\/span><\/label>\r\n        <\/div>\r\n        <div class=\"zic2__help\" style=\"margin-bottom:8px\">Rest neexecutat (pentru recidiv\u0103 postcondamnatorie)<\/div>\r\n        <div class=\"zic2__grid3\">\r\n          <div class=\"zic2__field\"><label class=\"zic2__label\">Ani<\/label><input class=\"zic2__input\" type=\"number\" min=\"0\" value=\"0\" data-field=\"conv_rest_y\"><\/div>\r\n          <div class=\"zic2__field\"><label class=\"zic2__label\">Luni<\/label><input class=\"zic2__input\" type=\"number\" min=\"0\" value=\"0\" data-field=\"conv_rest_m\"><\/div>\r\n          <div class=\"zic2__field\"><label class=\"zic2__label\">Zile<\/label><input class=\"zic2__input\" type=\"number\" min=\"0\" value=\"0\" data-field=\"conv_rest_d\"><\/div>\r\n        <\/div>\r\n      <\/div>`;\r\n    return row;\r\n  };\r\n\r\n  const buildOffRow = (idx, id) => {\r\n    const row = el('div', 'zic2__row');\r\n    row.setAttribute('data-row', 'off');\r\n    row.setAttribute('data-id', id);\r\n\r\n    row.innerHTML = `\r\n      <div class=\"zic2__rowHead\">\r\n        <span class=\"zic2__rowTitle\">Fapta #${idx}<\/span>\r\n        <span class=\"zic2__rowMeta\" data-summary>\u2014<\/span>\r\n        <div class=\"zic2__spacer\"><\/div>\r\n        <button type=\"button\" class=\"zic2__btn zic2__btn--outline zic2__btn--small\" data-action=\"toggleAdv\">Avansat<\/button>\r\n        <button type=\"button\" class=\"zic2__btn zic2__btn--danger zic2__btn--small\" data-action=\"removeOff\">\u0218terge<\/button>\r\n      <\/div>\r\n      <div class=\"zic2__rowBody\">\r\n        <div class=\"zic2__rowSection\">\r\n          <div class=\"zic2__rowSectionTitle\">Date principale<\/div>\r\n          <div class=\"zic2__grid3\">\r\n            <div class=\"zic2__field\"><label class=\"zic2__label\">Data faptei<\/label><input class=\"zic2__input\" type=\"text\" placeholder=\"dd.mm.yyyy\" data-field=\"off_date\"><\/div>\r\n            <div class=\"zic2__field\"><label class=\"zic2__label\">Tip pedeaps\u0103<\/label><select class=\"zic2__select\" data-field=\"pen_type\"><option value=\"prison\">\u00cenchisoare<\/option><option value=\"fine\">Amend\u0103<\/option><option value=\"mix\">\u00cenchisoare + amend\u0103<\/option><option value=\"life\">Deten\u021biune pe via\u021b\u0103<\/option><\/select><\/div>\r\n            <div class=\"zic2__field\"><label class=\"zic2__label\">Referin\u021b\u0103<\/label><div class=\"zic2__chip\" data-ref-basic>Auto<\/div><\/div>\r\n          <\/div>\r\n        <\/div>\r\n        <div class=\"zic2__rowSection\" data-pen-section>\r\n          <div class=\"zic2__rowSectionTitle\">Pedeaps\u0103<\/div>\r\n          <div data-panel=\"prison\">\r\n            <div class=\"zic2__help\" style=\"margin-bottom:8px\">\u00cenchisoare<\/div>\r\n            <div class=\"zic2__grid3\">\r\n              <div class=\"zic2__field\"><label class=\"zic2__label\">Ani<\/label><input class=\"zic2__input\" type=\"number\" min=\"0\" value=\"0\" data-field=\"pr_y\"><\/div>\r\n              <div class=\"zic2__field\"><label class=\"zic2__label\">Luni<\/label><input class=\"zic2__input\" type=\"number\" min=\"0\" value=\"0\" data-field=\"pr_m\"><\/div>\r\n              <div class=\"zic2__field\"><label class=\"zic2__label\">Zile<\/label><input class=\"zic2__input\" type=\"number\" min=\"0\" value=\"0\" data-field=\"pr_d\"><\/div>\r\n            <\/div>\r\n          <\/div>\r\n          <div data-panel=\"fine\" class=\"zic2__hidden\">\r\n            <div class=\"zic2__help\" style=\"margin-bottom:8px\">Amend\u0103<\/div>\r\n            <div class=\"zic2__grid3\">\r\n              <div class=\"zic2__field\"><label class=\"zic2__label\">Zile-amend\u0103<\/label><input class=\"zic2__input\" type=\"number\" min=\"0\" value=\"0\" data-field=\"fi_df\"><\/div>\r\n              <div class=\"zic2__field\"><label class=\"zic2__label\">Lei\/zi<\/label><input class=\"zic2__input\" type=\"number\" min=\"0\" value=\"0\" data-field=\"fi_lpd\"><\/div>\r\n              <div class=\"zic2__field\"><label class=\"zic2__label\">Total<\/label><div class=\"zic2__help\">= zile \u00d7 lei\/zi<\/div><\/div>\r\n            <\/div>\r\n          <\/div>\r\n          <div data-panel=\"life\" class=\"zic2__hidden\"><div class=\"zic2__help\">Deten\u021biune pe via\u021b\u0103 selectat\u0103.<\/div><\/div>\r\n        <\/div>\r\n      <\/div>\r\n      <div class=\"zic2__adv\" data-adv>\r\n        <div class=\"zic2__rowSectionTitle\">Set\u0103ri avansate<\/div>\r\n        <div class=\"zic2__field\" style=\"margin-bottom:12px\"><label class=\"zic2__label\">Condamnare de referin\u021b\u0103<\/label><select class=\"zic2__select\" data-field=\"off_ref\"><option value=\"auto\">Auto (cea mai recent\u0103 definitiv\u0103 \u00eenainte de fapt\u0103)<\/option><option value=\"none\">F\u0103r\u0103 referin\u021b\u0103<\/option><\/select><\/div>\r\n        <label class=\"zic2__checkbox-group\"><input type=\"checkbox\" class=\"zic2__checkbox\" data-field=\"off_recid_ok\"><span class=\"zic2__checkbox-label\">Fapta \u00eendepline\u0219te condi\u021biile recidivei (inten\u021bie & min legal >= 1 an)<\/span><\/label>\r\n      <\/div>`;\r\n    return row;\r\n  };\r\n\r\n  const updatePenaltyPanels = (row, type) => {\r\n    const prison = row.querySelector('[data-panel=\"prison\"]');\r\n    const fine = row.querySelector('[data-panel=\"fine\"]');\r\n    const life = row.querySelector('[data-panel=\"life\"]');\r\n    if (!prison || !fine || !life) return;\r\n\r\n    prison.classList.add('zic2__hidden');\r\n    fine.classList.add('zic2__hidden');\r\n    life.classList.add('zic2__hidden');\r\n\r\n    if (type === 'prison') prison.classList.remove('zic2__hidden');\r\n    else if (type === 'fine') fine.classList.remove('zic2__hidden');\r\n    else if (type === 'mix') { prison.classList.remove('zic2__hidden'); fine.classList.remove('zic2__hidden'); }\r\n    else if (type === 'life') life.classList.remove('zic2__hidden');\r\n  };\r\n\r\n  const readPenaltyFromRow = (row) => {\r\n    const typeSel = row.querySelector('[data-field=\"pen_type\"]');\r\n    const t = typeSel ? typeSel.value : 'prison';\r\n    const p = emptyPenalty();\r\n\r\n    if (t === 'life') { p.life = true; return p; }\r\n\r\n    if (t === 'prison' || t === 'mix') {\r\n      const py = row.querySelector('[data-field=\"pr_y\"]');\r\n      const pm = row.querySelector('[data-field=\"pr_m\"]');\r\n      const pd = row.querySelector('[data-field=\"pr_d\"]');\r\n      p.prisonDays = ymdToDays(py ? py.value : 0, pm ? pm.value : 0, pd ? pd.value : 0);\r\n    }\r\n\r\n    if (t === 'fine' || t === 'mix') {\r\n      const df = row.querySelector('[data-field=\"fi_df\"]');\r\n      const lpd = row.querySelector('[data-field=\"fi_lpd\"]');\r\n      const dayFines = toInt(df ? df.value : 0);\r\n      const leiPerDay = toFloat(lpd ? lpd.value : 0);\r\n      if (dayFines > 0 && leiPerDay > 0) {\r\n        const baniPerDay = leiToBani(leiPerDay);\r\n        p.fine = { dayFines, baniPerDay, totalBani: dayFines * baniPerDay };\r\n      }\r\n    }\r\n    return p;\r\n  };\r\n\r\n  \/\/ === UPDATE UI ===\r\n  const updateRefOptions = () => {\r\n    const convRows = $$('[data-row=\"conv\"]');\r\n    const offRows = $$('[data-row=\"off\"]');\r\n\r\n    offRows.forEach(o => {\r\n      const sel = o.querySelector('[data-field=\"off_ref\"]');\r\n      if (!sel) return;\r\n      const cur = sel.value || 'auto';\r\n      sel.innerHTML = '<option value=\"auto\">Auto (cea mai recent\u0103 definitiv\u0103 \u00eenainte de fapt\u0103)<\/option><option value=\"none\">F\u0103r\u0103 referin\u021b\u0103<\/option>';\r\n\r\n      convRows.forEach((c, j) => {\r\n        const cid = c.getAttribute('data-id');\r\n        const cdef = c.querySelector('[data-field=\"conv_def\"]');\r\n        const defStr = cdef ? safeText(cdef.value) : '';\r\n        const opt = document.createElement('option');\r\n        opt.value = 'conv:' + cid;\r\n        opt.textContent = `Condamnare #${j + 1}${defStr ? ` (def. ${defStr})` : ''}`;\r\n        sel.appendChild(opt);\r\n      });\r\n\r\n      let found = false;\r\n      for (const opt of sel.options) { if (opt.value === cur) { found = true; break; } }\r\n      sel.value = found ? cur : 'auto';\r\n\r\n      const refBasic = o.querySelector('[data-ref-basic]');\r\n      if (refBasic) refBasic.textContent = sel.value === 'auto' ? 'Auto' : sel.value === 'none' ? 'F\u0103r\u0103 ref.' : 'Manual';\r\n    });\r\n  };\r\n\r\n  const updateSummaries = () => {\r\n    $$('[data-row=\"conv\"]').forEach((c, i) => {\r\n      const defEl = c.querySelector('[data-field=\"conv_def\"]');\r\n      const execEl = c.querySelector('[data-field=\"conv_exec\"]');\r\n      const defTs = parseRoDateTs(defEl ? defEl.value : '');\r\n      const execTs = parseRoDateTs(execEl ? execEl.value : '');\r\n      const p = readPenaltyFromRow(c);\r\n      const meta = c.querySelector('[data-summary]');\r\n      if (meta) meta.textContent = `def. ${defTs ? fmtDate(defTs) : '\u2014'} | exec. ${execTs ? fmtDate(execTs) : '\u2014'} | ${penaltySummary(p)}`;\r\n    });\r\n\r\n    $$('[data-row=\"off\"]').forEach((o, i) => {\r\n      const dateEl = o.querySelector('[data-field=\"off_date\"]');\r\n      const dTs = parseRoDateTs(dateEl ? dateEl.value : '');\r\n      const p = readPenaltyFromRow(o);\r\n      const meta = o.querySelector('[data-summary]');\r\n      if (meta) meta.textContent = `${dTs ? fmtDate(dTs) : '\u2014'} | ${penaltySummary(p)}`;\r\n    });\r\n  };\r\n\r\n  const renderTimeline = () => {\r\n    const wrap = $('[data-timeline-wrap]');\r\n    const showEl = $('[data-field=\"showTimeline\"]');\r\n    const show = showEl ? showEl.checked : true;\r\n    if (wrap) wrap.style.display = show ? '' : 'none';\r\n    if (!show) return;\r\n\r\n    const tl = $('[data-timeline]');\r\n    if (!tl) return;\r\n\r\n    const events = [];\r\n\r\n    $$('[data-row=\"conv\"]').forEach((c, i) => {\r\n      const defEl = c.querySelector('[data-field=\"conv_def\"]');\r\n      const execEl = c.querySelector('[data-field=\"conv_exec\"]');\r\n      const defTs = parseRoDateTs(defEl ? defEl.value : '');\r\n      const execTs = parseRoDateTs(execEl ? execEl.value : '');\r\n      const p = readPenaltyFromRow(c);\r\n\r\n      if (defTs) events.push({ ts: defTs, type: 'conv', title: `${fmtDate(defTs)} \u2014 Condamnare definitiv\u0103`, meta: `C${i + 1} | ${penaltySummary(p)}` });\r\n      if (execTs) events.push({ ts: execTs, type: 'exec', title: `${fmtDate(execTs)} \u2014 Considerat\u0103 executat\u0103`, meta: `C${i + 1}` });\r\n    });\r\n\r\n    $$('[data-row=\"off\"]').forEach((o, i) => {\r\n      const dateEl = o.querySelector('[data-field=\"off_date\"]');\r\n      const dTs = parseRoDateTs(dateEl ? dateEl.value : '');\r\n      const p = readPenaltyFromRow(o);\r\n      if (dTs) events.push({ ts: dTs, type: 'off', title: `${fmtDate(dTs)} \u2014 Fapt\u0103`, meta: `F${i + 1} | ${penaltySummary(p)}` });\r\n    });\r\n\r\n    events.sort((a, b) => a.ts - b.ts);\r\n\r\n    tl.innerHTML = `\r\n      <div class=\"zic2__tlLegend\">\r\n        <span class=\"zic2__tlTag zic2__tlTag--conv\">Condamnare<\/span>\r\n        <span class=\"zic2__tlTag zic2__tlTag--exec\">Executat\u0103<\/span>\r\n        <span class=\"zic2__tlTag zic2__tlTag--off\">Fapt\u0103<\/span>\r\n      <\/div>`;\r\n\r\n    if (!events.length) {\r\n      tl.innerHTML += '<div class=\"zic2__tlEmpty\">Adaug\u0103 condamn\u0103ri \u0219i\/sau fapte pentru a vedea timeline-ul.<\/div>';\r\n      return;\r\n    }\r\n\r\n    const list = el('div', 'zic2__tlList');\r\n    events.forEach(ev => {\r\n      list.innerHTML += `<div class=\"zic2__tlItem\"><div class=\"zic2__tlDot zic2__tlDot--${ev.type}\"><\/div><div class=\"zic2__tlContent\"><div class=\"zic2__tlTitle\">${escapeHtml(ev.title)}<\/div><div class=\"zic2__tlMeta\">${escapeHtml(ev.meta)}<\/div><\/div><\/div>`;\r\n    });\r\n    tl.appendChild(list);\r\n  };\r\n\r\n  let refreshTimer;\r\n  const scheduleRefresh = () => {\r\n    clearTimeout(refreshTimer);\r\n    refreshTimer = setTimeout(() => { updateRefOptions(); updateSummaries(); renderTimeline(); }, 150);\r\n  };\r\n\r\n  \/\/ === ACTIONS ===\r\n  const addConv = () => {\r\n    convCounter++;\r\n    const id = uid();\r\n    const list = $('[data-list=\"conv\"]');\r\n    const idx = list.querySelectorAll('[data-row=\"conv\"]').length + 1;\r\n    list.appendChild(buildConvRow(idx, id));\r\n    scheduleRefresh();\r\n  };\r\n\r\n  const addOff = () => {\r\n    offCounter++;\r\n    const id = uid();\r\n    const list = $('[data-list=\"off\"]');\r\n    const idx = list.querySelectorAll('[data-row=\"off\"]').length + 1;\r\n    list.appendChild(buildOffRow(idx, id));\r\n    scheduleRefresh();\r\n  };\r\n\r\n  const resetConv = () => { $('[data-list=\"conv\"]').innerHTML = ''; convCounter = 0; addConv(); };\r\n  const resetOff = () => { $('[data-list=\"off\"]').innerHTML = ''; offCounter = 0; addOff(); };\r\n\r\n  const resetAll = () => {\r\n    setStatus(''); setFinal('\u2014', []); setSteps(['Completeaz\u0103 datele \u0219i apas\u0103 \"Calculeaz\u0103\".']); setAudit('');\r\n    state.lastResult = null; resetConv(); resetOff(); scheduleRefresh();\r\n  };\r\n\r\n  const removeRow = (row, type) => {\r\n    if (!row || !row.parentNode) return;\r\n    row.remove();\r\n    const list = $(`[data-list=\"${type}\"]`);\r\n    const rows = list.querySelectorAll(`[data-row=\"${type}\"]`);\r\n    rows.forEach((r, i) => { const title = r.querySelector('.zic2__rowTitle'); if (title) title.textContent = `${type === 'conv' ? 'Condamnare' : 'Fapta'} #${i + 1}`; });\r\n    if (!rows.length) { type === 'conv' ? addConv() : addOff(); }\r\n    scheduleRefresh();\r\n  };\r\n\r\n  const toggleAdv = (row, btn) => {\r\n    const adv = row.querySelector('[data-adv]');\r\n    if (!adv) return;\r\n    const isOpen = adv.classList.contains('is-open');\r\n    adv.classList.toggle('is-open', !isOpen);\r\n    btn.textContent = isOpen ? 'Avansat' : '\u00cenchide';\r\n  };\r\n\r\n  \/\/ === RESULT UI ===\r\n  const setStatus = (txt, isError) => { const el = $('[data-status]'); if (el) { el.textContent = txt || ''; el.className = 'zic2__status' + (isError ? ' zic2__status--error' : (txt ? ' zic2__status--ok' : '')); } };\r\n  const setFinal = (txt, metaLines) => { const f = $('[data-final]'); const m = $('[data-final-meta]'); if (f) f.textContent = txt || '\u2014'; if (m) { m.innerHTML = ''; metaLines.forEach(l => { const d = document.createElement('div'); d.textContent = l; m.appendChild(d); }); } };\r\n  const setSteps = (steps) => { const ol = $('[data-steps]'); if (!ol) return; ol.innerHTML = ''; if (!steps.length) { ol.innerHTML = '<li>Completeaz\u0103 datele \u0219i apas\u0103 \"Calculeaz\u0103\".<\/li>'; return; } steps.forEach(s => { const li = document.createElement('li'); li.textContent = s; ol.appendChild(li); }); };\r\n  const setAudit = (txt) => { const pre = $('[data-audit]'); if (pre) pre.textContent = txt || ''; };\r\n\r\n  \/\/ === READ DATA ===\r\n  const readConvictions = () => {\r\n    const items = [], errors = [];\r\n    $$('[data-row=\"conv\"]').forEach((c, i) => {\r\n      const defEl = c.querySelector('[data-field=\"conv_def\"]');\r\n      const defStr = safeText(defEl ? defEl.value : '');\r\n      const defTs = parseRoDateTs(defStr);\r\n      if (!defTs) { errors.push(`Condamnare #${i + 1}: dat\u0103 definitiv\u0103 invalid\u0103.`); return; }\r\n\r\n      const execEl = c.querySelector('[data-field=\"conv_exec\"]');\r\n      const execStr = safeText(execEl ? execEl.value : '');\r\n      const execTs = execStr ? parseRoDateTs(execStr) : null;\r\n      if (execStr && !execTs) errors.push(`Condamnare #${i + 1}: dat\u0103 executat\u0103 invalid\u0103.`);\r\n\r\n      const typeSel = c.querySelector('[data-field=\"pen_type\"]');\r\n      const type = typeSel ? typeSel.value : 'prison';\r\n      const pen = readPenaltyFromRow(c);\r\n\r\n      if (type === 'prison' && pen.prisonDays <= 0 && !pen.life) { errors.push(`Condamnare #${i + 1}: completeaz\u0103 durata \u00eenchisorii.`); return; }\r\n      if (type === 'fine' && (!pen.fine || pen.fine.dayFines <= 0)) { errors.push(`Condamnare #${i + 1}: completeaz\u0103 amenda.`); return; }\r\n      if (type === 'mix' && (pen.prisonDays <= 0 || !pen.fine || pen.fine.dayFines <= 0)) { errors.push(`Condamnare #${i + 1}: completeaz\u0103 \u00eenchisoarea \u0219i amenda.`); return; }\r\n\r\n      const eligEl = c.querySelector('[data-field=\"conv_eligrec\"]');\r\n      const revokedEl = c.querySelector('[data-field=\"conv_revoked\"]');\r\n      const restY = c.querySelector('[data-field=\"conv_rest_y\"]');\r\n      const restM = c.querySelector('[data-field=\"conv_rest_m\"]');\r\n      const restD = c.querySelector('[data-field=\"conv_rest_d\"]');\r\n      let restDays = ymdToDays(restY?.value, restM?.value, restD?.value);\r\n      if (revokedEl?.checked && restDays === 0 && pen.prisonDays > 0) restDays = pen.prisonDays;\r\n\r\n      items.push({ id: c.getAttribute('data-id'), idx: i + 1, defTs, defStr: fmtDate(defTs), execTs, execStr: execTs ? fmtDate(execTs) : '', type, penalty: pen, eligibleRec: eligEl?.checked ?? true, revoked: revokedEl?.checked ?? false, restDays });\r\n    });\r\n    items.sort((a, b) => a.defTs - b.defTs);\r\n    return { items, errors };\r\n  };\r\n\r\n  const readOffences = () => {\r\n    const items = [], errors = [];\r\n    $$('[data-row=\"off\"]').forEach((o, i) => {\r\n      const dateEl = o.querySelector('[data-field=\"off_date\"]');\r\n      const dateStr = safeText(dateEl ? dateEl.value : '');\r\n      const dTs = parseRoDateTs(dateStr);\r\n      if (!dTs) { errors.push(`Fapta #${i + 1}: dat\u0103 invalid\u0103.`); return; }\r\n\r\n      const typeSel = o.querySelector('[data-field=\"pen_type\"]');\r\n      const type = typeSel ? typeSel.value : 'prison';\r\n      const pen = readPenaltyFromRow(o);\r\n\r\n      if (type === 'prison' && pen.prisonDays <= 0 && !pen.life) { errors.push(`Fapta #${i + 1}: completeaz\u0103 durata \u00eenchisorii.`); return; }\r\n      if (type === 'fine' && (!pen.fine || pen.fine.dayFines <= 0)) { errors.push(`Fapta #${i + 1}: completeaz\u0103 amenda.`); return; }\r\n      if (type === 'mix' && (pen.prisonDays <= 0 || !pen.fine || pen.fine.dayFines <= 0)) { errors.push(`Fapta #${i + 1}: completeaz\u0103 \u00eenchisoarea \u0219i amenda.`); return; }\r\n\r\n      const refSel = o.querySelector('[data-field=\"off_ref\"]');\r\n      const recidEl = o.querySelector('[data-field=\"off_recid_ok\"]');\r\n      items.push({ id: o.getAttribute('data-id'), idx: i + 1, dateTs: dTs, dateStr: fmtDate(dTs), type, penalty: pen, refVal: refSel?.value ?? 'auto', recidOk: recidEl?.checked ?? false });\r\n    });\r\n    items.sort((a, b) => a.dateTs - b.dateTs);\r\n    return { items, errors };\r\n  };\r\n\r\n  const pickReference = (off, convictions) => {\r\n    if (off.refVal === 'none') return { ref: null, sameDay: false };\r\n    if (off.refVal?.startsWith('conv:')) {\r\n      const id = off.refVal.slice(5);\r\n      const c = convictions.find(x => x.id === id);\r\n      return c ? { ref: c, sameDay: c.defTs === off.dateTs } : { ref: null, sameDay: false };\r\n    }\r\n    let bestBefore = null, sameDay = null;\r\n    convictions.forEach(c => {\r\n      if (c.defTs === off.dateTs) sameDay = c;\r\n      if (c.defTs < off.dateTs && (!bestBefore || c.defTs > bestBefore.defTs)) bestBefore = c;\r\n    });\r\n    if (sameDay) return { ref: sameDay, sameDay: true };\r\n    return { ref: bestBefore, sameDay: false };\r\n  };\r\n\r\n  const classify = (off, refPack) => {\r\n    if (!refPack.ref) return { code: 'none', label: 'F\u0103r\u0103 antecedent' };\r\n    if (refPack.sameDay) return { code: 'same_day', label: 'Ziua definitiv\u0103rii => concurs' };\r\n    const ref = refPack.ref;\r\n    const executedAtOffence = ref.execTs && ref.execTs < off.dateTs;\r\n    const recidOk = ref.eligibleRec && off.recidOk;\r\n    if (!executedAtOffence) return recidOk ? { code: 'rec_postcond', label: 'Recidiv\u0103 postcondamnatorie' } : { code: 'plural_inter', label: 'Pluralitate intermediar\u0103' };\r\n    return recidOk ? { code: 'rec_postexec', label: 'Recidiv\u0103 postexecutorie' } : { code: 'after_exec', label: 'Dup\u0103 executare (f\u0103r\u0103 recidiv\u0103)' };\r\n  };\r\n\r\n  \/\/ === CALCULATE ===\r\n  const calculate = () => {\r\n    setStatus(''); setFinal('\u2014', []); setSteps([]); setAudit('');\r\n    const cfg = getCfg();\r\n    const convRead = readConvictions();\r\n    const offRead = readOffences();\r\n    const errors = [...convRead.errors, ...offRead.errors];\r\n    if (!offRead.items.length) errors.push('Adaug\u0103 cel pu\u021bin o fapt\u0103 \u00een dosarul curent.');\r\n\r\n    if (errors.length) {\r\n      setStatus('Erori', true); setSteps(errors); setAudit('Erori:\\n- ' + errors.join('\\n- ')); setFinal('\u2014', ['Corecteaz\u0103 erorile \u0219i recalculeaz\u0103.']);\r\n      state.lastResult = null; return;\r\n    }\r\n\r\n    const convictions = convRead.items, offences = offRead.items;\r\n    const warnings = [], tech = ['=== Audit tehnic ===', `Config amenzi: ${cfg.label}`, ''];\r\n    const buckets = {};\r\n\r\n    const addToBucket = (key, ref, status, item) => { if (!buckets[key]) buckets[key] = { key, ref, status, items: [] }; buckets[key].items.push(item); };\r\n\r\n    offences.forEach(o => {\r\n      const refPack = pickReference(o, convictions);\r\n      const cls = classify(o, refPack);\r\n      tech.push(`F${o.idx} ${o.dateStr} -> ${cls.code} | ref=${refPack.ref ? refPack.ref.defStr : '\u2014'}`);\r\n\r\n      if (cls.code === 'same_day') { warnings.push('Exist\u0103 fapt\u0103 \u00een ziua definitiv\u0103rii: de regul\u0103 se trateaz\u0103 ca concurs.'); addToBucket('none', null, 'none', { off: o, cls, refPack }); return; }\r\n      if (!refPack.ref) {\r\n        if (convictions.some(c => c.defTs > o.dateTs)) warnings.push('Exist\u0103 fapt\u0103 anterioar\u0103 unei condamn\u0103ri definitive: poate fi relevant art. 40.');\r\n        addToBucket('none', null, 'none', { off: o, cls, refPack }); return;\r\n      }\r\n\r\n      const ref = refPack.ref;\r\n      if (!ref.execTs) warnings.push(`Lipse\u0219te \"data considerat\u0103 executat\u0103\" pentru condamnarea din ${ref.defStr}.`);\r\n      const executedAtOffence = ref.execTs && ref.execTs < o.dateTs;\r\n      addToBucket(`${ref.id}::${executedAtOffence ? 'after' : 'before'}`, ref, executedAtOffence ? 'after' : 'before', { off: o, cls, refPack });\r\n      if (cls.code === 'rec_postexec') warnings.push('Recidiv\u0103 postexecutorie: pedepsele trebuie stabilite \u00een limite majorate (+1\/2).');\r\n    });\r\n\r\n    const bucketKeys = Object.keys(buckets).sort((a, b) => {\r\n      if (a === 'none') return -1; if (b === 'none') return 1;\r\n      const ra = buckets[a].ref, rb = buckets[b].ref;\r\n      if (ra.defTs !== rb.defTs) return ra.defTs - rb.defTs;\r\n      return buckets[a].status === buckets[b].status ? 0 : buckets[a].status === 'before' ? -1 : 1;\r\n    });\r\n\r\n    const bucketResults = [], humanSteps = [];\r\n\r\n    \/\/ Grouping info\r\n    const groupMap = {};\r\n    bucketKeys.forEach(bk => {\r\n      const b = buckets[bk];\r\n      const label = b.ref ? `Condamnarea ${b.ref.defStr}` : 'F\u0103r\u0103 referin\u021b\u0103 \/ concurs special';\r\n      if (!groupMap[label]) groupMap[label] = [];\r\n      b.items.forEach(it => groupMap[label].push(`F${it.off.idx}`));\r\n    });\r\n    const groupLabels = Object.keys(groupMap);\r\n    if (groupLabels.length) {\r\n      humanSteps.push('Grupare fapte dup\u0103 condamnarea de referin\u021b\u0103:');\r\n      groupLabels.forEach(l => humanSteps.push(`  ${groupMap[l].join(', ')} => ${l}`));\r\n    }\r\n    humanSteps.push('\u00cen fiecare grup: concurs = pedeaps\u0103 max + 1\/3 din totalul celorlalte.');\r\n\r\n    bucketKeys.forEach(bk => {\r\n      const bkt = buckets[bk];\r\n      const comps = bkt.items.map(it => it.off.penalty);\r\n      const hasRecPostCond = bkt.items.some(it => it.cls.code === 'rec_postcond');\r\n      const hasPluralInter = bkt.items.some(it => it.cls.code === 'plural_inter');\r\n\r\n      const concRes = computeConcurs(comps, cfg);\r\n      let outP = penaltyFromConcursResult(concRes);\r\n      tech.push('', `Bucket: ${bkt.ref ? `${bkt.ref.defStr} \/ ${bkt.status}` : 'none'}`, `T2 concurs: ${penaltySummary(outP)}`);\r\n\r\n      if (bkt.ref && bkt.status === 'before') {\r\n        if (hasRecPostCond) {\r\n          const rest = bkt.ref.restDays || 0;\r\n          if (rest <= 0) warnings.push(`Recidiv\u0103 postcond: completeaz\u0103 \"rest neexecutat\" la condamnarea din ${bkt.ref.defStr}.`);\r\n          if (!outP.life) outP.prisonDays = Math.min(MAX_PRISON_DAYS, (outP.prisonDays || 0) + rest);\r\n          tech.push(`art.43 postcond: +rest=${fmtDays(rest)} => ${penaltySummary(outP)}`);\r\n          humanSteps.push(`Grup ${bkt.ref.defStr}: +rest neexecutat (recidiv\u0103 postcond).`);\r\n        } else if (hasPluralInter) {\r\n          const piRes = computeConcurs([bkt.ref.penalty, outP], cfg);\r\n          outP = penaltyFromConcursResult(piRes);\r\n          tech.push(`art.44 plural inter: T1+T2 => ${penaltySummary(outP)}`);\r\n          humanSteps.push(`Grup ${bkt.ref.defStr}: contopire cu pedeapsa anterioar\u0103 (pluralitate intermediar\u0103).`);\r\n        }\r\n      }\r\n      bucketResults.push(outP);\r\n    });\r\n\r\n    let finalPenalty;\r\n    if (bucketResults.length === 1) {\r\n      finalPenalty = bucketResults[0];\r\n      humanSteps.push('Rezultatul final = rezultatul unic ob\u021binut.');\r\n    } else {\r\n      const finRes = computeConcurs(bucketResults, cfg);\r\n      finalPenalty = penaltyFromConcursResult(finRes);\r\n      humanSteps.push('Contopire final\u0103 a rezultatelor grupurilor.');\r\n      tech.push('', `Concurs final: ${penaltySummary(finalPenalty)}`);\r\n    }\r\n\r\n    const uniqueWarnings = [...new Set(warnings)];\r\n    if (uniqueWarnings.length) humanSteps.push(`Avertiz\u0103ri: ${uniqueWarnings.join(' | ')}`);\r\n\r\n    setStatus('OK');\r\n    setFinal(penaltySummary(finalPenalty), [`Config: ${cfg.label}`, uniqueWarnings.length ? `Avertiz\u0103ri: ${uniqueWarnings.length}` : 'F\u0103r\u0103 avertiz\u0103ri majore.']);\r\n    setSteps(humanSteps);\r\n    setAudit(tech.join('\\n'));\r\n\r\n    state.lastResult = {\r\n      generatedAt: new Date().toISOString(),\r\n      config: { personType: $('[data-field=\"personType\"]').value, label: cfg.label },\r\n      convictions, offences,\r\n      result: { final: finalPenalty, finalText: penaltySummary(finalPenalty), steps: humanSteps, warnings: uniqueWarnings },\r\n      techAudit: tech.join('\\n')\r\n    };\r\n  };\r\n\r\n  \/\/ === EXPORT PDF ===\r\n  const exportPdf = () => {\r\n    if (!state.lastResult) { alert('Calculeaz\u0103 mai \u00eent\u00e2i pentru a genera PDF-ul.'); return; }\r\n\r\n    const printWindow = window.open('', '_blank');\r\n    if (!printWindow) { alert('Permite pop-up-urile pentru a genera PDF-ul.'); return; }\r\n\r\n    const { generatedAt, config, result, convictions, offences, techAudit } = state.lastResult;\r\n    const date = new Date().toLocaleDateString('ro-RO', { year: 'numeric', month: 'long', day: 'numeric' });\r\n\r\n    const html = `<!DOCTYPE html><html lang=\"ro\"><head><meta charset=\"UTF-8\"><title>Raport Calculator Pedeaps\u0103 - ZIC Legal<\/title>\r\n<style>*{box-sizing:border-box;margin:0;padding:0}body{font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Roboto,sans-serif;max-width:700px;margin:0 auto;padding:40px 30px;color:#1F2937;line-height:1.6}.header{border-bottom:3px solid #8A88FF;padding-bottom:20px;margin-bottom:30px}.header h1{color:#6F6CFF;font-size:24px;margin-bottom:5px}.header p{color:#6B7280;font-size:14px}.section{background:#F9FAFB;border-radius:12px;padding:20px;margin-bottom:20px}.section h2{font-size:16px;color:#374151;margin-bottom:15px;padding-bottom:10px;border-bottom:1px solid #E5E7EB}.kpi{font-size:22px;font-weight:700;color:#6F6CFF;margin-bottom:15px}ol,ul{padding-left:20px}li{margin-bottom:8px;color:#374151}table{width:100%;border-collapse:collapse;margin-top:10px}th,td{border:1px solid #E5E7EB;padding:8px;text-align:left;font-size:13px}th{background:#F3F4F6}.disclaimer{margin-top:30px;padding:15px;background:#F3F4F6;border-radius:8px;font-size:11px;color:#6B7280}.footer{margin-top:40px;padding-top:20px;border-top:1px solid #E5E7EB;text-align:center;color:#6B7280;font-size:12px}.footer a{color:#6F6CFF;text-decoration:none}@media print{body{padding:20px}.section{break-inside:avoid}}<\/style><\/head><body>\r\n<div class=\"header\"><h1>Calculator Pedeaps\u0103 Rezultant\u0103<\/h1><p>Raport generat la ${date} | ${config.label}<\/p><\/div>\r\n<div class=\"section\"><h2>Rezultat final<\/h2><div class=\"kpi\">${escapeHtml(result.finalText)}<\/div><\/div>\r\n<div class=\"section\"><h2>Explica\u021bie<\/h2><ol>${result.steps.map(s => `<li>${escapeHtml(s)}<\/li>`).join('')}<\/ol><\/div>\r\n${result.warnings.length ? `<div class=\"section\"><h2>Avertiz\u0103ri<\/h2><ul>${result.warnings.map(w => `<li>${escapeHtml(w)}<\/li>`).join('')}<\/ul><\/div>` : ''}\r\n<div class=\"section\"><h2>Condamn\u0103ri anterioare<\/h2><table><thead><tr><th>#<\/th><th>Definitiv\u0103<\/th><th>Executat\u0103<\/th><th>Pedeaps\u0103<\/th><\/tr><\/thead><tbody>${convictions.map(c => `<tr><td>${c.idx}<\/td><td>${escapeHtml(c.defStr)}<\/td><td>${escapeHtml(c.execStr || '\u2014')}<\/td><td>${escapeHtml(penaltySummary(c.penalty))}<\/td><\/tr>`).join('')}<\/tbody><\/table><\/div>\r\n<div class=\"section\"><h2>Fapte \u00een dosarul curent<\/h2><table><thead><tr><th>#<\/th><th>Data<\/th><th>Pedeaps\u0103<\/th><\/tr><\/thead><tbody>${offences.map(o => `<tr><td>${o.idx}<\/td><td>${escapeHtml(o.dateStr)}<\/td><td>${escapeHtml(penaltySummary(o.penalty))}<\/td><\/tr>`).join('')}<\/tbody><\/table><\/div>\r\n<div class=\"disclaimer\"><strong>Disclaimer:<\/strong> Acest raport este oferit exclusiv \u00een scop informativ \u0219i educativ. Rezultatele generate nu constituie consultan\u021b\u0103 juridic\u0103 \u0219i trebuie verificate \u00een contextul specific al fiec\u0103rei spe\u021be.<\/div>\r\n<div class=\"footer\"><p>Generat cu Calculator Pedeaps\u0103 Rezultant\u0103<\/p><p><a href=\"https:\/\/zic.legal\">ZIC Legal<\/a><\/p><\/div><\/body><\/html>`;\r\n\r\n    printWindow.document.write(html);\r\n    printWindow.document.close();\r\n    printWindow.focus();\r\n    setTimeout(() => printWindow.print(), 300);\r\n  };\r\n\r\n  \/\/ === SAMPLE ===\r\n  const loadSample = () => {\r\n    resetAll();\r\n    const convRow = $('[data-row=\"conv\"]');\r\n    if (convRow) {\r\n      convRow.querySelector('[data-field=\"conv_def\"]').value = '01.01.2022';\r\n      convRow.querySelector('[data-field=\"pen_type\"]').value = 'prison';\r\n      updatePenaltyPanels(convRow, 'prison');\r\n      convRow.querySelector('[data-field=\"pr_y\"]').value = '2';\r\n      convRow.querySelector('[data-field=\"conv_rest_y\"]').value = '1';\r\n      const eligEl = convRow.querySelector('[data-field=\"conv_eligrec\"]');\r\n      if (eligEl) eligEl.checked = true;\r\n    }\r\n\r\n    const offRow = $('[data-row=\"off\"]');\r\n    if (offRow) {\r\n      offRow.querySelector('[data-field=\"off_date\"]').value = '01.06.2022';\r\n      offRow.querySelector('[data-field=\"pen_type\"]').value = 'prison';\r\n      updatePenaltyPanels(offRow, 'prison');\r\n      offRow.querySelector('[data-field=\"pr_y\"]').value = '3';\r\n      const recidEl = offRow.querySelector('[data-field=\"off_recid_ok\"]');\r\n      if (recidEl) recidEl.checked = true;\r\n    }\r\n\r\n    addOff();\r\n    const offRows = $$('[data-row=\"off\"]');\r\n    if (offRows.length > 1) {\r\n      const o2 = offRows[1];\r\n      o2.querySelector('[data-field=\"off_date\"]').value = '01.07.2022';\r\n      o2.querySelector('[data-field=\"pen_type\"]').value = 'prison';\r\n      updatePenaltyPanels(o2, 'prison');\r\n      o2.querySelector('[data-field=\"pr_y\"]').value = '1';\r\n      const recidEl2 = o2.querySelector('[data-field=\"off_recid_ok\"]');\r\n      if (recidEl2) recidEl2.checked = true;\r\n    }\r\n\r\n    scheduleRefresh();\r\n    setStatus('Exemplu \u00eenc\u0103rcat');\r\n    setSteps(['Exemplu \u00eenc\u0103rcat. Apas\u0103 \"Calculeaz\u0103\".']);\r\n  };\r\n\r\n  \/\/ === EVENT HANDLERS ===\r\n  const init = () => {\r\n    addConv(); addOff(); scheduleRefresh();\r\n\r\n    root.addEventListener('input', scheduleRefresh);\r\n    root.addEventListener('change', (e) => {\r\n      const t = e.target;\r\n      if (t?.getAttribute('data-field') === 'pen_type') {\r\n        const row = t.closest('[data-row]');\r\n        if (row) updatePenaltyPanels(row, t.value);\r\n      }\r\n      scheduleRefresh();\r\n    });\r\n\r\n    root.addEventListener('click', (e) => {\r\n      const btn = e.target.closest('[data-action]');\r\n      if (!btn) return;\r\n      const act = btn.getAttribute('data-action');\r\n\r\n      switch (act) {\r\n        case 'addConv': addConv(); break;\r\n        case 'addOff': addOff(); break;\r\n        case 'resetConv': resetConv(); break;\r\n        case 'resetOff': resetOff(); break;\r\n        case 'resetAll': resetAll(); break;\r\n        case 'calculate': calculate(); break;\r\n        case 'exportPdf': exportPdf(); break;\r\n        case 'loadSample': loadSample(); break;\r\n        case 'toggleAdv': const row = btn.closest('[data-row]'); if (row) toggleAdv(row, btn); break;\r\n        case 'removeConv': const cr = btn.closest('[data-row=\"conv\"]'); if (cr) removeRow(cr, 'conv'); break;\r\n        case 'removeOff': const or = btn.closest('[data-row=\"off\"]'); if (or) removeRow(or, 'off'); break;\r\n      }\r\n    });\r\n  };\r\n\r\n  if (document.readyState === 'loading') document.addEventListener('DOMContentLoaded', init);\r\n  else init();\r\n})();\r\n<\/script>\r\n<\/div>\n<div data-tool-content=\"formular\" style=\"display:none\"><\/div>\n<div data-tool-content=\"email\" style=\"display:none\"><div id=\"zic-email-analyzer\" class=\"zic2\" data-zic2=\"1\">\r\n  <div class=\"zic2__wrap\">\r\n    <!-- Header -->\r\n    <header class=\"zic2__hero\">\r\n      <div class=\"zic2__brandbar\">\r\n        <div class=\"zic2__mark\" aria-hidden=\"true\">\r\n          <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n            <path d=\"M4 4h16c1.1 0 2 .9 2 2v12c0 1.1-.9 2-2 2H4c-1.1 0-2-.9-2-2V6c0-1.1.9-2 2-2z\"\/>\r\n            <polyline points=\"22,6 12,13 2,6\"\/>\r\n          <\/svg>\r\n        <\/div>\r\n        <div class=\"zic2__headerText\">\r\n          <h2 class=\"zic2__title\" data-i18n=\"title\">Analizator Header Email<\/h2>\r\n          <p class=\"zic2__subtitle\" data-i18n=\"subtitle\">Detecteaza email spoofing si phishing<\/p>\r\n        <\/div>\r\n        <button type=\"button\" class=\"zic2__langBtn\" data-action=\"toggleLang\" title=\"Switch language\">\r\n          <span data-i18n=\"langSwitch\">EN<\/span>\r\n        <\/button>\r\n      <\/div>\r\n    <\/header>\r\n\r\n    <!-- GDPR Privacy Notice -->\r\n    <div class=\"zic2__gdprNotice\">\r\n      <div class=\"zic2__gdprIcon\">\r\n        <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\r\n          <rect x=\"3\" y=\"11\" width=\"18\" height=\"11\" rx=\"2\" ry=\"2\"\/>\r\n          <path d=\"M7 11V7a5 5 0 0 1 10 0v4\"\/>\r\n        <\/svg>\r\n      <\/div>\r\n      <div class=\"zic2__gdprContent\">\r\n        <span class=\"zic2__gdprTitle\" data-i18n=\"gdprTitle\">Protectia datelor tale<\/span>\r\n        <p data-i18n-html=\"gdprIntro\">Acest instrument proceseaza datele <em>exclusiv local<\/em>, in browser-ul tau. Header-ul email-ului (introdus manual sau din fisier):<\/p>\r\n        <ul>\r\n          <li data-i18n=\"gdprList1\">NU este trimis catre niciun server extern<\/li>\r\n          <li data-i18n=\"gdprList2\">NU este stocat sau salvat nicaieri<\/li>\r\n          <li data-i18n=\"gdprList3\">NU este partajat cu terti<\/li>\r\n          <li data-i18n=\"gdprList4\">Fisierele incarcate sunt citite local (FileReader API)<\/li>\r\n          <li data-i18n=\"gdprList5\">Este sters automat cand inchizi sau reincarci pagina<\/li>\r\n        <\/ul>\r\n        <p data-i18n=\"gdprCompliance\">Conform GDPR (Regulamentul UE 2016\/679), nu colectam si nu procesam date cu caracter personal pe serverele noastre.<\/p>\r\n      <\/div>\r\n    <\/div>\r\n\r\n    <!-- Consent Checkbox -->\r\n    <div class=\"zic2__consentCard\" data-consent-card>\r\n      <label class=\"zic2__checkbox\">\r\n        <input type=\"checkbox\" data-field=\"gdprConsent\" id=\"zic2-gdpr-consent\">\r\n        <span class=\"zic2__checkmark\"><\/span>\r\n        <span class=\"zic2__checkLabel\">\r\n          <strong data-i18n=\"consentTitle\">Confirm ca am inteles modul de procesare a datelor<\/strong>\r\n          <small data-i18n=\"consentDesc\">Inteleg ca datele introduse sunt procesate doar local in browser-ul meu si nu sunt transmise nicaieri.<\/small>\r\n        <\/span>\r\n      <\/label>\r\n    <\/div>\r\n\r\n    <!-- Main Content (hidden until consent) -->\r\n    <div class=\"zic2__mainContent is-hidden\" data-main-content>\r\n      <!-- Formula info -->\r\n      <div class=\"zic2__formula\">\r\n        <div class=\"zic2__formulaIcon\">\r\n          <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n            <circle cx=\"12\" cy=\"12\" r=\"10\"\/>\r\n            <path d=\"M12 16v-4\"\/>\r\n            <path d=\"M12 8h.01\"\/>\r\n          <\/svg>\r\n        <\/div>\r\n        <div class=\"zic2__formulaText\" data-i18n-html=\"formula\">\r\n          <strong>Cum functioneaza:<\/strong> Analizam SPF, DKIM, DMARC si alte header-e pentru a detecta semne de falsificare. Procesare 100% locala.\r\n        <\/div>\r\n      <\/div>\r\n\r\n      <!-- Card: Input Header -->\r\n      <section class=\"zic2__card\" aria-labelledby=\"zic2-sec-input\">\r\n        <div class=\"zic2__cardHeader\">\r\n          <div class=\"zic2__cardIcon zic2__cardIcon--purple\">\r\n            <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n              <path d=\"M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z\"\/>\r\n              <polyline points=\"14 2 14 8 20 8\"\/>\r\n              <line x1=\"16\" y1=\"13\" x2=\"8\" y2=\"13\"\/>\r\n              <line x1=\"16\" y1=\"17\" x2=\"8\" y2=\"17\"\/>\r\n            <\/svg>\r\n          <\/div>\r\n          <h3 id=\"zic2-sec-input\" class=\"zic2__cardTitle\" data-i18n=\"inputTitle\">Header Email<\/h3>\r\n        <\/div>\r\n\r\n        <!-- Upload Zone -->\r\n        <div class=\"zic2__uploadZone\" data-upload-zone>\r\n          <input type=\"file\" id=\"zic2-file-upload\" class=\"zic2__fileInput\" data-file-input accept=\".eml,.txt\" aria-label=\"Incarca fisier email\">\r\n          <label for=\"zic2-file-upload\" class=\"zic2__uploadLabel\">\r\n            <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\r\n              <path d=\"M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4\"\/>\r\n              <polyline points=\"17 8 12 3 7 8\"\/>\r\n              <line x1=\"12\" y1=\"3\" x2=\"12\" y2=\"15\"\/>\r\n            <\/svg>\r\n            <span class=\"zic2__uploadText\">\r\n              <strong data-i18n=\"uploadTitle\">Incarca fisier .eml sau .txt<\/strong>\r\n              <small data-i18n=\"uploadSubtitle\">sau trage fisierul aici<\/small>\r\n            <\/span>\r\n          <\/label>\r\n          <div class=\"zic2__uploadSuccess is-hidden\" data-upload-success>\r\n            <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\"><polyline points=\"20 6 9 17 4 12\"\/><\/svg>\r\n            <span data-upload-filename><\/span>\r\n          <\/div>\r\n        <\/div>\r\n\r\n        <div class=\"zic2__divider\">\r\n          <span data-i18n=\"dividerText\">sau copiaza manual<\/span>\r\n        <\/div>\r\n\r\n        <div class=\"zic2__field\">\r\n          <label class=\"zic2__label\" for=\"zic2-email-header\" data-i18n=\"inputLabel\">Copiaza header-ul email-ului aici<\/label>\r\n          <textarea id=\"zic2-email-header\" class=\"zic2__textarea\" data-field=\"emailHeader\" rows=\"10\" data-i18n-placeholder=\"inputPlaceholder\" placeholder=\"Copiaza intregul header al email-ului aici...\r\n\r\nCum obtii header-ul:\r\n- Gmail: Deschide email-ul > Click pe cele 3 puncte > 'Arata originalul'\r\n- Outlook: Deschide email-ul > File > Properties > Internet Headers\r\n- Yahoo: Deschide email-ul > More > View Raw Message\"><\/textarea>\r\n        <\/div>\r\n\r\n        <!-- Hint -->\r\n        <div class=\"zic2__hint\" style=\"margin-top: 16px;\">\r\n          <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><circle cx=\"12\" cy=\"12\" r=\"10\"\/><path d=\"M9.09 9a3 3 0 0 1 5.83 1c0 2-3 3-3 3\"\/><path d=\"M12 17h.01\"\/><\/svg>\r\n          <span data-i18n=\"hint\">Acceptam fisiere .eml (exportate din Outlook, Thunderbird) si .txt cu header-ul copiat.<\/span>\r\n        <\/div>\r\n      <\/section>\r\n\r\n      <!-- Actions -->\r\n      <div class=\"zic2__actions\">\r\n        <button type=\"button\" class=\"zic2__btn zic2__btn--primary zic2__btn--large\" data-action=\"analyze\">\r\n          <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\">\r\n            <circle cx=\"11\" cy=\"11\" r=\"8\"\/>\r\n            <path d=\"M21 21l-4.35-4.35\"\/>\r\n          <\/svg>\r\n          <span data-i18n=\"btnAnalyze\">Analizeaza Header<\/span>\r\n        <\/button>\r\n        <button type=\"button\" class=\"zic2__btn zic2__btn--secondary\" data-action=\"reset\">\r\n          <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><path d=\"M3 12a9 9 0 1 0 9-9 9.75 9.75 0 0 0-6.74 2.74L3 8\"\/><path d=\"M3 3v5h5\"\/><\/svg>\r\n          <span data-i18n=\"btnReset\">Sterge datele<\/span>\r\n        <\/button>\r\n        <button type=\"button\" class=\"zic2__btn zic2__btn--success\" data-action=\"example\">\r\n          <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><path d=\"M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z\"\/><polyline points=\"14 2 14 8 20 8\"\/><\/svg>\r\n          <span data-i18n=\"btnExample\">Exemplu<\/span>\r\n        <\/button>\r\n      <\/div>\r\n\r\n      <!-- Error -->\r\n      <div class=\"zic2__error is-hidden\" role=\"alert\" aria-live=\"polite\" data-errors><\/div>\r\n\r\n      <!-- Result: Score -->\r\n      <section class=\"zic2__card zic2__scoreCard is-hidden\" data-score-card aria-live=\"polite\">\r\n        <div class=\"zic2__scoreDisplay\" data-score-display>\r\n          <div class=\"zic2__scoreIcon\" data-score-icon><\/div>\r\n          <div class=\"zic2__scoreText\" data-score-text><\/div>\r\n          <div class=\"zic2__scoreDesc\" data-score-desc><\/div>\r\n        <\/div>\r\n      <\/section>\r\n\r\n      <!-- Result: Analysis Cards -->\r\n      <div class=\"zic2__analysisGrid is-hidden\" data-analysis-grid><\/div>\r\n\r\n      <!-- Result: Warnings -->\r\n      <section class=\"zic2__card is-hidden\" data-warnings-card aria-labelledby=\"zic2-sec-warnings\">\r\n        <div class=\"zic2__cardHeader\">\r\n          <div class=\"zic2__cardIcon zic2__cardIcon--warning\">\r\n            <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\r\n              <path d=\"M10.29 3.86L1.82 18a2 2 0 0 0 1.71 3h16.94a2 2 0 0 0 1.71-3L13.71 3.86a2 2 0 0 0-3.42 0z\"\/>\r\n              <line x1=\"12\" y1=\"9\" x2=\"12\" y2=\"13\"\/>\r\n              <line x1=\"12\" y1=\"17\" x2=\"12.01\" y2=\"17\"\/>\r\n            <\/svg>\r\n          <\/div>\r\n          <h3 id=\"zic2-sec-warnings\" class=\"zic2__cardTitle\" data-i18n=\"warningsTitle\">Avertismente detectate<\/h3>\r\n        <\/div>\r\n        <div class=\"zic2__warningsList\" data-warnings-list><\/div>\r\n      <\/section>\r\n\r\n      <!-- Result: Route -->\r\n      <section class=\"zic2__card is-hidden\" data-route-card aria-labelledby=\"zic2-sec-route\">\r\n        <div class=\"zic2__cardHeader\">\r\n          <div class=\"zic2__cardIcon zic2__cardIcon--blue\">\r\n            <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\r\n              <circle cx=\"12\" cy=\"10\" r=\"3\"\/>\r\n              <path d=\"M12 21.7C17.3 17 20 13 20 10a8 8 0 1 0-16 0c0 3 2.7 7 8 11.7z\"\/>\r\n            <\/svg>\r\n          <\/div>\r\n          <h3 id=\"zic2-sec-route\" class=\"zic2__cardTitle\" data-i18n=\"routeTitle\">Traseul email-ului<\/h3>\r\n        <\/div>\r\n        <div class=\"zic2__routeList\" data-route-list><\/div>\r\n      <\/section>\r\n\r\n      <!-- Result: Details -->\r\n      <section class=\"zic2__card is-hidden\" data-details-card aria-labelledby=\"zic2-sec-details\">\r\n        <div class=\"zic2__cardHeader\">\r\n          <div class=\"zic2__cardIcon zic2__cardIcon--purple\">\r\n            <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\r\n              <path d=\"M14.5 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V7.5L14.5 2z\"\/>\r\n              <polyline points=\"14 2 14 8 20 8\"\/>\r\n            <\/svg>\r\n          <\/div>\r\n          <h3 id=\"zic2-sec-details\" class=\"zic2__cardTitle\" data-i18n=\"detailsTitle\">Detalii suplimentare<\/h3>\r\n        <\/div>\r\n        <div class=\"zic2__detailsList\" data-details-list><\/div>\r\n      <\/section>\r\n    <\/div>\r\n\r\n    <!-- GDPR Data Protection Info -->\r\n    <details class=\"zic2__gdprDetails\">\r\n      <summary class=\"zic2__gdprSummary\">\r\n        <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\r\n          <circle cx=\"12\" cy=\"12\" r=\"10\"\/>\r\n          <path d=\"M12 16v-4\"\/>\r\n          <path d=\"M12 8h.01\"\/>\r\n        <\/svg>\r\n        <span data-i18n=\"gdprDetailsTitle\">Informatii despre protectia datelor (GDPR)<\/span>\r\n      <\/summary>\r\n      <div class=\"zic2__gdprDetailsContent\">\r\n        <h4>1. Operator de date<\/h4>\r\n        <p>Zlati Ionescu Chiperi SCPA, cu sediul in Romania, este operatorul acestui instrument.<\/p>\r\n\r\n        <h4>2. Date procesate<\/h4>\r\n        <p>Acest instrument proceseaza header-ele email-urilor introduse manual sau din fisiere incarcate (.eml, .txt). Header-ele pot contine:<\/p>\r\n        <ul>\r\n          <li>Adrese de email (From, To, Reply-To)<\/li>\r\n          <li>Adrese IP ale serverelor de email<\/li>\r\n          <li>Date si ore de transmitere<\/li>\r\n          <li>Identificatori tehnici (Message-ID)<\/li>\r\n        <\/ul>\r\n\r\n        <h4>3. Baza legala pentru procesare<\/h4>\r\n        <p>Procesarea se efectueaza in baza consimtamantului explicit al utilizatorului (Art. 6(1)(a) GDPR), acordat prin bifarea checkbox-ului de mai sus.<\/p>\r\n\r\n        <h4>4. Procesare locala<\/h4>\r\n        <p><strong>Important:<\/strong> Toate datele sunt procesate exclusiv in browser-ul utilizatorului folosind JavaScript. Fisierele incarcate sunt citite local prin API-ul FileReader al browser-ului - continutul nu este transmis nicaieri. Nicio informatie nu paraseste dispozitivul utilizatorului si nu este transmisa catre serverele noastre sau catre terti.<\/p>\r\n\r\n        <h4>5. Stocarea datelor<\/h4>\r\n        <p>Datele introduse:<\/p>\r\n        <ul>\r\n          <li>NU sunt stocate pe servere<\/li>\r\n          <li>NU sunt salvate in cookies<\/li>\r\n          <li>NU sunt salvate in localStorage sau sessionStorage<\/li>\r\n          <li>Exista doar in memoria temporara a browser-ului<\/li>\r\n          <li>Sunt sterse automat la inchiderea sau reincarcarea paginii<\/li>\r\n        <\/ul>\r\n\r\n        <h4>6. Drepturile utilizatorului<\/h4>\r\n        <p>Conform GDPR, aveti urmatoarele drepturi:<\/p>\r\n        <ul>\r\n          <li><strong>Dreptul de acces<\/strong> - puteti vedea oricand datele introduse in campul de text<\/li>\r\n          <li><strong>Dreptul la stergere<\/strong> - folositi butonul \"Sterge datele\" sau reincarcati pagina<\/li>\r\n          <li><strong>Dreptul de retragere a consimtamantului<\/strong> - debifati checkbox-ul de consimtamant<\/li>\r\n          <li><strong>Dreptul de a depune plangere<\/strong> - la ANSPDCP (Autoritatea Nationala de Supraveghere)<\/li>\r\n        <\/ul>\r\n\r\n        <h4>7. Contact<\/h4>\r\n        <p>Pentru intrebari privind protectia datelor: <a href=\"https:\/\/zic.legal\/contact\" target=\"_blank\" rel=\"noopener\">zic.legal\/contact<\/a><\/p>\r\n\r\n        <h4>8. Modificari ale politicii<\/h4>\r\n        <p>Ultima actualizare: Decembrie 2024<\/p>\r\n      <\/div>\r\n    <\/details>\r\n\r\n    <!-- Disclaimer -->\r\n    <div class=\"zic2__disclaimer\">\r\n      <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><path d=\"M10.29 3.86L1.82 18a2 2 0 0 0 1.71 3h16.94a2 2 0 0 0 1.71-3L13.71 3.86a2 2 0 0 0-3.42 0z\"\/><line x1=\"12\" y1=\"9\" x2=\"12\" y2=\"13\"\/><line x1=\"12\" y1=\"17\" x2=\"12.01\" y2=\"17\"\/><\/svg>\r\n      <div data-i18n-html=\"disclaimer\">\r\n        <strong>Disclaimer:<\/strong> Aceasta analiza este orientativa si nu inlocuieste o verificare profesionala de securitate, precum cea oferita de <a href=\"https:\/\/cyberopsnetwork.com\/\" target=\"_blank\" rel=\"noopener noreferrer\">CyberOps Network<\/a> \u2013 partenerii ZIC.legal.\r\n      <\/div>\r\n    <\/div>\r\n\r\n    <!-- Footer -->\r\n    <footer class=\"zic2__footer\">\r\n      <a href=\"https:\/\/zic.legal\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"zic2__footerLink\">\r\n        &copy; 2025 ZIC Legal\r\n      <\/a>\r\n      <span class=\"zic2__footerSep\">|<\/span>\r\n      <a href=\"https:\/\/zic.legal\/politica-confidentialitate\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"zic2__footerLink\">\r\n        Politica de confidentialitate\r\n      <\/a>\r\n    <\/footer>\r\n  <\/div>\r\n<\/div>\r\n\r\n<style>\r\n\/* ============================================================\r\n   ZIC Calculator v2 - Email Analyzer\r\n   Theme: Purple\/Mov | Fully Responsive | GDPR Compliant\r\n   ============================================================ *\/\r\n\r\n\/* === CSS Variables === *\/\r\n#zic-email-analyzer {\r\n  --zic-primary: #8A88FF;\r\n  --zic-primary-dark: #6F6CFF;\r\n  --zic-primary-light: rgba(138,136,255,.08);\r\n  --zic-primary-border: rgba(138,136,255,.25);\r\n\r\n  --zic-success: #10B981;\r\n  --zic-success-light: rgba(16,185,129,.08);\r\n  --zic-success-border: rgba(16,185,129,.25);\r\n\r\n  --zic-danger: #EF4444;\r\n  --zic-danger-light: rgba(239,68,68,.08);\r\n  --zic-danger-border: rgba(239,68,68,.25);\r\n\r\n  --zic-warning: #F59E0B;\r\n  --zic-warning-light: rgba(245,158,11,.08);\r\n  --zic-warning-border: rgba(245,158,11,.25);\r\n\r\n  --zic-blue: #3B82F6;\r\n  --zic-blue-light: rgba(59,130,246,.08);\r\n  --zic-blue-border: rgba(59,130,246,.25);\r\n\r\n  --zic-ink: #1F2937;\r\n  --zic-ink-light: #374151;\r\n  --zic-muted: #6B7280;\r\n  --zic-light: #9CA3AF;\r\n\r\n  --zic-bg: #F9FAFB;\r\n  --zic-surface: #FFFFFF;\r\n  --zic-border: #E5E7EB;\r\n\r\n  --zic-shadow-sm: 0 1px 2px rgba(0,0,0,.05);\r\n  --zic-shadow: 0 4px 6px -1px rgba(0,0,0,.1), 0 2px 4px -1px rgba(0,0,0,.06);\r\n  --zic-shadow-lg: 0 10px 15px -3px rgba(0,0,0,.1), 0 4px 6px -2px rgba(0,0,0,.05);\r\n\r\n  --zic-radius: 16px;\r\n  --zic-radius-sm: 12px;\r\n  --zic-radius-xs: 8px;\r\n\r\n  --zic-transition: 150ms ease;\r\n\r\n  font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif;\r\n  color: var(--zic-ink);\r\n  line-height: 1.5;\r\n  -webkit-font-smoothing: antialiased;\r\n}\r\n\r\n#zic-email-analyzer *,\r\n#zic-email-analyzer *::before,\r\n#zic-email-analyzer *::after {\r\n  box-sizing: border-box;\r\n}\r\n\r\n\/* === WordPress\/Avada Override Protection === *\/\r\n#zic-email-analyzer input[type=\"checkbox\"] {\r\n  -webkit-appearance: checkbox !important;\r\n  -moz-appearance: checkbox !important;\r\n  appearance: checkbox !important;\r\n  width: 18px !important;\r\n  height: 18px !important;\r\n  margin: 0 !important;\r\n  padding: 0 !important;\r\n  border: none !important;\r\n  background: none !important;\r\n  box-shadow: none !important;\r\n}\r\n\r\n#zic-email-analyzer input[type=\"file\"] {\r\n  background: none !important;\r\n  border: none !important;\r\n  box-shadow: none !important;\r\n}\r\n\r\n#zic-email-analyzer textarea {\r\n  -webkit-appearance: none !important;\r\n  -moz-appearance: none !important;\r\n  appearance: none !important;\r\n  background-image: none !important;\r\n  box-shadow: none !important;\r\n}\r\n\r\n#zic-email-analyzer button:not(.zic2__btn--primary) {\r\n  background-image: none !important;\r\n}\r\n\r\n#zic-email-analyzer button {\r\n  text-shadow: none !important;\r\n  letter-spacing: normal !important;\r\n}\r\n\r\n#zic-email-analyzer h2,\r\n#zic-email-analyzer h3 {\r\n  text-transform: none !important;\r\n  letter-spacing: normal !important;\r\n}\r\n\r\n#zic-email-analyzer a {\r\n  text-decoration: none;\r\n}\r\n\r\n#zic-email-analyzer a:hover {\r\n  text-decoration: underline;\r\n}\r\n\r\n\/* === Layout === *\/\r\n#zic-email-analyzer .zic2__wrap {\r\n  max-width: 720px;\r\n  margin: 0 auto;\r\n  padding: 16px;\r\n}\r\n\r\n\/* === Header === *\/\r\n#zic-email-analyzer .zic2__hero {\r\n  margin-bottom: 16px;\r\n}\r\n\r\n#zic-email-analyzer .zic2__brandbar {\r\n  display: flex;\r\n  align-items: center;\r\n  gap: 14px;\r\n  background: linear-gradient(135deg, var(--zic-primary), var(--zic-primary-dark));\r\n  border-radius: var(--zic-radius);\r\n  padding: 20px;\r\n  color: #fff;\r\n  box-shadow: var(--zic-shadow-lg);\r\n  position: relative;\r\n}\r\n\r\n#zic-email-analyzer .zic2__langBtn {\r\n  position: absolute;\r\n  top: 12px;\r\n  right: 16px;\r\n  background: rgba(255,255,255,.25);\r\n  border: 1px solid rgba(255,255,255,.3);\r\n  padding: 4px 10px;\r\n  border-radius: 20px;\r\n  font-size: 11px;\r\n  font-weight: 700;\r\n  letter-spacing: 0.5px;\r\n  color: #fff;\r\n  cursor: pointer;\r\n  transition: all var(--zic-transition);\r\n}\r\n\r\n#zic-email-analyzer .zic2__langBtn:hover {\r\n  background: rgba(255,255,255,.35);\r\n  transform: scale(1.05);\r\n}\r\n\r\n#zic-email-analyzer .zic2__mark {\r\n  width: 48px;\r\n  height: 48px;\r\n  background: rgba(255,255,255,.2);\r\n  border-radius: 12px;\r\n  display: flex;\r\n  align-items: center;\r\n  justify-content: center;\r\n  flex-shrink: 0;\r\n}\r\n\r\n#zic-email-analyzer .zic2__headerText {\r\n  flex: 1;\r\n  min-width: 0;\r\n}\r\n\r\n#zic-email-analyzer .zic2__title {\r\n  margin: 0;\r\n  font-size: 20px;\r\n  font-weight: 700;\r\n  line-height: 1.2;\r\n}\r\n\r\n#zic-email-analyzer .zic2__subtitle {\r\n  margin: 4px 0 0;\r\n  font-size: 14px;\r\n  opacity: 0.9;\r\n}\r\n\r\n\/* === GDPR Notice === *\/\r\n#zic-email-analyzer .zic2__gdprNotice {\r\n  display: flex;\r\n  align-items: flex-start;\r\n  gap: 14px;\r\n  background: linear-gradient(135deg, rgba(16,185,129,.05), rgba(16,185,129,.1));\r\n  border: 1px solid var(--zic-success-border);\r\n  border-radius: var(--zic-radius-sm);\r\n  padding: 16px;\r\n  margin-bottom: 16px;\r\n}\r\n\r\n#zic-email-analyzer .zic2__gdprIcon {\r\n  width: 40px;\r\n  height: 40px;\r\n  background: var(--zic-success-light);\r\n  border-radius: 10px;\r\n  display: flex;\r\n  align-items: center;\r\n  justify-content: center;\r\n  flex-shrink: 0;\r\n  color: var(--zic-success);\r\n}\r\n\r\n#zic-email-analyzer .zic2__gdprContent {\r\n  flex: 1;\r\n  font-size: 13px;\r\n  color: var(--zic-ink-light);\r\n}\r\n\r\n#zic-email-analyzer .zic2__gdprTitle {\r\n  display: block;\r\n  font-size: 14px;\r\n  font-weight: 700;\r\n  color: var(--zic-ink);\r\n  margin-bottom: 6px;\r\n}\r\n\r\n#zic-email-analyzer .zic2__gdprContent em {\r\n  font-style: normal;\r\n  font-weight: 700;\r\n  color: var(--zic-success);\r\n}\r\n\r\n#zic-email-analyzer .zic2__gdprContent p {\r\n  margin: 0 0 8px 0;\r\n}\r\n\r\n#zic-email-analyzer .zic2__gdprContent ul {\r\n  margin: 0;\r\n  padding-left: 18px;\r\n}\r\n\r\n#zic-email-analyzer .zic2__gdprContent li {\r\n  margin: 3px 0;\r\n}\r\n\r\n\/* === Consent Card === *\/\r\n#zic-email-analyzer .zic2__consentCard {\r\n  background: var(--zic-surface);\r\n  border: 2px solid var(--zic-primary-border);\r\n  border-radius: var(--zic-radius);\r\n  padding: 16px;\r\n  margin-bottom: 16px;\r\n}\r\n\r\n#zic-email-analyzer .zic2__checkbox {\r\n  display: flex;\r\n  align-items: flex-start;\r\n  gap: 12px;\r\n  cursor: pointer;\r\n  transition: all var(--zic-transition);\r\n}\r\n\r\n#zic-email-analyzer .zic2__checkbox input[type=\"checkbox\"] {\r\n  width: 20px;\r\n  height: 20px;\r\n  accent-color: var(--zic-primary);\r\n  flex-shrink: 0;\r\n  margin-top: 2px;\r\n  cursor: pointer;\r\n}\r\n\r\n#zic-email-analyzer .zic2__checkLabel {\r\n  display: flex;\r\n  flex-direction: column;\r\n  gap: 4px;\r\n}\r\n\r\n#zic-email-analyzer .zic2__checkLabel strong {\r\n  font-size: 14px;\r\n  font-weight: 700;\r\n  color: var(--zic-ink);\r\n}\r\n\r\n#zic-email-analyzer .zic2__checkLabel small {\r\n  font-size: 12px;\r\n  color: var(--zic-muted);\r\n  line-height: 1.4;\r\n}\r\n\r\n\/* === Formula Box === *\/\r\n#zic-email-analyzer .zic2__formula {\r\n  display: flex;\r\n  align-items: flex-start;\r\n  gap: 10px;\r\n  background: var(--zic-primary-light);\r\n  border: 1px solid var(--zic-primary-border);\r\n  border-radius: var(--zic-radius-sm);\r\n  padding: 12px 14px;\r\n  margin-bottom: 16px;\r\n  font-size: 14px;\r\n  color: var(--zic-ink-light);\r\n}\r\n\r\n#zic-email-analyzer .zic2__formulaIcon {\r\n  color: var(--zic-primary-dark);\r\n  flex-shrink: 0;\r\n  margin-top: 1px;\r\n}\r\n\r\n#zic-email-analyzer .zic2__formulaText strong {\r\n  color: var(--zic-ink);\r\n}\r\n\r\n\/* === Cards === *\/\r\n#zic-email-analyzer .zic2__card {\r\n  background: var(--zic-surface);\r\n  border: 1px solid var(--zic-border);\r\n  border-radius: var(--zic-radius);\r\n  padding: 20px;\r\n  margin-bottom: 16px;\r\n  box-shadow: var(--zic-shadow-sm);\r\n}\r\n\r\n#zic-email-analyzer .zic2__cardHeader {\r\n  display: flex;\r\n  align-items: center;\r\n  gap: 12px;\r\n  margin-bottom: 16px;\r\n}\r\n\r\n#zic-email-analyzer .zic2__cardIcon {\r\n  width: 36px;\r\n  height: 36px;\r\n  border-radius: 10px;\r\n  display: flex;\r\n  align-items: center;\r\n  justify-content: center;\r\n  flex-shrink: 0;\r\n}\r\n\r\n#zic-email-analyzer .zic2__cardIcon--purple {\r\n  background: var(--zic-primary-light);\r\n  color: var(--zic-primary-dark);\r\n}\r\n\r\n#zic-email-analyzer .zic2__cardIcon--green {\r\n  background: var(--zic-success-light);\r\n  color: var(--zic-success);\r\n}\r\n\r\n#zic-email-analyzer .zic2__cardIcon--warning {\r\n  background: var(--zic-warning-light);\r\n  color: var(--zic-warning);\r\n}\r\n\r\n#zic-email-analyzer .zic2__cardIcon--blue {\r\n  background: var(--zic-blue-light);\r\n  color: var(--zic-blue);\r\n}\r\n\r\n#zic-email-analyzer .zic2__cardIcon--danger {\r\n  background: var(--zic-danger-light);\r\n  color: var(--zic-danger);\r\n}\r\n\r\n#zic-email-analyzer .zic2__cardTitle {\r\n  margin: 0;\r\n  font-size: 17px;\r\n  font-weight: 700;\r\n  color: var(--zic-ink);\r\n}\r\n\r\n\/* === Upload Zone === *\/\r\n#zic-email-analyzer .zic2__uploadZone {\r\n  position: relative;\r\n  margin-bottom: 16px;\r\n}\r\n\r\n#zic-email-analyzer .zic2__fileInput {\r\n  position: absolute;\r\n  width: 1px;\r\n  height: 1px;\r\n  padding: 0;\r\n  margin: -1px;\r\n  overflow: hidden;\r\n  clip: rect(0, 0, 0, 0);\r\n  white-space: nowrap;\r\n  border: 0;\r\n}\r\n\r\n#zic-email-analyzer .zic2__uploadLabel {\r\n  display: flex;\r\n  flex-direction: column;\r\n  align-items: center;\r\n  justify-content: center;\r\n  gap: 12px;\r\n  padding: 24px 20px;\r\n  background: var(--zic-bg);\r\n  border: 2px dashed var(--zic-border);\r\n  border-radius: var(--zic-radius-sm);\r\n  cursor: pointer;\r\n  transition: all var(--zic-transition);\r\n  text-align: center;\r\n}\r\n\r\n#zic-email-analyzer .zic2__uploadLabel:hover {\r\n  background: var(--zic-primary-light);\r\n  border-color: var(--zic-primary);\r\n}\r\n\r\n#zic-email-analyzer .zic2__uploadLabel svg {\r\n  color: var(--zic-primary);\r\n}\r\n\r\n#zic-email-analyzer .zic2__uploadZone.is-dragover .zic2__uploadLabel {\r\n  background: var(--zic-primary-light);\r\n  border-color: var(--zic-primary);\r\n  border-style: solid;\r\n}\r\n\r\n#zic-email-analyzer .zic2__uploadText {\r\n  display: flex;\r\n  flex-direction: column;\r\n  gap: 4px;\r\n}\r\n\r\n#zic-email-analyzer .zic2__uploadText strong {\r\n  font-size: 14px;\r\n  color: var(--zic-ink);\r\n}\r\n\r\n#zic-email-analyzer .zic2__uploadText small {\r\n  font-size: 12px;\r\n  color: var(--zic-muted);\r\n}\r\n\r\n#zic-email-analyzer .zic2__uploadSuccess {\r\n  display: flex;\r\n  align-items: center;\r\n  justify-content: center;\r\n  gap: 8px;\r\n  padding: 12px;\r\n  background: var(--zic-success-light);\r\n  border: 1px solid var(--zic-success-border);\r\n  border-radius: var(--zic-radius-xs);\r\n  margin-top: 10px;\r\n  font-size: 13px;\r\n  font-weight: 600;\r\n  color: var(--zic-success);\r\n}\r\n\r\n#zic-email-analyzer .zic2__uploadSuccess svg {\r\n  flex-shrink: 0;\r\n}\r\n\r\n\/* === Divider === *\/\r\n#zic-email-analyzer .zic2__divider {\r\n  display: flex;\r\n  align-items: center;\r\n  gap: 16px;\r\n  margin-bottom: 16px;\r\n}\r\n\r\n#zic-email-analyzer .zic2__divider::before,\r\n#zic-email-analyzer .zic2__divider::after {\r\n  content: '';\r\n  flex: 1;\r\n  height: 1px;\r\n  background: var(--zic-border);\r\n}\r\n\r\n#zic-email-analyzer .zic2__divider span {\r\n  font-size: 12px;\r\n  color: var(--zic-muted);\r\n  text-transform: uppercase;\r\n  letter-spacing: 0.5px;\r\n  white-space: nowrap;\r\n}\r\n\r\n\/* === Form Elements === *\/\r\n#zic-email-analyzer .zic2__field {\r\n  display: flex;\r\n  flex-direction: column;\r\n  gap: 4px;\r\n}\r\n\r\n#zic-email-analyzer .zic2__label {\r\n  font-size: 12px;\r\n  font-weight: 600;\r\n  color: var(--zic-muted);\r\n}\r\n\r\n#zic-email-analyzer .zic2__textarea {\r\n  width: 100%;\r\n  padding: 12px 14px;\r\n  font-size: 13px;\r\n  font-family: 'Consolas', 'Monaco', 'Courier New', monospace;\r\n  color: var(--zic-ink);\r\n  background: var(--zic-surface);\r\n  border: 2px solid var(--zic-border);\r\n  border-radius: var(--zic-radius-xs);\r\n  outline: none;\r\n  resize: vertical;\r\n  min-height: 180px;\r\n  transition: border-color var(--zic-transition), box-shadow var(--zic-transition);\r\n  line-height: 1.5;\r\n}\r\n\r\n#zic-email-analyzer .zic2__textarea:focus {\r\n  border-color: var(--zic-primary);\r\n  box-shadow: 0 0 0 3px var(--zic-primary-light);\r\n}\r\n\r\n#zic-email-analyzer .zic2__textarea::placeholder {\r\n  color: var(--zic-light);\r\n  font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;\r\n}\r\n\r\n\/* === Buttons === *\/\r\n#zic-email-analyzer .zic2__actions {\r\n  display: flex;\r\n  flex-wrap: wrap;\r\n  gap: 10px;\r\n  margin-bottom: 16px;\r\n}\r\n\r\n#zic-email-analyzer .zic2__actions .zic2__btn--primary {\r\n  flex: 1;\r\n  min-width: 200px;\r\n}\r\n\r\n#zic-email-analyzer .zic2__btn {\r\n  display: inline-flex;\r\n  align-items: center;\r\n  justify-content: center;\r\n  gap: 6px;\r\n  padding: 10px 16px;\r\n  font-size: 14px;\r\n  font-weight: 600;\r\n  border-radius: var(--zic-radius-sm);\r\n  border: 1px solid transparent;\r\n  cursor: pointer;\r\n  transition: all var(--zic-transition);\r\n  white-space: nowrap;\r\n  text-decoration: none;\r\n}\r\n\r\n#zic-email-analyzer .zic2__btn:focus {\r\n  outline: none;\r\n  box-shadow: 0 0 0 3px var(--zic-primary-border);\r\n}\r\n\r\n#zic-email-analyzer .zic2__btn:active {\r\n  transform: translateY(1px);\r\n}\r\n\r\n#zic-email-analyzer .zic2__btn--primary {\r\n  background: linear-gradient(135deg, var(--zic-primary), var(--zic-primary-dark));\r\n  color: #fff;\r\n  box-shadow: 0 4px 14px rgba(138,136,255,.35);\r\n}\r\n\r\n#zic-email-analyzer .zic2__btn--primary:hover {\r\n  box-shadow: 0 6px 20px rgba(138,136,255,.45);\r\n  transform: translateY(-1px);\r\n}\r\n\r\n#zic-email-analyzer .zic2__btn--large {\r\n  padding: 14px 24px;\r\n  font-size: 15px;\r\n}\r\n\r\n#zic-email-analyzer .zic2__btn--secondary {\r\n  background: var(--zic-surface);\r\n  border-color: var(--zic-border);\r\n  color: var(--zic-ink-light);\r\n}\r\n\r\n#zic-email-analyzer .zic2__btn--secondary:hover {\r\n  background: var(--zic-bg);\r\n  border-color: var(--zic-primary-border);\r\n  color: var(--zic-primary-dark);\r\n}\r\n\r\n#zic-email-analyzer .zic2__btn--success {\r\n  background: var(--zic-success-light);\r\n  border-color: var(--zic-success-border);\r\n  color: var(--zic-success);\r\n}\r\n\r\n#zic-email-analyzer .zic2__btn--success:hover {\r\n  background: rgba(16,185,129,.15);\r\n}\r\n\r\n\/* === Hint === *\/\r\n#zic-email-analyzer .zic2__hint {\r\n  display: flex;\r\n  align-items: flex-start;\r\n  gap: 8px;\r\n  padding: 10px 12px;\r\n  background: var(--zic-bg);\r\n  border-radius: var(--zic-radius-xs);\r\n  font-size: 12px;\r\n  color: var(--zic-muted);\r\n}\r\n\r\n#zic-email-analyzer .zic2__hint svg {\r\n  flex-shrink: 0;\r\n  margin-top: 1px;\r\n}\r\n\r\n\/* === Error === *\/\r\n#zic-email-analyzer .zic2__error {\r\n  margin-bottom: 16px;\r\n  padding: 12px;\r\n  background: var(--zic-danger-light);\r\n  border: 1px solid var(--zic-danger-border);\r\n  border-radius: var(--zic-radius-xs);\r\n  color: var(--zic-danger);\r\n  font-size: 13px;\r\n  font-weight: 500;\r\n}\r\n\r\n\/* === Score Card === *\/\r\n#zic-email-analyzer .zic2__scoreCard {\r\n  padding: 0;\r\n  overflow: hidden;\r\n}\r\n\r\n#zic-email-analyzer .zic2__scoreDisplay {\r\n  text-align: center;\r\n  padding: 30px 20px;\r\n}\r\n\r\n#zic-email-analyzer .zic2__scoreDisplay.score-safe {\r\n  background: linear-gradient(135deg, rgba(16,185,129,.05), rgba(16,185,129,.12));\r\n  border-color: var(--zic-success-border);\r\n}\r\n\r\n#zic-email-analyzer .zic2__scoreDisplay.score-warning {\r\n  background: linear-gradient(135deg, rgba(245,158,11,.05), rgba(245,158,11,.12));\r\n  border-color: var(--zic-warning-border);\r\n}\r\n\r\n#zic-email-analyzer .zic2__scoreDisplay.score-danger {\r\n  background: linear-gradient(135deg, rgba(239,68,68,.05), rgba(239,68,68,.12));\r\n  border-color: var(--zic-danger-border);\r\n}\r\n\r\n#zic-email-analyzer .zic2__scoreIcon {\r\n  font-size: 48px;\r\n  margin-bottom: 10px;\r\n}\r\n\r\n#zic-email-analyzer .zic2__scoreText {\r\n  font-size: 22px;\r\n  font-weight: 700;\r\n  margin-bottom: 5px;\r\n  color: var(--zic-ink);\r\n}\r\n\r\n#zic-email-analyzer .zic2__scoreDesc {\r\n  font-size: 14px;\r\n  color: var(--zic-muted);\r\n}\r\n\r\n\/* === Analysis Grid === *\/\r\n#zic-email-analyzer .zic2__analysisGrid {\r\n  display: grid;\r\n  grid-template-columns: repeat(auto-fit, minmax(280px, 1fr));\r\n  gap: 12px;\r\n  margin-bottom: 16px;\r\n}\r\n\r\n#zic-email-analyzer .zic2__analysisCard {\r\n  background: var(--zic-surface);\r\n  border: 1px solid var(--zic-border);\r\n  border-radius: var(--zic-radius-sm);\r\n  padding: 16px;\r\n  border-left: 4px solid var(--zic-border);\r\n}\r\n\r\n#zic-email-analyzer .zic2__analysisCard.status-pass {\r\n  border-left-color: var(--zic-success);\r\n}\r\n\r\n#zic-email-analyzer .zic2__analysisCard.status-fail {\r\n  border-left-color: var(--zic-danger);\r\n}\r\n\r\n#zic-email-analyzer .zic2__analysisCard.status-warning {\r\n  border-left-color: var(--zic-warning);\r\n}\r\n\r\n#zic-email-analyzer .zic2__analysisCard.status-neutral {\r\n  border-left-color: var(--zic-light);\r\n}\r\n\r\n#zic-email-analyzer .zic2__analysisHeader {\r\n  display: flex;\r\n  align-items: center;\r\n  gap: 10px;\r\n  margin-bottom: 10px;\r\n}\r\n\r\n#zic-email-analyzer .zic2__analysisIcon {\r\n  font-size: 18px;\r\n}\r\n\r\n#zic-email-analyzer .zic2__analysisTitle {\r\n  font-weight: 600;\r\n  font-size: 14px;\r\n  color: var(--zic-ink);\r\n  flex: 1;\r\n}\r\n\r\n#zic-email-analyzer .zic2__analysisStatus {\r\n  padding: 3px 10px;\r\n  border-radius: 12px;\r\n  font-size: 11px;\r\n  font-weight: 700;\r\n  text-transform: uppercase;\r\n}\r\n\r\n#zic-email-analyzer .zic2__analysisStatus.status-pass {\r\n  background: var(--zic-success-light);\r\n  color: var(--zic-success);\r\n}\r\n\r\n#zic-email-analyzer .zic2__analysisStatus.status-fail {\r\n  background: var(--zic-danger-light);\r\n  color: var(--zic-danger);\r\n}\r\n\r\n#zic-email-analyzer .zic2__analysisStatus.status-warning {\r\n  background: var(--zic-warning-light);\r\n  color: #92400E;\r\n}\r\n\r\n#zic-email-analyzer .zic2__analysisStatus.status-neutral {\r\n  background: var(--zic-bg);\r\n  color: var(--zic-muted);\r\n}\r\n\r\n#zic-email-analyzer .zic2__analysisContent {\r\n  font-size: 13px;\r\n  color: var(--zic-ink-light);\r\n  line-height: 1.5;\r\n}\r\n\r\n#zic-email-analyzer .zic2__analysisValue {\r\n  background: var(--zic-bg);\r\n  padding: 8px 10px;\r\n  border-radius: 6px;\r\n  margin-top: 8px;\r\n  font-family: 'Consolas', 'Monaco', monospace;\r\n  font-size: 11px;\r\n  word-break: break-all;\r\n  color: var(--zic-ink-light);\r\n}\r\n\r\n\/* === Warnings List === *\/\r\n#zic-email-analyzer .zic2__warningsList {\r\n  display: flex;\r\n  flex-direction: column;\r\n  gap: 8px;\r\n}\r\n\r\n#zic-email-analyzer .zic2__warningItem {\r\n  display: flex;\r\n  align-items: flex-start;\r\n  gap: 10px;\r\n  padding: 12px;\r\n  background: var(--zic-warning-light);\r\n  border-radius: var(--zic-radius-xs);\r\n  font-size: 13px;\r\n  color: #92400E;\r\n}\r\n\r\n#zic-email-analyzer .zic2__warningItem.critical {\r\n  background: var(--zic-danger-light);\r\n  color: #991B1B;\r\n}\r\n\r\n#zic-email-analyzer .zic2__warningIcon {\r\n  font-size: 16px;\r\n  flex-shrink: 0;\r\n}\r\n\r\n\/* === Route List === *\/\r\n#zic-email-analyzer .zic2__routeList {\r\n  display: flex;\r\n  flex-direction: column;\r\n  gap: 10px;\r\n}\r\n\r\n#zic-email-analyzer .zic2__routeItem {\r\n  background: var(--zic-bg);\r\n  border-radius: var(--zic-radius-xs);\r\n  padding: 12px;\r\n}\r\n\r\n#zic-email-analyzer .zic2__routeHeader {\r\n  display: flex;\r\n  justify-content: space-between;\r\n  align-items: center;\r\n  margin-bottom: 8px;\r\n}\r\n\r\n#zic-email-analyzer .zic2__routeNumber {\r\n  background: var(--zic-primary);\r\n  color: white;\r\n  padding: 2px 8px;\r\n  border-radius: 4px;\r\n  font-weight: 700;\r\n  font-size: 11px;\r\n}\r\n\r\n#zic-email-analyzer .zic2__routeTime {\r\n  color: var(--zic-muted);\r\n  font-size: 11px;\r\n}\r\n\r\n#zic-email-analyzer .zic2__routeDetails {\r\n  font-family: 'Consolas', 'Monaco', monospace;\r\n  font-size: 12px;\r\n  color: var(--zic-ink-light);\r\n  line-height: 1.6;\r\n}\r\n\r\n#zic-email-analyzer .zic2__routeDetails strong {\r\n  color: var(--zic-ink);\r\n}\r\n\r\n\/* === Details List === *\/\r\n#zic-email-analyzer .zic2__detailsList {\r\n  display: flex;\r\n  flex-direction: column;\r\n}\r\n\r\n#zic-email-analyzer .zic2__detailRow {\r\n  display: flex;\r\n  padding: 10px 0;\r\n  border-bottom: 1px solid var(--zic-border);\r\n  font-size: 13px;\r\n  gap: 12px;\r\n}\r\n\r\n#zic-email-analyzer .zic2__detailRow:last-child {\r\n  border-bottom: none;\r\n}\r\n\r\n#zic-email-analyzer .zic2__detailLabel {\r\n  font-weight: 600;\r\n  color: var(--zic-muted);\r\n  min-width: 120px;\r\n  flex-shrink: 0;\r\n  font-size: 12px;\r\n}\r\n\r\n#zic-email-analyzer .zic2__detailValue {\r\n  color: var(--zic-ink-light);\r\n  word-break: break-all;\r\n  font-family: 'Consolas', 'Monaco', monospace;\r\n  font-size: 12px;\r\n}\r\n\r\n\/* === GDPR Details === *\/\r\n#zic-email-analyzer .zic2__gdprDetails {\r\n  background: var(--zic-bg);\r\n  border: 1px solid var(--zic-border);\r\n  border-radius: var(--zic-radius-sm);\r\n  margin-bottom: 16px;\r\n  font-size: 13px;\r\n}\r\n\r\n#zic-email-analyzer .zic2__gdprSummary {\r\n  display: flex;\r\n  align-items: center;\r\n  gap: 8px;\r\n  padding: 14px 16px;\r\n  cursor: pointer;\r\n  font-weight: 600;\r\n  color: var(--zic-ink-light);\r\n  list-style: none;\r\n}\r\n\r\n#zic-email-analyzer .zic2__gdprSummary::-webkit-details-marker {\r\n  display: none;\r\n}\r\n\r\n#zic-email-analyzer .zic2__gdprSummary::after {\r\n  content: '';\r\n  margin-left: auto;\r\n  width: 0;\r\n  height: 0;\r\n  border-left: 5px solid transparent;\r\n  border-right: 5px solid transparent;\r\n  border-top: 6px solid var(--zic-muted);\r\n  transition: transform var(--zic-transition);\r\n}\r\n\r\n#zic-email-analyzer .zic2__gdprDetails[open] .zic2__gdprSummary::after {\r\n  transform: rotate(180deg);\r\n}\r\n\r\n#zic-email-analyzer .zic2__gdprDetailsContent {\r\n  padding: 0 16px 16px 16px;\r\n  color: var(--zic-ink-light);\r\n  line-height: 1.6;\r\n}\r\n\r\n#zic-email-analyzer .zic2__gdprDetailsContent h4 {\r\n  font-size: 13px;\r\n  font-weight: 700;\r\n  color: var(--zic-ink);\r\n  margin: 16px 0 8px 0;\r\n}\r\n\r\n#zic-email-analyzer .zic2__gdprDetailsContent h4:first-child {\r\n  margin-top: 0;\r\n}\r\n\r\n#zic-email-analyzer .zic2__gdprDetailsContent p {\r\n  margin: 0 0 8px 0;\r\n}\r\n\r\n#zic-email-analyzer .zic2__gdprDetailsContent ul {\r\n  margin: 0 0 8px 0;\r\n  padding-left: 20px;\r\n}\r\n\r\n#zic-email-analyzer .zic2__gdprDetailsContent li {\r\n  margin: 4px 0;\r\n}\r\n\r\n#zic-email-analyzer .zic2__gdprDetailsContent a {\r\n  color: var(--zic-primary-dark);\r\n  text-decoration: none;\r\n}\r\n\r\n#zic-email-analyzer .zic2__gdprDetailsContent a:hover {\r\n  text-decoration: underline;\r\n}\r\n\r\n\/* === Disclaimer === *\/\r\n#zic-email-analyzer .zic2__disclaimer {\r\n  display: flex;\r\n  align-items: flex-start;\r\n  gap: 10px;\r\n  padding: 14px;\r\n  background: var(--zic-bg);\r\n  border: 1px solid var(--zic-border);\r\n  border-radius: var(--zic-radius-sm);\r\n  font-size: 12px;\r\n  color: var(--zic-muted);\r\n  line-height: 1.5;\r\n  margin-bottom: 16px;\r\n}\r\n\r\n#zic-email-analyzer .zic2__disclaimer svg {\r\n  flex-shrink: 0;\r\n  color: var(--zic-warning);\r\n  margin-top: 1px;\r\n}\r\n\r\n#zic-email-analyzer .zic2__disclaimer strong {\r\n  color: var(--zic-ink-light);\r\n}\r\n\r\n\/* === Footer === *\/\r\n#zic-email-analyzer .zic2__footer {\r\n  text-align: center;\r\n  padding: 8px 0;\r\n  display: flex;\r\n  justify-content: center;\r\n  align-items: center;\r\n  gap: 8px;\r\n  flex-wrap: wrap;\r\n}\r\n\r\n#zic-email-analyzer .zic2__footerLink {\r\n  color: var(--zic-primary-dark);\r\n  text-decoration: none;\r\n  font-size: 13px;\r\n  font-weight: 600;\r\n  transition: color var(--zic-transition);\r\n}\r\n\r\n#zic-email-analyzer .zic2__footerLink:hover {\r\n  color: var(--zic-primary);\r\n  text-decoration: underline;\r\n}\r\n\r\n#zic-email-analyzer .zic2__footerSep {\r\n  color: var(--zic-light);\r\n}\r\n\r\n\/* === Utility === *\/\r\n#zic-email-analyzer .is-hidden {\r\n  display: none !important;\r\n}\r\n\r\n\/* === RESPONSIVE === *\/\r\n\r\n\/* Small mobile (max 500px) *\/\r\n@media (max-width: 500px) {\r\n  #zic-email-analyzer .zic2__actions {\r\n    flex-direction: column;\r\n  }\r\n\r\n  #zic-email-analyzer .zic2__actions .zic2__btn {\r\n    width: 100%;\r\n    min-width: unset;\r\n  }\r\n\r\n  #zic-email-analyzer .zic2__btnGroup {\r\n    flex-direction: column;\r\n  }\r\n\r\n  #zic-email-analyzer .zic2__btnGroup .zic2__btn {\r\n    width: 100%;\r\n  }\r\n}\r\n\r\n\/* Tablet (640px+) *\/\r\n@media (min-width: 640px) {\r\n  #zic-email-analyzer .zic2__wrap {\r\n    padding: 24px;\r\n  }\r\n  #zic-email-analyzer .zic2__title {\r\n    font-size: 24px;\r\n  }\r\n}\r\n\r\n@media (min-width: 768px) {\r\n  #zic-email-analyzer .zic2__card {\r\n    padding: 24px;\r\n  }\r\n  #zic-email-analyzer .zic2__brandbar {\r\n    padding: 24px;\r\n  }\r\n  #zic-email-analyzer .zic2__mark {\r\n    width: 56px;\r\n    height: 56px;\r\n  }\r\n  #zic-email-analyzer .zic2__title {\r\n    font-size: 26px;\r\n  }\r\n}\r\n\r\n\/* Large screens (1024px+) *\/\r\n@media (min-width: 1024px) {\r\n  #zic-email-analyzer .zic2__wrap {\r\n    max-width: 900px;\r\n  }\r\n}\r\n\r\n@media (max-width: 600px) {\r\n  #zic-email-analyzer .zic2__detailRow {\r\n    flex-direction: column;\r\n    gap: 4px;\r\n  }\r\n  #zic-email-analyzer .zic2__detailLabel {\r\n    min-width: auto;\r\n  }\r\n  #zic-email-analyzer .zic2__gdprNotice {\r\n    flex-direction: column;\r\n    gap: 12px;\r\n  }\r\n}\r\n\r\n\/* Print styles *\/\r\n@media print {\r\n  #zic-email-analyzer .zic2__actions,\r\n  #zic-email-analyzer .zic2__hint,\r\n  #zic-email-analyzer .zic2__footer,\r\n  #zic-email-analyzer .zic2__gdprDetails,\r\n  #zic-email-analyzer .zic2__consentCard {\r\n    display: none !important;\r\n  }\r\n  #zic-email-analyzer .zic2__card {\r\n    box-shadow: none;\r\n    border: 1px solid #ddd;\r\n    break-inside: avoid;\r\n  }\r\n  #zic-email-analyzer .zic2__mainContent {\r\n    display: block !important;\r\n  }\r\n}\r\n<\/style>\r\n\r\n<script>\r\n(function() {\r\n  'use strict';\r\n\r\n  const ROOT_ID = 'zic-email-analyzer';\r\n  const root = document.getElementById(ROOT_ID);\r\n  if (!root) return;\r\n\r\n  const $ = (sel) => root.querySelector(sel);\r\n  const $$ = (sel) => root.querySelectorAll(sel);\r\n\r\n  \/\/ === Security: HTML Escape Function (XSS Prevention) ===\r\n  function escapeHtml(str) {\r\n    if (str === null || str === undefined) return '';\r\n    const div = document.createElement('div');\r\n    div.textContent = String(str);\r\n    return div.innerHTML;\r\n  }\r\n\r\n  \/\/ === INTERNATIONALIZATION (i18n) ===\r\n  const LANG = {\r\n    ro: {\r\n      \/\/ Header\r\n      title: 'Analizator Header Email',\r\n      subtitle: 'Detecteaza email spoofing si phishing',\r\n      langSwitch: 'EN',\r\n      \/\/ GDPR Notice\r\n      gdprTitle: 'Protectia datelor tale',\r\n      gdprIntro: 'Acest instrument proceseaza datele <em>exclusiv local<\/em>, in browser-ul tau. Header-ul email-ului (introdus manual sau din fisier):',\r\n      gdprList1: 'NU este trimis catre niciun server extern',\r\n      gdprList2: 'NU este stocat sau salvat nicaieri',\r\n      gdprList3: 'NU este partajat cu terti',\r\n      gdprList4: 'Fisierele incarcate sunt citite local (FileReader API)',\r\n      gdprList5: 'Este sters automat cand inchizi sau reincarci pagina',\r\n      gdprCompliance: 'Conform GDPR (Regulamentul UE 2016\/679), nu colectam si nu procesam date cu caracter personal pe serverele noastre.',\r\n      \/\/ Consent\r\n      consentTitle: 'Confirm ca am inteles modul de procesare a datelor',\r\n      consentDesc: 'Inteleg ca datele introduse sunt procesate doar local in browser-ul meu si nu sunt transmise nicaieri.',\r\n      \/\/ Formula\r\n      formula: '<strong>Cum functioneaza:<\/strong> Analizam SPF, DKIM, DMARC si alte header-e pentru a detecta semne de falsificare. Procesare 100% locala.',\r\n      \/\/ Input\r\n      inputTitle: 'Header Email',\r\n      uploadTitle: 'Incarca fisier .eml sau .txt',\r\n      uploadSubtitle: 'sau trage fisierul aici',\r\n      dividerText: 'sau copiaza manual',\r\n      inputLabel: 'Copiaza header-ul email-ului aici',\r\n      inputPlaceholder: 'Copiaza intregul header al email-ului aici...\\n\\nCum obtii header-ul:\\n- Gmail: Deschide email-ul > Click pe cele 3 puncte > \\'Arata originalul\\'\\n- Outlook: Deschide email-ul > File > Properties > Internet Headers\\n- Yahoo: Deschide email-ul > More > View Raw Message',\r\n      hint: 'Acceptam fisiere .eml (exportate din Outlook, Thunderbird) si .txt cu header-ul copiat.',\r\n      \/\/ Buttons\r\n      btnAnalyze: 'Analizeaza Header',\r\n      btnReset: 'Sterge datele',\r\n      btnExample: 'Exemplu',\r\n      \/\/ Results\r\n      warningsTitle: 'Avertismente detectate',\r\n      routeTitle: 'Traseul email-ului',\r\n      detailsTitle: 'Detalii suplimentare',\r\n      \/\/ Score texts\r\n      scoreSafe: 'Risc Scazut',\r\n      scoreWarning: 'Atentie Necesara',\r\n      scoreDanger: 'Risc Ridicat de Spoofing',\r\n      descSafe: 'Email-ul pare a fi legitim. Verificarile principale au trecut.',\r\n      descWarning: 'Au fost detectate unele probleme. Verifica manual inainte de a actiona.',\r\n      descDanger: 'Multiple semne de falsificare detectate. Trateaza acest email cu suspiciune!',\r\n      \/\/ GDPR Details\r\n      gdprDetailsTitle: 'Informatii despre protectia datelor (GDPR)',\r\n      \/\/ Disclaimer\r\n      disclaimer: '<strong>Disclaimer:<\/strong> Aceasta analiza este orientativa si nu inlocuieste o verificare profesionala de securitate, precum cea oferita de <a href=\"https:\/\/cyberopsnetwork.com\/\" target=\"_blank\" rel=\"noopener noreferrer\">CyberOps Network<\/a> \u2013 partenerii ZIC.legal.',\r\n      \/\/ Errors\r\n      errorEmpty: 'Te rugam sa introduci header-ul email-ului pentru analiza.',\r\n      errorTooLarge: 'Header-ul este prea mare (max 500KB). Te rugam sa copiezi doar header-ul, nu intregul email.',\r\n      errorConsent: 'Te rugam sa confirmi ca ai inteles modul de procesare a datelor inainte de a continua.',\r\n      errorFileFormat: 'Format neacceptat. Te rugam sa incarci un fisier .eml sau .txt (fisierele .msg nu sunt suportate - exporta din Outlook ca .eml)',\r\n      errorFileSize: 'Fisierul este prea mare. Dimensiunea maxima este 5MB.',\r\n      errorFileRead: 'Eroare la citirea fisierului. Te rugam sa incerci din nou.',\r\n      \/\/ Analysis labels\r\n      spfLabel: 'SPF (Sender Policy)',\r\n      dkimLabel: 'DKIM (Semnatura Digitala)',\r\n      dmarcLabel: 'DMARC (Politica Domeniu)',\r\n      alignmentLabel: 'Aliniere Expeditor',\r\n      \/\/ Route labels\r\n      hopLabel: 'Hop',\r\n      fromLabel: 'De la:',\r\n      byLabel: 'Prin:',\r\n      ipLabel: 'IP:',\r\n      \/\/ Detail labels\r\n      subjectLabel: 'Subiect',\r\n      dateLabel: 'Data',\r\n      messageIdLabel: 'Message-ID',\r\n      originatingIpLabel: 'IP Original',\r\n      mailerLabel: 'Client Email',\r\n      contentTypeLabel: 'Tip Continut'\r\n    },\r\n    en: {\r\n      \/\/ Header\r\n      title: 'Email Header Analyzer',\r\n      subtitle: 'Detect email spoofing and phishing',\r\n      langSwitch: 'RO',\r\n      \/\/ GDPR Notice\r\n      gdprTitle: 'Your data protection',\r\n      gdprIntro: 'This tool processes data <em>exclusively locally<\/em>, in your browser. The email header (entered manually or from file):',\r\n      gdprList1: 'Is NOT sent to any external server',\r\n      gdprList2: 'Is NOT stored or saved anywhere',\r\n      gdprList3: 'Is NOT shared with third parties',\r\n      gdprList4: 'Uploaded files are read locally (FileReader API)',\r\n      gdprList5: 'Is automatically deleted when you close or reload the page',\r\n      gdprCompliance: 'In accordance with GDPR (EU Regulation 2016\/679), we do not collect or process personal data on our servers.',\r\n      \/\/ Consent\r\n      consentTitle: 'I confirm that I understand how data is processed',\r\n      consentDesc: 'I understand that the entered data is processed only locally in my browser and is not transmitted anywhere.',\r\n      \/\/ Formula\r\n      formula: '<strong>How it works:<\/strong> We analyze SPF, DKIM, DMARC and other headers to detect signs of forgery. 100% local processing.',\r\n      \/\/ Input\r\n      inputTitle: 'Email Header',\r\n      uploadTitle: 'Upload .eml or .txt file',\r\n      uploadSubtitle: 'or drag file here',\r\n      dividerText: 'or paste manually',\r\n      inputLabel: 'Paste the email header here',\r\n      inputPlaceholder: 'Paste the entire email header here...\\n\\nHow to get the header:\\n- Gmail: Open email > Click 3 dots > \\'Show original\\'\\n- Outlook: Open email > File > Properties > Internet Headers\\n- Yahoo: Open email > More > View Raw Message',\r\n      hint: 'We accept .eml files (exported from Outlook, Thunderbird) and .txt with copied header.',\r\n      \/\/ Buttons\r\n      btnAnalyze: 'Analyze Header',\r\n      btnReset: 'Clear data',\r\n      btnExample: 'Example',\r\n      \/\/ Results\r\n      warningsTitle: 'Detected warnings',\r\n      routeTitle: 'Email route',\r\n      detailsTitle: 'Additional details',\r\n      \/\/ Score texts\r\n      scoreSafe: 'Low Risk',\r\n      scoreWarning: 'Caution Required',\r\n      scoreDanger: 'High Spoofing Risk',\r\n      descSafe: 'The email appears to be legitimate. Main checks passed.',\r\n      descWarning: 'Some issues detected. Verify manually before taking action.',\r\n      descDanger: 'Multiple signs of forgery detected. Treat this email with suspicion!',\r\n      \/\/ GDPR Details\r\n      gdprDetailsTitle: 'Data protection information (GDPR)',\r\n      \/\/ Disclaimer\r\n      disclaimer: '<strong>Disclaimer:<\/strong> This analysis is indicative and does not replace a professional security assessment, such as that offered by <a href=\"https:\/\/cyberopsnetwork.com\/\" target=\"_blank\" rel=\"noopener noreferrer\">CyberOps Network<\/a> \u2013 ZIC.legal partners.',\r\n      \/\/ Errors\r\n      errorEmpty: 'Please enter the email header for analysis.',\r\n      errorTooLarge: 'Header is too large (max 500KB). Please copy only the header, not the entire email.',\r\n      errorConsent: 'Please confirm that you understand how data is processed before continuing.',\r\n      errorFileFormat: 'Unsupported format. Please upload an .eml or .txt file (.msg files are not supported - export from Outlook as .eml)',\r\n      errorFileSize: 'File is too large. Maximum size is 5MB.',\r\n      errorFileRead: 'Error reading file. Please try again.',\r\n      \/\/ Analysis labels\r\n      spfLabel: 'SPF (Sender Policy)',\r\n      dkimLabel: 'DKIM (Digital Signature)',\r\n      dmarcLabel: 'DMARC (Domain Policy)',\r\n      alignmentLabel: 'Sender Alignment',\r\n      \/\/ Route labels\r\n      hopLabel: 'Hop',\r\n      fromLabel: 'From:',\r\n      byLabel: 'Via:',\r\n      ipLabel: 'IP:',\r\n      \/\/ Detail labels\r\n      subjectLabel: 'Subject',\r\n      dateLabel: 'Date',\r\n      messageIdLabel: 'Message-ID',\r\n      originatingIpLabel: 'Original IP',\r\n      mailerLabel: 'Email Client',\r\n      contentTypeLabel: 'Content Type'\r\n    }\r\n  };\r\n\r\n  \/\/ Detect browser language, default to Romanian\r\n  let currentLang = navigator.language.startsWith('ro') ? 'ro' : 'en';\r\n\r\n  \/\/ Get translation\r\n  function t(key, replacements = {}) {\r\n    let text = LANG[currentLang][key] || LANG['ro'][key] || key;\r\n    for (const [placeholder, value] of Object.entries(replacements)) {\r\n      text = text.replace('{' + placeholder + '}', value);\r\n    }\r\n    return text;\r\n  }\r\n\r\n  \/\/ Apply translations to all elements with data-i18n attributes\r\n  function applyTranslations() {\r\n    \/\/ Text content\r\n    root.querySelectorAll('[data-i18n]').forEach(el => {\r\n      const key = el.getAttribute('data-i18n');\r\n      if (LANG[currentLang][key]) {\r\n        el.textContent = LANG[currentLang][key];\r\n      }\r\n    });\r\n    \/\/ HTML content\r\n    root.querySelectorAll('[data-i18n-html]').forEach(el => {\r\n      const key = el.getAttribute('data-i18n-html');\r\n      if (LANG[currentLang][key]) {\r\n        el.innerHTML = LANG[currentLang][key];\r\n      }\r\n    });\r\n    \/\/ Placeholders\r\n    root.querySelectorAll('[data-i18n-placeholder]').forEach(el => {\r\n      const key = el.getAttribute('data-i18n-placeholder');\r\n      if (LANG[currentLang][key]) {\r\n        el.placeholder = LANG[currentLang][key];\r\n      }\r\n    });\r\n  }\r\n\r\n  \/\/ Toggle language\r\n  function toggleLanguage() {\r\n    currentLang = currentLang === 'ro' ? 'en' : 'ro';\r\n    applyTranslations();\r\n  }\r\n\r\n  const elements = {\r\n    gdprConsent: $('[data-field=\"gdprConsent\"]'),\r\n    consentCard: $('[data-consent-card]'),\r\n    mainContent: $('[data-main-content]'),\r\n    emailHeader: $('[data-field=\"emailHeader\"]'),\r\n    fileInput: $('[data-file-input]'),\r\n    uploadZone: $('[data-upload-zone]'),\r\n    uploadSuccess: $('[data-upload-success]'),\r\n    uploadFilename: $('[data-upload-filename]'),\r\n    errors: $('[data-errors]'),\r\n    scoreCard: $('[data-score-card]'),\r\n    scoreDisplay: $('[data-score-display]'),\r\n    scoreIcon: $('[data-score-icon]'),\r\n    scoreText: $('[data-score-text]'),\r\n    scoreDesc: $('[data-score-desc]'),\r\n    analysisGrid: $('[data-analysis-grid]'),\r\n    warningsCard: $('[data-warnings-card]'),\r\n    warningsList: $('[data-warnings-list]'),\r\n    routeCard: $('[data-route-card]'),\r\n    routeList: $('[data-route-list]'),\r\n    detailsCard: $('[data-details-card]'),\r\n    detailsList: $('[data-details-list]')\r\n  };\r\n\r\n  \/\/ === GDPR Consent Handler ===\r\n  function handleConsentChange() {\r\n    if (elements.gdprConsent.checked) {\r\n      elements.mainContent.classList.remove('is-hidden');\r\n      elements.consentCard.style.borderColor = 'var(--zic-success-border)';\r\n      elements.consentCard.style.background = 'var(--zic-success-light)';\r\n    } else {\r\n      elements.mainContent.classList.add('is-hidden');\r\n      elements.consentCard.style.borderColor = 'var(--zic-primary-border)';\r\n      elements.consentCard.style.background = 'var(--zic-surface)';\r\n      \/\/ Clear all data when consent is withdrawn\r\n      clearAllData();\r\n    }\r\n  }\r\n\r\n  function clearAllData() {\r\n    if (elements.emailHeader) {\r\n      elements.emailHeader.value = '';\r\n    }\r\n    if (elements.fileInput) {\r\n      elements.fileInput.value = '';\r\n    }\r\n    if (elements.uploadSuccess) {\r\n      elements.uploadSuccess.classList.add('is-hidden');\r\n    }\r\n    elements.errors.classList.add('is-hidden');\r\n    elements.scoreCard.classList.add('is-hidden');\r\n    elements.analysisGrid.classList.add('is-hidden');\r\n    elements.warningsCard.classList.add('is-hidden');\r\n    elements.routeCard.classList.add('is-hidden');\r\n    elements.detailsCard.classList.add('is-hidden');\r\n    elements.analysisGrid.innerHTML = '';\r\n    elements.warningsList.innerHTML = '';\r\n    elements.routeList.innerHTML = '';\r\n    elements.detailsList.innerHTML = '';\r\n  }\r\n\r\n  \/\/ === File Upload Handler ===\r\n  function extractHeaderFromEml(content) {\r\n    \/\/ EML files have headers separated from body by double newline\r\n    const headerEndIndex = content.search(\/\\r?\\n\\r?\\n\/);\r\n    if (headerEndIndex !== -1) {\r\n      return content.substring(0, headerEndIndex);\r\n    }\r\n    \/\/ If no double newline found, return first part or all content\r\n    return content;\r\n  }\r\n\r\n  function processFile(file) {\r\n    if (!file) return;\r\n\r\n    \/\/ Note: .msg files are binary Microsoft Outlook format and cannot be read as text\r\n    const allowedTypes = ['.eml', '.txt'];\r\n    const fileName = file.name.toLowerCase();\r\n    const isAllowed = allowedTypes.some(ext => fileName.endsWith(ext));\r\n\r\n    if (!isAllowed) {\r\n      elements.errors.textContent = t('errorFileFormat');\r\n      elements.errors.classList.remove('is-hidden');\r\n      return;\r\n    }\r\n\r\n    \/\/ Check file size (max 5MB)\r\n    if (file.size > 5 * 1024 * 1024) {\r\n      elements.errors.textContent = t('errorFileSize');\r\n      elements.errors.classList.remove('is-hidden');\r\n      return;\r\n    }\r\n\r\n    const reader = new FileReader();\r\n\r\n    reader.onload = function(e) {\r\n      let content = e.target.result;\r\n\r\n      \/\/ Extract header from EML file\r\n      if (fileName.endsWith('.eml')) {\r\n        content = extractHeaderFromEml(content);\r\n      }\r\n\r\n      \/\/ Put content in textarea\r\n      elements.emailHeader.value = content;\r\n\r\n      \/\/ Show success message\r\n      elements.uploadSuccess.classList.remove('is-hidden');\r\n      elements.uploadFilename.textContent = file.name;\r\n\r\n      \/\/ Clear any previous errors\r\n      elements.errors.classList.add('is-hidden');\r\n    };\r\n\r\n    reader.onerror = function() {\r\n      elements.errors.textContent = t('errorFileRead');\r\n      elements.errors.classList.remove('is-hidden');\r\n    };\r\n\r\n    reader.readAsText(file);\r\n  }\r\n\r\n  function handleFileSelect(e) {\r\n    const file = e.target.files[0];\r\n    processFile(file);\r\n  }\r\n\r\n  function handleDragOver(e) {\r\n    e.preventDefault();\r\n    e.stopPropagation();\r\n    elements.uploadZone.classList.add('is-dragover');\r\n  }\r\n\r\n  function handleDragLeave(e) {\r\n    e.preventDefault();\r\n    e.stopPropagation();\r\n    elements.uploadZone.classList.remove('is-dragover');\r\n  }\r\n\r\n  function handleDrop(e) {\r\n    e.preventDefault();\r\n    e.stopPropagation();\r\n    elements.uploadZone.classList.remove('is-dragover');\r\n\r\n    const file = e.dataTransfer.files[0];\r\n    processFile(file);\r\n  }\r\n\r\n  \/\/ === Header Parser ===\r\n  function parseHeader(headerText) {\r\n    const headers = {};\r\n    const lines = headerText.split(\/\\r?\\n\/);\r\n    let currentHeader = '';\r\n    let currentValue = '';\r\n\r\n    for (let line of lines) {\r\n      if (line.match(\/^[\\t ]\/)) {\r\n        currentValue += ' ' + line.trim();\r\n      } else {\r\n        if (currentHeader) {\r\n          const key = currentHeader.toLowerCase();\r\n          if (!headers[key]) headers[key] = [];\r\n          headers[key].push(currentValue);\r\n        }\r\n        const match = line.match(\/^([^:]+):\\s*(.*)$\/);\r\n        if (match) {\r\n          currentHeader = match[1];\r\n          currentValue = match[2];\r\n        } else {\r\n          currentHeader = '';\r\n          currentValue = '';\r\n        }\r\n      }\r\n    }\r\n    if (currentHeader) {\r\n      const key = currentHeader.toLowerCase();\r\n      if (!headers[key]) headers[key] = [];\r\n      headers[key].push(currentValue);\r\n    }\r\n    return headers;\r\n  }\r\n\r\n  function extractEmail(str) {\r\n    if (!str) return null;\r\n    const match = str.match(\/<([^>]+)>\/) || str.match(\/([a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,})\/);\r\n    return match ? match[1].toLowerCase() : null;\r\n  }\r\n\r\n  function extractDomain(email) {\r\n    if (!email) return null;\r\n    const parts = email.split('@');\r\n    return parts.length > 1 ? parts[1].toLowerCase() : null;\r\n  }\r\n\r\n  function parseReceivedHeaders(receivedHeaders) {\r\n    const hops = [];\r\n    if (!receivedHeaders) return hops;\r\n\r\n    for (let i = receivedHeaders.length - 1; i >= 0; i--) {\r\n      const header = receivedHeaders[i];\r\n      const hop = { raw: header, from: null, by: null, ip: null, date: null };\r\n\r\n      const fromMatch = header.match(\/from\\s+([^\\s]+)\/i);\r\n      if (fromMatch) hop.from = fromMatch[1];\r\n\r\n      const byMatch = header.match(\/by\\s+([^\\s]+)\/i);\r\n      if (byMatch) hop.by = byMatch[1];\r\n\r\n      const ipMatch = header.match(\/\\[(\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3})\\]\/);\r\n      if (ipMatch) hop.ip = ipMatch[1];\r\n\r\n      const dateMatch = header.match(\/;\\s*(.+)$\/);\r\n      if (dateMatch) hop.date = dateMatch[1].trim();\r\n\r\n      hops.push(hop);\r\n    }\r\n    return hops;\r\n  }\r\n\r\n  \/\/ === Checks ===\r\n  function checkSPF(headers) {\r\n    const result = { status: 'neutral', found: false, value: null, details: 'Nu s-a gasit informatii SPF in header.' };\r\n\r\n    const authResults = headers['authentication-results'];\r\n    if (authResults) {\r\n      for (let auth of authResults) {\r\n        const spfMatch = auth.match(\/spf=(\\w+)\/i);\r\n        if (spfMatch) {\r\n          result.found = true;\r\n          result.value = spfMatch[1].toLowerCase();\r\n          if (result.value === 'pass') {\r\n            result.status = 'pass';\r\n            result.details = 'SPF a trecut - IP-ul expeditorului este autorizat pentru acest domeniu.';\r\n          } else if (result.value === 'fail' || result.value === 'hardfail') {\r\n            result.status = 'fail';\r\n            result.details = 'SPF a esuat - IP-ul expeditorului NU este autorizat. Posibil spoofing!';\r\n          } else if (result.value === 'softfail') {\r\n            result.status = 'warning';\r\n            result.details = 'SPF softfail - IP-ul expeditorului nu este explicit autorizat.';\r\n          } else {\r\n            result.status = 'warning';\r\n            result.details = 'SPF neutral\/none - Domeniul nu are o politica SPF definita.';\r\n          }\r\n          break;\r\n        }\r\n      }\r\n    }\r\n\r\n    const receivedSPF = headers['received-spf'];\r\n    if (receivedSPF && !result.found) {\r\n      result.found = true;\r\n      const spfResult = receivedSPF[0].toLowerCase();\r\n      if (spfResult.includes('pass')) {\r\n        result.status = 'pass';\r\n        result.value = 'pass';\r\n        result.details = 'SPF a trecut verificarea.';\r\n      } else if (spfResult.includes('fail')) {\r\n        result.status = 'fail';\r\n        result.value = 'fail';\r\n        result.details = 'SPF a esuat - Posibil email falsificat!';\r\n      } else if (spfResult.includes('softfail')) {\r\n        result.status = 'warning';\r\n        result.value = 'softfail';\r\n        result.details = 'SPF softfail - Verificare incompleta.';\r\n      }\r\n    }\r\n    return result;\r\n  }\r\n\r\n  function checkDKIM(headers) {\r\n    const result = { status: 'neutral', found: false, value: null, domain: null, details: 'Nu s-a gasit semnatura DKIM in header.' };\r\n\r\n    const authResults = headers['authentication-results'];\r\n    if (authResults) {\r\n      for (let auth of authResults) {\r\n        const dkimMatch = auth.match(\/dkim=(\\w+)\/i);\r\n        if (dkimMatch) {\r\n          result.found = true;\r\n          result.value = dkimMatch[1].toLowerCase();\r\n          const domainMatch = auth.match(\/header\\.d=([^\\s;]+)\/i) || auth.match(\/d=([^\\s;]+)\/i);\r\n          if (domainMatch) result.domain = domainMatch[1];\r\n\r\n          if (result.value === 'pass') {\r\n            result.status = 'pass';\r\n            result.details = 'DKIM valid - Email-ul a fost semnat digital si nu a fost modificat.';\r\n          } else if (result.value === 'fail') {\r\n            result.status = 'fail';\r\n            result.details = 'DKIM invalid - Semnatura nu corespunde. Email-ul poate fi falsificat!';\r\n          } else {\r\n            result.status = 'warning';\r\n            result.details = 'DKIM absent - Email-ul nu are semnatura digitala.';\r\n          }\r\n          break;\r\n        }\r\n      }\r\n    }\r\n\r\n    const dkimSig = headers['dkim-signature'];\r\n    if (dkimSig && !result.found) {\r\n      result.found = true;\r\n      result.status = 'warning';\r\n      result.details = 'Semnatura DKIM prezenta, dar rezultatul verificarii nu este disponibil.';\r\n      const domainMatch = dkimSig[0].match(\/d=([^;]+)\/i);\r\n      if (domainMatch) result.domain = domainMatch[1].trim();\r\n    }\r\n    return result;\r\n  }\r\n\r\n  function checkDMARC(headers) {\r\n    const result = { status: 'neutral', found: false, value: null, details: 'Nu s-a gasit informatii DMARC in header.' };\r\n\r\n    const authResults = headers['authentication-results'];\r\n    if (authResults) {\r\n      for (let auth of authResults) {\r\n        const dmarcMatch = auth.match(\/dmarc=(\\w+)\/i);\r\n        if (dmarcMatch) {\r\n          result.found = true;\r\n          result.value = dmarcMatch[1].toLowerCase();\r\n          if (result.value === 'pass') {\r\n            result.status = 'pass';\r\n            result.details = 'DMARC a trecut - Email-ul respecta politica de autentificare a domeniului.';\r\n          } else if (result.value === 'fail') {\r\n            result.status = 'fail';\r\n            result.details = 'DMARC a esuat - Email-ul nu respecta politica domeniului. Risc ridicat!';\r\n          } else {\r\n            result.status = 'warning';\r\n            result.details = 'DMARC absent - Domeniul nu are politica DMARC configurata.';\r\n          }\r\n          break;\r\n        }\r\n      }\r\n    }\r\n    return result;\r\n  }\r\n\r\n  function checkFromAlignment(headers) {\r\n    const result = { status: 'neutral', from: null, returnPath: null, replyTo: null, warnings: [] };\r\n\r\n    if (headers['from']) result.from = extractEmail(headers['from'][0]);\r\n    if (headers['return-path']) result.returnPath = extractEmail(headers['return-path'][0]);\r\n    if (headers['reply-to']) result.replyTo = extractEmail(headers['reply-to'][0]);\r\n\r\n    const fromDomain = extractDomain(result.from);\r\n    const returnPathDomain = extractDomain(result.returnPath);\r\n    const replyToDomain = extractDomain(result.replyTo);\r\n\r\n    if (result.from && result.returnPath && fromDomain !== returnPathDomain) {\r\n      result.status = 'warning';\r\n      result.warnings.push({\r\n        type: 'warning',\r\n        message: `Domeniul From (${fromDomain}) difera de Return-Path (${returnPathDomain}). Poate fi legitim pentru email marketing, dar poate indica si spoofing.`\r\n      });\r\n    }\r\n\r\n    if (result.from && result.replyTo && result.from !== result.replyTo && fromDomain !== replyToDomain) {\r\n      result.status = 'warning';\r\n      result.warnings.push({\r\n        type: 'warning',\r\n        message: `Reply-To (${result.replyTo}) difera de From (${result.from}). Raspunsurile vor fi trimise la o adresa diferita!`\r\n      });\r\n    }\r\n\r\n    if (result.warnings.length === 0 && result.from) result.status = 'pass';\r\n    return result;\r\n  }\r\n\r\n  function checkSuspiciousPatterns(headers) {\r\n    const warnings = [];\r\n\r\n    if (headers['from'] && headers['from'].length > 1) {\r\n      warnings.push({ type: 'critical', message: 'Header-e From multiple detectate! Acesta este un semn clar de manipulare.' });\r\n    }\r\n\r\n    const xMailer = headers['x-mailer'];\r\n    if (xMailer) {\r\n      const suspiciousMailers = ['PHPMailer', 'anonymous', 'mass mail'];\r\n      for (let mailer of suspiciousMailers) {\r\n        if (xMailer[0].toLowerCase().includes(mailer.toLowerCase())) {\r\n          warnings.push({ type: 'warning', message: `X-Mailer suspect detectat: ${xMailer[0]}` });\r\n          break;\r\n        }\r\n      }\r\n    }\r\n\r\n    const subject = headers['subject'];\r\n    if (subject) {\r\n      const urgentPatterns = ['urgent', 'immediate action', 'verify your account', 'suspended', 'security alert', 'cont blocat', 'actiune imediata'];\r\n      for (let pattern of urgentPatterns) {\r\n        if (subject[0].toLowerCase().includes(pattern)) {\r\n          warnings.push({ type: 'warning', message: `Subiect cu potential de phishing: contine \"${pattern}\"` });\r\n          break;\r\n        }\r\n      }\r\n    }\r\n\r\n    if (headers['from']) {\r\n      const fromHeader = headers['from'][0];\r\n      const displayNameMatch = fromHeader.match(\/^\"?([^\"<]+)\"?\\s*<\/);\r\n      const emailMatch = fromHeader.match(\/<([^>]+)>\/);\r\n\r\n      if (displayNameMatch && emailMatch) {\r\n        const displayName = displayNameMatch[1].trim().toLowerCase();\r\n        const email = emailMatch[1].toLowerCase();\r\n\r\n        if (displayName.includes('@') && !email.includes(displayName)) {\r\n          warnings.push({ type: 'critical', message: `Posibil display name spoofing: numele afisat \"${displayNameMatch[1]}\" arata ca o adresa email diferita de adresa reala \"${emailMatch[1]}\"` });\r\n        }\r\n\r\n        const knownServices = ['paypal', 'amazon', 'microsoft', 'google', 'apple', 'facebook', 'netflix', 'dhl', 'fedex', 'ups', 'banca', 'bank', 'ing', 'bt', 'bcr', 'raiffeisen'];\r\n        for (let service of knownServices) {\r\n          if (displayName.includes(service) && !email.includes(service)) {\r\n            warnings.push({ type: 'critical', message: `Posibila impersonare: numele contine \"${service}\" dar domeniul email (${extractDomain(email)}) nu apartine acestui serviciu.` });\r\n            break;\r\n          }\r\n        }\r\n      }\r\n    }\r\n\r\n    return warnings;\r\n  }\r\n\r\n  \/\/ === Main Analysis ===\r\n  function performAnalysis(headerText) {\r\n    const headers = parseHeader(headerText);\r\n\r\n    const analysis = {\r\n      headers,\r\n      spf: checkSPF(headers),\r\n      dkim: checkDKIM(headers),\r\n      dmarc: checkDMARC(headers),\r\n      alignment: checkFromAlignment(headers),\r\n      hops: parseReceivedHeaders(headers['received']),\r\n      suspiciousPatterns: checkSuspiciousPatterns(headers),\r\n      overallScore: 0,\r\n      riskLevel: 'unknown'\r\n    };\r\n\r\n    let score = 100;\r\n    let criticalIssues = 0;\r\n\r\n    if (analysis.spf.status === 'fail') { score -= 30; criticalIssues++; }\r\n    else if (analysis.spf.status === 'warning') score -= 15;\r\n    else if (analysis.spf.status === 'neutral') score -= 5;\r\n\r\n    if (analysis.dkim.status === 'fail') { score -= 30; criticalIssues++; }\r\n    else if (analysis.dkim.status === 'warning') score -= 10;\r\n    else if (analysis.dkim.status === 'neutral') score -= 5;\r\n\r\n    if (analysis.dmarc.status === 'fail') { score -= 25; criticalIssues++; }\r\n    else if (analysis.dmarc.status === 'warning') score -= 10;\r\n\r\n    if (analysis.alignment.status === 'warning') score -= 10 * analysis.alignment.warnings.length;\r\n\r\n    for (let warning of analysis.suspiciousPatterns) {\r\n      if (warning.type === 'critical') { score -= 25; criticalIssues++; }\r\n      else if (warning.type === 'warning') score -= 10;\r\n    }\r\n\r\n    analysis.overallScore = Math.max(0, score);\r\n\r\n    if (criticalIssues >= 2 || analysis.overallScore < 40) analysis.riskLevel = 'danger';\r\n    else if (analysis.overallScore < 70) analysis.riskLevel = 'warning';\r\n    else analysis.riskLevel = 'safe';\r\n\r\n    return analysis;\r\n  }\r\n\r\n  \/\/ === Display Results ===\r\n  function displayResults(analysis) {\r\n    let scoreIcon, scoreText, scoreDesc;\r\n    if (analysis.riskLevel === 'safe') {\r\n      scoreIcon = '\\u2705';\r\n      scoreText = t('scoreSafe');\r\n      scoreDesc = t('descSafe');\r\n    } else if (analysis.riskLevel === 'warning') {\r\n      scoreIcon = '\\u26A0\\uFE0F';\r\n      scoreText = t('scoreWarning');\r\n      scoreDesc = t('descWarning');\r\n    } else {\r\n      scoreIcon = '\\u274C';\r\n      scoreText = t('scoreDanger');\r\n      scoreDesc = t('descDanger');\r\n    }\r\n\r\n    elements.scoreDisplay.className = 'zic2__scoreDisplay score-' + analysis.riskLevel;\r\n    elements.scoreIcon.textContent = scoreIcon;\r\n    elements.scoreText.textContent = scoreText;\r\n    elements.scoreDesc.textContent = scoreDesc;\r\n    elements.scoreCard.classList.remove('is-hidden');\r\n\r\n    \/\/ Analysis Cards\r\n    let cardsHtml = '';\r\n\r\n    \/\/ SECURITY: All user-derived data is escaped to prevent XSS\r\n    cardsHtml += `\r\n      <div class=\"zic2__analysisCard status-${escapeHtml(analysis.spf.status)}\">\r\n        <div class=\"zic2__analysisHeader\">\r\n          <span class=\"zic2__analysisIcon\">\\uD83D\\uDCE7<\/span>\r\n          <span class=\"zic2__analysisTitle\">${t('spfLabel')}<\/span>\r\n          <span class=\"zic2__analysisStatus status-${escapeHtml(analysis.spf.status)}\">${escapeHtml(analysis.spf.value) || 'N\/A'}<\/span>\r\n        <\/div>\r\n        <div class=\"zic2__analysisContent\">${escapeHtml(analysis.spf.details)}<\/div>\r\n      <\/div>\r\n    `;\r\n\r\n    cardsHtml += `\r\n      <div class=\"zic2__analysisCard status-${escapeHtml(analysis.dkim.status)}\">\r\n        <div class=\"zic2__analysisHeader\">\r\n          <span class=\"zic2__analysisIcon\">\\uD83D\\uDD10<\/span>\r\n          <span class=\"zic2__analysisTitle\">${t('dkimLabel')}<\/span>\r\n          <span class=\"zic2__analysisStatus status-${escapeHtml(analysis.dkim.status)}\">${escapeHtml(analysis.dkim.value) || 'N\/A'}<\/span>\r\n        <\/div>\r\n        <div class=\"zic2__analysisContent\">\r\n          ${escapeHtml(analysis.dkim.details)}\r\n          ${analysis.dkim.domain ? `<div class=\"zic2__analysisValue\">Domain: ${escapeHtml(analysis.dkim.domain)}<\/div>` : ''}\r\n        <\/div>\r\n      <\/div>\r\n    `;\r\n\r\n    cardsHtml += `\r\n      <div class=\"zic2__analysisCard status-${escapeHtml(analysis.dmarc.status)}\">\r\n        <div class=\"zic2__analysisHeader\">\r\n          <span class=\"zic2__analysisIcon\">\\uD83D\\uDEE1\\uFE0F<\/span>\r\n          <span class=\"zic2__analysisTitle\">${t('dmarcLabel')}<\/span>\r\n          <span class=\"zic2__analysisStatus status-${escapeHtml(analysis.dmarc.status)}\">${escapeHtml(analysis.dmarc.value) || 'N\/A'}<\/span>\r\n        <\/div>\r\n        <div class=\"zic2__analysisContent\">${escapeHtml(analysis.dmarc.details)}<\/div>\r\n      <\/div>\r\n    `;\r\n\r\n    cardsHtml += `\r\n      <div class=\"zic2__analysisCard status-${escapeHtml(analysis.alignment.status)}\">\r\n        <div class=\"zic2__analysisHeader\">\r\n          <span class=\"zic2__analysisIcon\">\\uD83D\\uDC64<\/span>\r\n          <span class=\"zic2__analysisTitle\">${t('alignmentLabel')}<\/span>\r\n          <span class=\"zic2__analysisStatus status-${escapeHtml(analysis.alignment.status)}\">${analysis.alignment.status === 'pass' ? 'OK' : (currentLang === 'ro' ? 'Atentie' : 'Caution')}<\/span>\r\n        <\/div>\r\n        <div class=\"zic2__analysisContent\">\r\n          ${analysis.alignment.from ? `<strong>From:<\/strong> ${escapeHtml(analysis.alignment.from)}<br>` : ''}\r\n          ${analysis.alignment.returnPath ? `<strong>Return-Path:<\/strong> ${escapeHtml(analysis.alignment.returnPath)}<br>` : ''}\r\n          ${analysis.alignment.replyTo ? `<strong>Reply-To:<\/strong> ${escapeHtml(analysis.alignment.replyTo)}` : ''}\r\n        <\/div>\r\n      <\/div>\r\n    `;\r\n\r\n    elements.analysisGrid.innerHTML = cardsHtml;\r\n    elements.analysisGrid.classList.remove('is-hidden');\r\n\r\n    \/\/ Warnings - SECURITY: Escape warning messages\r\n    const allWarnings = [...analysis.suspiciousPatterns, ...analysis.alignment.warnings];\r\n    if (allWarnings.length > 0) {\r\n      let warningsHtml = '';\r\n      for (let warning of allWarnings) {\r\n        const icon = warning.type === 'critical' ? '\\u274C' : '\\u26A0\\uFE0F';\r\n        const safeType = escapeHtml(warning.type);\r\n        warningsHtml += `\r\n          <div class=\"zic2__warningItem ${safeType}\">\r\n            <span class=\"zic2__warningIcon\">${icon}<\/span>\r\n            <span>${escapeHtml(warning.message)}<\/span>\r\n          <\/div>\r\n        `;\r\n      }\r\n      elements.warningsList.innerHTML = warningsHtml;\r\n      elements.warningsCard.classList.remove('is-hidden');\r\n    } else {\r\n      elements.warningsCard.classList.add('is-hidden');\r\n    }\r\n\r\n    \/\/ Route - SECURITY: Escape all hop data from email headers\r\n    if (analysis.hops.length > 0) {\r\n      let routeHtml = '';\r\n      for (let i = 0; i < analysis.hops.length; i++) {\r\n        const hop = analysis.hops[i];\r\n        routeHtml += `\r\n          <div class=\"zic2__routeItem\">\r\n            <div class=\"zic2__routeHeader\">\r\n              <span class=\"zic2__routeNumber\">${t('hopLabel')} ${i + 1}<\/span>\r\n              ${hop.date ? `<span class=\"zic2__routeTime\">${escapeHtml(hop.date)}<\/span>` : ''}\r\n            <\/div>\r\n            <div class=\"zic2__routeDetails\">\r\n              ${hop.from ? `<strong>${t('fromLabel')}<\/strong> ${escapeHtml(hop.from)}<br>` : ''}\r\n              ${hop.by ? `<strong>${t('byLabel')}<\/strong> ${escapeHtml(hop.by)}<br>` : ''}\r\n              ${hop.ip ? `<strong>${t('ipLabel')}<\/strong> ${escapeHtml(hop.ip)}` : ''}\r\n            <\/div>\r\n          <\/div>\r\n        `;\r\n      }\r\n      elements.routeList.innerHTML = routeHtml;\r\n      elements.routeCard.classList.remove('is-hidden');\r\n    } else {\r\n      elements.routeCard.classList.add('is-hidden');\r\n    }\r\n\r\n    \/\/ Details - SECURITY: Escape all header values from user input\r\n    const detailsToShow = [\r\n      { key: 'subject', label: t('subjectLabel') },\r\n      { key: 'date', label: t('dateLabel') },\r\n      { key: 'message-id', label: t('messageIdLabel') },\r\n      { key: 'x-originating-ip', label: t('originatingIpLabel') },\r\n      { key: 'x-mailer', label: t('mailerLabel') },\r\n      { key: 'content-type', label: t('contentTypeLabel') }\r\n    ];\r\n\r\n    let detailsHtml = '';\r\n    for (let detail of detailsToShow) {\r\n      if (analysis.headers[detail.key]) {\r\n        detailsHtml += `\r\n          <div class=\"zic2__detailRow\">\r\n            <span class=\"zic2__detailLabel\">${escapeHtml(detail.label)}<\/span>\r\n            <span class=\"zic2__detailValue\">${escapeHtml(analysis.headers[detail.key][0])}<\/span>\r\n          <\/div>\r\n        `;\r\n      }\r\n    }\r\n\r\n    if (detailsHtml) {\r\n      elements.detailsList.innerHTML = detailsHtml;\r\n      elements.detailsCard.classList.remove('is-hidden');\r\n    } else {\r\n      elements.detailsCard.classList.add('is-hidden');\r\n    }\r\n\r\n    setTimeout(() => {\r\n      elements.scoreCard.scrollIntoView({ behavior: 'smooth', block: 'nearest' });\r\n    }, 100);\r\n  }\r\n\r\n  \/\/ === SECURITY: Maximum header size limit (500KB) to prevent DoS ===\r\n  const MAX_HEADER_SIZE = 500 * 1024;\r\n\r\n  \/\/ === Actions ===\r\n  function analyze() {\r\n    if (!elements.gdprConsent.checked) {\r\n      elements.errors.textContent = t('errorConsent');\r\n      elements.errors.classList.remove('is-hidden');\r\n      return;\r\n    }\r\n\r\n    const headerText = elements.emailHeader.value.trim();\r\n\r\n    if (!headerText) {\r\n      elements.errors.textContent = t('errorEmpty');\r\n      elements.errors.classList.remove('is-hidden');\r\n      return;\r\n    }\r\n\r\n    \/\/ SECURITY: Check header size to prevent DoS attacks\r\n    if (headerText.length > MAX_HEADER_SIZE) {\r\n      elements.errors.textContent = t('errorTooLarge');\r\n      elements.errors.classList.remove('is-hidden');\r\n      return;\r\n    }\r\n\r\n    elements.errors.classList.add('is-hidden');\r\n    const analysis = performAnalysis(headerText);\r\n    displayResults(analysis);\r\n  }\r\n\r\n  function reset() {\r\n    clearAllData();\r\n  }\r\n\r\n  function loadExample() {\r\n    if (!elements.gdprConsent.checked) {\r\n      elements.gdprConsent.checked = true;\r\n      handleConsentChange();\r\n    }\r\n\r\n    elements.emailHeader.value = `Delivered-To: recipient@gmail.com\r\nReceived: by 2002:a17:90a:1234:0:0:0:0 with SMTP id x1234567890;\r\n        Sat, 28 Dec 2024 10:30:00 -0800 (PST)\r\nReceived: from mail-sor-f41.google.com (mail-sor-f41.google.com. [209.85.220.41])\r\n        by mx.google.com with SMTPS id a1234567890;\r\n        Sat, 28 Dec 2024 10:29:59 -0800 (PST)\r\nReceived-SPF: pass (google.com: domain of sender@example.com designates 209.85.220.41 as permitted sender)\r\nAuthentication-Results: mx.google.com;\r\n       dkim=pass header.i=@example.com header.s=selector1;\r\n       spf=pass (google.com: domain of sender@example.com designates 209.85.220.41 as permitted sender);\r\n       dmarc=pass (p=REJECT sp=REJECT dis=NONE) header.from=example.com\r\nDKIM-Signature: v=1; a=rsa-sha256; c=relaxed\/relaxed; d=example.com; s=selector1;\r\nReturn-Path: <sender@example.com>\r\nFrom: \"Sender Name\" <sender@example.com>\r\nTo: recipient@gmail.com\r\nSubject: Test Email - Verificare Header\r\nDate: Sat, 28 Dec 2024 18:29:50 +0000\r\nMessage-ID: <abc123@mail.example.com>\r\nMIME-Version: 1.0\r\nContent-Type: text\/plain; charset=UTF-8\r\nX-Mailer: Microsoft Outlook 16.0`;\r\n  }\r\n\r\n  \/\/ === SECURITY: Whitelist of valid actions ===\r\n  const VALID_ACTIONS = ['analyze', 'reset', 'example', 'toggleLang'];\r\n\r\n  \/\/ === Event Handlers ===\r\n  function handleClick(e) {\r\n    const button = e.target.closest('[data-action]');\r\n    if (!button) return;\r\n\r\n    const action = button.dataset.action;\r\n    \/\/ SECURITY: Validate action is in whitelist\r\n    if (!VALID_ACTIONS.includes(action)) {\r\n      console.warn('Invalid action attempted:', action);\r\n      return;\r\n    }\r\n\r\n    switch (action) {\r\n      case 'analyze': analyze(); break;\r\n      case 'reset': reset(); break;\r\n      case 'example': loadExample(); break;\r\n      case 'toggleLang': toggleLanguage(); break;\r\n    }\r\n  }\r\n\r\n  \/\/ === Initialize ===\r\n  function init() {\r\n    root.addEventListener('click', handleClick);\r\n    elements.gdprConsent.addEventListener('change', handleConsentChange);\r\n\r\n    \/\/ File upload event listeners\r\n    if (elements.fileInput) {\r\n      elements.fileInput.addEventListener('change', handleFileSelect);\r\n    }\r\n    if (elements.uploadZone) {\r\n      elements.uploadZone.addEventListener('dragover', handleDragOver);\r\n      elements.uploadZone.addEventListener('dragleave', handleDragLeave);\r\n      elements.uploadZone.addEventListener('drop', handleDrop);\r\n    }\r\n\r\n    \/\/ Ensure main content is hidden on load\r\n    elements.mainContent.classList.add('is-hidden');\r\n\r\n    \/\/ Apply initial translations based on browser language\r\n    applyTranslations();\r\n  }\r\n\r\n  if (document.readyState === 'loading') {\r\n    document.addEventListener('DOMContentLoaded', init);\r\n  } else {\r\n    init();\r\n  }\r\n})();\r\n<\/script>\r\n<\/div>\r\n<\/div>\n<div data-tool-content=\"website\" style=\"display:none\"><div id=\"zic-website-spoofing-v2\" class=\"zic2\" data-zic2=\"1\">\r\n  <!-- Skip Link for Keyboard Navigation -->\r\n  <a href=\"#zic2v2-url-input\" class=\"zic2__skipLink\">\r\n    Sari la formularul de verificare\r\n  <\/a>\r\n\r\n  <!-- Screen Reader Status Announcements -->\r\n  <div class=\"zic2__srStatus\" role=\"status\" aria-live=\"polite\" aria-atomic=\"true\" data-sr-status><\/div>\r\n\r\n  <div class=\"zic2__wrap\">\r\n    <!-- Header -->\r\n    <header class=\"zic2__hero\">\r\n      <div class=\"zic2__brandbar\">\r\n        <div class=\"zic2__mark\" aria-hidden=\"true\">\r\n          <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n            <circle cx=\"11\" cy=\"11\" r=\"8\"\/>\r\n            <path d=\"M21 21l-4.35-4.35\"\/>\r\n          <\/svg>\r\n        <\/div>\r\n        <div class=\"zic2__headerText\">\r\n          <h2 class=\"zic2__title\" data-i18n=\"title\">Verificare website spoofing<\/h2>\r\n          <p class=\"zic2__subtitle\" data-i18n=\"subtitle\">Detecteaz\u0103 link-uri suspecte \u0219i tentative de phishing<\/p>\r\n        <\/div>\r\n        <button type=\"button\" class=\"zic2__themeBtn\" data-action=\"toggleTheme\" title=\"Toggle dark mode\" aria-label=\"Switch to dark mode\" aria-pressed=\"false\">\r\n          <svg class=\"zic2__themeIcon zic2__themeIcon--sun\" width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><circle cx=\"12\" cy=\"12\" r=\"5\"\/><line x1=\"12\" y1=\"1\" x2=\"12\" y2=\"3\"\/><line x1=\"12\" y1=\"21\" x2=\"12\" y2=\"23\"\/><line x1=\"4.22\" y1=\"4.22\" x2=\"5.64\" y2=\"5.64\"\/><line x1=\"18.36\" y1=\"18.36\" x2=\"19.78\" y2=\"19.78\"\/><line x1=\"1\" y1=\"12\" x2=\"3\" y2=\"12\"\/><line x1=\"21\" y1=\"12\" x2=\"23\" y2=\"12\"\/><line x1=\"4.22\" y1=\"19.78\" x2=\"5.64\" y2=\"18.36\"\/><line x1=\"18.36\" y1=\"5.64\" x2=\"19.78\" y2=\"4.22\"\/><\/svg>\r\n          <svg class=\"zic2__themeIcon zic2__themeIcon--moon\" width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><path d=\"M21 12.79A9 9 0 1 1 11.21 3 7 7 0 0 0 21 12.79z\"\/><\/svg>\r\n        <\/button>\r\n        <button type=\"button\" class=\"zic2__langBtn\" data-action=\"toggleLang\" title=\"Switch language\" aria-label=\"Switch to English\">\r\n          <span data-i18n=\"langSwitch\">EN<\/span>\r\n        <\/button>\r\n        <div class=\"zic2__version\">v4.1<\/div>\r\n      <\/div>\r\n    <\/header>\r\n\r\n    <!-- Formula info -->\r\n    <div class=\"zic2__formula\">\r\n      <div class=\"zic2__formulaIcon\">\r\n        <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n          <circle cx=\"12\" cy=\"12\" r=\"10\"\/>\r\n          <path d=\"M12 16v-4\"\/>\r\n          <path d=\"M12 8h.01\"\/>\r\n        <\/svg>\r\n      <\/div>\r\n      <div class=\"zic2__formulaText\" data-i18n-html=\"formula\">\r\n        <strong>Cum func\u021bioneaz\u0103:<\/strong> Analiz\u0103m URL-ul pentru typosquatting, caractere Unicode suspecte, extensii de domeniu riscante \u0219i alte indicii de phishing. Verific\u0103m suplimentar prin <strong>5 surse externe<\/strong>: Google Safe Browsing, VirusTotal, URLhaus, urlscan.io \u0219i PhishTank.\r\n      <\/div>\r\n    <\/div>\r\n\r\n    <!-- Card: Input URL -->\r\n    <section class=\"zic2__card\" aria-labelledby=\"zic2-sec-input\">\r\n      <div class=\"zic2__cardHeader\">\r\n        <div class=\"zic2__cardIcon zic2__cardIcon--purple\">\r\n          <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n            <path d=\"M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71\"\/>\r\n            <path d=\"M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71\"\/>\r\n          <\/svg>\r\n        <\/div>\r\n        <h3 id=\"zic2-sec-input\" class=\"zic2__cardTitle\" data-i18n=\"inputTitle\">Link de verificat<\/h3>\r\n      <\/div>\r\n\r\n      <!-- Batch Mode Toggle -->\r\n      <div class=\"zic2__batchToggle\">\r\n        <label class=\"zic2__checkboxLabel\" for=\"zic2-batch-mode\">\r\n          <input type=\"checkbox\" id=\"zic2-batch-mode\" class=\"zic2__checkbox\" data-field=\"batchMode\" aria-describedby=\"zic2-batch-desc\" \/>\r\n          <span class=\"zic2__checkboxText\" data-i18n=\"batchMode\">Mod batch (verific\u0103 multiple URL-uri)<\/span>\r\n        <\/label>\r\n      <\/div>\r\n\r\n      <!-- Single URL Input -->\r\n      <div class=\"zic2__field\" data-single-input>\r\n        <label class=\"zic2__label\" for=\"zic2v2-url-input\" data-i18n=\"inputLabel\">Introdu link-ul website-ului<\/label>\r\n        <input type=\"text\" id=\"zic2v2-url-input\" class=\"zic2__input\" data-field=\"urlInput\" data-i18n-placeholder=\"inputPlaceholder\" placeholder=\"https:\/\/example.com\" maxlength=\"2048\" autocomplete=\"off\" \/>\r\n      <\/div>\r\n\r\n      <!-- Batch URL Input (hidden by default) -->\r\n      <div class=\"zic2__field is-hidden\" data-batch-input>\r\n        <label class=\"zic2__label\" for=\"zic2v2-url-batch\" data-i18n=\"batchLabel\">Introdu URL-urile (unul pe linie, max 10)<\/label>\r\n        <textarea id=\"zic2v2-url-batch\" class=\"zic2__input\" data-field=\"urlBatch\" rows=\"6\" style=\"resize: vertical; font-family: monospace; font-size: 13px;\" placeholder=\"https:\/\/example1.com&#10;https:\/\/example2.com&#10;https:\/\/example3.com\"><\/textarea>\r\n      <\/div>\r\n\r\n      <!-- Hint -->\r\n      <div class=\"zic2__hint\" style=\"margin-top: 16px;\">\r\n        <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><circle cx=\"12\" cy=\"12\" r=\"10\"\/><path d=\"M9.09 9a3 3 0 0 1 5.83 1c0 2-3 3-3 3\"\/><path d=\"M12 17h.01\"\/><\/svg>\r\n        <span data-i18n=\"hint\">Copiaz\u0103 link-ul direct din email, mesaj sau bara de adrese a browser-ului.<\/span>\r\n      <\/div>\r\n\r\n      <!-- QR Code Upload -->\r\n      <div class=\"zic2__qrUpload\" style=\"margin-top: 16px; padding-top: 16px; border-top: 1px solid var(--zic-border);\">\r\n        <label style=\"display: flex; align-items: center; gap: 8px; font-size: 14px; color: var(--zic-muted); margin-bottom: 8px;\">\r\n          <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\r\n            <rect x=\"3\" y=\"3\" width=\"7\" height=\"7\"\/>\r\n            <rect x=\"14\" y=\"3\" width=\"7\" height=\"7\"\/>\r\n            <rect x=\"3\" y=\"14\" width=\"7\" height=\"7\"\/>\r\n            <rect x=\"14\" y=\"14\" width=\"3\" height=\"3\"\/>\r\n            <rect x=\"18\" y=\"14\" width=\"3\" height=\"3\"\/>\r\n            <rect x=\"14\" y=\"18\" width=\"3\" height=\"3\"\/>\r\n            <rect x=\"18\" y=\"18\" width=\"3\" height=\"3\"\/>\r\n          <\/svg>\r\n          <span data-i18n=\"qrLabel\">Sau \u00eencarc\u0103 un cod QR cu un link<\/span>\r\n        <\/label>\r\n        <input type=\"file\" id=\"zic2-qr-upload\" data-field=\"qrUpload\" accept=\"image\/*\" style=\"display: none;\" \/>\r\n        <button type=\"button\" class=\"zic2__btn zic2__btn--secondary\" style=\"width: 100%;\" onclick=\"document.getElementById('zic2-qr-upload').click();\">\r\n          <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\r\n            <path d=\"M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4\"\/>\r\n            <polyline points=\"17 8 12 3 7 8\"\/>\r\n            <line x1=\"12\" y1=\"3\" x2=\"12\" y2=\"15\"\/>\r\n          <\/svg>\r\n          <span data-i18n=\"qrUploadBtn\">\u00cencarc\u0103 imagine QR<\/span>\r\n        <\/button>\r\n        <div class=\"zic2__qrStatus is-hidden\" data-qr-status style=\"margin-top: 8px; padding: 8px; border-radius: 6px; font-size: 13px;\"><\/div>\r\n      <\/div>\r\n    <\/section>\r\n\r\n    <!-- Actions -->\r\n    <div class=\"zic2__actions\">\r\n      <button type=\"button\" class=\"zic2__btn zic2__btn--primary zic2__btn--large\" data-action=\"analyze\">\r\n        <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\">\r\n          <circle cx=\"11\" cy=\"11\" r=\"8\"\/>\r\n          <path d=\"M21 21l-4.35-4.35\"\/>\r\n        <\/svg>\r\n        <span data-i18n=\"btnAnalyze\">Verific\u0103 link<\/span>\r\n      <\/button>\r\n      <button type=\"button\" class=\"zic2__btn zic2__btn--secondary\" data-action=\"reset\">\r\n        <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><path d=\"M3 12a9 9 0 1 0 9-9 9.75 9.75 0 0 0-6.74 2.74L3 8\"\/><path d=\"M3 3v5h5\"\/><\/svg>\r\n        <span data-i18n=\"btnReset\">\u0218terge<\/span>\r\n      <\/button>\r\n      <button type=\"button\" class=\"zic2__btn zic2__btn--success\" data-action=\"example\">\r\n        <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><path d=\"M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z\"\/><polyline points=\"14 2 14 8 20 8\"\/><\/svg>\r\n        <span data-i18n=\"btnExample\">Exemplu suspect<\/span>\r\n      <\/button>\r\n    <\/div>\r\n\r\n    <!-- Error -->\r\n    <div class=\"zic2__error is-hidden\" role=\"alert\" aria-live=\"polite\" data-errors><\/div>\r\n\r\n    <!-- Loading Overlay -->\r\n    <div class=\"zic2__loading is-hidden\" data-loading>\r\n      <div class=\"zic2__loadingContent\">\r\n        <div class=\"zic2__loadingSpinner\"><\/div>\r\n        <div class=\"zic2__loadingText\" data-i18n=\"loadingText\">Se verific\u0103 URL-ul...<\/div>\r\n\r\n        <!-- Step-by-step progress indicator -->\r\n        <div class=\"zic2__loadingSteps\" data-loading-steps>\r\n          <div class=\"zic2__loadingStep\" data-step=\"local\">\r\n            <span class=\"zic2__stepIcon\" data-step-icon><\/span>\r\n            <span class=\"zic2__stepText\" data-i18n=\"loadingLocal\">Analiz\u0103 local\u0103<\/span>\r\n          <\/div>\r\n          <div class=\"zic2__loadingStep\" data-step=\"google\">\r\n            <span class=\"zic2__stepIcon\" data-step-icon><\/span>\r\n            <span class=\"zic2__stepText\" data-i18n=\"loadingGoogle\">Google Safe Browsing<\/span>\r\n          <\/div>\r\n          <div class=\"zic2__loadingStep\" data-step=\"virustotal\">\r\n            <span class=\"zic2__stepIcon\" data-step-icon><\/span>\r\n            <span class=\"zic2__stepText\" data-i18n=\"loadingVT\">VirusTotal<\/span>\r\n          <\/div>\r\n          <div class=\"zic2__loadingStep\" data-step=\"urlhaus\">\r\n            <span class=\"zic2__stepIcon\" data-step-icon><\/span>\r\n            <span class=\"zic2__stepText\" data-i18n=\"loadingURLhaus\">URLhaus<\/span>\r\n          <\/div>\r\n          <div class=\"zic2__loadingStep\" data-step=\"urlscan\">\r\n            <span class=\"zic2__stepIcon\" data-step-icon><\/span>\r\n            <span class=\"zic2__stepText\" data-i18n=\"loadingUrlscan\">urlscan.io<\/span>\r\n          <\/div>\r\n          <div class=\"zic2__loadingStep\" data-step=\"phishtank\">\r\n            <span class=\"zic2__stepIcon\" data-step-icon><\/span>\r\n            <span class=\"zic2__stepText\" data-i18n=\"loadingPhishtank\">PhishTank<\/span>\r\n          <\/div>\r\n        <\/div>\r\n\r\n        <!-- Progress bar -->\r\n        <div class=\"zic2__loadingProgress\">\r\n          <div class=\"zic2__progressBar\" data-progress-bar><\/div>\r\n        <\/div>\r\n        <div class=\"zic2__loadingPercent\" data-loading-percent>0%<\/div>\r\n      <\/div>\r\n    <\/div>\r\n\r\n    <!-- Result: Score -->\r\n    <section class=\"zic2__card zic2__scoreCard is-hidden\" data-score-card aria-live=\"polite\">\r\n      <div class=\"zic2__analyzedUrl\" data-analyzed-url><\/div>\r\n      <div class=\"zic2__scoreDisplay\" data-score-display>\r\n        <div class=\"zic2__scoreCircle\" data-score-circle>\r\n          <span class=\"zic2__scoreNumber\" data-score-number>0<\/span>\r\n          <span class=\"zic2__scoreLabel\" data-i18n=\"scoreLabel\">din 100<\/span>\r\n        <\/div>\r\n        <div class=\"zic2__scoreText\" data-score-text><\/div>\r\n        <div class=\"zic2__scoreDesc\" data-score-desc><\/div>\r\n      <\/div>\r\n    <\/section>\r\n\r\n    <!-- Result: Analysis Cards -->\r\n    <section class=\"zic2__card is-hidden\" data-checks-card aria-labelledby=\"zic2-sec-checks\">\r\n      <div class=\"zic2__cardHeader\">\r\n        <div class=\"zic2__cardIcon zic2__cardIcon--blue\">\r\n          <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\r\n            <path d=\"M9 11l3 3L22 4\"\/>\r\n            <path d=\"M21 12v7a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h11\"\/>\r\n          <\/svg>\r\n        <\/div>\r\n        <h3 id=\"zic2-sec-checks\" class=\"zic2__cardTitle\" data-i18n=\"resultsTitle\">Rezultate analiz\u0103<\/h3>\r\n      <\/div>\r\n      <div class=\"zic2__checksList\" data-checks-list><\/div>\r\n\r\n      <!-- API Status Indicator -->\r\n      <div class=\"zic2__apiStatus is-hidden\" data-api-status>\r\n        <div class=\"zic2__apiStatusTitle\" data-i18n=\"apiStatusTitle\">Verific\u0103ri externe (5 surse):<\/div>\r\n        <div class=\"zic2__apiStatusList\">\r\n          <span class=\"zic2__apiItem\" data-api=\"google\">\r\n            <span class=\"zic2__apiDot zic2__apiDot--pending\"><\/span>\r\n            Google Safe Browsing\r\n          <\/span>\r\n          <span class=\"zic2__apiItem\" data-api=\"virustotal\">\r\n            <span class=\"zic2__apiDot zic2__apiDot--pending\"><\/span>\r\n            VirusTotal\r\n          <\/span>\r\n          <span class=\"zic2__apiItem\" data-api=\"urlhaus\">\r\n            <span class=\"zic2__apiDot zic2__apiDot--pending\"><\/span>\r\n            URLhaus\r\n          <\/span>\r\n          <span class=\"zic2__apiItem\" data-api=\"urlscan\">\r\n            <span class=\"zic2__apiDot zic2__apiDot--pending\"><\/span>\r\n            urlscan.io\r\n          <\/span>\r\n          <span class=\"zic2__apiItem\" data-api=\"phishtank\">\r\n            <span class=\"zic2__apiDot zic2__apiDot--pending\"><\/span>\r\n            PhishTank\r\n          <\/span>\r\n        <\/div>\r\n      <\/div>\r\n\r\n      <!-- Export Buttons -->\r\n      <div class=\"zic2__exportButtons is-hidden\" data-export-buttons>\r\n        <button type=\"button\" class=\"zic2__btn zic2__btn--secondary zic2__btn--sm\" data-action=\"exportJSON\">\r\n          <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><path d=\"M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z\"\/><polyline points=\"14 2 14 8 20 8\"\/><\/svg>\r\n          JSON\r\n        <\/button>\r\n        <button type=\"button\" class=\"zic2__btn zic2__btn--secondary zic2__btn--sm\" data-action=\"exportCSV\">\r\n          <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><path d=\"M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z\"\/><polyline points=\"14 2 14 8 20 8\"\/><\/svg>\r\n          CSV\r\n        <\/button>\r\n        <button type=\"button\" class=\"zic2__btn zic2__btn--secondary zic2__btn--sm\" data-action=\"copyResults\">\r\n          <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><rect x=\"9\" y=\"9\" width=\"13\" height=\"13\" rx=\"2\" ry=\"2\"\/><path d=\"M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1\"\/><\/svg>\r\n          <span data-i18n=\"copyResults\">Copiaz\u0103<\/span>\r\n        <\/button>\r\n        <span class=\"zic2__exportSep\"><\/span>\r\n        <button type=\"button\" class=\"zic2__btn zic2__btn--secondary zic2__btn--sm\" data-action=\"shareLink\">\r\n          <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><path d=\"M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71\"\/><path d=\"M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71\"\/><\/svg>\r\n          <span data-i18n=\"shareLink\">Copiaz\u0103 link<\/span>\r\n        <\/button>\r\n        <button type=\"button\" class=\"zic2__btn zic2__btn--secondary zic2__btn--sm\" data-action=\"printReport\">\r\n          <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><polyline points=\"6 9 6 2 18 2 18 9\"\/><path d=\"M6 18H4a2 2 0 0 1-2-2v-5a2 2 0 0 1 2-2h16a2 2 0 0 1 2 2v5a2 2 0 0 1-2 2h-2\"\/><rect x=\"6\" y=\"14\" width=\"12\" height=\"8\"\/><\/svg>\r\n          <span data-i18n=\"printReport\">Printeaz\u0103<\/span>\r\n        <\/button>\r\n      <\/div>\r\n    <\/section>\r\n\r\n    <!-- Batch Results Table (hidden by default) -->\r\n    <section class=\"zic2__card is-hidden\" data-batch-results aria-labelledby=\"zic2-sec-batch\">\r\n      <div class=\"zic2__cardHeader\">\r\n        <div class=\"zic2__cardIcon zic2__cardIcon--purple\">\r\n          <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\r\n            <rect x=\"3\" y=\"3\" width=\"18\" height=\"18\" rx=\"2\" ry=\"2\"\/>\r\n            <line x1=\"3\" y1=\"9\" x2=\"21\" y2=\"9\"\/>\r\n            <line x1=\"9\" y1=\"21\" x2=\"9\" y2=\"9\"\/>\r\n          <\/svg>\r\n        <\/div>\r\n        <h3 id=\"zic2-sec-batch\" class=\"zic2__cardTitle\" data-i18n=\"batchResultsTitle\">Rezultate batch<\/h3>\r\n      <\/div>\r\n      <div class=\"zic2__batchTable\" data-batch-table>\r\n        <table class=\"zic2__table\">\r\n          <thead>\r\n            <tr>\r\n              <th>#<\/th>\r\n              <th>URL<\/th>\r\n              <th data-i18n=\"batchScore\">Scor<\/th>\r\n              <th data-i18n=\"batchRisk\">Risc<\/th>\r\n              <th data-i18n=\"batchIssues\">Probleme<\/th>\r\n            <\/tr>\r\n          <\/thead>\r\n          <tbody data-batch-tbody><\/tbody>\r\n        <\/table>\r\n      <\/div>\r\n      <!-- Batch Export Buttons -->\r\n      <div class=\"zic2__exportButtons\">\r\n        <button type=\"button\" class=\"zic2__btn zic2__btn--secondary zic2__btn--sm\" data-action=\"exportBatchJSON\">\r\n          JSON\r\n        <\/button>\r\n        <button type=\"button\" class=\"zic2__btn zic2__btn--secondary zic2__btn--sm\" data-action=\"exportBatchCSV\">\r\n          CSV\r\n        <\/button>\r\n      <\/div>\r\n    <\/section>\r\n\r\n    <!-- History Section -->\r\n    <section class=\"zic2__card is-hidden\" data-history-section aria-labelledby=\"zic2-sec-history\">\r\n      <div class=\"zic2__cardHeader\" style=\"cursor: pointer;\" data-action=\"toggleHistory\">\r\n        <div class=\"zic2__cardIcon zic2__cardIcon--purple\">\r\n          <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\r\n            <circle cx=\"12\" cy=\"12\" r=\"10\"\/>\r\n            <polyline points=\"12 6 12 12 16 14\"\/>\r\n          <\/svg>\r\n        <\/div>\r\n        <h3 id=\"zic2-sec-history\" class=\"zic2__cardTitle\" data-i18n=\"historyTitle\">Istoric verific\u0103ri<\/h3>\r\n        <span style=\"margin-left: auto; font-size: 12px; color: var(--zic-text-muted);\" data-history-count><\/span>\r\n      <\/div>\r\n      <div class=\"zic2__historyList\" data-history-list style=\"max-height: 300px; overflow-y: auto;\"><\/div>\r\n      <div style=\"margin-top: 12px; display: flex; gap: 8px;\">\r\n        <button type=\"button\" class=\"zic2__btn zic2__btn--secondary\" data-action=\"clearHistory\" style=\"font-size: 12px; padding: 6px 10px;\">\r\n          <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><path d=\"M3 6h18\"\/><path d=\"M19 6v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6m3 0V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2\"\/><\/svg>\r\n          <span data-i18n=\"clearHistory\">\u0218terge istoric<\/span>\r\n        <\/button>\r\n      <\/div>\r\n    <\/section>\r\n\r\n    <!-- Show History Button -->\r\n    <div style=\"text-align: center; margin: 16px 0;\">\r\n      <button type=\"button\" class=\"zic2__btn zic2__btn--secondary\" data-action=\"showHistory\" style=\"font-size: 13px;\">\r\n        <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><circle cx=\"12\" cy=\"12\" r=\"10\"\/><polyline points=\"12 6 12 12 16 14\"\/><\/svg>\r\n        <span data-i18n=\"viewHistory\">Vezi istoric<\/span>\r\n        <span data-history-badge style=\"background: var(--zic-primary); color: white; padding: 2px 6px; border-radius: 10px; font-size: 11px; margin-left: 4px;\"><\/span>\r\n      <\/button>\r\n    <\/div>\r\n\r\n    <!-- Disclaimer -->\r\n    <div class=\"zic2__disclaimer\">\r\n      <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><path d=\"M10.29 3.86L1.82 18a2 2 0 0 0 1.71 3h16.94a2 2 0 0 0 1.71-3L13.71 3.86a2 2 0 0 0-3.42 0z\"\/><line x1=\"12\" y1=\"9\" x2=\"12\" y2=\"13\"\/><line x1=\"12\" y1=\"17\" x2=\"12.01\" y2=\"17\"\/><\/svg>\r\n      <div data-i18n-html=\"disclaimer\">\r\n        <strong>Disclaimer:<\/strong> Aceast\u0103 analiz\u0103 este orientativ\u0103 \u0219i combin\u0103 verific\u0103ri locale cu 5 servicii externe (Google Safe Browsing, VirusTotal, URLhaus, urlscan.io, PhishTank). Nu \u00eenlocuie\u0219te o verificare profesional\u0103 de securitate, precum cea oferit\u0103 de <a href=\"https:\/\/cyberopsnetwork.com\/\" target=\"_blank\" rel=\"noopener noreferrer\">CyberOps Network<\/a> \u2013 partenerii ZIC.legal.\r\n      <\/div>\r\n    <\/div>\r\n\r\n    <!-- Interpretation Guide -->\r\n    <section class=\"zic2__guide\" style=\"margin-top: 16px;\">\r\n      <details class=\"zic2__guideDetails\">\r\n        <summary class=\"zic2__guideSummary\">\r\n          <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\r\n            <circle cx=\"12\" cy=\"12\" r=\"10\"\/>\r\n            <path d=\"M9.09 9a3 3 0 0 1 5.83 1c0 2-3 3-3 3\"\/>\r\n            <path d=\"M12 17h.01\"\/>\r\n          <\/svg>\r\n          <span data-i18n=\"guideTitle\">Ce \u00eenseamn\u0103 rezultatele?<\/span>\r\n          <svg class=\"zic2__guideChevron\" width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><polyline points=\"6 9 12 15 18 9\"\/><\/svg>\r\n        <\/summary>\r\n        <div class=\"zic2__guideContent\">\r\n          <div class=\"zic2__guideSection\">\r\n            <h4 data-i18n=\"guideScoreTitle\">&#x1f4ca; Scorul de \u00eencredere (0-100)<\/h4>\r\n            <ul>\r\n              <li><strong style=\"color: var(--zic-safe);\">80-100:<\/strong> <span data-i18n=\"guideScoreSafe\">Risc sc\u0103zut - link probabil sigur<\/span><\/li>\r\n              <li><strong style=\"color: var(--zic-warning);\">50-79:<\/strong> <span data-i18n=\"guideScoreWarning\">Verificare manual\u0103 recomandat\u0103<\/span><\/li>\r\n              <li><strong style=\"color: var(--zic-danger);\">0-49:<\/strong> <span data-i18n=\"guideScoreDanger\">Risc ridicat - NU accesa!<\/span><\/li>\r\n            <\/ul>\r\n          <\/div>\r\n          <div class=\"zic2__guideSection\">\r\n            <h4 data-i18n=\"guideChecksTitle\">&#x1f50d; Tipuri de verific\u0103ri<\/h4>\r\n            <ul>\r\n              <li><strong data-i18n=\"guideTyposquat\">Typosquatting:<\/strong> <span data-i18n=\"guideTyposquatDesc\">Domeniu care imit\u0103 un brand cunoscut (ex: gooogle.com)<\/span><\/li>\r\n              <li><strong data-i18n=\"guideHttps\">HTTPS:<\/strong> <span data-i18n=\"guideHttpsDesc\">Conexiune securizat\u0103 - lipsa poate indica risc<\/span><\/li>\r\n              <li><strong data-i18n=\"guideUnicode\">Unicode suspect:<\/strong> <span data-i18n=\"guideUnicodeDesc\">Caractere care arat\u0103 ca litere normale dar sunt diferite<\/span><\/li>\r\n              <li><strong data-i18n=\"guideTld\">TLD suspect:<\/strong> <span data-i18n=\"guideTldDesc\">Extensii precum .tk, .xyz, .ml sunt frecvent abuzate<\/span><\/li>\r\n              <li><strong data-i18n=\"guideKeywords\">Cuvinte cheie:<\/strong> <span data-i18n=\"guideKeywordsDesc\">Termeni precum \"login\", \"verify\", \"secure\" \u00een URL-uri suspecte<\/span><\/li>\r\n            <\/ul>\r\n          <\/div>\r\n          <div class=\"zic2__guideSection\">\r\n            <h4 data-i18n=\"guideApisTitle\">&#x1f310; Verific\u0103ri externe<\/h4>\r\n            <ul>\r\n              <li><strong>Google Safe Browsing:<\/strong> <span data-i18n=\"guideGsb\">Baz\u0103 de date Google cu site-uri periculoase<\/span><\/li>\r\n              <li><strong>VirusTotal:<\/strong> <span data-i18n=\"guideVt\">Scanare cu 70+ motoare antivirus<\/span><\/li>\r\n              <li><strong>URLhaus:<\/strong> <span data-i18n=\"guideUrlhaus\">Baz\u0103 de date specialiazat\u0103 \u00een malware<\/span><\/li>\r\n              <li><strong>urlscan.io:<\/strong> <span data-i18n=\"guideUrlscan\">Analiz\u0103 comportamental\u0103 a site-ului<\/span><\/li>\r\n              <li><strong>PhishTank:<\/strong> <span data-i18n=\"guidePhishtank\">Comunitate care raporteaz\u0103 phishing<\/span><\/li>\r\n            <\/ul>\r\n          <\/div>\r\n          <div class=\"zic2__guideSection\">\r\n            <h4 data-i18n=\"guideActionsTitle\">&#x2705; Ce s\u0103 faci<\/h4>\r\n            <ul>\r\n              <li data-i18n=\"guideAction1\">Dac\u0103 scorul e sub 40: NU accesa link-ul<\/li>\r\n              <li data-i18n=\"guideAction2\">Verific\u0103 manual adresa \u00eenainte de a introduce date personale<\/li>\r\n              <li data-i18n=\"guideAction3\">Dac\u0103 ai dubii, contacteaz\u0103 direct organiza\u021bia pe canalele oficiale<\/li>\r\n              <li data-i18n=\"guideAction4\">Raporteaz\u0103 link-urile de phishing la poli\u021bie sau CERT-RO<\/li>\r\n            <\/ul>\r\n          <\/div>\r\n        <\/div>\r\n      <\/details>\r\n    <\/section>\r\n\r\n    <!-- Footer -->\r\n    <footer class=\"zic2__footer\">\r\n      <a href=\"https:\/\/zic.legal\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"zic2__footerLink\">\r\n        &copy; 2025 ZIC Legal\r\n      <\/a>\r\n    <\/footer>\r\n  <\/div>\r\n<\/div>\r\n\r\n<style>\r\n\/* ============================================================\r\n   ZIC Calculator v2.1 - Website Spoofing Checker ENHANCED\r\n   Theme: Purple\/Mov | Fully Responsive | Optimized for WPCode\r\n   SECURITY VERSION - All XSS vulnerabilities patched\r\n   ENHANCED: 4 External API Sources with CORS proxy support\r\n   ============================================================ *\/\r\n@import url('https:\/\/fonts.googleapis.com\/css2?family=Inter:wght@400;500;600;700&display=swap');\r\n\r\n\/* === CSS Variables === *\/\r\n#zic-website-spoofing-v2 {\r\n  --zic-primary: #8980f5;\r\n  --zic-primary-dark: #7370e0;\r\n  --zic-primary-light: rgba(137,128,245,.08);\r\n  --zic-primary-border: rgba(137,128,245,.25);\r\n\r\n  --zic-secondary: #308c97;\r\n  --zic-secondary-light: rgba(48,140,151,.08);\r\n\r\n  --zic-success: #10B981;\r\n  --zic-success-light: rgba(16,185,129,.08);\r\n  --zic-success-border: rgba(16,185,129,.25);\r\n\r\n  --zic-danger: #EF4444;\r\n  --zic-danger-light: rgba(239,68,68,.08);\r\n  --zic-danger-border: rgba(239,68,68,.25);\r\n\r\n  --zic-warning: #F59E0B;\r\n  --zic-warning-light: rgba(245,158,11,.08);\r\n  --zic-warning-border: rgba(245,158,11,.25);\r\n\r\n  --zic-blue: #3B82F6;\r\n  --zic-blue-light: rgba(59,130,246,.08);\r\n  --zic-blue-border: rgba(59,130,246,.25);\r\n\r\n  --zic-ink: #1c1c1c;\r\n  --zic-ink-light: #323232;\r\n  --zic-muted: #5B6370;\r\n  --zic-light: #9CA3AF;\r\n\r\n  --zic-bg: #fcfcfc;\r\n  --zic-surface: #FFFFFF;\r\n  --zic-border: #E5E7EB;\r\n\r\n  --zic-shadow-sm: 0 1px 2px rgba(0,0,0,.05);\r\n  --zic-shadow: 0 4px 6px -1px rgba(0,0,0,.1), 0 2px 4px -1px rgba(0,0,0,.06);\r\n  --zic-shadow-lg: 0 10px 15px -3px rgba(0,0,0,.1), 0 4px 6px -2px rgba(0,0,0,.05);\r\n\r\n  --zic-radius: 16px;\r\n  --zic-radius-sm: 12px;\r\n  --zic-radius-xs: 8px;\r\n\r\n  --zic-transition: 150ms ease;\r\n  --zic-duration-fast: 150ms;\r\n  --zic-duration-normal: 250ms;\r\n  --zic-duration-slow: 400ms;\r\n  --zic-ease-out: cubic-bezier(0.16, 1, 0.3, 1);\r\n\r\n  font-family: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;\r\n  color: var(--zic-ink);\r\n  line-height: 1.6;\r\n  -webkit-font-smoothing: antialiased;\r\n}\r\n\r\n\/* Respect reduced motion preference *\/\r\n@media (prefers-reduced-motion: reduce) {\r\n  #zic-website-spoofing-v2 *,\r\n  #zic-website-spoofing-v2 *::before,\r\n  #zic-website-spoofing-v2 *::after {\r\n    animation-duration: 0.01ms !important;\r\n    transition-duration: 0.01ms !important;\r\n  }\r\n}\r\n\r\n\/* === Dark Mode (v4.1) === *\/\r\n@media (prefers-color-scheme: dark) {\r\n  #zic-website-spoofing-v2:not([data-theme=\"light\"]) {\r\n    --zic-ink: #f0f0f5;\r\n    --zic-ink-light: #d8d8e8;\r\n    --zic-muted: #9898b0;\r\n    --zic-light: #6a6a80;\r\n\r\n    --zic-bg: #121218;\r\n    --zic-surface: #1e1e2a;\r\n    --zic-border: #2e2e40;\r\n\r\n    --zic-primary-light: rgba(137,128,245,.15);\r\n    --zic-primary-border: rgba(137,128,245,.35);\r\n\r\n    --zic-success-light: rgba(16,185,129,.15);\r\n    --zic-danger-light: rgba(239,68,68,.15);\r\n    --zic-warning-light: rgba(245,158,11,.15);\r\n    --zic-blue-light: rgba(59,130,246,.15);\r\n\r\n    --zic-shadow-sm: 0 1px 2px rgba(0,0,0,.3);\r\n    --zic-shadow: 0 4px 6px -1px rgba(0,0,0,.4), 0 2px 4px -1px rgba(0,0,0,.3);\r\n    --zic-shadow-lg: 0 10px 15px -3px rgba(0,0,0,.5), 0 4px 6px -2px rgba(0,0,0,.4);\r\n  }\r\n}\r\n\r\n\/* Manual dark mode override *\/\r\n#zic-website-spoofing-v2[data-theme=\"dark\"] {\r\n  --zic-ink: #f0f0f5;\r\n  --zic-ink-light: #d8d8e8;\r\n  --zic-muted: #9898b0;\r\n  --zic-light: #6a6a80;\r\n\r\n  --zic-bg: #121218;\r\n  --zic-surface: #1e1e2a;\r\n  --zic-border: #2e2e40;\r\n\r\n  --zic-primary-light: rgba(137,128,245,.15);\r\n  --zic-primary-border: rgba(137,128,245,.35);\r\n\r\n  --zic-success-light: rgba(16,185,129,.15);\r\n  --zic-danger-light: rgba(239,68,68,.15);\r\n  --zic-warning-light: rgba(245,158,11,.15);\r\n  --zic-blue-light: rgba(59,130,246,.15);\r\n\r\n  --zic-shadow-sm: 0 1px 2px rgba(0,0,0,.3);\r\n  --zic-shadow: 0 4px 6px -1px rgba(0,0,0,.4), 0 2px 4px -1px rgba(0,0,0,.3);\r\n  --zic-shadow-lg: 0 10px 15px -3px rgba(0,0,0,.5), 0 4px 6px -2px rgba(0,0,0,.4);\r\n}\r\n\r\n\/* === Accessibility: Skip Link === *\/\r\n#zic-website-spoofing-v2 .zic2__skipLink {\r\n  position: absolute;\r\n  left: -9999px;\r\n  top: auto;\r\n  z-index: 9999;\r\n  padding: 12px 24px;\r\n  background: var(--zic-primary);\r\n  color: #fff;\r\n  font-weight: 600;\r\n  font-size: 14px;\r\n  border-radius: var(--zic-radius-sm);\r\n  text-decoration: none;\r\n  box-shadow: var(--zic-shadow-lg);\r\n}\r\n\r\n#zic-website-spoofing-v2 .zic2__skipLink:focus {\r\n  left: 16px;\r\n  top: 16px;\r\n  outline: 3px solid var(--zic-ink);\r\n  outline-offset: 2px;\r\n}\r\n\r\n\/* === Accessibility: Screen Reader Only === *\/\r\n#zic-website-spoofing-v2 .zic2__srStatus {\r\n  position: absolute;\r\n  width: 1px;\r\n  height: 1px;\r\n  padding: 0;\r\n  margin: -1px;\r\n  overflow: hidden;\r\n  clip: rect(0, 0, 0, 0);\r\n  white-space: nowrap;\r\n  border: 0;\r\n}\r\n\r\n#zic-website-spoofing-v2 *,\r\n#zic-website-spoofing-v2 *::before,\r\n#zic-website-spoofing-v2 *::after {\r\n  box-sizing: border-box;\r\n}\r\n\r\n\/* === WordPress\/Avada Override Protection === *\/\r\n#zic-website-spoofing-v2 input[type=\"text\"],\r\n#zic-website-spoofing-v2 input[type=\"url\"] {\r\n  -webkit-appearance: none !important;\r\n  -moz-appearance: none !important;\r\n  appearance: none !important;\r\n  background-image: none !important;\r\n  box-shadow: none !important;\r\n}\r\n\r\n#zic-website-spoofing-v2 button:not(.zic2__btn--primary) {\r\n  background-image: none !important;\r\n}\r\n\r\n#zic-website-spoofing-v2 button {\r\n  text-shadow: none !important;\r\n  letter-spacing: normal !important;\r\n}\r\n\r\n#zic-website-spoofing-v2 h2,\r\n#zic-website-spoofing-v2 h3 {\r\n  text-transform: none !important;\r\n  letter-spacing: normal !important;\r\n}\r\n\r\n#zic-website-spoofing-v2 a {\r\n  text-decoration: none;\r\n}\r\n\r\n#zic-website-spoofing-v2 a:hover {\r\n  text-decoration: underline;\r\n}\r\n\r\n\/* === Layout === *\/\r\n#zic-website-spoofing-v2 .zic2__wrap {\r\n  max-width: 720px;\r\n  margin: 0 auto;\r\n  padding: 16px;\r\n}\r\n\r\n\/* === Header === *\/\r\n#zic-website-spoofing-v2 .zic2__hero {\r\n  margin-bottom: 16px;\r\n}\r\n\r\n#zic-website-spoofing-v2 .zic2__brandbar {\r\n  display: flex;\r\n  align-items: center;\r\n  gap: 14px;\r\n  background: linear-gradient(135deg, var(--zic-primary), var(--zic-primary-dark));\r\n  border-radius: var(--zic-radius);\r\n  padding: 20px;\r\n  color: #fff;\r\n  box-shadow: var(--zic-shadow-lg);\r\n  position: relative;\r\n}\r\n\r\n#zic-website-spoofing-v2 .zic2__version {\r\n  position: absolute;\r\n  top: 12px;\r\n  right: 16px;\r\n  background: rgba(255,255,255,.2);\r\n  padding: 4px 10px;\r\n  border-radius: 20px;\r\n  font-size: 11px;\r\n  font-weight: 700;\r\n  letter-spacing: 0.5px;\r\n}\r\n\r\n#zic-website-spoofing-v2 .zic2__langBtn {\r\n  position: absolute;\r\n  top: 12px;\r\n  right: 70px;\r\n  background: rgba(255,255,255,.25);\r\n  border: 1px solid rgba(255,255,255,.3);\r\n  padding: 4px 10px;\r\n  border-radius: 20px;\r\n  font-size: 11px;\r\n  font-weight: 700;\r\n  letter-spacing: 0.5px;\r\n  color: #fff;\r\n  cursor: pointer;\r\n  transition: all var(--zic-transition);\r\n}\r\n\r\n#zic-website-spoofing-v2 .zic2__langBtn:hover {\r\n  background: rgba(255,255,255,.35);\r\n  transform: scale(1.05);\r\n}\r\n\r\n#zic-website-spoofing-v2 .zic2__langBtn:focus-visible {\r\n  outline: 2px solid #fff;\r\n  outline-offset: 2px;\r\n}\r\n\r\n\/* === Theme Toggle Button (v4.1) === *\/\r\n#zic-website-spoofing-v2 .zic2__themeBtn {\r\n  position: absolute;\r\n  top: 12px;\r\n  right: 115px;\r\n  background: rgba(255,255,255,.2);\r\n  border: none;\r\n  border-radius: 8px;\r\n  padding: 8px;\r\n  min-width: 44px;\r\n  min-height: 44px;\r\n  display: flex;\r\n  align-items: center;\r\n  justify-content: center;\r\n  color: #fff;\r\n  cursor: pointer;\r\n  transition: all var(--zic-transition);\r\n}\r\n\r\n#zic-website-spoofing-v2 .zic2__themeBtn:hover {\r\n  background: rgba(255,255,255,.35);\r\n  transform: scale(1.05);\r\n}\r\n\r\n#zic-website-spoofing-v2 .zic2__themeBtn:focus-visible {\r\n  outline: 2px solid #fff;\r\n  outline-offset: 2px;\r\n}\r\n\r\n#zic-website-spoofing-v2 .zic2__themeIcon {\r\n  transition: opacity var(--zic-duration-fast) ease, transform var(--zic-duration-fast) ease;\r\n}\r\n\r\n#zic-website-spoofing-v2 .zic2__themeIcon--moon {\r\n  position: absolute;\r\n  opacity: 0;\r\n  transform: rotate(-90deg);\r\n}\r\n\r\n\/* Dark mode: show moon, hide sun *\/\r\n#zic-website-spoofing-v2[data-theme=\"dark\"] .zic2__themeIcon--sun {\r\n  opacity: 0;\r\n  transform: rotate(90deg);\r\n}\r\n\r\n#zic-website-spoofing-v2[data-theme=\"dark\"] .zic2__themeIcon--moon {\r\n  opacity: 1;\r\n  transform: rotate(0);\r\n}\r\n\r\n\/* Auto dark mode via media query *\/\r\n@media (prefers-color-scheme: dark) {\r\n  #zic-website-spoofing-v2:not([data-theme=\"light\"]) .zic2__themeIcon--sun {\r\n    opacity: 0;\r\n    transform: rotate(90deg);\r\n  }\r\n  #zic-website-spoofing-v2:not([data-theme=\"light\"]) .zic2__themeIcon--moon {\r\n    opacity: 1;\r\n    transform: rotate(0);\r\n  }\r\n}\r\n\r\n\/* === Touch Targets & Checkbox (v4.1 - WCAG 2.5.5) === *\/\r\n#zic-website-spoofing-v2 .zic2__batchToggle {\r\n  margin-bottom: 12px;\r\n}\r\n\r\n#zic-website-spoofing-v2 .zic2__checkboxLabel {\r\n  display: inline-flex;\r\n  align-items: center;\r\n  gap: 10px;\r\n  padding: 10px 12px;\r\n  margin: -10px -12px;\r\n  cursor: pointer;\r\n  font-size: 14px;\r\n  border-radius: var(--zic-radius-xs);\r\n  transition: background-color var(--zic-duration-fast) ease;\r\n  min-height: 44px;\r\n}\r\n\r\n#zic-website-spoofing-v2 .zic2__checkboxLabel:hover {\r\n  background: var(--zic-primary-light);\r\n}\r\n\r\n#zic-website-spoofing-v2 .zic2__checkbox {\r\n  appearance: none;\r\n  -webkit-appearance: none;\r\n  width: 22px;\r\n  height: 22px;\r\n  border: 2px solid var(--zic-border);\r\n  border-radius: 6px;\r\n  background: var(--zic-surface);\r\n  cursor: pointer;\r\n  transition: all var(--zic-duration-fast) ease;\r\n  flex-shrink: 0;\r\n}\r\n\r\n#zic-website-spoofing-v2 .zic2__checkbox:checked {\r\n  background: var(--zic-primary);\r\n  border-color: var(--zic-primary);\r\n  background-image: url(\"data:image\/svg+xml,%3Csvg viewBox='0 0 16 16' fill='white' xmlns='http:\/\/www.w3.org\/2000\/svg'%3E%3Cpath d='M13.78 4.22a.75.75 0 010 1.06l-7.25 7.25a.75.75 0 01-1.06 0L2.22 9.28a.75.75 0 111.06-1.06L6 10.94l6.72-6.72a.75.75 0 011.06 0z'\/%3E%3C\/svg%3E\");\r\n  background-size: 14px;\r\n  background-repeat: no-repeat;\r\n  background-position: center;\r\n}\r\n\r\n#zic-website-spoofing-v2 .zic2__checkbox:focus-visible {\r\n  outline: 3px solid var(--zic-primary);\r\n  outline-offset: 2px;\r\n  box-shadow: 0 0 0 6px rgba(137,128,245,.15);\r\n}\r\n\r\n#zic-website-spoofing-v2 .zic2__checkboxText {\r\n  color: var(--zic-ink-light);\r\n}\r\n\r\n#zic-website-spoofing-v2 .zic2__mark {\r\n  width: 48px;\r\n  height: 48px;\r\n  background: rgba(255,255,255,.2);\r\n  border-radius: 12px;\r\n  display: flex;\r\n  align-items: center;\r\n  justify-content: center;\r\n  flex-shrink: 0;\r\n}\r\n\r\n#zic-website-spoofing-v2 .zic2__headerText {\r\n  flex: 1;\r\n  min-width: 0;\r\n}\r\n\r\n#zic-website-spoofing-v2 .zic2__title {\r\n  margin: 0;\r\n  font-size: 20px;\r\n  font-weight: 700;\r\n  line-height: 1.2;\r\n}\r\n\r\n#zic-website-spoofing-v2 .zic2__subtitle {\r\n  margin: 4px 0 0;\r\n  font-size: 14px;\r\n  opacity: 0.9;\r\n}\r\n\r\n\/* === Formula Box === *\/\r\n#zic-website-spoofing-v2 .zic2__formula {\r\n  display: flex;\r\n  align-items: flex-start;\r\n  gap: 10px;\r\n  background: var(--zic-primary-light);\r\n  border: 1px solid var(--zic-primary-border);\r\n  border-radius: var(--zic-radius-sm);\r\n  padding: 12px 14px;\r\n  margin-bottom: 16px;\r\n  font-size: 14px;\r\n  color: var(--zic-ink-light);\r\n}\r\n\r\n#zic-website-spoofing-v2 .zic2__formulaIcon {\r\n  color: var(--zic-primary-dark);\r\n  flex-shrink: 0;\r\n  margin-top: 1px;\r\n}\r\n\r\n#zic-website-spoofing-v2 .zic2__formulaText strong {\r\n  color: var(--zic-ink);\r\n}\r\n\r\n\/* === Cards === *\/\r\n#zic-website-spoofing-v2 .zic2__card {\r\n  background: var(--zic-surface);\r\n  border: 1px solid var(--zic-border);\r\n  border-radius: var(--zic-radius);\r\n  padding: 20px;\r\n  margin-bottom: 16px;\r\n  box-shadow: var(--zic-shadow-sm);\r\n}\r\n\r\n#zic-website-spoofing-v2 .zic2__cardHeader {\r\n  display: flex;\r\n  align-items: center;\r\n  gap: 12px;\r\n  margin-bottom: 16px;\r\n}\r\n\r\n#zic-website-spoofing-v2 .zic2__cardIcon {\r\n  width: 36px;\r\n  height: 36px;\r\n  border-radius: 10px;\r\n  display: flex;\r\n  align-items: center;\r\n  justify-content: center;\r\n  flex-shrink: 0;\r\n}\r\n\r\n#zic-website-spoofing-v2 .zic2__cardIcon--purple {\r\n  background: var(--zic-primary-light);\r\n  color: var(--zic-primary-dark);\r\n}\r\n\r\n#zic-website-spoofing-v2 .zic2__cardIcon--green {\r\n  background: var(--zic-success-light);\r\n  color: var(--zic-success);\r\n}\r\n\r\n#zic-website-spoofing-v2 .zic2__cardIcon--warning {\r\n  background: var(--zic-warning-light);\r\n  color: var(--zic-warning);\r\n}\r\n\r\n#zic-website-spoofing-v2 .zic2__cardIcon--blue {\r\n  background: var(--zic-blue-light);\r\n  color: var(--zic-blue);\r\n}\r\n\r\n#zic-website-spoofing-v2 .zic2__cardIcon--danger {\r\n  background: var(--zic-danger-light);\r\n  color: var(--zic-danger);\r\n}\r\n\r\n#zic-website-spoofing-v2 .zic2__cardTitle {\r\n  margin: 0;\r\n  font-size: 17px;\r\n  font-weight: 700;\r\n  color: var(--zic-ink);\r\n}\r\n\r\n\/* === Form Elements === *\/\r\n#zic-website-spoofing-v2 .zic2__field {\r\n  display: flex;\r\n  flex-direction: column;\r\n  gap: 4px;\r\n}\r\n\r\n#zic-website-spoofing-v2 .zic2__label {\r\n  font-size: 12px;\r\n  font-weight: 600;\r\n  color: var(--zic-muted);\r\n}\r\n\r\n#zic-website-spoofing-v2 .zic2__input {\r\n  width: 100%;\r\n  padding: 14px 16px;\r\n  font-size: 15px;\r\n  color: var(--zic-ink);\r\n  background: var(--zic-surface);\r\n  border: 2px solid var(--zic-border);\r\n  border-radius: var(--zic-radius-xs);\r\n  outline: none;\r\n  transition: border-color var(--zic-transition), box-shadow var(--zic-transition);\r\n}\r\n\r\n#zic-website-spoofing-v2 .zic2__input:focus {\r\n  border-color: var(--zic-primary);\r\n  box-shadow: 0 0 0 3px var(--zic-primary-light);\r\n}\r\n\r\n#zic-website-spoofing-v2 .zic2__input:focus-visible {\r\n  outline: 3px solid var(--zic-primary);\r\n  outline-offset: 2px;\r\n  box-shadow: 0 0 0 6px rgba(137,128,245,.15);\r\n}\r\n\r\n#zic-website-spoofing-v2 .zic2__input::placeholder {\r\n  color: var(--zic-light);\r\n}\r\n\r\n\/* === Buttons === *\/\r\n#zic-website-spoofing-v2 .zic2__actions {\r\n  display: flex;\r\n  flex-wrap: wrap;\r\n  gap: 10px;\r\n  margin-bottom: 16px;\r\n}\r\n\r\n#zic-website-spoofing-v2 .zic2__actions .zic2__btn--primary {\r\n  flex: 1;\r\n  min-width: 200px;\r\n}\r\n\r\n#zic-website-spoofing-v2 .zic2__btn {\r\n  display: inline-flex;\r\n  align-items: center;\r\n  justify-content: center;\r\n  gap: 6px;\r\n  padding: 10px 16px;\r\n  font-size: 14px;\r\n  font-weight: 600;\r\n  border-radius: var(--zic-radius-sm);\r\n  border: 1px solid transparent;\r\n  cursor: pointer;\r\n  transition: all var(--zic-transition);\r\n  white-space: nowrap;\r\n  text-decoration: none;\r\n}\r\n\r\n#zic-website-spoofing-v2 .zic2__btn:focus {\r\n  box-shadow: 0 0 0 3px var(--zic-primary-border);\r\n}\r\n\r\n#zic-website-spoofing-v2 .zic2__btn:focus-visible {\r\n  outline: 3px solid var(--zic-primary);\r\n  outline-offset: 2px;\r\n  box-shadow: 0 0 0 6px rgba(137,128,245,.2);\r\n}\r\n\r\n#zic-website-spoofing-v2 .zic2__btn:active {\r\n  transform: translateY(1px);\r\n}\r\n\r\n#zic-website-spoofing-v2 .zic2__btn--primary {\r\n  background: linear-gradient(135deg, var(--zic-primary), var(--zic-primary-dark));\r\n  color: #fff;\r\n  box-shadow: 0 4px 14px rgba(138,136,255,.35);\r\n}\r\n\r\n#zic-website-spoofing-v2 .zic2__btn--primary:hover {\r\n  box-shadow: 0 6px 20px rgba(138,136,255,.45);\r\n  transform: translateY(-1px);\r\n}\r\n\r\n#zic-website-spoofing-v2 .zic2__btn--large {\r\n  padding: 14px 24px;\r\n  font-size: 15px;\r\n}\r\n\r\n#zic-website-spoofing-v2 .zic2__btn--secondary {\r\n  background: var(--zic-surface);\r\n  border-color: var(--zic-border);\r\n  color: var(--zic-ink-light);\r\n}\r\n\r\n#zic-website-spoofing-v2 .zic2__btn--secondary:hover {\r\n  background: var(--zic-bg);\r\n  border-color: var(--zic-primary-border);\r\n  color: var(--zic-primary-dark);\r\n}\r\n\r\n#zic-website-spoofing-v2 .zic2__btn--sm {\r\n  font-size: 13px;\r\n  padding: 10px 14px;\r\n  min-height: 44px;\r\n  gap: 6px;\r\n}\r\n\r\n#zic-website-spoofing-v2 .zic2__exportButtons {\r\n  margin-top: 16px;\r\n  padding-top: 16px;\r\n  border-top: 1px solid var(--zic-primary-border);\r\n  display: flex;\r\n  gap: 10px;\r\n  flex-wrap: wrap;\r\n  align-items: center;\r\n}\r\n\r\n#zic-website-spoofing-v2 .zic2__exportSep {\r\n  width: 1px;\r\n  height: 24px;\r\n  background: var(--zic-border);\r\n  margin: 0 4px;\r\n}\r\n\r\n#zic-website-spoofing-v2 .zic2__btn.is-success {\r\n  background: var(--zic-success-light);\r\n  border-color: var(--zic-success);\r\n  color: var(--zic-success);\r\n}\r\n\r\n#zic-website-spoofing-v2 .zic2__sharedNote {\r\n  background: var(--zic-warning-light);\r\n  border: 1px solid var(--zic-warning);\r\n  border-radius: var(--zic-radius);\r\n  padding: 12px 16px;\r\n  margin-bottom: 16px;\r\n  font-size: 13px;\r\n  color: var(--zic-ink);\r\n}\r\n\r\n\/* === Batch Table (v4.1) === *\/\r\n#zic-website-spoofing-v2 .zic2__batchTable {\r\n  overflow-x: auto;\r\n  margin-top: 12px;\r\n}\r\n\r\n#zic-website-spoofing-v2 .zic2__table {\r\n  width: 100%;\r\n  border-collapse: collapse;\r\n  font-size: 13px;\r\n}\r\n\r\n#zic-website-spoofing-v2 .zic2__table thead tr {\r\n  background: var(--zic-primary-light);\r\n}\r\n\r\n#zic-website-spoofing-v2 .zic2__table th {\r\n  padding: 10px;\r\n  text-align: left;\r\n  border-bottom: 2px solid var(--zic-primary-border);\r\n  font-weight: 600;\r\n  color: var(--zic-ink);\r\n}\r\n\r\n#zic-website-spoofing-v2 .zic2__table th:nth-child(3),\r\n#zic-website-spoofing-v2 .zic2__table th:nth-child(4) {\r\n  text-align: center;\r\n}\r\n\r\n#zic-website-spoofing-v2 .zic2__table td {\r\n  padding: 10px;\r\n  border-bottom: 1px solid var(--zic-border);\r\n  color: var(--zic-ink-light);\r\n}\r\n\r\n#zic-website-spoofing-v2 .zic2__table td:nth-child(2) {\r\n  max-width: 300px;\r\n  overflow: hidden;\r\n  text-overflow: ellipsis;\r\n  white-space: nowrap;\r\n  font-family: monospace;\r\n  font-size: 12px;\r\n}\r\n\r\n#zic-website-spoofing-v2 .zic2__table td:nth-child(3),\r\n#zic-website-spoofing-v2 .zic2__table td:nth-child(4) {\r\n  text-align: center;\r\n}\r\n\r\n#zic-website-spoofing-v2 .zic2__btn--success {\r\n  background: var(--zic-warning-light);\r\n  border-color: var(--zic-warning-border);\r\n  color: #92400E;\r\n}\r\n\r\n#zic-website-spoofing-v2 .zic2__btn--success:hover {\r\n  background: rgba(245,158,11,.15);\r\n}\r\n\r\n\/* === Hint === *\/\r\n#zic-website-spoofing-v2 .zic2__hint {\r\n  display: flex;\r\n  align-items: flex-start;\r\n  gap: 8px;\r\n  padding: 10px 12px;\r\n  background: var(--zic-bg);\r\n  border-radius: var(--zic-radius-xs);\r\n  font-size: 12px;\r\n  color: var(--zic-muted);\r\n}\r\n\r\n#zic-website-spoofing-v2 .zic2__hint svg {\r\n  flex-shrink: 0;\r\n  margin-top: 1px;\r\n}\r\n\r\n\/* === Error === *\/\r\n#zic-website-spoofing-v2 .zic2__error {\r\n  margin-bottom: 16px;\r\n  padding: 12px;\r\n  background: var(--zic-danger-light);\r\n  border: 1px solid var(--zic-danger-border);\r\n  border-radius: var(--zic-radius-xs);\r\n  color: var(--zic-danger);\r\n  font-size: 13px;\r\n  font-weight: 500;\r\n}\r\n\r\n\/* === Score Card === *\/\r\n#zic-website-spoofing-v2 .zic2__scoreCard {\r\n  padding: 0;\r\n  overflow: hidden;\r\n}\r\n\r\n#zic-website-spoofing-v2 .zic2__analyzedUrl {\r\n  background: var(--zic-bg);\r\n  padding: 12px 20px;\r\n  font-family: 'Consolas', 'Monaco', 'Courier New', monospace;\r\n  font-size: 13px;\r\n  color: var(--zic-ink-light);\r\n  word-break: break-all;\r\n  border-bottom: 1px solid var(--zic-border);\r\n}\r\n\r\n#zic-website-spoofing-v2 .zic2__scoreDisplay {\r\n  text-align: center;\r\n  padding: 30px 20px;\r\n}\r\n\r\n#zic-website-spoofing-v2 .zic2__scoreDisplay.score-safe {\r\n  background: linear-gradient(135deg, rgba(16,185,129,.05), rgba(16,185,129,.12));\r\n}\r\n\r\n#zic-website-spoofing-v2 .zic2__scoreDisplay.score-warning {\r\n  background: linear-gradient(135deg, rgba(245,158,11,.05), rgba(245,158,11,.12));\r\n}\r\n\r\n#zic-website-spoofing-v2 .zic2__scoreDisplay.score-danger {\r\n  background: linear-gradient(135deg, rgba(239,68,68,.05), rgba(239,68,68,.12));\r\n}\r\n\r\n#zic-website-spoofing-v2 .zic2__scoreCircle {\r\n  width: 100px;\r\n  height: 100px;\r\n  border-radius: 50%;\r\n  display: inline-flex;\r\n  flex-direction: column;\r\n  align-items: center;\r\n  justify-content: center;\r\n  color: white;\r\n  font-weight: bold;\r\n  margin-bottom: 16px;\r\n  box-shadow: 0 4px 15px rgba(0,0,0,.2);\r\n}\r\n\r\n#zic-website-spoofing-v2 .zic2__scoreCircle.score-safe {\r\n  background: linear-gradient(135deg, #11998e, #38ef7d);\r\n}\r\n\r\n#zic-website-spoofing-v2 .zic2__scoreCircle.score-warning {\r\n  background: linear-gradient(135deg, #F59E0B, #FBBF24);\r\n}\r\n\r\n#zic-website-spoofing-v2 .zic2__scoreCircle.score-danger {\r\n  background: linear-gradient(135deg, #cb2d3e, #ef473a);\r\n}\r\n\r\n#zic-website-spoofing-v2 .zic2__scoreNumber {\r\n  font-size: 32px;\r\n  line-height: 1;\r\n}\r\n\r\n#zic-website-spoofing-v2 .zic2__scoreLabel {\r\n  font-size: 11px;\r\n  opacity: 0.9;\r\n}\r\n\r\n#zic-website-spoofing-v2 .zic2__scoreText {\r\n  font-size: 20px;\r\n  font-weight: 700;\r\n  margin-bottom: 5px;\r\n  color: var(--zic-ink);\r\n}\r\n\r\n#zic-website-spoofing-v2 .zic2__scoreDesc {\r\n  font-size: 14px;\r\n  color: var(--zic-muted);\r\n}\r\n\r\n\/* === Checks List === *\/\r\n#zic-website-spoofing-v2 .zic2__checksList {\r\n  display: flex;\r\n  flex-direction: column;\r\n  gap: 8px;\r\n}\r\n\r\n#zic-website-spoofing-v2 .zic2__checkItem {\r\n  display: flex;\r\n  align-items: flex-start;\r\n  gap: 12px;\r\n  padding: 14px;\r\n  background: var(--zic-bg);\r\n  border-radius: var(--zic-radius-xs);\r\n  border-left: 4px solid var(--zic-border);\r\n}\r\n\r\n#zic-website-spoofing-v2 .zic2__checkItem.status-pass {\r\n  border-left-color: var(--zic-success);\r\n  background: var(--zic-success-light);\r\n}\r\n\r\n#zic-website-spoofing-v2 .zic2__checkItem.status-fail {\r\n  border-left-color: var(--zic-danger);\r\n  background: var(--zic-danger-light);\r\n}\r\n\r\n#zic-website-spoofing-v2 .zic2__checkItem.status-warn {\r\n  border-left-color: var(--zic-warning);\r\n  background: var(--zic-warning-light);\r\n}\r\n\r\n#zic-website-spoofing-v2 .zic2__checkIcon {\r\n  width: 24px;\r\n  height: 24px;\r\n  border-radius: 50%;\r\n  display: flex;\r\n  align-items: center;\r\n  justify-content: center;\r\n  flex-shrink: 0;\r\n  font-size: 12px;\r\n  font-weight: 700;\r\n}\r\n\r\n#zic-website-spoofing-v2 .zic2__checkItem.status-pass .zic2__checkIcon {\r\n  background: var(--zic-success);\r\n  color: white;\r\n}\r\n\r\n#zic-website-spoofing-v2 .zic2__checkItem.status-fail .zic2__checkIcon {\r\n  background: var(--zic-danger);\r\n  color: white;\r\n}\r\n\r\n#zic-website-spoofing-v2 .zic2__checkItem.status-warn .zic2__checkIcon {\r\n  background: var(--zic-warning);\r\n  color: white;\r\n}\r\n\r\n#zic-website-spoofing-v2 .zic2__checkContent {\r\n  flex: 1;\r\n  min-width: 0;\r\n}\r\n\r\n#zic-website-spoofing-v2 .zic2__checkTitle {\r\n  font-weight: 600;\r\n  font-size: 14px;\r\n  color: var(--zic-ink);\r\n  margin-bottom: 2px;\r\n}\r\n\r\n#zic-website-spoofing-v2 .zic2__checkDesc {\r\n  font-size: 13px;\r\n  color: var(--zic-ink-light);\r\n  line-height: 1.4;\r\n}\r\n\r\n\/* === Disclaimer === *\/\r\n#zic-website-spoofing-v2 .zic2__disclaimer {\r\n  display: flex;\r\n  align-items: flex-start;\r\n  gap: 10px;\r\n  padding: 14px;\r\n  background: var(--zic-bg);\r\n  border: 1px solid var(--zic-border);\r\n  border-radius: var(--zic-radius-sm);\r\n  font-size: 12px;\r\n  color: var(--zic-muted);\r\n  line-height: 1.5;\r\n  margin-bottom: 16px;\r\n}\r\n\r\n#zic-website-spoofing-v2 .zic2__disclaimer svg {\r\n  flex-shrink: 0;\r\n  color: var(--zic-warning);\r\n  margin-top: 1px;\r\n}\r\n\r\n#zic-website-spoofing-v2 .zic2__disclaimer strong {\r\n  color: var(--zic-ink-light);\r\n}\r\n\r\n\/* === Interpretation Guide === *\/\r\n#zic-website-spoofing-v2 .zic2__guideDetails {\r\n  background: var(--zic-surface);\r\n  border: 1px solid var(--zic-border);\r\n  border-radius: var(--zic-radius-sm);\r\n  overflow: hidden;\r\n}\r\n\r\n#zic-website-spoofing-v2 .zic2__guideSummary {\r\n  display: flex;\r\n  align-items: center;\r\n  gap: 8px;\r\n  padding: 12px 16px;\r\n  cursor: pointer;\r\n  font-size: 14px;\r\n  font-weight: 500;\r\n  color: var(--zic-ink-light);\r\n  background: var(--zic-bg);\r\n  list-style: none;\r\n}\r\n\r\n#zic-website-spoofing-v2 .zic2__guideSummary::-webkit-details-marker {\r\n  display: none;\r\n}\r\n\r\n#zic-website-spoofing-v2 .zic2__guideSummary svg:first-child {\r\n  color: var(--zic-primary);\r\n  flex-shrink: 0;\r\n}\r\n\r\n#zic-website-spoofing-v2 .zic2__guideChevron {\r\n  margin-left: auto;\r\n  transition: transform var(--zic-duration-fast) ease;\r\n  color: var(--zic-muted);\r\n}\r\n\r\n#zic-website-spoofing-v2 .zic2__guideDetails[open] .zic2__guideChevron {\r\n  transform: rotate(180deg);\r\n}\r\n\r\n@media (prefers-reduced-motion: reduce) {\r\n  #zic-website-spoofing-v2 .zic2__guideChevron {\r\n    transition: none;\r\n  }\r\n}\r\n\r\n#zic-website-spoofing-v2 .zic2__guideContent {\r\n  padding: 16px;\r\n  border-top: 1px solid var(--zic-border);\r\n}\r\n\r\n#zic-website-spoofing-v2 .zic2__guideSection {\r\n  margin-bottom: 16px;\r\n}\r\n\r\n#zic-website-spoofing-v2 .zic2__guideSection:last-child {\r\n  margin-bottom: 0;\r\n}\r\n\r\n#zic-website-spoofing-v2 .zic2__guideSection h4 {\r\n  font-size: 14px;\r\n  font-weight: 600;\r\n  color: var(--zic-ink);\r\n  margin: 0 0 8px 0;\r\n}\r\n\r\n#zic-website-spoofing-v2 .zic2__guideSection ul {\r\n  margin: 0;\r\n  padding-left: 20px;\r\n  font-size: 13px;\r\n  line-height: 1.6;\r\n  color: var(--zic-ink-light);\r\n}\r\n\r\n#zic-website-spoofing-v2 .zic2__guideSection li {\r\n  margin-bottom: 4px;\r\n}\r\n\r\n#zic-website-spoofing-v2 .zic2__guideSection strong {\r\n  color: var(--zic-ink);\r\n}\r\n\r\n\/* === Footer === *\/\r\n#zic-website-spoofing-v2 .zic2__footer {\r\n  text-align: center;\r\n  padding: 8px 0;\r\n}\r\n\r\n#zic-website-spoofing-v2 .zic2__footerLink {\r\n  color: var(--zic-primary-dark);\r\n  text-decoration: none;\r\n  font-size: 13px;\r\n  font-weight: 600;\r\n  transition: color var(--zic-transition);\r\n}\r\n\r\n#zic-website-spoofing-v2 .zic2__footerLink:hover {\r\n  color: var(--zic-primary);\r\n  text-decoration: underline;\r\n}\r\n\r\n\/* === Utility === *\/\r\n#zic-website-spoofing-v2 .is-hidden {\r\n  display: none !important;\r\n}\r\n\r\n\/* === Loading Spinner === *\/\r\n@keyframes zic-spin {\r\n  0% { transform: rotate(0deg); }\r\n  100% { transform: rotate(360deg); }\r\n}\r\n\r\n#zic-website-spoofing-v2 .zic2__spinner {\r\n  animation: zic-spin 1s linear infinite;\r\n}\r\n\r\n#zic-website-spoofing-v2 .zic2__btn:disabled {\r\n  opacity: 0.7;\r\n  cursor: not-allowed;\r\n  transform: none !important;\r\n}\r\n\r\n\/* === API Status Indicator === *\/\r\n#zic-website-spoofing-v2 .zic2__apiStatus {\r\n  margin-top: 16px;\r\n  padding-top: 16px;\r\n  border-top: 1px solid var(--zic-border);\r\n}\r\n\r\n#zic-website-spoofing-v2 .zic2__apiStatusTitle {\r\n  font-size: 12px;\r\n  font-weight: 600;\r\n  color: var(--zic-muted);\r\n  margin-bottom: 8px;\r\n  text-transform: uppercase;\r\n  letter-spacing: 0.5px;\r\n}\r\n\r\n#zic-website-spoofing-v2 .zic2__apiStatusList {\r\n  display: flex;\r\n  flex-wrap: wrap;\r\n  gap: 12px;\r\n}\r\n\r\n#zic-website-spoofing-v2 .zic2__apiItem {\r\n  display: inline-flex;\r\n  align-items: center;\r\n  gap: 6px;\r\n  font-size: 13px;\r\n  color: var(--zic-ink-light);\r\n}\r\n\r\n#zic-website-spoofing-v2 .zic2__apiDot {\r\n  width: 8px;\r\n  height: 8px;\r\n  border-radius: 50%;\r\n  flex-shrink: 0;\r\n}\r\n\r\n#zic-website-spoofing-v2 .zic2__apiDot--pending {\r\n  background-color: var(--zic-light);\r\n  animation: zic-pulse 1.5s ease-in-out infinite;\r\n}\r\n\r\n#zic-website-spoofing-v2 .zic2__apiDot--success {\r\n  background-color: var(--zic-success);\r\n}\r\n\r\n#zic-website-spoofing-v2 .zic2__apiDot--error {\r\n  background-color: var(--zic-danger);\r\n}\r\n\r\n#zic-website-spoofing-v2 .zic2__apiDot--warning {\r\n  background-color: var(--zic-warning);\r\n}\r\n\r\n@keyframes zic-pulse {\r\n  0%, 100% { opacity: 1; }\r\n  50% { opacity: 0.4; }\r\n}\r\n\r\n\/* === RESPONSIVE === *\/\r\n@media (min-width: 640px) {\r\n  #zic-website-spoofing-v2 .zic2__wrap {\r\n    padding: 24px;\r\n  }\r\n  #zic-website-spoofing-v2 .zic2__title {\r\n    font-size: 24px;\r\n  }\r\n}\r\n\r\n@media (min-width: 768px) {\r\n  #zic-website-spoofing-v2 .zic2__card {\r\n    padding: 24px;\r\n  }\r\n  #zic-website-spoofing-v2 .zic2__brandbar {\r\n    padding: 24px;\r\n  }\r\n  #zic-website-spoofing-v2 .zic2__mark {\r\n    width: 56px;\r\n    height: 56px;\r\n  }\r\n  #zic-website-spoofing-v2 .zic2__title {\r\n    font-size: 26px;\r\n  }\r\n}\r\n\r\n\/* Large screens (1024px+) *\/\r\n@media (min-width: 1024px) {\r\n  #zic-website-spoofing-v2 .zic2__wrap {\r\n    max-width: 900px;\r\n  }\r\n}\r\n\r\n@media (max-width: 500px) {\r\n  #zic-website-spoofing-v2 .zic2__actions {\r\n    flex-direction: column;\r\n  }\r\n  #zic-website-spoofing-v2 .zic2__actions .zic2__btn {\r\n    width: 100%;\r\n  }\r\n  #zic-website-spoofing-v2 .zic2__apiStatusList {\r\n    flex-direction: column;\r\n    gap: 8px;\r\n  }\r\n  #zic-website-spoofing-v2 .zic2__scoreCircle {\r\n    width: 80px;\r\n    height: 80px;\r\n  }\r\n  #zic-website-spoofing-v2 .zic2__scoreNumber {\r\n    font-size: 26px;\r\n  }\r\n  #zic-website-spoofing-v2 .zic2__scoreLabel {\r\n    font-size: 10px;\r\n  }\r\n  #zic-website-spoofing-v2 .zic2__title {\r\n    font-size: 18px;\r\n  }\r\n  #zic-website-spoofing-v2 .zic2__subtitle {\r\n    font-size: 13px;\r\n  }\r\n}\r\n\r\n\/* Large phones (501-639px) - fills responsive gap *\/\r\n@media (min-width: 501px) and (max-width: 639px) {\r\n  #zic-website-spoofing-v2 .zic2__wrap {\r\n    padding: 20px;\r\n  }\r\n  #zic-website-spoofing-v2 .zic2__card {\r\n    padding: 20px;\r\n  }\r\n  #zic-website-spoofing-v2 .zic2__title {\r\n    font-size: 20px;\r\n  }\r\n  #zic-website-spoofing-v2 .zic2__scoreCircle {\r\n    width: 90px;\r\n    height: 90px;\r\n  }\r\n  #zic-website-spoofing-v2 .zic2__scoreNumber {\r\n    font-size: 28px;\r\n  }\r\n  #zic-website-spoofing-v2 .zic2__apiStatusList {\r\n    flex-wrap: wrap;\r\n    gap: 10px;\r\n  }\r\n  #zic-website-spoofing-v2 .zic2__apiStatus {\r\n    flex: 1 1 calc(50% - 5px);\r\n    min-width: 140px;\r\n  }\r\n  #zic-website-spoofing-v2 .zic2__checkItem {\r\n    padding: 14px 16px;\r\n  }\r\n  #zic-website-spoofing-v2 .zic2__loadingStep {\r\n    font-size: 13px;\r\n  }\r\n}\r\n\r\n\/* Print styles *\/\r\n@media print {\r\n  \/* Hide interactive elements *\/\r\n  #zic-website-spoofing-v2 .zic2__actions,\r\n  #zic-website-spoofing-v2 .zic2__hint,\r\n  #zic-website-spoofing-v2 .zic2__footer,\r\n  #zic-website-spoofing-v2 .zic2__loading,\r\n  #zic-website-spoofing-v2 .zic2__langBtn,\r\n  #zic-website-spoofing-v2 .zic2__themeBtn,\r\n  #zic-website-spoofing-v2 .zic2__history,\r\n  #zic-website-spoofing-v2 .zic2__qrWrapper,\r\n  #zic-website-spoofing-v2 .zic2__exportWrapper,\r\n  #zic-website-spoofing-v2 [data-action],\r\n  #zic-website-spoofing-v2 .zic2__batchMode {\r\n    display: none !important;\r\n  }\r\n\r\n  \/* Reset backgrounds for print *\/\r\n  #zic-website-spoofing-v2 {\r\n    background: white !important;\r\n    color: #111 !important;\r\n  }\r\n\r\n  #zic-website-spoofing-v2 .zic2__wrap {\r\n    max-width: 100% !important;\r\n    padding: 0 !important;\r\n  }\r\n\r\n  #zic-website-spoofing-v2 .zic2__card {\r\n    box-shadow: none !important;\r\n    border: 1px solid #ccc !important;\r\n    break-inside: avoid;\r\n    background: white !important;\r\n    margin-bottom: 16px;\r\n  }\r\n\r\n  #zic-website-spoofing-v2 .zic2__brandbar {\r\n    background: white !important;\r\n    border-bottom: 2px solid #111 !important;\r\n    padding: 16px 0 !important;\r\n  }\r\n\r\n  \/* Print header *\/\r\n  #zic-website-spoofing-v2 .zic2__brandbar::before {\r\n    content: \"Raport Verificare Website - ZIC.legal\";\r\n    display: block;\r\n    font-size: 10px;\r\n    color: #666;\r\n    text-transform: uppercase;\r\n    letter-spacing: 1px;\r\n    margin-bottom: 8px;\r\n  }\r\n\r\n  \/* Show timestamp on results *\/\r\n  #zic-website-spoofing-v2 .zic2__scoreCard::after {\r\n    content: \"Generat: \" attr(data-print-timestamp);\r\n    display: block;\r\n    font-size: 11px;\r\n    color: #666;\r\n    margin-top: 16px;\r\n    padding-top: 8px;\r\n    border-top: 1px solid #eee;\r\n  }\r\n\r\n  \/* Preserve colors for score circle *\/\r\n  #zic-website-spoofing-v2 .zic2__scoreCircle {\r\n    print-color-adjust: exact !important;\r\n    -webkit-print-color-adjust: exact !important;\r\n  }\r\n\r\n  #zic-website-spoofing-v2 .zic2__scoreCircle.score-safe {\r\n    background: var(--zic-success) !important;\r\n    color: white !important;\r\n    print-color-adjust: exact !important;\r\n    -webkit-print-color-adjust: exact !important;\r\n  }\r\n\r\n  #zic-website-spoofing-v2 .zic2__scoreCircle.score-warning {\r\n    background: var(--zic-warning) !important;\r\n    color: white !important;\r\n    print-color-adjust: exact !important;\r\n    -webkit-print-color-adjust: exact !important;\r\n  }\r\n\r\n  #zic-website-spoofing-v2 .zic2__scoreCircle.score-danger {\r\n    background: var(--zic-danger) !important;\r\n    color: white !important;\r\n    print-color-adjust: exact !important;\r\n    -webkit-print-color-adjust: exact !important;\r\n  }\r\n\r\n  \/* Preserve status colors *\/\r\n  #zic-website-spoofing-v2 .zic2__checkItem,\r\n  #zic-website-spoofing-v2 .zic2__apiStatus {\r\n    print-color-adjust: exact !important;\r\n    -webkit-print-color-adjust: exact !important;\r\n  }\r\n\r\n  \/* Expand all results details *\/\r\n  #zic-website-spoofing-v2 .zic2__checkItem details {\r\n    display: block !important;\r\n  }\r\n\r\n  #zic-website-spoofing-v2 .zic2__checkItem details[open] summary ~ * {\r\n    display: block !important;\r\n  }\r\n\r\n  \/* Input field styling for print *\/\r\n  #zic-website-spoofing-v2 .zic2__input {\r\n    border: 1px solid #ccc !important;\r\n    background: #f9f9f9 !important;\r\n  }\r\n\r\n  \/* Disclaimer visibility *\/\r\n  #zic-website-spoofing-v2 .zic2__disclaimer {\r\n    border: 1px solid #ddd !important;\r\n    background: #f5f5f5 !important;\r\n    print-color-adjust: exact !important;\r\n    -webkit-print-color-adjust: exact !important;\r\n  }\r\n\r\n  \/* Page breaks *\/\r\n  #zic-website-spoofing-v2 .zic2__scoreCard {\r\n    break-before: avoid;\r\n  }\r\n\r\n  #zic-website-spoofing-v2 .zic2__checkList {\r\n    break-inside: avoid;\r\n  }\r\n}\r\n\r\n\/* === Loading Overlay === *\/\r\n#zic-website-spoofing-v2 .zic2__loading {\r\n  background: var(--zic-surface);\r\n  border: 1px solid var(--zic-border);\r\n  border-radius: var(--zic-radius);\r\n  padding: 40px 20px;\r\n  margin-bottom: 16px;\r\n  box-shadow: var(--zic-shadow);\r\n  text-align: center;\r\n}\r\n\r\n#zic-website-spoofing-v2 .zic2__loadingContent {\r\n  display: flex;\r\n  flex-direction: column;\r\n  align-items: center;\r\n  gap: 16px;\r\n}\r\n\r\n#zic-website-spoofing-v2 .zic2__loadingSpinner {\r\n  width: 48px;\r\n  height: 48px;\r\n  border: 4px solid var(--zic-border);\r\n  border-top-color: var(--zic-primary);\r\n  border-radius: 50%;\r\n  animation: zic-spin 1s linear infinite;\r\n}\r\n\r\n#zic-website-spoofing-v2 .zic2__loadingText {\r\n  font-size: 18px;\r\n  font-weight: 600;\r\n  color: var(--zic-ink);\r\n}\r\n\r\n#zic-website-spoofing-v2 .zic2__loadingSubtext {\r\n  font-size: 14px;\r\n  color: var(--zic-muted);\r\n}\r\n\r\n\/* === Loading Steps Indicator (v4.1) === *\/\r\n#zic-website-spoofing-v2 .zic2__loadingSteps {\r\n  display: flex;\r\n  flex-direction: column;\r\n  gap: 8px;\r\n  margin-top: 8px;\r\n  text-align: left;\r\n  width: 100%;\r\n  max-width: 260px;\r\n}\r\n\r\n#zic-website-spoofing-v2 .zic2__loadingStep {\r\n  display: flex;\r\n  align-items: center;\r\n  gap: 10px;\r\n  font-size: 13px;\r\n  color: var(--zic-muted);\r\n  transition: color var(--zic-duration-fast) ease;\r\n}\r\n\r\n#zic-website-spoofing-v2 .zic2__loadingStep.is-active {\r\n  color: var(--zic-ink);\r\n}\r\n\r\n#zic-website-spoofing-v2 .zic2__loadingStep.is-done {\r\n  color: var(--zic-success);\r\n}\r\n\r\n#zic-website-spoofing-v2 .zic2__loadingStep.is-failed {\r\n  color: var(--zic-danger);\r\n}\r\n\r\n#zic-website-spoofing-v2 .zic2__loadingStep.is-timeout {\r\n  color: var(--zic-warning);\r\n}\r\n\r\n#zic-website-spoofing-v2 .zic2__stepIcon {\r\n  width: 18px;\r\n  height: 18px;\r\n  border-radius: 50%;\r\n  display: flex;\r\n  align-items: center;\r\n  justify-content: center;\r\n  font-size: 10px;\r\n  font-weight: 700;\r\n  flex-shrink: 0;\r\n  background: var(--zic-border);\r\n  color: var(--zic-muted);\r\n  transition: all var(--zic-duration-fast) ease;\r\n}\r\n\r\n#zic-website-spoofing-v2 .zic2__loadingStep.is-active .zic2__stepIcon {\r\n  background: var(--zic-primary-light);\r\n  border: 2px solid var(--zic-primary);\r\n  animation: zic-pulse 1s ease-in-out infinite;\r\n}\r\n\r\n#zic-website-spoofing-v2 .zic2__loadingStep.is-done .zic2__stepIcon {\r\n  background: var(--zic-success);\r\n  color: #fff;\r\n}\r\n\r\n#zic-website-spoofing-v2 .zic2__loadingStep.is-failed .zic2__stepIcon {\r\n  background: var(--zic-danger);\r\n  color: #fff;\r\n}\r\n\r\n#zic-website-spoofing-v2 .zic2__loadingStep.is-timeout .zic2__stepIcon {\r\n  background: var(--zic-warning);\r\n  color: #fff;\r\n}\r\n\r\n\/* Progress bar *\/\r\n#zic-website-spoofing-v2 .zic2__loadingProgress {\r\n  width: 100%;\r\n  max-width: 260px;\r\n  height: 6px;\r\n  background: var(--zic-border);\r\n  border-radius: 3px;\r\n  margin-top: 12px;\r\n  overflow: hidden;\r\n}\r\n\r\n#zic-website-spoofing-v2 .zic2__progressBar {\r\n  height: 100%;\r\n  width: 0%;\r\n  background: linear-gradient(90deg, var(--zic-primary), var(--zic-success));\r\n  border-radius: 3px;\r\n  transition: width var(--zic-duration-normal) ease;\r\n}\r\n\r\n#zic-website-spoofing-v2 .zic2__loadingPercent {\r\n  font-size: 14px;\r\n  font-weight: 600;\r\n  color: var(--zic-ink);\r\n  margin-top: 4px;\r\n}\r\n\r\n\/* Reduced motion *\/\r\n@media (prefers-reduced-motion: reduce) {\r\n  #zic-website-spoofing-v2 .zic2__loadingStep.is-active .zic2__stepIcon {\r\n    animation: none;\r\n  }\r\n}\r\n<\/style>\r\n\r\n<!-- jsQR Library for QR Code Scanning -->\r\n<script src=\"https:\/\/cdn.jsdelivr.net\/npm\/jsqr@1.4.0\/dist\/jsQR.min.js\"><\/script>\r\n\r\n<script>\r\n(function() {\r\n  'use strict';\r\n\r\n  const ROOT_ID = 'zic-website-spoofing-v2';\r\n  const root = document.getElementById(ROOT_ID);\r\n  if (!root) return;\r\n\r\n  \/\/ === INTERNATIONALIZATION (i18n) ===\r\n  const LANG = {\r\n    ro: {\r\n      \/\/ Header\r\n      title: 'Verificare website spoofing',\r\n      subtitle: 'Detecteaz\u0103 link-uri suspecte \u0219i tentative de phishing',\r\n      langSwitch: 'EN',\r\n      \/\/ Formula\r\n      formula: '<strong>Cum func\u021bioneaz\u0103:<\/strong> Analiz\u0103m URL-ul pentru typosquatting, caractere Unicode suspecte, extensii de domeniu riscante \u0219i alte indicii de phishing. Verific\u0103m suplimentar prin <strong>5 surse externe<\/strong>: Google Safe Browsing, VirusTotal, URLhaus, urlscan.io \u0219i PhishTank.',\r\n      \/\/ Input\r\n      inputTitle: 'Link de verificat',\r\n      inputLabel: 'Introdu link-ul website-ului',\r\n      inputPlaceholder: 'https:\/\/example.com',\r\n      hint: 'Copiaz\u0103 link-ul direct din email, mesaj sau bara de adrese a browser-ului.',\r\n      \/\/ QR Code\r\n      qrLabel: 'Sau \u00eencarc\u0103 un cod QR cu un link',\r\n      qrUploadBtn: '\u00cencarc\u0103 imagine QR',\r\n      \/\/ Buttons\r\n      btnAnalyze: 'Verific\u0103 link',\r\n      btnAnalyzing: 'Se verific\u0103...',\r\n      btnReset: '\u0218terge',\r\n      btnExample: 'Exemplu suspect',\r\n      \/\/ Loading\r\n      loadingText: 'Se verific\u0103 URL-ul...',\r\n      loadingSub: 'Interog\u0103m 5 baze de date de securitate',\r\n      loadingLocal: 'Analiz\u0103 local\u0103',\r\n      loadingGoogle: 'Google Safe Browsing',\r\n      loadingVT: 'VirusTotal',\r\n      loadingURLhaus: 'URLhaus',\r\n      loadingUrlscan: 'urlscan.io',\r\n      loadingPhishtank: 'PhishTank',\r\n      \/\/ Results\r\n      scoreLabel: 'din 100',\r\n      resultsTitle: 'Rezultate analiz\u0103',\r\n      apiStatusTitle: 'Verific\u0103ri externe (5 surse):',\r\n      \/\/ Score texts\r\n      scoreSafe: 'Risc sc\u0103zut',\r\n      scoreWarning: 'Aten\u021bie necesar\u0103',\r\n      scoreDanger: 'Risc ridicat',\r\n      descSafe: 'Link-ul pare a fi legitim. Nu s-au detectat semne de phishing.',\r\n      descWarning: 'Au fost detectate unele probleme. Verific\u0103 manual \u00eenainte de a accesa.',\r\n      descDanger: 'Multiple semne de fraudare detectate. Nu accesa acest link!',\r\n      \/\/ Disclaimer\r\n      disclaimer: '<strong>Disclaimer:<\/strong> Aceast\u0103 analiz\u0103 este orientativ\u0103 \u0219i combin\u0103 verific\u0103ri locale cu 5 servicii externe (Google Safe Browsing, VirusTotal, URLhaus, urlscan.io, PhishTank). Nu \u00eenlocuie\u0219te o verificare profesional\u0103 de securitate, precum cea oferit\u0103 de <a href=\"https:\/\/cyberopsnetwork.com\/\" target=\"_blank\" rel=\"noopener noreferrer\">CyberOps Network<\/a> \u2013 partenerii ZIC.legal.',\r\n      \/\/ Errors\r\n      errorEmpty: 'Te rug\u0103m s\u0103 introduci un link pentru verificare.',\r\n      errorTooLong: 'URL-ul este prea lung. Limita este de {max} caractere.',\r\n      errorDangerous: 'URL-ul con\u021bine caractere sau scheme periculoase.',\r\n      errorInvalid: 'Link-ul introdus nu este valid. Te rug\u0103m verific\u0103 formatul.',\r\n      errorGeneral: 'A ap\u0103rut o eroare la analiz\u0103. V\u0103 rug\u0103m \u00eencerca\u021bi din nou.',\r\n      \/\/ Check results\r\n      checkHttpsPass: 'Conexiune HTTPS',\r\n      checkHttpsPassDesc: 'Site-ul folose\u0219te protocol securizat HTTPS.',\r\n      checkHttpsFail: 'Lips\u0103 HTTPS',\r\n      checkHttpsFailDesc: 'Site-ul nu folose\u0219te HTTPS. Datele nu sunt criptate!',\r\n      checkUnicodePass: 'Caractere legitime',\r\n      checkUnicodePassDesc: 'Nu s-au detectat caractere Unicode suspecte \u00een domeniu.',\r\n      checkUnicodeFail: 'Caractere Unicode suspecte',\r\n      checkUnicodeFailDesc: 'Domeniul con\u021bine caractere care imit\u0103 litere latine. Forma real\u0103: \"{domain}\"',\r\n      \/\/ API results\r\n      googleOk: 'Google Safe Browsing: OK',\r\n      googleOkDesc: 'URL-ul nu este raportat \u00een baza de date Google.',\r\n      googleFail: 'Google Safe Browsing: PERICOL',\r\n      googleFailDesc: 'Google a detectat: {threats}. NU accesa\u021bi acest link!',\r\n      vtOk: 'VirusTotal: curat',\r\n      vtOkDesc: 'Niciun motor antivirus nu a detectat amenin\u021b\u0103ri.',\r\n      vtFail: 'VirusTotal: DETEC\u021aII',\r\n      vtFailDesc: '{count} motoare antivirus au detectat amenin\u021b\u0103ri.',\r\n      urlhausOk: 'URLhaus: curat',\r\n      urlhausOkDesc: 'URL-ul nu apare \u00een baza de date URLhaus.',\r\n      urlhausFail: 'URLhaus: MALWARE',\r\n      urlhausFailDesc: 'URL-ul este \u00een baza de date URLhaus. Tip: {threat}.',\r\n      urlscanOk: 'urlscan.io: OK',\r\n      urlscanOkDesc: 'Nicio amenin\u021bare detectat\u0103{scans}.',\r\n      urlscanFail: 'urlscan.io: SUSPECT',\r\n      urlscanFailDesc: 'Domeniul a fost marcat ca mali\u021bios. Verdicts: {verdicts}',\r\n      phishtankOk: 'PhishTank: OK',\r\n      phishtankOkDesc: 'URL-ul nu este \u00een baza de date PhishTank (Cisco Talos).',\r\n      phishtankFail: 'PhishTank: PHISHING CONFIRMAT',\r\n      phishtankFailDesc: 'URL-ul este \u00een baza de date PhishTank ca site de phishing verificat!',\r\n      \/\/ Local checks\r\n      typosquatTitle: 'Typosquatting detectat',\r\n      typosquatDouble: 'Typosquatting prin litere duble',\r\n      typosquatVisual: 'Typosquatting vizual',\r\n      typosquatSubst: 'Typosquatting prin substitu\u021bie',\r\n      typosquatHyphen: 'Brand fragmentat cu cratime',\r\n      typosquatKeyboard: 'Eroare tastare detectat\u0103',\r\n      typosquatSimilarity: 'Similaritate suspect\u0103',\r\n      typosquatRepetition: 'Litere repetate',\r\n      typosquatOmission: 'Caracter lips\u0103',\r\n      typosquatTransposition: 'Litere inversate',\r\n      typosquatVowelSwap: 'Vocale substituite',\r\n      typosquatDesc: 'Domeniul seam\u0103n\u0103 suspect cu brandul \"{brand}\".',\r\n      brandWrongTld: 'Brand pe TLD gre\u0219it',\r\n      brandOk: 'Brand recunoscut',\r\n      brandOkDesc: 'Domeniul corespunde unui brand cunoscut.',\r\n      noTyposquat: 'F\u0103r\u0103 typosquatting detectat',\r\n      noTyposquatDesc: 'Domeniul nu pare s\u0103 imite branduri cunoscute.',\r\n      suspiciousTld: 'Extensie domeniu suspect\u0103',\r\n      suspiciousTldDesc: 'Domeniul folose\u0219te o extensie frecvent asociat\u0103 cu site-uri frauduloase.',\r\n      tldOk: 'Extensie domeniu OK',\r\n      tldOkDesc: 'Extensia domeniului nu ridic\u0103 suspiciuni.',\r\n      multiSubdomain: 'Subdomain-uri multiple',\r\n      multiSubdomainDesc: 'Domeniul are {count} subdomain-uri.',\r\n      subdomainOk: 'Structur\u0103 domeniu normal\u0103',\r\n      subdomainOkDesc: 'Num\u0103rul de subdomain-uri este normal.',\r\n      phishKeywords: 'Cuvinte cheie phishing',\r\n      phishKeywordsDesc: 'URL-ul con\u021bine termeni suspec\u021bi: \"{keywords}\"',\r\n      sensitiveTerm: 'Termen sensibil \u00een URL',\r\n      sensitiveTermDesc: 'URL-ul con\u021bine termenul \"{keyword}\".',\r\n      noSuspiciousTerms: 'URL f\u0103r\u0103 termeni suspec\u021bi',\r\n      noSuspiciousTermsDesc: 'Nu s-au detectat cuvinte cheie asociate cu phishing.',\r\n      longDomain: 'Domeniu foarte lung',\r\n      longDomainDesc: 'Domeniul are {length} caractere.',\r\n      domainLengthOk: 'Lungime domeniu OK',\r\n      domainLengthOkDesc: 'Lungimea domeniului este normal\u0103.',\r\n      ipAddress: 'Adres\u0103 IP \u00een loc de domeniu',\r\n      ipAddressDesc: 'URL-ul folose\u0219te o adres\u0103 IP direct\u0103.',\r\n      nonStandardPort: 'Port non-standard',\r\n      nonStandardPortDesc: 'URL-ul folose\u0219te portul {port}.',\r\n      idnDomain: 'Domeniu interna\u021bional (IDN\/Punycode)',\r\n      idnDomainDesc: 'Domeniul folose\u0219te caractere interna\u021bionale codificate.',\r\n      unusualChars: 'Caractere neobi\u0219nuite',\r\n      unusualCharsDesc: 'Domeniul con\u021bine caractere speciale neobi\u0219nuite.',\r\n      brandInSubdomain: 'Brand \u00een subdomain',\r\n      brandInSubdomainDesc: 'Un brand cunoscut apare \u00een subdomain dar nu \u00een domeniul principal.',\r\n      \/\/ Interpretation Guide\r\n      guideTitle: 'Ce \u00eenseamn\u0103 rezultatele?',\r\n      guideScoreTitle: '&#x1f4ca; Scorul de \u00eencredere (0-100)',\r\n      guideScoreSafe: 'Risc sc\u0103zut - link probabil sigur',\r\n      guideScoreWarning: 'Verificare manual\u0103 recomandat\u0103',\r\n      guideScoreDanger: 'Risc ridicat - NU accesa!',\r\n      guideChecksTitle: '&#x1f50d; Tipuri de verific\u0103ri',\r\n      guideTyposquat: 'Typosquatting:',\r\n      guideTyposquatDesc: 'Domeniu care imit\u0103 un brand cunoscut (ex: gooogle.com)',\r\n      guideHttps: 'HTTPS:',\r\n      guideHttpsDesc: 'Conexiune securizat\u0103 - lipsa poate indica risc',\r\n      guideUnicode: 'Unicode suspect:',\r\n      guideUnicodeDesc: 'Caractere care arat\u0103 ca litere normale dar sunt diferite',\r\n      guideTld: 'TLD suspect:',\r\n      guideTldDesc: 'Extensii precum .tk, .xyz, .ml sunt frecvent abuzate',\r\n      guideKeywords: 'Cuvinte cheie:',\r\n      guideKeywordsDesc: 'Termeni precum \"login\", \"verify\", \"secure\" \u00een URL-uri suspecte',\r\n      guideApisTitle: '&#x1f310; Verific\u0103ri externe',\r\n      guideGsb: 'Baz\u0103 de date Google cu site-uri periculoase',\r\n      guideVt: 'Scanare cu 70+ motoare antivirus',\r\n      guideUrlhaus: 'Baz\u0103 de date specializat\u0103 \u00een malware',\r\n      guideUrlscan: 'Analiz\u0103 comportamental\u0103 a site-ului',\r\n      guidePhishtank: 'Comunitate care raporteaz\u0103 phishing',\r\n      guideActionsTitle: '&#x2705; Ce s\u0103 faci',\r\n      guideAction1: 'Dac\u0103 scorul e sub 40: NU accesa link-ul',\r\n      guideAction2: 'Verific\u0103 manual adresa \u00eenainte de a introduce date personale',\r\n      guideAction3: 'Dac\u0103 ai dubii, contacteaz\u0103 direct organiza\u021bia pe canalele oficiale',\r\n      guideAction4: 'Raporteaz\u0103 link-urile de phishing la poli\u021bie sau CERT-RO',\r\n      \/\/ Theme\r\n      themeLight: 'Comut\u0103 pe mod luminos',\r\n      themeDark: 'Comut\u0103 pe mod \u00eentunecat',\r\n      \/\/ Share\r\n      shareLink: 'Copiaz\u0103 link',\r\n      shareLinkCopied: 'Link copiat!',\r\n      printReport: 'Printeaz\u0103',\r\n      \/\/ Batch\r\n      batchTruncated: 'Doar primele {count} URL-uri din {total} vor fi procesate.'\r\n    },\r\n    en: {\r\n      \/\/ Header\r\n      title: 'Website spoofing check',\r\n      subtitle: 'Detect suspicious links and phishing attempts',\r\n      langSwitch: 'RO',\r\n      \/\/ Formula\r\n      formula: '<strong>How it works:<\/strong> We analyse the URL for typosquatting, suspicious Unicode characters, risky domain extensions, and other phishing indicators. We additionally verify through <strong>5 external sources<\/strong>: Google Safe Browsing, VirusTotal, URLhaus, urlscan.io, and PhishTank.',\r\n      \/\/ Input\r\n      inputTitle: 'Link to check',\r\n      inputLabel: 'Enter the website link',\r\n      inputPlaceholder: 'https:\/\/example.com',\r\n      hint: 'Copy the link directly from email, message, or browser address bar.',\r\n      \/\/ QR Code\r\n      qrLabel: 'Or upload a QR code with a link',\r\n      qrUploadBtn: 'Upload QR image',\r\n      \/\/ Buttons\r\n      btnAnalyze: 'Check link',\r\n      btnAnalyzing: 'Checking...',\r\n      btnReset: 'Clear',\r\n      btnExample: 'Suspicious example',\r\n      \/\/ Loading\r\n      loadingText: 'Checking URL...',\r\n      loadingSub: 'Querying 5 security databases',\r\n      loadingLocal: 'Local analysis',\r\n      loadingGoogle: 'Google Safe Browsing',\r\n      loadingVT: 'VirusTotal',\r\n      loadingURLhaus: 'URLhaus',\r\n      loadingUrlscan: 'urlscan.io',\r\n      loadingPhishtank: 'PhishTank',\r\n      \/\/ Results\r\n      scoreLabel: 'out of 100',\r\n      resultsTitle: 'Analysis results',\r\n      apiStatusTitle: 'External checks (5 sources):',\r\n      \/\/ Score texts\r\n      scoreSafe: 'Low risk',\r\n      scoreWarning: 'Caution required',\r\n      scoreDanger: 'High risk',\r\n      descSafe: 'The link appears to be legitimate. No signs of phishing detected.',\r\n      descWarning: 'Some issues detected. Verify manually before accessing.',\r\n      descDanger: 'Multiple fraud signs detected. Do not access this link!',\r\n      \/\/ Disclaimer\r\n      disclaimer: '<strong>Disclaimer:<\/strong> This analysis is indicative and combines local checks with 5 external services (Google Safe Browsing, VirusTotal, URLhaus, urlscan.io, PhishTank). It does not replace a professional security assessment, such as that offered by <a href=\"https:\/\/cyberopsnetwork.com\/\" target=\"_blank\" rel=\"noopener noreferrer\">CyberOps Network<\/a> \u2013 ZIC.legal partners.',\r\n      \/\/ Errors\r\n      errorEmpty: 'Please enter a link to check.',\r\n      errorTooLong: 'URL is too long. Maximum is {max} characters.',\r\n      errorDangerous: 'URL contains dangerous characters or schemes.',\r\n      errorInvalid: 'The entered link is not valid. Please check the format.',\r\n      errorGeneral: 'An error occurred during analysis. Please try again.',\r\n      \/\/ Check results\r\n      checkHttpsPass: 'HTTPS connection',\r\n      checkHttpsPassDesc: 'The site uses secure HTTPS protocol.',\r\n      checkHttpsFail: 'Missing HTTPS',\r\n      checkHttpsFailDesc: 'The site does not use HTTPS. Data is not encrypted!',\r\n      checkUnicodePass: 'Legitimate characters',\r\n      checkUnicodePassDesc: 'No suspicious Unicode characters detected in domain.',\r\n      checkUnicodeFail: 'Suspicious Unicode characters',\r\n      checkUnicodeFailDesc: 'The domain contains characters mimicking Latin letters. Real form: \"{domain}\"',\r\n      \/\/ API results\r\n      googleOk: 'Google Safe Browsing: OK',\r\n      googleOkDesc: 'URL is not reported in Google database.',\r\n      googleFail: 'Google Safe Browsing: DANGER',\r\n      googleFailDesc: 'Google detected: {threats}. DO NOT access this link!',\r\n      vtOk: 'VirusTotal: clean',\r\n      vtOkDesc: 'No antivirus engine detected threats.',\r\n      vtFail: 'VirusTotal: DETECTIONS',\r\n      vtFailDesc: '{count} antivirus engines detected threats.',\r\n      urlhausOk: 'URLhaus: clean',\r\n      urlhausOkDesc: 'URL is not in URLhaus database.',\r\n      urlhausFail: 'URLhaus: MALWARE',\r\n      urlhausFailDesc: 'URL is in URLhaus database. Type: {threat}.',\r\n      urlscanOk: 'urlscan.io: OK',\r\n      urlscanOkDesc: 'No threats detected{scans}.',\r\n      urlscanFail: 'urlscan.io: SUSPECT',\r\n      urlscanFailDesc: 'Domain was marked as malicious. Verdicts: {verdicts}',\r\n      phishtankOk: 'PhishTank: OK',\r\n      phishtankOkDesc: 'URL is not in PhishTank database (Cisco Talos).',\r\n      phishtankFail: 'PhishTank: PHISHING CONFIRMED',\r\n      phishtankFailDesc: 'URL is in PhishTank database as verified phishing site!',\r\n      \/\/ Local checks\r\n      typosquatTitle: 'Typosquatting detected',\r\n      typosquatDouble: 'Double letter typosquatting',\r\n      typosquatVisual: 'Visual typosquatting',\r\n      typosquatSubst: 'Substitution typosquatting',\r\n      typosquatHyphen: 'Hyphen-fragmented brand',\r\n      typosquatKeyboard: 'Keyboard typo detected',\r\n      typosquatSimilarity: 'Suspicious similarity',\r\n      typosquatRepetition: 'Repeated letters',\r\n      typosquatOmission: 'Missing character',\r\n      typosquatTransposition: 'Swapped letters',\r\n      typosquatVowelSwap: 'Vowel substitution',\r\n      typosquatDesc: 'Domain suspiciously resembles the brand \"{brand}\".',\r\n      brandWrongTld: 'Brand on wrong TLD',\r\n      brandOk: 'Recognised brand',\r\n      brandOkDesc: 'Domain corresponds to a known brand.',\r\n      noTyposquat: 'No typosquatting detected',\r\n      noTyposquatDesc: 'Domain does not appear to mimic known brands.',\r\n      suspiciousTld: 'Suspicious domain extension',\r\n      suspiciousTldDesc: 'Domain uses an extension frequently associated with fraudulent sites.',\r\n      tldOk: 'Domain extension OK',\r\n      tldOkDesc: 'Domain extension does not raise suspicions.',\r\n      multiSubdomain: 'Multiple subdomains',\r\n      multiSubdomainDesc: 'Domain has {count} subdomains.',\r\n      subdomainOk: 'Normal domain structure',\r\n      subdomainOkDesc: 'Number of subdomains is normal.',\r\n      phishKeywords: 'Phishing keywords',\r\n      phishKeywordsDesc: 'URL contains suspicious terms: \"{keywords}\"',\r\n      sensitiveTerm: 'Sensitive term in URL',\r\n      sensitiveTermDesc: 'URL contains the term \"{keyword}\".',\r\n      noSuspiciousTerms: 'URL without suspicious terms',\r\n      noSuspiciousTermsDesc: 'No keywords associated with phishing detected.',\r\n      longDomain: 'Very long domain',\r\n      longDomainDesc: 'Domain has {length} characters.',\r\n      domainLengthOk: 'Domain length OK',\r\n      domainLengthOkDesc: 'Domain length is normal.',\r\n      ipAddress: 'IP address instead of domain',\r\n      ipAddressDesc: 'URL uses a direct IP address.',\r\n      nonStandardPort: 'Non-standard port',\r\n      nonStandardPortDesc: 'URL uses port {port}.',\r\n      idnDomain: 'International domain (IDN\/Punycode)',\r\n      idnDomainDesc: 'Domain uses encoded international characters.',\r\n      unusualChars: 'Unusual characters',\r\n      unusualCharsDesc: 'Domain contains unusual special characters.',\r\n      brandInSubdomain: 'Brand in subdomain',\r\n      brandInSubdomainDesc: 'A known brand appears in subdomain but not in main domain.',\r\n      \/\/ Interpretation Guide\r\n      guideTitle: 'What do the results mean?',\r\n      guideScoreTitle: '&#x1f4ca; Trust Score (0-100)',\r\n      guideScoreSafe: 'Low risk - link is probably safe',\r\n      guideScoreWarning: 'Manual verification recommended',\r\n      guideScoreDanger: 'High risk - DO NOT access!',\r\n      guideChecksTitle: '&#x1f50d; Types of checks',\r\n      guideTyposquat: 'Typosquatting:',\r\n      guideTyposquatDesc: 'Domain that mimics a known brand (e.g., gooogle.com)',\r\n      guideHttps: 'HTTPS:',\r\n      guideHttpsDesc: 'Secure connection - absence may indicate risk',\r\n      guideUnicode: 'Suspicious Unicode:',\r\n      guideUnicodeDesc: 'Characters that look like normal letters but are different',\r\n      guideTld: 'Suspicious TLD:',\r\n      guideTldDesc: 'Extensions like .tk, .xyz, .ml are frequently abused',\r\n      guideKeywords: 'Keywords:',\r\n      guideKeywordsDesc: 'Terms like \"login\", \"verify\", \"secure\" in suspicious URLs',\r\n      guideApisTitle: '&#x1f310; External checks',\r\n      guideGsb: 'Google database of dangerous sites',\r\n      guideVt: 'Scan with 70+ antivirus engines',\r\n      guideUrlhaus: 'Database specialized in malware',\r\n      guideUrlscan: 'Behavioral analysis of the site',\r\n      guidePhishtank: 'Community reporting phishing',\r\n      guideActionsTitle: '&#x2705; What to do',\r\n      guideAction1: 'If score is below 40: DO NOT access the link',\r\n      guideAction2: 'Manually verify the address before entering personal data',\r\n      guideAction3: 'If in doubt, contact the organization directly through official channels',\r\n      guideAction4: 'Report phishing links to police or your local CERT',\r\n      \/\/ Theme\r\n      themeLight: 'Switch to light mode',\r\n      themeDark: 'Switch to dark mode',\r\n      \/\/ Share\r\n      shareLink: 'Copy link',\r\n      shareLinkCopied: 'Link copied!',\r\n      printReport: 'Print',\r\n      \/\/ Batch\r\n      batchTruncated: 'Only the first {count} of {total} URLs will be processed.'\r\n    }\r\n  };\r\n\r\n  \/\/ Detect browser language, default to Romanian\r\n  let currentLang = navigator.language.startsWith('ro') ? 'ro' : 'en';\r\n\r\n  \/\/ Get translation\r\n  function t(key, replacements = {}) {\r\n    let text = LANG[currentLang][key] || LANG['ro'][key] || key;\r\n    for (const [placeholder, value] of Object.entries(replacements)) {\r\n      text = text.replace('{' + placeholder + '}', value);\r\n    }\r\n    return text;\r\n  }\r\n\r\n  \/\/ Apply translations to all elements with data-i18n attributes\r\n  function applyTranslations() {\r\n    \/\/ Text content\r\n    root.querySelectorAll('[data-i18n]').forEach(el => {\r\n      const key = el.getAttribute('data-i18n');\r\n      if (LANG[currentLang][key]) {\r\n        el.textContent = LANG[currentLang][key];\r\n      }\r\n    });\r\n    \/\/ HTML content\r\n    root.querySelectorAll('[data-i18n-html]').forEach(el => {\r\n      const key = el.getAttribute('data-i18n-html');\r\n      if (LANG[currentLang][key]) {\r\n        el.innerHTML = LANG[currentLang][key];\r\n      }\r\n    });\r\n    \/\/ Placeholders\r\n    root.querySelectorAll('[data-i18n-placeholder]').forEach(el => {\r\n      const key = el.getAttribute('data-i18n-placeholder');\r\n      if (LANG[currentLang][key]) {\r\n        el.placeholder = LANG[currentLang][key];\r\n      }\r\n    });\r\n  }\r\n\r\n  \/\/ Toggle language\r\n  function toggleLanguage() {\r\n    currentLang = currentLang === 'ro' ? 'en' : 'ro';\r\n    applyTranslations();\r\n  }\r\n\r\n  \/\/ === THEME MANAGEMENT ===\r\n  const THEME_KEY = 'zic-theme';\r\n  const themeBtn = root.querySelector('[data-action=\"toggleTheme\"]');\r\n\r\n  \/\/ Detect system preference\r\n  function getSystemTheme() {\r\n    return window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light';\r\n  }\r\n\r\n  \/\/ Get current theme (stored > system)\r\n  function getCurrentTheme() {\r\n    return localStorage.getItem(THEME_KEY) || null;\r\n  }\r\n\r\n  \/\/ Apply theme to root element\r\n  function applyTheme(theme) {\r\n    if (theme) {\r\n      root.setAttribute('data-theme', theme);\r\n    } else {\r\n      root.removeAttribute('data-theme');\r\n    }\r\n    updateThemeButton(theme || getSystemTheme());\r\n  }\r\n\r\n  \/\/ Update button aria-label and pressed state\r\n  function updateThemeButton(activeTheme) {\r\n    if (!themeBtn) return;\r\n    const isDark = activeTheme === 'dark';\r\n    themeBtn.setAttribute('aria-pressed', isDark.toString());\r\n    themeBtn.setAttribute('aria-label', t(isDark ? 'themeLight' : 'themeDark'));\r\n  }\r\n\r\n  \/\/ Toggle between themes\r\n  function toggleTheme() {\r\n    const current = getCurrentTheme();\r\n    const systemTheme = getSystemTheme();\r\n    let newTheme;\r\n\r\n    if (current === null) {\r\n      \/\/ No preference stored, switch from system default\r\n      newTheme = systemTheme === 'dark' ? 'light' : 'dark';\r\n    } else {\r\n      \/\/ Toggle stored preference\r\n      newTheme = current === 'dark' ? 'light' : 'dark';\r\n    }\r\n\r\n    localStorage.setItem(THEME_KEY, newTheme);\r\n    applyTheme(newTheme);\r\n  }\r\n\r\n  \/\/ Listen for system theme changes\r\n  window.matchMedia('(prefers-color-scheme: dark)').addEventListener('change', (e) => {\r\n    \/\/ Only react if no manual override stored\r\n    if (!getCurrentTheme()) {\r\n      updateThemeButton(e.matches ? 'dark' : 'light');\r\n    }\r\n  });\r\n\r\n  \/\/ Initialize theme on load\r\n  applyTheme(getCurrentTheme());\r\n\r\n  \/\/ === CSS VARIABLE HELPERS ===\r\n  function getCssVar(name) {\r\n    return getComputedStyle(root).getPropertyValue('--zic-' + name).trim();\r\n  }\r\n\r\n  function getRiskColors() {\r\n    return {\r\n      safe: getCssVar('success'),\r\n      warning: getCssVar('warning'),\r\n      danger: getCssVar('danger')\r\n    };\r\n  }\r\n\r\n  \/\/ === SECURITY: Maximum input length to prevent DoS ===\r\n  const MAX_URL_LENGTH = 2048;\r\n\r\n  \/\/ === SECURITY: Rate limiting to prevent abuse ===\r\n  let lastAnalysisTime = 0;\r\n  const MIN_ANALYSIS_INTERVAL = 500;\r\n\r\n  \/\/ === SCORE THRESHOLDS ===\r\n  const SCORE_THRESHOLDS = {\r\n    safe: 80,      \/\/ 80-100 = risc sc\u0103zut\r\n    warning: 50    \/\/ 50-79 = aten\u021bie, 0-49 = pericol\r\n  };\r\n\r\n  \/\/ === BATCH LIMIT ===\r\n  const BATCH_LIMIT = 10;\r\n\r\n  \/\/ === Cloudflare Worker Proxy pentru API-uri fara CORS ===\r\n  \/\/ IMPORTANT: Inlocuieste cu URL-ul tau de Cloudflare Worker dupa deploy!\r\n  \/\/ Exemplu: 'https:\/\/zic-security-proxy.YOUR-SUBDOMAIN.workers.dev'\r\n  const CLOUDFLARE_PROXY = 'https:\/\/zic-security-proxy.red-tooth-f5c5.workers.dev';\r\n\r\n  \/\/ === API CONFIGURATION ===\r\n  \/\/ SECURITATE: Toate API keys sunt acum \u00een Cloudflare Worker (backend)\r\n  \/\/ Nu mai sunt expuse \u00een codul client\r\n  const API_CONFIG = {\r\n    \/\/ Google Safe Browsing API - prin Cloudflare Worker proxy (API key \u00een backend)\r\n    GOOGLE_SAFE_BROWSING: {\r\n      enabled: true,\r\n      useProxy: true\r\n    },\r\n    \/\/ VirusTotal API - prin Cloudflare Worker proxy\r\n    VIRUSTOTAL: {\r\n      enabled: true,\r\n      useProxy: true\r\n    },\r\n    \/\/ IPQualityScore API - prin Cloudflare Worker proxy\r\n    IPQUALITYSCORE: {\r\n      enabled: true,\r\n      useProxy: true\r\n    },\r\n    \/\/ URLhaus - prin Cloudflare Worker proxy\r\n    URLHAUS: {\r\n      enabled: true,\r\n      useProxy: true\r\n    },\r\n    \/\/ urlscan.io - prin Cloudflare Worker proxy\r\n    URLSCAN: {\r\n      enabled: true,\r\n      useProxy: true\r\n    },\r\n    \/\/ PhishTank - prin Cloudflare Worker proxy\r\n    PHISHTANK: {\r\n      enabled: true,\r\n      useProxy: true\r\n    },\r\n    \/\/ PhishStats - DEZACTIVAT (server down\/timeout)\r\n    PHISHSTATS: {\r\n      enabled: false,\r\n      useProxy: true\r\n    },\r\n    \/\/ === NOI VERIFIC\u0102RI v3 ===\r\n    \/\/ DNS Analysis - verific\u0103 DNS records\r\n    DNS: {\r\n      enabled: true,\r\n      useProxy: true\r\n    },\r\n    \/\/ GeoIP - loca\u021bia serverului\r\n    GEOIP: {\r\n      enabled: true,\r\n      useProxy: true\r\n    },\r\n    \/\/ WHOIS - v\u00e2rsta domeniului\r\n    WHOIS: {\r\n      enabled: true,\r\n      useProxy: true\r\n    },\r\n    \/\/ SSL Certificate validation\r\n    SSL: {\r\n      enabled: true,\r\n      useProxy: true\r\n    }\r\n  };\r\n\r\n  \/\/ === SECURITY: HTML Entity Encoding ===\r\n  function escapeHtml(text) {\r\n    if (typeof text !== 'string') return '';\r\n    const map = {\r\n      '&': '&amp;', '<': '&lt;', '>': '&gt;', '\"': '&quot;',\r\n      \"'\": '&#039;', '\/': '&#x2F;', '`': '&#x60;', '=': '&#x3D;'\r\n    };\r\n    return text.replace(\/[&<>\"'`=\\\/]\/g, s => map[s]);\r\n  }\r\n\r\n  \/\/ === ACCESSIBILITY: Screen Reader Announcements ===\r\n  function announceToSR(message, priority = 'polite') {\r\n    const srContainer = root.querySelector('[data-sr-status]');\r\n    if (!srContainer) return;\r\n    srContainer.setAttribute('aria-live', priority);\r\n    srContainer.textContent = '';\r\n    \/\/ Force reflow for announcement\r\n    requestAnimationFrame(() => {\r\n      srContainer.textContent = message;\r\n    });\r\n  }\r\n\r\n  function sanitizeInput(input) {\r\n    if (typeof input !== 'string') return '';\r\n    return input.replace(\/\\0\/g, '').replace(\/[\\x00-\\x08\\x0B\\x0C\\x0E-\\x1F\\x7F]\/g, '').trim().substring(0, MAX_URL_LENGTH);\r\n  }\r\n\r\n  function validateStatus(status) {\r\n    const allowedStatuses = ['pass', 'warn', 'fail'];\r\n    return allowedStatuses.includes(status) ? status : 'warn';\r\n  }\r\n\r\n  function containsDangerousPatterns(url) {\r\n    if (typeof url !== 'string') return true;\r\n    const dangerousPatterns = [\/^javascript:\/i, \/^data:\/i, \/^vbscript:\/i, \/^file:\/i, \/&#\/, \/%00\/, \/\\x00\/];\r\n    return dangerousPatterns.some(pattern => pattern.test(url));\r\n  }\r\n\r\n  const $ = (sel) => root.querySelector(sel);\r\n\r\n  const elements = {\r\n    urlInput: $('[data-field=\"urlInput\"]'),\r\n    errors: $('[data-errors]'),\r\n    scoreCard: $('[data-score-card]'),\r\n    analyzedUrl: $('[data-analyzed-url]'),\r\n    scoreDisplay: $('[data-score-display]'),\r\n    scoreCircle: $('[data-score-circle]'),\r\n    scoreNumber: $('[data-score-number]'),\r\n    scoreText: $('[data-score-text]'),\r\n    scoreDesc: $('[data-score-desc]'),\r\n    checksCard: $('[data-checks-card]'),\r\n    checksList: $('[data-checks-list]'),\r\n    apiStatus: $('[data-api-status]'),\r\n    loading: $('[data-loading]'),\r\n    apiGoogle: $('[data-api=\"google\"]'),\r\n    apiVirusTotal: $('[data-api=\"virustotal\"]'),\r\n    apiURLhaus: $('[data-api=\"urlhaus\"]'),\r\n    apiUrlscan: $('[data-api=\"urlscan\"]'),\r\n    apiPhishTank: $('[data-api=\"phishtank\"]'),\r\n    \/\/ Batch mode elements\r\n    batchMode: $('[data-field=\"batchMode\"]'),\r\n    singleInput: $('[data-single-input]'),\r\n    batchInput: $('[data-batch-input]'),\r\n    urlBatch: $('[data-field=\"urlBatch\"]'),\r\n    batchResults: $('[data-batch-results]'),\r\n    batchTbody: $('[data-batch-tbody]'),\r\n    exportButtons: $('[data-export-buttons]'),\r\n    \/\/ History elements\r\n    historySection: $('[data-history-section]'),\r\n    historyList: $('[data-history-list]'),\r\n    historyCount: $('[data-history-count]'),\r\n    historyBadge: $('[data-history-badge]'),\r\n    \/\/ QR Code elements\r\n    qrUpload: $('[data-field=\"qrUpload\"]'),\r\n    qrStatus: $('[data-qr-status]')\r\n  };\r\n\r\n  \/\/ Store last analysis for export\r\n  let lastAnalysis = null;\r\n  let lastBatchResults = [];\r\n\r\n  \/\/ === Loading Steps Tracking (v4.1) ===\r\n  const LOADING_STEPS = ['local', 'google', 'virustotal', 'urlhaus', 'urlscan', 'phishtank'];\r\n  let completedSteps = 0;\r\n\r\n  function updateLoadingStep(stepName, status) {\r\n    const stepEl = root.querySelector('[data-step=\"' + stepName + '\"]');\r\n    if (!stepEl) return;\r\n\r\n    const icon = stepEl.querySelector('[data-step-icon]');\r\n    stepEl.classList.remove('is-active', 'is-done', 'is-failed', 'is-timeout');\r\n\r\n    switch (status) {\r\n      case 'checking':\r\n        stepEl.classList.add('is-active');\r\n        if (icon) icon.textContent = '';\r\n        break;\r\n      case 'done':\r\n        stepEl.classList.add('is-done');\r\n        if (icon) icon.textContent = '\u2713';\r\n        completedSteps++;\r\n        updateLoadingProgress();\r\n        break;\r\n      case 'failed':\r\n        stepEl.classList.add('is-failed');\r\n        if (icon) icon.textContent = '\u2715';\r\n        completedSteps++;\r\n        updateLoadingProgress();\r\n        break;\r\n      case 'timeout':\r\n        stepEl.classList.add('is-timeout');\r\n        if (icon) icon.textContent = '!';\r\n        completedSteps++;\r\n        updateLoadingProgress();\r\n        break;\r\n    }\r\n  }\r\n\r\n  function updateLoadingProgress() {\r\n    const progressBar = root.querySelector('[data-progress-bar]');\r\n    const percentEl = root.querySelector('[data-loading-percent]');\r\n    const percent = Math.round((completedSteps \/ LOADING_STEPS.length) * 100);\r\n\r\n    if (progressBar) progressBar.style.width = percent + '%';\r\n    if (percentEl) percentEl.textContent = percent + '%';\r\n  }\r\n\r\n  function resetLoadingSteps() {\r\n    completedSteps = 0;\r\n    LOADING_STEPS.forEach(function(step) {\r\n      const stepEl = root.querySelector('[data-step=\"' + step + '\"]');\r\n      if (stepEl) {\r\n        stepEl.classList.remove('is-active', 'is-done', 'is-failed', 'is-timeout');\r\n        const icon = stepEl.querySelector('[data-step-icon]');\r\n        if (icon) icon.textContent = '';\r\n      }\r\n    });\r\n    updateLoadingProgress();\r\n  }\r\n\r\n  function updateApiStatus(apiElement, status) {\r\n    if (!apiElement) return;\r\n    const dot = apiElement.querySelector('.zic2__apiDot');\r\n    if (!dot) return;\r\n    dot.className = 'zic2__apiDot';\r\n    dot.classList.add('zic2__apiDot--' + status);\r\n  }\r\n\r\n  function resetApiStatus() {\r\n    updateApiStatus(elements.apiGoogle, 'pending');\r\n    updateApiStatus(elements.apiVirusTotal, 'pending');\r\n    updateApiStatus(elements.apiURLhaus, 'pending');\r\n    updateApiStatus(elements.apiUrlscan, 'pending');\r\n    updateApiStatus(elements.apiPhishTank, 'pending');\r\n  }\r\n\r\n  \/\/ === Known Brands Database ===\r\n  const knownBrands = Object.freeze([\r\n    'google', 'facebook', 'amazon', 'apple', 'microsoft', 'netflix', 'paypal',\r\n    'instagram', 'twitter', 'linkedin', 'whatsapp', 'telegram', 'yahoo', 'outlook',\r\n    'dropbox', 'adobe', 'spotify', 'uber', 'airbnb', 'booking', 'ebay', 'alibaba',\r\n    'walmart', 'target', 'bestbuy', 'costco', 'ikea', 'samsung', 'sony',\r\n    'chase', 'bankofamerica', 'wellsfargo', 'citibank', 'capitalone', 'americanexpress',\r\n    'visa', 'mastercard', 'stripe', 'venmo', 'coinbase', 'binance', 'blockchain',\r\n    'dhl', 'fedex', 'ups', 'usps', 'hbo', 'disney',\r\n    'youtube', 'tiktok', 'snapchat', 'pinterest', 'reddit', 'twitch', 'discord',\r\n    'zoom', 'slack', 'github', 'gitlab', 'wordpress', 'shopify', 'cloudflare', 'godaddy',\r\n    'bancatransilvania', 'btrl', 'raiffeisen', 'raiffeisenbank', 'bcr', 'brd', 'ing', 'ingbank',\r\n    'unicredit', 'cec', 'cecbank', 'alphabank', 'otpbank', 'otp', 'libra', 'librabank',\r\n    'garanti', 'intesa', 'firstbank', 'patria', 'patriabank', 'crediteurope', 'exim', 'eximbank',\r\n    'revolut', 'wise', 'tradeville', 'bvb',\r\n    'emag', 'altex', 'pcgarage', 'evomag', 'cel', 'mediagalaxy', 'flanco', 'domo', 'dedeman',\r\n    'leroy', 'leroymerlin', 'jysk', 'mobexpert', 'vivre', 'bonami', 'elefant', 'libris',\r\n    'carturesti', 'pepita', 'notino', 'douglas', 'sephora', 'fashiondays', 'aboutyou',\r\n    'answear', 'modivo', 'epantofi', 'sportisimo', 'decathlon', 'intersport', 'hervis',\r\n    'olx', 'publi24', 'autovit', 'storia', 'imobiliare', 'lajumate',\r\n    'orange', 'vodafone', 'digi', 'rcs', 'telekom', 'cosmote', 'enel', 'engie', 'eon',\r\n    'electrica', 'hidroelectrica', 'delgaz', 'distrigaz', 'apanova',\r\n    'fancourier', 'cargus', 'sameday', 'dpd', 'gls', 'urgentcargus', 'postaromana',\r\n    'cfr', 'tarom', 'wizz', 'wizzair', 'blueair', 'ryanair', 'flixbus',\r\n    'anaf', 'ghiseul', 'rovinieta', 'drpciv', 'cnas', 'ajofm', 'onrc', 'efactura', 'roalert',\r\n    'tazz', 'foodpanda', 'glovo', 'bolt', 'kaufland', 'lidl', 'carrefour', 'auchan',\r\n    'mega', 'megaimage', 'profi', 'penny', 'cora', 'selgros', 'metro',\r\n    'payu', 'netopia', 'mobilpay', 'smartbill', 'oblio', 'facturis', 'gomag'\r\n  ]);\r\n\r\n  \/\/ === ENHANCED HOMOGLYPH DATABASE v4.0 ===\r\n  \/\/ Covers: Cyrillic, Greek, Armenian, Math Alphanumeric, Fullwidth, Common substitutions\r\n  const homoglyphs = Object.freeze({\r\n    \/\/ Cyrillic lookalikes\r\n    '\\u0430': 'a', '\\u0435': 'e', '\\u043e': 'o', '\\u0440': 'p', '\\u0441': 'c', '\\u0445': 'x', '\\u0443': 'y',\r\n    '\\u0456': 'i', '\\u0458': 'j', '\\u0455': 's', '\\u0501': 'd', '\\u0261': 'g', '\\u0578': 'n', '\\u057d': 'u',\r\n    '\\u04bd': 'e', '\\u0432': 'b', '\\u043d': 'h', '\\u043a': 'k', '\\u043c': 'm', '\\u0442': 't',\r\n    '\\u0410': 'a', '\\u0412': 'b', '\\u0415': 'e', '\\u041a': 'k', '\\u041c': 'm', '\\u041d': 'h',\r\n    '\\u041e': 'o', '\\u0420': 'p', '\\u0421': 'c', '\\u0422': 't', '\\u0425': 'x', '\\u0443': 'y',\r\n    \/\/ Greek lookalikes\r\n    '\\u03b1': 'a', '\\u03b2': 'b', '\\u03b5': 'e', '\\u03b7': 'n', '\\u03b9': 'i', '\\u03ba': 'k',\r\n    '\\u03bd': 'v', '\\u03bf': 'o', '\\u03c1': 'p', '\\u03c3': 'o', '\\u03c4': 't', '\\u03c5': 'u',\r\n    '\\u03c7': 'x', '\\u03c9': 'w', '\\u0391': 'a', '\\u0392': 'b', '\\u0395': 'e', '\\u0397': 'h',\r\n    '\\u0399': 'i', '\\u039a': 'k', '\\u039c': 'm', '\\u039d': 'n', '\\u039f': 'o', '\\u03a1': 'p',\r\n    '\\u03a4': 't', '\\u03a7': 'x', '\\u03a5': 'y', '\\u03a9': 'w',\r\n    \/\/ Armenian lookalikes\r\n    '\\u0561': 'a', '\\u0562': 'b', '\\u0565': 'e', '\\u0568': 'n', '\\u056b': 'h', '\\u0570': 'h',\r\n    '\\u0571': 'j', '\\u0575': 'n', '\\u0578': 'n', '\\u057a': 'n', '\\u057c': 'o', '\\u057d': 'u',\r\n    \/\/ Math alphanumeric (script, bold, italic variants)\r\n    '\\u{1D41A}': 'a', '\\u{1D41B}': 'b', '\\u{1D41C}': 'c', '\\u{1D41D}': 'd', '\\u{1D41E}': 'e',\r\n    '\\u{1D41F}': 'f', '\\u{1D420}': 'g', '\\u{1D421}': 'h', '\\u{1D422}': 'i', '\\u{1D423}': 'j',\r\n    '\\u{1D424}': 'k', '\\u{1D425}': 'l', '\\u{1D426}': 'm', '\\u{1D427}': 'n', '\\u{1D428}': 'o',\r\n    '\\u{1D429}': 'p', '\\u{1D42A}': 'q', '\\u{1D42B}': 'r', '\\u{1D42C}': 's', '\\u{1D42D}': 't',\r\n    '\\u{1D42E}': 'u', '\\u{1D42F}': 'v', '\\u{1D430}': 'w', '\\u{1D42F}': 'x', '\\u{1D432}': 'y',\r\n    '\\u{1D433}': 'z',\r\n    \/\/ Fullwidth forms (CJK compatibility)\r\n    '\\uFF41': 'a', '\\uFF42': 'b', '\\uFF43': 'c', '\\uFF44': 'd', '\\uFF45': 'e', '\\uFF46': 'f',\r\n    '\\uFF47': 'g', '\\uFF48': 'h', '\\uFF49': 'i', '\\uFF4A': 'j', '\\uFF4B': 'k', '\\uFF4C': 'l',\r\n    '\\uFF4D': 'm', '\\uFF4E': 'n', '\\uFF4F': 'o', '\\uFF50': 'p', '\\uFF51': 'q', '\\uFF52': 'r',\r\n    '\\uFF53': 's', '\\uFF54': 't', '\\uFF55': 'u', '\\uFF56': 'v', '\\uFF57': 'w', '\\uFF58': 'x',\r\n    '\\uFF59': 'y', '\\uFF5A': 'z',\r\n    \/\/ Superscript\/subscript\r\n    '\\u1D43': 'a', '\\u1D47': 'b', '\\u1D48': 'd', '\\u1D49': 'e', '\\u1D4D': 'g', '\\u02B0': 'h',\r\n    '\\u2071': 'i', '\\u02B2': 'j', '\\u1D4F': 'k', '\\u02E1': 'l', '\\u1D50': 'm', '\\u207F': 'n',\r\n    '\\u1D52': 'o', '\\u1D56': 'p', '\\u02B3': 'r', '\\u02E2': 's', '\\u1D57': 't', '\\u1D58': 'u',\r\n    '\\u1D5B': 'v', '\\u02B7': 'w', '\\u02E3': 'x', '\\u02B8': 'y',\r\n    \/\/ IPA extensions\r\n    '\\u0251': 'a', '\\u0185': 'b', '\\u0269': 'l', '\\u028f': 'y', '\\u0254': 'c', '\\u0256': 'd',\r\n    '\\u025b': 'e', '\\u0263': 'g', '\\u026a': 'i', '\\u026f': 'm', '\\u0273': 'n', '\\u0275': 'o',\r\n    '\\u0279': 'r', '\\u0283': 's', '\\u0288': 't', '\\u028a': 'u', '\\u028b': 'v', '\\u0290': 'z',\r\n    \/\/ Common number\/symbol substitutions\r\n    '0': 'o', '1': 'l', '3': 'e', '4': 'a', '5': 's', '8': 'b', '9': 'g',\r\n    '@': 'a', '$': 's', '!': 'i', '|': 'l', '(': 'c', ')': 'd',\r\n    \/\/ Latin Extended lookalikes\r\n    '\\u0101': 'a', '\\u0103': 'a', '\\u00e0': 'a', '\\u00e1': 'a', '\\u00e2': 'a', '\\u00e3': 'a', '\\u00e4': 'a',\r\n    '\\u0113': 'e', '\\u0115': 'e', '\\u00e8': 'e', '\\u00e9': 'e', '\\u00ea': 'e', '\\u00eb': 'e',\r\n    '\\u012b': 'i', '\\u012d': 'i', '\\u00ec': 'i', '\\u00ed': 'i', '\\u00ee': 'i', '\\u00ef': 'i',\r\n    '\\u014d': 'o', '\\u014f': 'o', '\\u00f2': 'o', '\\u00f3': 'o', '\\u00f4': 'o', '\\u00f5': 'o', '\\u00f6': 'o',\r\n    '\\u016b': 'u', '\\u016d': 'u', '\\u00f9': 'u', '\\u00fa': 'u', '\\u00fb': 'u', '\\u00fc': 'u'\r\n  });\r\n\r\n  \/\/ Script ranges for detection logging\r\n  const SCRIPT_RANGES = {\r\n    cyrillic: { start: 0x0400, end: 0x04FF, name: 'Cyrillic' },\r\n    greek: { start: 0x0370, end: 0x03FF, name: 'Greek' },\r\n    armenian: { start: 0x0530, end: 0x058F, name: 'Armenian' },\r\n    mathAlphanumeric: { start: 0x1D400, end: 0x1D7FF, name: 'Math Alphanumeric' },\r\n    fullWidth: { start: 0xFF00, end: 0xFFEF, name: 'Fullwidth Forms' }\r\n  };\r\n\r\n  \/\/ Detect which scripts are present in a string\r\n  function detectScripts(str) {\r\n    const detected = new Set();\r\n    for (const char of str) {\r\n      const code = char.codePointAt(0);\r\n      for (const [script, range] of Object.entries(SCRIPT_RANGES)) {\r\n        if (code >= range.start && code <= range.end) {\r\n          detected.add(range.name);\r\n        }\r\n      }\r\n    }\r\n    return detected;\r\n  }\r\n\r\n  const suspiciousTLDs = Object.freeze([\r\n    '.tk', '.ml', '.ga', '.cf', '.gq', '.xyz', '.top', '.work', '.click',\r\n    '.link', '.buzz', '.monster', '.rest', '.icu', '.surf'\r\n  ]);\r\n\r\n  const romanianBrandsRequiringRO = Object.freeze([\r\n    'bancatransilvania', 'btrl', 'raiffeisen', 'raiffeisenbank', 'bcr', 'brd',\r\n    'unicredit', 'cec', 'cecbank', 'alphabank', 'otpbank', 'otp', 'libra', 'librabank',\r\n    'garanti', 'intesa', 'firstbank', 'patria', 'patriabank', 'crediteurope', 'exim', 'eximbank',\r\n    'anaf', 'ghiseul', 'rovinieta', 'drpciv', 'cnas', 'ajofm', 'onrc', 'efactura', 'roalert',\r\n    'emag', 'altex', 'pcgarage', 'evomag', 'cel', 'mediagalaxy', 'flanco', 'domo', 'dedeman',\r\n    'elefant', 'libris', 'carturesti',\r\n    'digi', 'rcs', 'telekom', 'cosmote', 'enel', 'engie', 'eon', 'electrica', 'hidroelectrica',\r\n    'delgaz', 'distrigaz', 'apanova',\r\n    'fancourier', 'cargus', 'sameday', 'urgentcargus', 'postaromana', 'cfr', 'tarom',\r\n    'olx', 'publi24', 'autovit', 'storia', 'imobiliare', 'lajumate',\r\n    'netopia', 'mobilpay', 'smartbill', 'oblio', 'facturis', 'gomag', 'megaimage'\r\n  ]);\r\n\r\n  const internationalBrandTLDs = Object.freeze({\r\n    'google': ['.com', '.ro', '.de', '.fr', '.co.uk', '.es', '.it'],\r\n    'gmail': ['.com'], 'youtube': ['.com'], 'facebook': ['.com'], 'instagram': ['.com'],\r\n    'whatsapp': ['.com'], 'microsoft': ['.com'], 'outlook': ['.com'], 'hotmail': ['.com'],\r\n    'apple': ['.com'], 'icloud': ['.com'],\r\n    'amazon': ['.com', '.de', '.co.uk', '.fr', '.es', '.it', '.ro'],\r\n    'paypal': ['.com'], 'stripe': ['.com'], 'twitter': ['.com'], 'linkedin': ['.com'],\r\n    'tiktok': ['.com'], 'snapchat': ['.com'], 'pinterest': ['.com'], 'reddit': ['.com'],\r\n    'discord': ['.com', '.gg'], 'twitch': ['.tv'], 'netflix': ['.com'], 'spotify': ['.com'],\r\n    'hbo': ['.com'], 'disney': ['.com'], 'github': ['.com'], 'gitlab': ['.com'],\r\n    'dropbox': ['.com'], 'adobe': ['.com'], 'zoom': ['.us'], 'slack': ['.com'],\r\n    'ebay': ['.com', '.de', '.co.uk', '.fr', '.es', '.it', '.ro'],\r\n    'alibaba': ['.com'], 'chase': ['.com'], 'visa': ['.com'], 'mastercard': ['.com'],\r\n    'coinbase': ['.com'], 'binance': ['.com'], 'booking': ['.com'], 'airbnb': ['.com'],\r\n    'dhl': ['.com', '.de', '.ro'], 'fedex': ['.com'], 'ups': ['.com']\r\n  });\r\n\r\n  const phishingKeywords = Object.freeze([\r\n    'login', 'signin', 'sign-in', 'log-in', 'secure', 'security', 'verify',\r\n    'verification', 'account', 'update', 'confirm', 'password', 'credential',\r\n    'suspend', 'suspended', 'locked', 'unlock', 'restore', 'recover', 'recovery',\r\n    'urgent', 'immediate', 'alert', 'warning', 'limited', 'expire', 'expired',\r\n    'validate', 'authenticate', 'banking', 'wallet', 'payment', 'invoice',\r\n    'refund', 'prize', 'winner', 'congratulation', 'selected', 'lucky',\r\n    'conectare', 'autentificare', 'parola', 'cont', 'verifica', 'verificare',\r\n    'actualizare', 'blocat', 'deblocare', 'recuperare', 'urgent', 'plata',\r\n    'factura', 'ramburs', 'castigator', 'premiu', 'felicitari'\r\n  ]);\r\n\r\n  \/\/ === Helper Functions ===\r\n  function normalizeForComparison(str) {\r\n    if (typeof str !== 'string') return '';\r\n    let normalized = str.toLowerCase();\r\n    for (const [homoglyph, letter] of Object.entries(homoglyphs)) {\r\n      normalized = normalized.split(homoglyph).join(letter);\r\n    }\r\n    return normalized;\r\n  }\r\n\r\n  function normalizeTyposquatting(str) {\r\n    if (typeof str !== 'string') return '';\r\n    return str.toLowerCase()\r\n      .replace(\/1\/g, 'l').replace(\/0\/g, 'o').replace(\/3\/g, 'e')\r\n      .replace(\/4\/g, 'a').replace(\/5\/g, 's').replace(\/\\$\/g, 's')\r\n      .replace(\/@\/g, 'a').replace(\/!\/g, 'i').replace(\/\\|\/g, 'l');\r\n  }\r\n\r\n  function findBrandWithSubstitutions(domain) {\r\n    const domainLower = domain.toLowerCase();\r\n    const normalizedDomain = normalizeTyposquatting(domainLower);\r\n    const results = [];\r\n\r\n    for (const brand of knownBrands) {\r\n      if (normalizedDomain.includes(brand) && !domainLower.includes(brand)) {\r\n        results.push({ brand, type: 'substitution', description: 'Domeniul contine caractere substituate care formeaza \"' + brand + '\"' });\r\n        continue;\r\n      }\r\n\r\n      const withIL = domainLower.replace(\/ll\/g, 'il');\r\n      const withLI = domainLower.replace(\/ll\/g, 'li');\r\n      const withM = domainLower.replace(\/rn\/g, 'm');\r\n      const withW = domainLower.replace(\/vv\/g, 'w');\r\n\r\n      if (withIL.includes(brand) && !domainLower.includes(brand)) {\r\n        results.push({ brand, type: 'double_letter', substitution: 'll \u2192 il', description: 'Domeniul imita \"' + brand + '\" folosind \"ll\" in loc de \"il\"' });\r\n      } else if (withLI.includes(brand) && !domainLower.includes(brand)) {\r\n        results.push({ brand, type: 'double_letter', substitution: 'll \u2192 li', description: 'Domeniul imita \"' + brand + '\" folosind \"ll\" in loc de \"li\"' });\r\n      } else if (withM.includes(brand) && !domainLower.includes(brand)) {\r\n        results.push({ brand, type: 'visual_trick', substitution: 'rn \u2192 m', description: 'Domeniul imita \"' + brand + '\" folosind \"rn\" care arata ca \"m\"' });\r\n      } else if (withW.includes(brand) && !domainLower.includes(brand)) {\r\n        results.push({ brand, type: 'visual_trick', substitution: 'vv \u2192 w', description: 'Domeniul imita \"' + brand + '\" folosind \"vv\" care arata ca \"w\"' });\r\n      }\r\n    }\r\n    return results;\r\n  }\r\n\r\n  function checkWithoutHyphens(domain) {\r\n    const domainLower = domain.toLowerCase();\r\n    const withoutHyphens = domainLower.replace(\/-\/g, '');\r\n    const results = [];\r\n\r\n    let domainName = domainLower.startsWith('www.') ? domainLower.substring(4) : domainLower;\r\n    const domainNameWithoutTLD = domainName.split('.')[0] || '';\r\n\r\n    if (knownBrands.includes(domainNameWithoutTLD)) return results;\r\n\r\n    for (const brand of knownBrands) {\r\n      if (brand.includes('-')) continue;\r\n      if (withoutHyphens.includes(brand) && !domainLower.replace(\/[^a-z]\/g, '').startsWith(brand)) {\r\n        const brandPattern = brand.split('').join('-?');\r\n        const regex = new RegExp(brandPattern);\r\n        if (regex.test(domainLower) && domainLower.includes('-')) {\r\n          results.push({ brand, description: 'Brandul \"' + brand + '\" este fragmentat cu cratime pentru a evita detectia' });\r\n        }\r\n      }\r\n    }\r\n    return results;\r\n  }\r\n\r\n  function levenshteinDistance(str1, str2) {\r\n    if (typeof str1 !== 'string' || typeof str2 !== 'string') return Infinity;\r\n    const s1 = str1.substring(0, 100), s2 = str2.substring(0, 100);\r\n    const m = s1.length, n = s2.length;\r\n    const dp = Array(m + 1).fill(null).map(() => Array(n + 1).fill(0));\r\n    for (let i = 0; i <= m; i++) dp[i][0] = i;\r\n    for (let j = 0; j <= n; j++) dp[0][j] = j;\r\n    for (let i = 1; i <= m; i++) {\r\n      for (let j = 1; j <= n; j++) {\r\n        dp[i][j] = s1[i - 1] === s2[j - 1] ? dp[i - 1][j - 1] : 1 + Math.min(dp[i - 1][j], dp[i][j - 1], dp[i - 1][j - 1]);\r\n      }\r\n    }\r\n    return dp[m][n];\r\n  }\r\n\r\n  \/\/ === Advanced Typosquatting Algorithms (v4.0) ===\r\n\r\n  \/\/ Jaro-Winkler similarity - better for prefix matching (brand spoofing)\r\n  function jaroWinklerSimilarity(s1, s2) {\r\n    if (typeof s1 !== 'string' || typeof s2 !== 'string') return 0;\r\n    if (s1 === s2) return 1;\r\n    s1 = s1.substring(0, 100);\r\n    s2 = s2.substring(0, 100);\r\n\r\n    const len1 = s1.length, len2 = s2.length;\r\n    if (len1 === 0 || len2 === 0) return 0;\r\n\r\n    const matchWindow = Math.floor(Math.max(len1, len2) \/ 2) - 1;\r\n    const s1Matches = new Array(len1).fill(false);\r\n    const s2Matches = new Array(len2).fill(false);\r\n\r\n    let matches = 0;\r\n    let transpositions = 0;\r\n\r\n    \/\/ Find matches\r\n    for (let i = 0; i < len1; i++) {\r\n      const start = Math.max(0, i - matchWindow);\r\n      const end = Math.min(i + matchWindow + 1, len2);\r\n      for (let j = start; j < end; j++) {\r\n        if (s2Matches[j] || s1[i] !== s2[j]) continue;\r\n        s1Matches[i] = true;\r\n        s2Matches[j] = true;\r\n        matches++;\r\n        break;\r\n      }\r\n    }\r\n\r\n    if (matches === 0) return 0;\r\n\r\n    \/\/ Count transpositions\r\n    let k = 0;\r\n    for (let i = 0; i < len1; i++) {\r\n      if (!s1Matches[i]) continue;\r\n      while (!s2Matches[k]) k++;\r\n      if (s1[i] !== s2[k]) transpositions++;\r\n      k++;\r\n    }\r\n\r\n    const jaro = (matches \/ len1 + matches \/ len2 + (matches - transpositions \/ 2) \/ matches) \/ 3;\r\n\r\n    \/\/ Winkler modification: boost for common prefix\r\n    let prefix = 0;\r\n    for (let i = 0; i < Math.min(4, Math.min(len1, len2)); i++) {\r\n      if (s1[i] === s2[i]) prefix++;\r\n      else break;\r\n    }\r\n\r\n    return jaro + prefix * 0.1 * (1 - jaro);\r\n  }\r\n\r\n  \/\/ Keyboard proximity map (QWERTY layout)\r\n  const KEYBOARD_NEIGHBORS = Object.freeze({\r\n    'q': ['w', 'a', '1', '2'],\r\n    'w': ['q', 'e', 'a', 's', '2', '3'],\r\n    'e': ['w', 'r', 's', 'd', '3', '4'],\r\n    'r': ['e', 't', 'd', 'f', '4', '5'],\r\n    't': ['r', 'y', 'f', 'g', '5', '6'],\r\n    'y': ['t', 'u', 'g', 'h', '6', '7'],\r\n    'u': ['y', 'i', 'h', 'j', '7', '8'],\r\n    'i': ['u', 'o', 'j', 'k', '8', '9'],\r\n    'o': ['i', 'p', 'k', 'l', '9', '0'],\r\n    'p': ['o', 'l', '0'],\r\n    'a': ['q', 'w', 's', 'z'],\r\n    's': ['a', 'w', 'e', 'd', 'z', 'x'],\r\n    'd': ['s', 'e', 'r', 'f', 'x', 'c'],\r\n    'f': ['d', 'r', 't', 'g', 'c', 'v'],\r\n    'g': ['f', 't', 'y', 'h', 'v', 'b'],\r\n    'h': ['g', 'y', 'u', 'j', 'b', 'n'],\r\n    'j': ['h', 'u', 'i', 'k', 'n', 'm'],\r\n    'k': ['j', 'i', 'o', 'l', 'm'],\r\n    'l': ['k', 'o', 'p'],\r\n    'z': ['a', 's', 'x'],\r\n    'x': ['z', 's', 'd', 'c'],\r\n    'c': ['x', 'd', 'f', 'v'],\r\n    'v': ['c', 'f', 'g', 'b'],\r\n    'b': ['v', 'g', 'h', 'n'],\r\n    'n': ['b', 'h', 'j', 'm'],\r\n    'm': ['n', 'j', 'k'],\r\n    '1': ['2', 'q'],\r\n    '2': ['1', '3', 'q', 'w'],\r\n    '3': ['2', '4', 'w', 'e'],\r\n    '4': ['3', '5', 'e', 'r'],\r\n    '5': ['4', '6', 'r', 't'],\r\n    '6': ['5', '7', 't', 'y'],\r\n    '7': ['6', '8', 'y', 'u'],\r\n    '8': ['7', '9', 'u', 'i'],\r\n    '9': ['8', '0', 'i', 'o'],\r\n    '0': ['9', 'o', 'p']\r\n  });\r\n\r\n  function isKeyboardNeighbor(char1, char2) {\r\n    const c1 = char1.toLowerCase(), c2 = char2.toLowerCase();\r\n    return KEYBOARD_NEIGHBORS[c1]?.includes(c2) || false;\r\n  }\r\n\r\n  \/\/ Detect \"fat finger\" typos using keyboard proximity\r\n  function detectKeyboardTypo(domain, brand) {\r\n    if (domain.length !== brand.length) return null;\r\n    let typoCount = 0;\r\n    let typoPositions = [];\r\n\r\n    for (let i = 0; i < domain.length; i++) {\r\n      if (domain[i] !== brand[i]) {\r\n        if (isKeyboardNeighbor(domain[i], brand[i])) {\r\n          typoCount++;\r\n          typoPositions.push(i);\r\n        } else {\r\n          return null; \/\/ Non-keyboard typo\r\n        }\r\n      }\r\n    }\r\n\r\n    if (typoCount > 0 && typoCount <= 2) {\r\n      return {\r\n        brand,\r\n        typoCount,\r\n        typoPositions,\r\n        type: 'keyboard_typo',\r\n        description: 'Posibil\u0103 eroare de tastare: \"' + domain + '\" vs \"' + brand + '\" (taste adiacente)'\r\n      };\r\n    }\r\n    return null;\r\n  }\r\n\r\n  \/\/ Pattern detection: repetition (gooogle), omission (gogle), transposition (googel), vowel swap (guugle)\r\n  const VOWELS = new Set(['a', 'e', 'i', 'o', 'u']);\r\n\r\n  function detectRepetition(domain, brand) {\r\n    \/\/ Check if domain has repeated chars that brand doesn't\r\n    const domainCollapsed = domain.replace(\/(.)\\1+\/g, '$1');\r\n    if (domainCollapsed === brand && domain !== brand) {\r\n      return {\r\n        brand,\r\n        type: 'repetition',\r\n        description: 'Litere repetate detectate: \"' + domain + '\" \u2192 \"' + brand + '\"'\r\n      };\r\n    }\r\n    return null;\r\n  }\r\n\r\n  function detectOmission(domain, brand) {\r\n    \/\/ Check if domain is brand with one char removed\r\n    if (domain.length !== brand.length - 1) return null;\r\n    for (let i = 0; i < brand.length; i++) {\r\n      const modified = brand.slice(0, i) + brand.slice(i + 1);\r\n      if (modified === domain) {\r\n        return {\r\n          brand,\r\n          type: 'omission',\r\n          description: 'Caracter lips\u0103: \"' + domain + '\" (lipse\u0219te \"' + brand[i] + '\" din \"' + brand + '\")'\r\n        };\r\n      }\r\n    }\r\n    return null;\r\n  }\r\n\r\n  function detectTransposition(domain, brand) {\r\n    \/\/ Check if domain is brand with two adjacent chars swapped\r\n    if (domain.length !== brand.length) return null;\r\n    let diffCount = 0;\r\n    let diffPositions = [];\r\n    for (let i = 0; i < domain.length; i++) {\r\n      if (domain[i] !== brand[i]) {\r\n        diffCount++;\r\n        diffPositions.push(i);\r\n      }\r\n    }\r\n    if (diffCount === 2 && diffPositions[1] === diffPositions[0] + 1) {\r\n      if (domain[diffPositions[0]] === brand[diffPositions[1]] &&\r\n          domain[diffPositions[1]] === brand[diffPositions[0]]) {\r\n        return {\r\n          brand,\r\n          type: 'transposition',\r\n          description: 'Litere inversate: \"' + domain + '\" vs \"' + brand + '\"'\r\n        };\r\n      }\r\n    }\r\n    return null;\r\n  }\r\n\r\n  function detectVowelSwap(domain, brand) {\r\n    \/\/ Check if domain differs only by vowel substitution\r\n    if (domain.length !== brand.length) return null;\r\n    let vowelSwaps = 0;\r\n    let otherDiffs = 0;\r\n    for (let i = 0; i < domain.length; i++) {\r\n      if (domain[i] !== brand[i]) {\r\n        if (VOWELS.has(domain[i]) && VOWELS.has(brand[i])) {\r\n          vowelSwaps++;\r\n        } else {\r\n          otherDiffs++;\r\n        }\r\n      }\r\n    }\r\n    if (vowelSwaps > 0 && vowelSwaps <= 2 && otherDiffs === 0) {\r\n      return {\r\n        brand,\r\n        type: 'vowel_swap',\r\n        description: 'Vocale substituite: \"' + domain + '\" vs \"' + brand + '\"'\r\n      };\r\n    }\r\n    return null;\r\n  }\r\n\r\n  \/\/ Combined advanced typosquatting check\r\n  function advancedTyposquatCheck(domain, brands) {\r\n    const results = [];\r\n    const domainLower = domain.toLowerCase();\r\n\r\n    for (const brand of brands) {\r\n      \/\/ Skip exact matches\r\n      if (domainLower === brand) continue;\r\n\r\n      \/\/ 1. Jaro-Winkler (prefix-focused similarity)\r\n      const jwScore = jaroWinklerSimilarity(domainLower, brand);\r\n      if (jwScore >= 0.85 && jwScore < 1) {\r\n        results.push({\r\n          brand,\r\n          score: jwScore,\r\n          type: 'jaro_winkler',\r\n          description: 'Similaritate ridicat\u0103 (' + Math.round(jwScore * 100) + '%) cu brandul \"' + brand + '\"'\r\n        });\r\n        continue;\r\n      }\r\n\r\n      \/\/ 2. Keyboard proximity typo\r\n      const keyboardMatch = detectKeyboardTypo(domainLower, brand);\r\n      if (keyboardMatch) {\r\n        results.push(keyboardMatch);\r\n        continue;\r\n      }\r\n\r\n      \/\/ 3. Pattern detection\r\n      const repetition = detectRepetition(domainLower, brand);\r\n      if (repetition) { results.push(repetition); continue; }\r\n\r\n      const omission = detectOmission(domainLower, brand);\r\n      if (omission) { results.push(omission); continue; }\r\n\r\n      const transposition = detectTransposition(domainLower, brand);\r\n      if (transposition) { results.push(transposition); continue; }\r\n\r\n      const vowelSwap = detectVowelSwap(domainLower, brand);\r\n      if (vowelSwap) { results.push(vowelSwap); continue; }\r\n    }\r\n\r\n    \/\/ Sort by score (Jaro-Winkler) descending\r\n    return results.sort((a, b) => (b.score || 0) - (a.score || 0));\r\n  }\r\n\r\n  \/\/ === API Response Cache (v4.0) ===\r\n  const CACHE_CONFIG = {\r\n    PREFIX: 'zic_api_cache_',\r\n    TTL: {\r\n      google: 60 * 60 * 1000,       \/\/ 1 hour\r\n      virustotal: 60 * 60 * 1000,   \/\/ 1 hour\r\n      urlhaus: 30 * 60 * 1000,      \/\/ 30 minutes (updates frequently)\r\n      urlscan: 2 * 60 * 60 * 1000,  \/\/ 2 hours\r\n      phishtank: 30 * 60 * 1000,    \/\/ 30 minutes\r\n      whois: 24 * 60 * 60 * 1000,   \/\/ 24 hours (rarely changes)\r\n      geoip: 24 * 60 * 60 * 1000,   \/\/ 24 hours\r\n      dns: 6 * 60 * 60 * 1000,      \/\/ 6 hours\r\n      ssl: 24 * 60 * 60 * 1000      \/\/ 24 hours\r\n    },\r\n    MAX_ENTRIES: 200\r\n  };\r\n\r\n  const apiCache = {\r\n    _hash(str) {\r\n      let hash = 0;\r\n      for (let i = 0; i < str.length; i++) {\r\n        const char = str.charCodeAt(i);\r\n        hash = ((hash << 5) - hash) + char;\r\n        hash = hash & hash;\r\n      }\r\n      return Math.abs(hash).toString(36);\r\n    },\r\n\r\n    _getKey(apiName, url) {\r\n      return CACHE_CONFIG.PREFIX + apiName + '_' + this._hash(url);\r\n    },\r\n\r\n    get(apiName, url) {\r\n      try {\r\n        const key = this._getKey(apiName, url);\r\n        const cached = localStorage.getItem(key);\r\n        if (!cached) return null;\r\n\r\n        const { data, timestamp } = JSON.parse(cached);\r\n        const ttl = CACHE_CONFIG.TTL[apiName] || 60 * 60 * 1000;\r\n\r\n        if (Date.now() - timestamp > ttl) {\r\n          localStorage.removeItem(key);\r\n          return null;\r\n        }\r\n\r\n        return { ...data, fromCache: true };\r\n      } catch (e) {\r\n        return null;\r\n      }\r\n    },\r\n\r\n    set(apiName, url, data) {\r\n      try {\r\n        \/\/ Don't cache errors\r\n        if (data.error || !data.checked) return;\r\n\r\n        const key = this._getKey(apiName, url);\r\n        const entry = {\r\n          data: data,\r\n          timestamp: Date.now()\r\n        };\r\n        localStorage.setItem(key, JSON.stringify(entry));\r\n        this._enforceMaxEntries();\r\n      } catch (e) {\r\n        \/\/ localStorage full - clean old entries\r\n        this._cleanOldest(50);\r\n      }\r\n    },\r\n\r\n    _enforceMaxEntries() {\r\n      const entries = [];\r\n      const prefix = CACHE_CONFIG.PREFIX;\r\n\r\n      for (let i = 0; i < localStorage.length; i++) {\r\n        const key = localStorage.key(i);\r\n        if (key && key.startsWith(prefix)) {\r\n          try {\r\n            const { timestamp } = JSON.parse(localStorage.getItem(key));\r\n            entries.push({ key, timestamp });\r\n          } catch (e) {}\r\n        }\r\n      }\r\n\r\n      if (entries.length > CACHE_CONFIG.MAX_ENTRIES) {\r\n        entries.sort((a, b) => a.timestamp - b.timestamp);\r\n        const toRemove = entries.slice(0, entries.length - CACHE_CONFIG.MAX_ENTRIES);\r\n        toRemove.forEach(e => localStorage.removeItem(e.key));\r\n      }\r\n    },\r\n\r\n    _cleanOldest(count) {\r\n      const entries = [];\r\n      const prefix = CACHE_CONFIG.PREFIX;\r\n\r\n      for (let i = 0; i < localStorage.length; i++) {\r\n        const key = localStorage.key(i);\r\n        if (key && key.startsWith(prefix)) {\r\n          try {\r\n            const { timestamp } = JSON.parse(localStorage.getItem(key));\r\n            entries.push({ key, timestamp });\r\n          } catch (e) {\r\n            localStorage.removeItem(key);\r\n          }\r\n        }\r\n      }\r\n\r\n      entries.sort((a, b) => a.timestamp - b.timestamp);\r\n      entries.slice(0, count).forEach(e => localStorage.removeItem(e.key));\r\n    }\r\n  };\r\n\r\n  \/\/ === API Timeout Handler (v4.0) ===\r\n  const API_TIMEOUTS = {\r\n    google: 8000,\r\n    virustotal: 10000,\r\n    urlhaus: 5000,\r\n    urlscan: 8000,\r\n    phishtank: 8000,\r\n    whois: 12000,\r\n    geoip: 5000,\r\n    dns: 5000,\r\n    ssl: 15000,\r\n    default: 10000\r\n  };\r\n\r\n  async function fetchWithTimeout(url, options = {}, apiName = 'default') {\r\n    const timeout = API_TIMEOUTS[apiName] || API_TIMEOUTS.default;\r\n    const controller = new AbortController();\r\n    const timeoutId = setTimeout(() => controller.abort(), timeout);\r\n\r\n    try {\r\n      const response = await fetch(url, {\r\n        ...options,\r\n        signal: controller.signal\r\n      });\r\n      clearTimeout(timeoutId);\r\n      return response;\r\n    } catch (error) {\r\n      clearTimeout(timeoutId);\r\n      if (error.name === 'AbortError') {\r\n        throw new Error('Timeout after ' + timeout + 'ms');\r\n      }\r\n      throw error;\r\n    }\r\n  }\r\n\r\n  \/\/ === API Functions ===\r\n\r\n  \/\/ Google Safe Browsing - prin Cloudflare Worker proxy (API key securizat\u0103 \u00een backend)\r\n  async function checkGoogleSafeBrowsing(url) {\r\n    if (!API_CONFIG.GOOGLE_SAFE_BROWSING.enabled) {\r\n      return { checked: false };\r\n    }\r\n\r\n    \/\/ Check cache first\r\n    const cached = apiCache.get('google', url);\r\n    if (cached) return cached;\r\n\r\n    try {\r\n      const response = await fetchWithTimeout(\r\n        CLOUDFLARE_PROXY + '\/google-safebrowsing?url=' + encodeURIComponent(url),\r\n        { method: 'GET', headers: { 'Accept': 'application\/json' } },\r\n        'google'\r\n      );\r\n\r\n      if (!response.ok) return { checked: false, error: 'API error: ' + response.status };\r\n\r\n      const data = await response.json();\r\n\r\n      if (data.error) {\r\n        return { checked: false, error: data.error };\r\n      }\r\n\r\n      const result = {\r\n        checked: data.checked || false,\r\n        safe: data.safe !== false,\r\n        threats: data.threats || [],\r\n        source: data.source || 'Google Safe Browsing'\r\n      };\r\n\r\n      \/\/ Cache successful result\r\n      apiCache.set('google', url, result);\r\n      return result;\r\n    } catch (error) {\r\n      console.warn('Google Safe Browsing check failed:', error);\r\n      return { checked: false, error: error.message };\r\n    }\r\n  }\r\n\r\n  \/\/ VirusTotal - prin Cloudflare Worker proxy\r\n  async function checkVirusTotal(url) {\r\n    if (!API_CONFIG.VIRUSTOTAL.enabled) {\r\n      return { checked: false };\r\n    }\r\n\r\n    \/\/ Check cache first\r\n    const cached = apiCache.get('virustotal', url);\r\n    if (cached) return cached;\r\n\r\n    try {\r\n      const response = await fetchWithTimeout(\r\n        CLOUDFLARE_PROXY + '\/virustotal?url=' + encodeURIComponent(url),\r\n        { method: 'GET', headers: { 'Accept': 'application\/json' } },\r\n        'virustotal'\r\n      );\r\n\r\n      if (!response.ok) {\r\n        return { checked: false, error: 'API error: ' + response.status };\r\n      }\r\n\r\n      const data = await response.json();\r\n\r\n      if (data.error) {\r\n        return { checked: false, error: data.error };\r\n      }\r\n\r\n      let result;\r\n      const stats = data.data?.attributes?.last_analysis_stats;\r\n      if (stats) {\r\n        const malicious = stats.malicious || 0;\r\n        const suspicious = stats.suspicious || 0;\r\n        const total = Object.values(stats).reduce((a, b) => a + b, 0);\r\n        result = { checked: true, safe: malicious === 0 && suspicious === 0, malicious, suspicious, total, source: 'VirusTotal' };\r\n      } else {\r\n        result = { checked: true, safe: true, source: 'VirusTotal' };\r\n      }\r\n\r\n      apiCache.set('virustotal', url, result);\r\n      return result;\r\n    } catch (error) {\r\n      console.warn('VirusTotal check failed:', error);\r\n      return { checked: false, error: error.message };\r\n    }\r\n  }\r\n\r\n  \/\/ IPQualityScore - prin Cloudflare Worker proxy\r\n  async function checkIPQualityScore(url) {\r\n    if (!API_CONFIG.IPQUALITYSCORE.enabled) {\r\n      return { checked: false };\r\n    }\r\n    try {\r\n      const response = await fetch(\r\n        CLOUDFLARE_PROXY + '\/ipqs?url=' + encodeURIComponent(url),\r\n        { method: 'GET', headers: { 'Accept': 'application\/json' } }\r\n      );\r\n\r\n      if (!response.ok) return { checked: false, error: 'API error: ' + response.status };\r\n\r\n      const data = await response.json();\r\n\r\n      if (data.error) {\r\n        return { checked: false, error: data.error };\r\n      }\r\n\r\n      if (data.success) {\r\n        return {\r\n          checked: true,\r\n          safe: !data.unsafe && !data.phishing && !data.malware,\r\n          riskScore: data.risk_score || 0,\r\n          phishing: data.phishing || false,\r\n          malware: data.malware || false,\r\n          suspicious: data.suspicious || false,\r\n          source: 'IPQualityScore'\r\n        };\r\n      }\r\n      return { checked: false, error: data.message || 'Unknown error' };\r\n    } catch (error) {\r\n      console.warn('IPQualityScore check failed:', error);\r\n      return { checked: false, error: error.message };\r\n    }\r\n  }\r\n\r\n  \/\/ URLhaus - prin Cloudflare Worker proxy (cu fallback la API direct CORS-enabled)\r\n  async function checkURLhaus(url) {\r\n    if (!API_CONFIG.URLHAUS.enabled) {\r\n      return { checked: false };\r\n    }\r\n\r\n    \/\/ Check cache first\r\n    const cached = apiCache.get('urlhaus', url);\r\n    if (cached) return cached;\r\n\r\n    try {\r\n      \/\/ Try direct API first (URLhaus supports CORS)\r\n      let response;\r\n      try {\r\n        response = await fetchWithTimeout('https:\/\/urlhaus-api.abuse.ch\/v1\/url\/', {\r\n          method: 'POST',\r\n          headers: { 'Content-Type': 'application\/x-www-form-urlencoded' },\r\n          body: 'url=' + encodeURIComponent(url)\r\n        }, 'urlhaus');\r\n      } catch (directError) {\r\n        \/\/ Fallback to proxy if direct fails\r\n        response = await fetchWithTimeout(CLOUDFLARE_PROXY + '\/urlhaus', {\r\n          method: 'POST',\r\n          headers: { 'Content-Type': 'application\/x-www-form-urlencoded' },\r\n          body: 'url=' + encodeURIComponent(url)\r\n        }, 'urlhaus');\r\n      }\r\n\r\n      if (!response.ok) return { checked: false, error: 'API error: ' + response.status };\r\n\r\n      const data = await response.json();\r\n\r\n      if (data.error) {\r\n        return { checked: false, error: data.error };\r\n      }\r\n\r\n      let result;\r\n      if (data.query_status === 'ok') {\r\n        result = {\r\n          checked: true,\r\n          safe: false,\r\n          threat: data.threat || 'malware',\r\n          tags: data.tags || [],\r\n          dateAdded: data.date_added,\r\n          source: 'URLhaus (abuse.ch)'\r\n        };\r\n      } else if (data.query_status === 'no_results') {\r\n        result = { checked: true, safe: true, source: 'URLhaus (abuse.ch)' };\r\n      } else {\r\n        return { checked: false, error: data.query_status };\r\n      }\r\n\r\n      apiCache.set('urlhaus', url, result);\r\n      return result;\r\n    } catch (error) {\r\n      console.warn('URLhaus check failed:', error);\r\n      return { checked: false, error: error.message };\r\n    }\r\n  }\r\n\r\n  \/\/ urlscan.io - prin Cloudflare Worker proxy\r\n  async function checkUrlscan(url) {\r\n    if (!API_CONFIG.URLSCAN.enabled) {\r\n      return { checked: false };\r\n    }\r\n    try {\r\n      const response = await fetch(\r\n        CLOUDFLARE_PROXY + '\/urlscan?url=' + encodeURIComponent(url),\r\n        { method: 'GET', headers: { 'Accept': 'application\/json' } }\r\n      );\r\n\r\n      if (!response.ok) return { checked: false, error: 'API error: ' + response.status };\r\n\r\n      const data = await response.json();\r\n\r\n      if (data.error) {\r\n        return { checked: false, error: data.error };\r\n      }\r\n\r\n      return {\r\n        checked: true,\r\n        safe: !data.malicious,\r\n        found: data.found || false,\r\n        total: data.total || 0,\r\n        verdicts: data.verdicts || [],\r\n        source: 'urlscan.io'\r\n      };\r\n    } catch (error) {\r\n      console.warn('urlscan.io check failed:', error);\r\n      return { checked: false, error: error.message };\r\n    }\r\n  }\r\n\r\n  \/\/ PhishTank - prin Cloudflare Worker proxy\r\n  async function checkPhishTank(url) {\r\n    if (!API_CONFIG.PHISHTANK.enabled) {\r\n      return { checked: false };\r\n    }\r\n\r\n    \/\/ Check cache first\r\n    const cached = apiCache.get('phishtank', url);\r\n    if (cached) return cached;\r\n\r\n    try {\r\n      const response = await fetchWithTimeout(CLOUDFLARE_PROXY + '\/phishtank', {\r\n        method: 'POST',\r\n        headers: { 'Content-Type': 'application\/x-www-form-urlencoded' },\r\n        body: 'url=' + encodeURIComponent(url)\r\n      }, 'phishtank');\r\n\r\n      if (!response.ok) {\r\n        if (response.status === 429) {\r\n          return { checked: false, error: 'Rate limit exceeded' };\r\n        }\r\n        return { checked: false, error: 'API error: ' + response.status };\r\n      }\r\n\r\n      const data = await response.json();\r\n\r\n      if (data.error) {\r\n        return { checked: false, error: data.error };\r\n      }\r\n\r\n      const result = {\r\n        checked: true,\r\n        safe: !data.in_database || !data.verified,\r\n        inDatabase: data.in_database || false,\r\n        verified: data.verified || false,\r\n        phishId: data.phish_id,\r\n        source: 'PhishTank (Cisco)'\r\n      };\r\n\r\n      apiCache.set('phishtank', url, result);\r\n      return result;\r\n    } catch (error) {\r\n      console.warn('PhishTank check failed:', error);\r\n      return { checked: false, error: error.message };\r\n    }\r\n  }\r\n\r\n  \/\/ PhishStats - prin Cloudflare Worker proxy\r\n  async function checkPhishStats(url) {\r\n    if (!API_CONFIG.PHISHSTATS.enabled) {\r\n      return { checked: false };\r\n    }\r\n    try {\r\n      const response = await fetch(\r\n        CLOUDFLARE_PROXY + '\/phishstats?url=' + encodeURIComponent(url),\r\n        { method: 'GET', headers: { 'Accept': 'application\/json' } }\r\n      );\r\n\r\n      if (!response.ok) return { checked: false, error: 'API error: ' + response.status };\r\n\r\n      const data = await response.json();\r\n\r\n      if (data.error) {\r\n        return { checked: false, error: data.error };\r\n      }\r\n\r\n      return {\r\n        checked: true,\r\n        safe: !data.malicious,\r\n        found: data.found || false,\r\n        total: data.total || 0,\r\n        threats: data.threats || [],\r\n        source: 'PhishStats'\r\n      };\r\n    } catch (error) {\r\n      console.warn('PhishStats check failed:', error);\r\n      return { checked: false, error: error.message };\r\n    }\r\n  }\r\n\r\n  \/\/ === NOI VERIFIC\u0102RI v3 ===\r\n\r\n  \/\/ DNS Analysis - verific\u0103 DNS records\r\n  async function checkDNS(url) {\r\n    if (!API_CONFIG.DNS.enabled) {\r\n      return { checked: false };\r\n    }\r\n    try {\r\n      const response = await fetch(\r\n        CLOUDFLARE_PROXY + '\/dns?url=' + encodeURIComponent(url),\r\n        { method: 'GET', headers: { 'Accept': 'application\/json' } }\r\n      );\r\n\r\n      if (!response.ok) return { checked: false, error: 'API error: ' + response.status };\r\n\r\n      const data = await response.json();\r\n\r\n      if (data.error) {\r\n        return { checked: false, error: data.error };\r\n      }\r\n\r\n      \/\/ Analiz\u0103: domeniu f\u0103r\u0103 MX records sau f\u0103r\u0103 SPF poate fi suspect\r\n      const suspicious = !data.analysis?.hasMailServers && !data.analysis?.hasSpf;\r\n\r\n      return {\r\n        checked: true,\r\n        domain: data.domain,\r\n        records: data.records,\r\n        analysis: data.analysis,\r\n        suspicious: suspicious,\r\n        source: 'DNS Analysis'\r\n      };\r\n    } catch (error) {\r\n      console.warn('DNS check failed:', error);\r\n      return { checked: false, error: error.message };\r\n    }\r\n  }\r\n\r\n  \/\/ GeoIP - loca\u021bia serverului\r\n  async function checkGeoIP(url) {\r\n    if (!API_CONFIG.GEOIP.enabled) {\r\n      return { checked: false };\r\n    }\r\n    try {\r\n      const response = await fetch(\r\n        CLOUDFLARE_PROXY + '\/geoip?url=' + encodeURIComponent(url),\r\n        { method: 'GET', headers: { 'Accept': 'application\/json' } }\r\n      );\r\n\r\n      if (!response.ok) return { checked: false, error: 'API error: ' + response.status };\r\n\r\n      const data = await response.json();\r\n\r\n      if (data.error) {\r\n        return { checked: false, error: data.error };\r\n      }\r\n\r\n      return {\r\n        checked: true,\r\n        ip: data.ip,\r\n        location: data.location,\r\n        network: data.network,\r\n        source: 'GeoIP'\r\n      };\r\n    } catch (error) {\r\n      console.warn('GeoIP check failed:', error);\r\n      return { checked: false, error: error.message };\r\n    }\r\n  }\r\n\r\n  \/\/ WHOIS - v\u00e2rsta domeniului\r\n  async function checkWHOIS(url) {\r\n    if (!API_CONFIG.WHOIS.enabled) {\r\n      return { checked: false };\r\n    }\r\n    try {\r\n      const response = await fetch(\r\n        CLOUDFLARE_PROXY + '\/whois?url=' + encodeURIComponent(url),\r\n        { method: 'GET', headers: { 'Accept': 'application\/json' } }\r\n      );\r\n\r\n      if (!response.ok) return { checked: false, error: 'API error: ' + response.status };\r\n\r\n      const data = await response.json();\r\n\r\n      if (data.error && !data.dates) {\r\n        return { checked: false, error: data.error };\r\n      }\r\n\r\n      return {\r\n        checked: true,\r\n        domain: data.domain,\r\n        dates: data.dates,\r\n        registrar: data.registrar,\r\n        analysis: data.analysis,\r\n        source: 'WHOIS'\r\n      };\r\n    } catch (error) {\r\n      console.warn('WHOIS check failed:', error);\r\n      return { checked: false, error: error.message };\r\n    }\r\n  }\r\n\r\n  \/\/ SSL Certificate validation\r\n  async function checkSSL(url) {\r\n    if (!API_CONFIG.SSL.enabled) {\r\n      return { checked: false };\r\n    }\r\n    try {\r\n      const response = await fetch(\r\n        CLOUDFLARE_PROXY + '\/ssl?url=' + encodeURIComponent(url),\r\n        { method: 'GET', headers: { 'Accept': 'application\/json' } }\r\n      );\r\n\r\n      if (!response.ok) return { checked: false, error: 'API error: ' + response.status };\r\n\r\n      const data = await response.json();\r\n\r\n      if (data.error) {\r\n        return { checked: false, error: data.error };\r\n      }\r\n\r\n      \/\/ SSL Labs poate returna 'analyzing' dac\u0103 verificarea e \u00een curs\r\n      if (data.status === 'analyzing') {\r\n        return {\r\n          checked: true,\r\n          analyzing: true,\r\n          message: data.message,\r\n          source: 'SSL Labs'\r\n        };\r\n      }\r\n\r\n      return {\r\n        checked: true,\r\n        domain: data.domain,\r\n        grade: data.grade,\r\n        hasWarnings: data.hasWarnings,\r\n        cert: data.cert,\r\n        analysis: data.analysis,\r\n        source: 'SSL Labs'\r\n      };\r\n    } catch (error) {\r\n      console.warn('SSL check failed:', error);\r\n      return { checked: false, error: error.message };\r\n    }\r\n  }\r\n\r\n  \/\/ Run all API checks (include noile verific\u0103ri v3)\r\n  async function runAPIChecks(url) {\r\n    \/\/ Helper to wrap API call with step tracking\r\n    async function trackStep(stepName, apiCall) {\r\n      updateLoadingStep(stepName, 'checking');\r\n      try {\r\n        const result = await apiCall;\r\n        updateLoadingStep(stepName, result.checked ? 'done' : (result.timeout ? 'timeout' : 'failed'));\r\n        return result;\r\n      } catch (e) {\r\n        updateLoadingStep(stepName, 'failed');\r\n        return { checked: false, error: e.message };\r\n      }\r\n    }\r\n\r\n    \/\/ Verific\u0103ri de securitate principale (cu step tracking)\r\n    const [googleResult, vtResult, urlhausResult, urlscanResult, phishtankResult] = await Promise.all([\r\n      trackStep('google', checkGoogleSafeBrowsing(url)),\r\n      trackStep('virustotal', checkVirusTotal(url)),\r\n      trackStep('urlhaus', checkURLhaus(url)),\r\n      trackStep('urlscan', checkUrlscan(url)),\r\n      trackStep('phishtank', checkPhishTank(url))\r\n    ]);\r\n\r\n    \/\/ Verific\u0103ri noi v3 (run \u00een paralel)\r\n    const [dnsResult, geoipResult, whoisResult, sslResult] = await Promise.all([\r\n      checkDNS(url),\r\n      checkGeoIP(url),\r\n      checkWHOIS(url),\r\n      checkSSL(url)\r\n    ]);\r\n\r\n    return {\r\n      googleSafeBrowsing: googleResult,\r\n      virusTotal: vtResult,\r\n      urlhaus: urlhausResult,\r\n      urlscan: urlscanResult,\r\n      phishtank: phishtankResult,\r\n      \/\/ Noile verific\u0103ri\r\n      dns: dnsResult,\r\n      geoip: geoipResult,\r\n      whois: whoisResult,\r\n      ssl: sslResult\r\n    };\r\n  }\r\n\r\n  function extractDomain(url) {\r\n    try {\r\n      let cleanUrl = sanitizeInput(url);\r\n      if (!cleanUrl) return { valid: false };\r\n      if (\/^(javascript|data|vbscript|file):\/i.test(cleanUrl)) return { valid: false };\r\n      if (!cleanUrl.match(\/^https?:\\\/\\\/\/i)) cleanUrl = 'https:\/\/' + cleanUrl;\r\n      const urlObj = new URL(cleanUrl);\r\n      if (urlObj.protocol !== 'https:' && urlObj.protocol !== 'http:') return { valid: false };\r\n      return {\r\n        full: urlObj.hostname,\r\n        pathname: urlObj.pathname,\r\n        search: urlObj.search,\r\n        protocol: urlObj.protocol,\r\n        port: urlObj.port,\r\n        valid: true\r\n      };\r\n    } catch (e) {\r\n      return { valid: false };\r\n    }\r\n  }\r\n\r\n  \/\/ === Local Analysis ===\r\n  function analyzeURL(url) {\r\n    const domainInfo = extractDomain(url);\r\n    if (!domainInfo.valid) return { valid: false };\r\n\r\n    const checks = [];\r\n    let totalScore = 100;\r\n\r\n    \/\/ 1. HTTPS Check\r\n    if (domainInfo.protocol === 'https:') {\r\n      checks.push({ status: 'pass', title: t('checkHttpsPass'), description: t('checkHttpsPassDesc') });\r\n    } else {\r\n      checks.push({ status: 'fail', title: t('checkHttpsFail'), description: t('checkHttpsFailDesc') });\r\n      totalScore -= 20;\r\n    }\r\n\r\n    \/\/ 2. Homograph Attack (Enhanced v4.0 with script detection)\r\n    const originalDomain = domainInfo.full;\r\n    const normalizedDomain = normalizeForComparison(originalDomain);\r\n    const detectedScriptsSet = detectScripts(originalDomain);\r\n    const hasNonLatinScripts = detectedScriptsSet.size > 0;\r\n\r\n    if (originalDomain.toLowerCase() !== normalizedDomain || hasNonLatinScripts) {\r\n      const scriptsArray = Array.from(detectedScriptsSet);\r\n      const scriptsInfo = scriptsArray.length > 0\r\n        ? (currentLang === 'ro'\r\n          ? ` Script-uri detectate: ${scriptsArray.join(', ')}.`\r\n          : ` Detected scripts: ${scriptsArray.join(', ')}.`)\r\n        : '';\r\n      const description = t('checkUnicodeFailDesc', { domain: normalizedDomain }) + scriptsInfo;\r\n      checks.push({ status: 'fail', title: t('checkUnicodeFail'), description });\r\n      \/\/ Mixed scripts (e.g., Cyrillic + Latin) are more dangerous\r\n      totalScore -= hasNonLatinScripts && scriptsArray.length > 1 ? 45 : 35;\r\n    } else {\r\n      checks.push({ status: 'pass', title: t('checkUnicodePass'), description: t('checkUnicodePassDesc') });\r\n    }\r\n\r\n    \/\/ 3. Typosquatting Detection\r\n    let domainForCheck = normalizedDomain.toLowerCase();\r\n    if (domainForCheck.startsWith('www.')) domainForCheck = domainForCheck.substring(4);\r\n    const domainWithoutTLD = domainForCheck.split('.')[0] || '';\r\n    const fullDomainLower = domainInfo.full.toLowerCase();\r\n    let typosquatMatch = null, typosquatDetails = null, typosquatType = null;\r\n\r\n    \/\/ 3a. Character substitution\r\n    const substitutionMatches = findBrandWithSubstitutions(fullDomainLower);\r\n    if (substitutionMatches.length > 0) {\r\n      typosquatMatch = substitutionMatches[0].brand;\r\n      typosquatDetails = substitutionMatches[0].description;\r\n      typosquatType = substitutionMatches[0].type;\r\n    }\r\n\r\n    \/\/ 3b. Hyphen fragmented\r\n    if (!typosquatMatch) {\r\n      const hyphenMatches = checkWithoutHyphens(fullDomainLower);\r\n      if (hyphenMatches.length > 0) {\r\n        typosquatMatch = hyphenMatches[0].brand;\r\n        typosquatDetails = hyphenMatches[0].description;\r\n        typosquatType = 'hyphen_fragmented';\r\n      }\r\n    }\r\n\r\n    \/\/ 3c. Levenshtein distance\r\n    if (!typosquatMatch) {\r\n      for (const brand of knownBrands) {\r\n        const maxAllowedDistance = brand.length <= 4 ? 1 : 2;\r\n        if (Math.abs(domainWithoutTLD.length - brand.length) > 3) continue;\r\n        const distance = levenshteinDistance(domainWithoutTLD, brand);\r\n        if (distance > 0 && distance <= maxAllowedDistance && distance \/ Math.max(domainWithoutTLD.length, brand.length) < 0.4) {\r\n          typosquatMatch = brand;\r\n          typosquatType = 'levenshtein';\r\n          typosquatDetails = 'Domeniul difera prin ' + distance + ' caracter(e) de brandul \"' + brand + '\".';\r\n          break;\r\n        }\r\n        if (domainWithoutTLD.includes(brand) && domainWithoutTLD !== brand && brand.length >= 4 && domainWithoutTLD.length - brand.length <= 5) {\r\n          typosquatMatch = brand;\r\n          typosquatType = 'brand_extended';\r\n          typosquatDetails = 'Domeniul contine brandul \"' + brand + '\" cu caractere aditionale.';\r\n          break;\r\n        }\r\n      }\r\n    }\r\n\r\n    \/\/ 3d. Normalized typosquatting\r\n    if (!typosquatMatch) {\r\n      const normalizedTypo = normalizeTyposquatting(domainWithoutTLD);\r\n      if (normalizedTypo !== domainWithoutTLD) {\r\n        for (const brand of knownBrands) {\r\n          if (normalizedTypo === brand || normalizedTypo.includes(brand)) {\r\n            typosquatMatch = brand;\r\n            typosquatType = 'char_substitution';\r\n            typosquatDetails = 'Domeniul foloseste cifre sau simboluri pentru a imita \"' + brand + '\".';\r\n            break;\r\n          }\r\n        }\r\n      }\r\n    }\r\n\r\n    \/\/ 3e. Advanced typosquatting (Jaro-Winkler, keyboard proximity, patterns)\r\n    if (!typosquatMatch) {\r\n      const advancedMatches = advancedTyposquatCheck(domainWithoutTLD, knownBrands);\r\n      if (advancedMatches.length > 0) {\r\n        typosquatMatch = advancedMatches[0].brand;\r\n        typosquatDetails = advancedMatches[0].description;\r\n        typosquatType = advancedMatches[0].type;\r\n      }\r\n    }\r\n\r\n    if (typosquatMatch && !knownBrands.includes(domainWithoutTLD)) {\r\n      let title = t('typosquatTitle');\r\n      let description = typosquatDetails || t('typosquatDesc', { brand: typosquatMatch });\r\n      if (typosquatType === 'double_letter') { title = t('typosquatDouble'); }\r\n      else if (typosquatType === 'visual_trick') { title = t('typosquatVisual'); }\r\n      else if (typosquatType === 'char_substitution') { title = t('typosquatSubst'); }\r\n      else if (typosquatType === 'hyphen_fragmented') { title = t('typosquatHyphen'); }\r\n      else if (typosquatType === 'keyboard_typo') { title = t('typosquatKeyboard'); }\r\n      else if (typosquatType === 'jaro_winkler') { title = t('typosquatSimilarity'); }\r\n      else if (typosquatType === 'repetition') { title = t('typosquatRepetition'); }\r\n      else if (typosquatType === 'omission') { title = t('typosquatOmission'); }\r\n      else if (typosquatType === 'transposition') { title = t('typosquatTransposition'); }\r\n      else if (typosquatType === 'vowel_swap') { title = t('typosquatVowelSwap'); }\r\n      checks.push({ status: 'fail', title, description });\r\n      totalScore -= 35;\r\n    } else if (knownBrands.includes(domainWithoutTLD)) {\r\n      const isRomanianBrand = romanianBrandsRequiringRO.includes(domainWithoutTLD);\r\n      const isInternationalBrand = internationalBrandTLDs.hasOwnProperty(domainWithoutTLD);\r\n      const domainTLD = '.' + domainInfo.full.split('.').pop().toLowerCase();\r\n      const isOnRoTLD = domainTLD === '.ro' || domainInfo.full.toLowerCase().includes('.gov.ro');\r\n      let brandTLDIssue = false, brandTLDMessage = '';\r\n\r\n      if (isRomanianBrand && !isOnRoTLD) {\r\n        brandTLDIssue = true;\r\n        brandTLDMessage = currentLang === 'ro'\r\n          ? 'ATEN\u021aIE: \"' + domainWithoutTLD + '\" este un brand rom\u00e2nesc care ar trebui s\u0103 fie pe .ro, nu pe \"' + domainTLD + '\".'\r\n          : 'WARNING: \"' + domainWithoutTLD + '\" is a Romanian brand that should be on .ro, not on \"' + domainTLD + '\".';\r\n      } else if (isInternationalBrand) {\r\n        const allowedTLDs = internationalBrandTLDs[domainWithoutTLD];\r\n        if (!allowedTLDs.some(tld => domainInfo.full.toLowerCase().endsWith(tld))) {\r\n          brandTLDIssue = true;\r\n          brandTLDMessage = currentLang === 'ro'\r\n            ? 'ATEN\u021aIE: \"' + domainWithoutTLD + '\" ar trebui s\u0103 fie pe ' + allowedTLDs.slice(0, 3).join(', ') + '.'\r\n            : 'WARNING: \"' + domainWithoutTLD + '\" should be on ' + allowedTLDs.slice(0, 3).join(', ') + '.';\r\n        }\r\n      }\r\n\r\n      if (brandTLDIssue) {\r\n        checks.push({ status: 'fail', title: t('brandWrongTld'), description: brandTLDMessage });\r\n        totalScore -= 40;\r\n      } else {\r\n        checks.push({ status: 'pass', title: t('brandOk'), description: t('brandOkDesc') });\r\n      }\r\n    } else {\r\n      checks.push({ status: 'pass', title: t('noTyposquat'), description: t('noTyposquatDesc') });\r\n    }\r\n\r\n    \/\/ 4. Suspicious TLD\r\n    if (suspiciousTLDs.some(tld => domainInfo.full.toLowerCase().endsWith(tld))) {\r\n      checks.push({ status: 'warn', title: t('suspiciousTld'), description: t('suspiciousTldDesc') });\r\n      totalScore -= 15;\r\n    } else {\r\n      checks.push({ status: 'pass', title: t('tldOk'), description: t('tldOkDesc') });\r\n    }\r\n\r\n    \/\/ 5. Excessive subdomains\r\n    const subdomainCount = Math.max(0, domainInfo.full.split('.').length - 2);\r\n    if (subdomainCount > 2) {\r\n      checks.push({ status: 'warn', title: t('multiSubdomain'), description: t('multiSubdomainDesc', { count: subdomainCount }) });\r\n      totalScore -= 10;\r\n    } else {\r\n      checks.push({ status: 'pass', title: t('subdomainOk'), description: t('subdomainOkDesc') });\r\n    }\r\n\r\n    \/\/ 6. Phishing keywords\r\n    const fullUrl = (domainInfo.full + domainInfo.pathname + domainInfo.search).toLowerCase();\r\n    const foundKeywords = phishingKeywords.filter(kw => fullUrl.includes(kw));\r\n    if (foundKeywords.length >= 2) {\r\n      checks.push({ status: 'fail', title: t('phishKeywords'), description: t('phishKeywordsDesc', { keywords: foundKeywords.slice(0, 3).join('\", \"') }) });\r\n      totalScore -= 20;\r\n    } else if (foundKeywords.length === 1) {\r\n      checks.push({ status: 'warn', title: t('sensitiveTerm'), description: t('sensitiveTermDesc', { keyword: foundKeywords[0] }) });\r\n      totalScore -= 5;\r\n    } else {\r\n      checks.push({ status: 'pass', title: t('noSuspiciousTerms'), description: t('noSuspiciousTermsDesc') });\r\n    }\r\n\r\n    \/\/ 7. Domain length\r\n    if (domainInfo.full.length > 40) {\r\n      checks.push({ status: 'warn', title: t('longDomain'), description: t('longDomainDesc', { length: domainInfo.full.length }) });\r\n      totalScore -= 10;\r\n    } else {\r\n      checks.push({ status: 'pass', title: t('domainLengthOk'), description: t('domainLengthOkDesc') });\r\n    }\r\n\r\n    \/\/ 8. IP instead of domain\r\n    if (\/^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$\/.test(domainInfo.full)) {\r\n      checks.push({ status: 'fail', title: t('ipAddress'), description: t('ipAddressDesc') });\r\n      totalScore -= 25;\r\n    }\r\n\r\n    \/\/ 9. Non-standard port\r\n    if (domainInfo.port && domainInfo.port !== '80' && domainInfo.port !== '443') {\r\n      checks.push({ status: 'warn', title: t('nonStandardPort'), description: t('nonStandardPortDesc', { port: domainInfo.port }) });\r\n      totalScore -= 10;\r\n    }\r\n\r\n    \/\/ 10. Punycode\/IDN\r\n    if (domainInfo.full.startsWith('xn--') || domainInfo.full.includes('.xn--')) {\r\n      checks.push({ status: 'warn', title: t('idnDomain'), description: t('idnDomainDesc') });\r\n      totalScore -= 15;\r\n    }\r\n\r\n    \/\/ 11. Suspicious characters\r\n    if (\/--|__|[!@#$%^&*()+=]\/.test(domainInfo.full)) {\r\n      checks.push({ status: 'warn', title: t('unusualChars'), description: t('unusualCharsDesc') });\r\n      totalScore -= 10;\r\n    }\r\n\r\n    \/\/ 12. Brand in subdomain\r\n    const allParts = domainInfo.full.split('.');\r\n    const subdomains = allParts.length > 2 ? allParts.slice(0, -2) : [];\r\n    const mainDomain = allParts.length >= 2 ? allParts[allParts.length - 2] : (allParts[0] || '');\r\n    const brandInSubdomain = subdomains.length > 0 && knownBrands.some(brand => subdomains.some(sub => sub.includes(brand)));\r\n    if (brandInSubdomain && !knownBrands.includes(mainDomain)) {\r\n      checks.push({ status: 'fail', title: t('brandInSubdomain'), description: t('brandInSubdomainDesc') });\r\n      totalScore -= 25;\r\n    }\r\n\r\n    totalScore = Math.max(0, Math.min(100, totalScore));\r\n    let riskLevel = totalScore >= SCORE_THRESHOLDS.safe ? 'safe' : totalScore >= SCORE_THRESHOLDS.warning ? 'warning' : 'danger';\r\n\r\n    return { valid: true, url: sanitizeInput(url), score: totalScore, riskLevel, checks };\r\n  }\r\n\r\n  \/\/ === DOM Manipulation ===\r\n  function createCheckItem(check) {\r\n    const validStatus = validateStatus(check.status);\r\n    const item = document.createElement('div');\r\n    item.className = 'zic2__checkItem status-' + validStatus;\r\n\r\n    const iconDiv = document.createElement('div');\r\n    iconDiv.className = 'zic2__checkIcon';\r\n    iconDiv.textContent = validStatus === 'pass' ? '\\u2713' : validStatus === 'warn' ? '!' : '\\u2717';\r\n\r\n    const contentDiv = document.createElement('div');\r\n    contentDiv.className = 'zic2__checkContent';\r\n\r\n    const titleDiv = document.createElement('div');\r\n    titleDiv.className = 'zic2__checkTitle';\r\n    titleDiv.textContent = check.title || '';\r\n\r\n    const descDiv = document.createElement('div');\r\n    descDiv.className = 'zic2__checkDesc';\r\n    descDiv.textContent = check.description || '';\r\n\r\n    contentDiv.appendChild(titleDiv);\r\n    contentDiv.appendChild(descDiv);\r\n    item.appendChild(iconDiv);\r\n    item.appendChild(contentDiv);\r\n    return item;\r\n  }\r\n\r\n  function displayResults(analysis) {\r\n    \/\/ Store for export\r\n    lastAnalysis = analysis;\r\n\r\n    \/\/ Save to history\r\n    saveToHistory(analysis);\r\n\r\n    \/\/ Set timestamp for print\r\n    const now = new Date();\r\n    const timestamp = now.toLocaleDateString(currentLang === 'ro' ? 'ro-RO' : 'en-GB', {\r\n      year: 'numeric', month: 'long', day: 'numeric', hour: '2-digit', minute: '2-digit'\r\n    });\r\n    elements.scoreCard.setAttribute('data-print-timestamp', timestamp);\r\n\r\n    elements.analyzedUrl.textContent = analysis.url;\r\n    elements.scoreNumber.textContent = String(analysis.score);\r\n\r\n    const validRiskLevels = ['safe', 'warning', 'danger'];\r\n    const safeRiskLevel = validRiskLevels.includes(analysis.riskLevel) ? analysis.riskLevel : 'warning';\r\n\r\n    elements.scoreCircle.className = 'zic2__scoreCircle score-' + safeRiskLevel;\r\n    elements.scoreDisplay.className = 'zic2__scoreDisplay score-' + safeRiskLevel;\r\n\r\n    if (safeRiskLevel === 'safe') {\r\n      elements.scoreText.textContent = t('scoreSafe');\r\n      elements.scoreDesc.textContent = t('descSafe');\r\n    } else if (safeRiskLevel === 'warning') {\r\n      elements.scoreText.textContent = t('scoreWarning');\r\n      elements.scoreDesc.textContent = t('descWarning');\r\n    } else {\r\n      elements.scoreText.textContent = t('scoreDanger');\r\n      elements.scoreDesc.textContent = t('descDanger');\r\n    }\r\n\r\n    elements.scoreCard.classList.remove('is-hidden');\r\n\r\n    const order = { fail: 0, warn: 1, pass: 2 };\r\n    analysis.checks.sort((a, b) => (order[a.status] || 1) - (order[b.status] || 1));\r\n\r\n    while (elements.checksList.firstChild) {\r\n      elements.checksList.removeChild(elements.checksList.firstChild);\r\n    }\r\n\r\n    for (const check of analysis.checks) {\r\n      elements.checksList.appendChild(createCheckItem(check));\r\n    }\r\n\r\n    elements.checksCard.classList.remove('is-hidden');\r\n\r\n    \/\/ Show export buttons\r\n    if (elements.exportButtons) {\r\n      elements.exportButtons.classList.remove('is-hidden');\r\n    }\r\n\r\n    setTimeout(() => elements.scoreCard.scrollIntoView({ behavior: 'smooth', block: 'nearest' }), 100);\r\n  }\r\n\r\n  \/\/ === Actions ===\r\n  let isAnalyzing = false;\r\n\r\n  async function analyze() {\r\n    if (isAnalyzing) return;\r\n\r\n    const now = Date.now();\r\n    if (now - lastAnalysisTime < MIN_ANALYSIS_INTERVAL) return;\r\n    lastAnalysisTime = now;\r\n\r\n    const rawUrl = elements.urlInput.value;\r\n    const url = sanitizeInput(rawUrl);\r\n\r\n    if (!url) {\r\n      elements.errors.textContent = t('errorEmpty');\r\n      elements.errors.classList.remove('is-hidden');\r\n      return;\r\n    }\r\n\r\n    if (rawUrl.length > MAX_URL_LENGTH) {\r\n      elements.errors.textContent = t('errorTooLong', { max: MAX_URL_LENGTH });\r\n      elements.errors.classList.remove('is-hidden');\r\n      return;\r\n    }\r\n\r\n    if (containsDangerousPatterns(rawUrl)) {\r\n      elements.errors.textContent = t('errorDangerous');\r\n      elements.errors.classList.remove('is-hidden');\r\n      return;\r\n    }\r\n\r\n    elements.errors.classList.add('is-hidden');\r\n    isAnalyzing = true;\r\n\r\n    \/\/ Announce to screen readers that analysis is starting\r\n    announceToSR(currentLang === 'ro' ? 'Se verific\u0103 URL-ul...' : 'Analyzing URL...');\r\n\r\n    const analyzeBtn = root.querySelector('[data-action=\"analyze\"]');\r\n    const originalBtnText = analyzeBtn ? analyzeBtn.innerHTML : '';\r\n    if (analyzeBtn) {\r\n      analyzeBtn.innerHTML = '<svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" class=\"zic2__spinner\"><circle cx=\"12\" cy=\"12\" r=\"10\" stroke-dasharray=\"32\" stroke-dashoffset=\"12\"\/><\/svg> ' + t('btnAnalyzing');\r\n      analyzeBtn.disabled = true;\r\n    }\r\n\r\n    \/\/ Show loading indicator and reset steps\r\n    if (elements.loading) {\r\n      elements.loading.classList.remove('is-hidden');\r\n      resetLoadingSteps();\r\n      updateLoadingStep('local', 'checking');\r\n    }\r\n\r\n    try {\r\n      const analysis = analyzeURL(url);\r\n      updateLoadingStep('local', 'done');\r\n\r\n      if (!analysis.valid) {\r\n        elements.errors.textContent = t('errorInvalid');\r\n        elements.errors.classList.remove('is-hidden');\r\n        if (elements.loading) elements.loading.classList.add('is-hidden');\r\n        return;\r\n      }\r\n\r\n      let fullUrl = url;\r\n      if (!fullUrl.match(\/^https?:\\\/\\\/\/i)) fullUrl = 'https:\/\/' + fullUrl;\r\n\r\n      const apiChecksPromise = runAPIChecks(fullUrl);\r\n      displayResults(analysis);\r\n\r\n      if (elements.apiStatus) {\r\n        elements.apiStatus.classList.remove('is-hidden');\r\n        resetApiStatus();\r\n      }\r\n\r\n      const apiResults = await apiChecksPromise;\r\n\r\n      \/\/ Process Google Safe Browsing\r\n      if (apiResults.googleSafeBrowsing.checked) {\r\n        if (!apiResults.googleSafeBrowsing.safe) {\r\n          const threats = apiResults.googleSafeBrowsing.threats || [currentLang === 'ro' ? 'Amenin\u021bare detectat\u0103' : 'Threat detected'];\r\n          analysis.checks.unshift({ status: 'fail', title: t('googleFail'), description: t('googleFailDesc', { threats: threats.join(', ') }) });\r\n          analysis.score = Math.max(0, analysis.score - 40);\r\n          updateApiStatus(elements.apiGoogle, 'warning');\r\n        } else {\r\n          analysis.checks.push({ status: 'pass', title: t('googleOk'), description: t('googleOkDesc') });\r\n          updateApiStatus(elements.apiGoogle, 'success');\r\n        }\r\n      } else {\r\n        updateApiStatus(elements.apiGoogle, 'error');\r\n      }\r\n\r\n      \/\/ Process VirusTotal\r\n      if (apiResults.virusTotal.checked) {\r\n        if (!apiResults.virusTotal.safe) {\r\n          analysis.checks.unshift({ status: 'fail', title: t('vtFail'), description: t('vtFailDesc', { count: apiResults.virusTotal.malicious }) });\r\n          analysis.score = Math.max(0, analysis.score - 30);\r\n          updateApiStatus(elements.apiVirusTotal, 'warning');\r\n        } else {\r\n          analysis.checks.push({ status: 'pass', title: t('vtOk'), description: t('vtOkDesc') });\r\n          updateApiStatus(elements.apiVirusTotal, 'success');\r\n        }\r\n      } else {\r\n        updateApiStatus(elements.apiVirusTotal, 'error');\r\n      }\r\n\r\n      \/\/ Process URLhaus\r\n      if (apiResults.urlhaus.checked) {\r\n        if (!apiResults.urlhaus.safe) {\r\n          analysis.checks.unshift({ status: 'fail', title: t('urlhausFail'), description: t('urlhausFailDesc', { threat: apiResults.urlhaus.threat || (currentLang === 'ro' ? 'necunoscut' : 'unknown') }) });\r\n          analysis.score = Math.max(0, analysis.score - 35);\r\n          updateApiStatus(elements.apiURLhaus, 'warning');\r\n        } else {\r\n          analysis.checks.push({ status: 'pass', title: t('urlhausOk'), description: t('urlhausOkDesc') });\r\n          updateApiStatus(elements.apiURLhaus, 'success');\r\n        }\r\n      } else {\r\n        updateApiStatus(elements.apiURLhaus, 'error');\r\n      }\r\n\r\n      \/\/ Process urlscan.io\r\n      if (apiResults.urlscan.checked) {\r\n        if (!apiResults.urlscan.safe) {\r\n          const verdicts = apiResults.urlscan.verdicts || [];\r\n          analysis.checks.unshift({ status: 'fail', title: t('urlscanFail'), description: t('urlscanFailDesc', { verdicts: verdicts.join(', ') || 'suspect' }) });\r\n          analysis.score = Math.max(0, analysis.score - 25);\r\n          updateApiStatus(elements.apiUrlscan, 'warning');\r\n        } else {\r\n          const totalScans = apiResults.urlscan.total || 0;\r\n          const scansText = totalScans > 0 ? (currentLang === 'ro' ? ' (' + totalScans + ' scan\u0103ri anterioare)' : ' (' + totalScans + ' previous scans)') : '';\r\n          analysis.checks.push({ status: 'pass', title: t('urlscanOk'), description: t('urlscanOkDesc', { scans: scansText }) });\r\n          updateApiStatus(elements.apiUrlscan, 'success');\r\n        }\r\n      } else {\r\n        updateApiStatus(elements.apiUrlscan, 'error');\r\n      }\r\n\r\n      \/\/ Process PhishTank\r\n      if (apiResults.phishtank.checked) {\r\n        if (!apiResults.phishtank.safe) {\r\n          analysis.checks.unshift({ status: 'fail', title: t('phishtankFail'), description: t('phishtankFailDesc') });\r\n          analysis.score = Math.max(0, analysis.score - 40);\r\n          updateApiStatus(elements.apiPhishTank, 'warning');\r\n        } else {\r\n          analysis.checks.push({ status: 'pass', title: t('phishtankOk'), description: t('phishtankOkDesc') });\r\n          updateApiStatus(elements.apiPhishTank, 'success');\r\n        }\r\n      } else {\r\n        updateApiStatus(elements.apiPhishTank, 'error');\r\n      }\r\n\r\n      \/\/ === NOI VERIFIC\u0102RI v3 ===\r\n\r\n      \/\/ Process WHOIS (v\u00e2rsta domeniului)\r\n      if (apiResults.whois && apiResults.whois.checked) {\r\n        const whoisData = apiResults.whois;\r\n        if (whoisData.analysis?.isNew) {\r\n          \/\/ Domeniu < 30 zile = foarte suspect\r\n          analysis.checks.unshift({\r\n            status: 'fail',\r\n            title: currentLang === 'ro' ? 'Domeniu foarte nou' : 'Very new domain',\r\n            description: currentLang === 'ro'\r\n              ? `Domeniul a fost creat acum ${whoisData.dates.ageInDays} zile. Domeniile noi sunt frecvent folosite pentru phishing.`\r\n              : `Domain was created ${whoisData.dates.ageInDays} days ago. New domains are frequently used for phishing.`\r\n          });\r\n          analysis.score = Math.max(0, analysis.score - 25);\r\n        } else if (whoisData.analysis?.isYoung) {\r\n          \/\/ Domeniu < 1 an = aten\u021bie\r\n          analysis.checks.push({\r\n            status: 'warn',\r\n            title: currentLang === 'ro' ? 'Domeniu relativ nou' : 'Relatively new domain',\r\n            description: currentLang === 'ro'\r\n              ? `Domeniul a fost creat acum ${whoisData.dates.ageInDays} zile (sub 1 an). Verific\u0103 legitimitatea.`\r\n              : `Domain was created ${whoisData.dates.ageInDays} days ago (under 1 year). Verify legitimacy.`\r\n          });\r\n          analysis.score = Math.max(0, analysis.score - 10);\r\n        } else if (whoisData.dates?.ageInDays) {\r\n          \/\/ Domeniu vechi = bun semn\r\n          const years = Math.floor(whoisData.dates.ageInDays \/ 365);\r\n          analysis.checks.push({\r\n            status: 'pass',\r\n            title: currentLang === 'ro' ? 'Domeniu vechi' : 'Established domain',\r\n            description: currentLang === 'ro'\r\n              ? `Domeniul are ${years} an${years !== 1 ? 'i' : ''} vechime. Registrar: ${whoisData.registrar || 'necunoscut'}`\r\n              : `Domain is ${years} year${years !== 1 ? 's' : ''} old. Registrar: ${whoisData.registrar || 'unknown'}`\r\n          });\r\n        }\r\n      }\r\n\r\n      \/\/ Process GeoIP (loca\u021bia serverului)\r\n      if (apiResults.geoip && apiResults.geoip.checked) {\r\n        const geoData = apiResults.geoip;\r\n        const location = geoData.location;\r\n\r\n        \/\/ Verific\u0103 dac\u0103 e brand rom\u00e2nesc pe server din afara UE\r\n        const euCountries = ['RO', 'DE', 'FR', 'NL', 'BE', 'AT', 'PL', 'CZ', 'HU', 'IT', 'ES', 'PT', 'IE', 'SE', 'FI', 'DK', 'BG', 'HR', 'SK', 'SI', 'LT', 'LV', 'EE', 'CY', 'MT', 'LU', 'GR'];\r\n        const suspiciousCountries = ['CN', 'RU', 'KP', 'IR'];\r\n\r\n        if (suspiciousCountries.includes(location?.countryCode)) {\r\n          analysis.checks.push({\r\n            status: 'warn',\r\n            title: currentLang === 'ro' ? 'Server \u00een \u021bar\u0103 suspect\u0103' : 'Server in suspicious country',\r\n            description: currentLang === 'ro'\r\n              ? `Serverul este localizat \u00een ${location.country}. Acest lucru poate fi suspect pentru site-uri care pretind a fi rom\u00e2ne\u0219ti sau occidentale.`\r\n              : `Server is located in ${location.country}. This may be suspicious for sites claiming to be Romanian or Western.`\r\n          });\r\n          analysis.score = Math.max(0, analysis.score - 15);\r\n        } else {\r\n          \/\/ Informa\u021bie neutr\u0103 despre loca\u021bie\r\n          const isHosting = geoData.network?.isHosting ? (currentLang === 'ro' ? ' (hosting\/cloud)' : ' (hosting\/cloud)') : '';\r\n          analysis.checks.push({\r\n            status: 'pass',\r\n            title: currentLang === 'ro' ? 'Loca\u021bie server' : 'Server location',\r\n            description: currentLang === 'ro'\r\n              ? `Server \u00een ${location.country} (${location.city || 'N\/A'})${isHosting}. ISP: ${geoData.network?.isp || 'N\/A'}`\r\n              : `Server in ${location.country} (${location.city || 'N\/A'})${isHosting}. ISP: ${geoData.network?.isp || 'N\/A'}`\r\n          });\r\n        }\r\n      }\r\n\r\n      \/\/ Process DNS (verificare DNS records)\r\n      if (apiResults.dns && apiResults.dns.checked) {\r\n        const dnsData = apiResults.dns;\r\n        const analysis_dns = dnsData.analysis;\r\n\r\n        if (!analysis_dns?.hasIpAddresses) {\r\n          analysis.checks.push({\r\n            status: 'warn',\r\n            title: currentLang === 'ro' ? 'DNS: f\u0103r\u0103 IP' : 'DNS: no IP',\r\n            description: currentLang === 'ro'\r\n              ? 'Domeniul nu are \u00eenregistr\u0103ri DNS A. Poate fi un domeniu parcat sau nefunc\u021bional.'\r\n              : 'Domain has no A DNS records. May be a parked or non-functional domain.'\r\n          });\r\n          analysis.score = Math.max(0, analysis.score - 10);\r\n        } else if (!analysis_dns?.hasMailServers && !analysis_dns?.hasSpf) {\r\n          \/\/ F\u0103r\u0103 MX \u0219i f\u0103r\u0103 SPF = probabil nu e un business legitim\r\n          analysis.checks.push({\r\n            status: 'warn',\r\n            title: currentLang === 'ro' ? 'DNS: configurare minim\u0103' : 'DNS: minimal setup',\r\n            description: currentLang === 'ro'\r\n              ? 'Domeniul nu are server de email (MX) sau protec\u021bie SPF. Companiile legitime au de obicei aceste configur\u0103ri.'\r\n              : 'Domain has no email server (MX) or SPF protection. Legitimate companies usually have these configured.'\r\n          });\r\n          analysis.score = Math.max(0, analysis.score - 5);\r\n        }\r\n      }\r\n\r\n      \/\/ Process SSL (certificat SSL)\r\n      if (apiResults.ssl && apiResults.ssl.checked && !apiResults.ssl.analyzing) {\r\n        const sslData = apiResults.ssl;\r\n\r\n        if (sslData.analysis?.isGradeF || sslData.grade === 'F') {\r\n          analysis.checks.unshift({\r\n            status: 'fail',\r\n            title: currentLang === 'ro' ? 'SSL: Certificat problematic' : 'SSL: Problematic certificate',\r\n            description: currentLang === 'ro'\r\n              ? `Certificatul SSL are probleme grave (grad ${sslData.grade}). Conexiunea nu este sigur\u0103.`\r\n              : `SSL certificate has serious issues (grade ${sslData.grade}). Connection is not secure.`\r\n          });\r\n          analysis.score = Math.max(0, analysis.score - 20);\r\n        } else if (sslData.analysis?.isGradeA) {\r\n          analysis.checks.push({\r\n            status: 'pass',\r\n            title: currentLang === 'ro' ? 'SSL: Certificat excelent' : 'SSL: Excellent certificate',\r\n            description: currentLang === 'ro'\r\n              ? `Certificat SSL valid (grad ${sslData.grade}). Emis de: ${sslData.cert?.issuer || 'N\/A'}`\r\n              : `Valid SSL certificate (grade ${sslData.grade}). Issued by: ${sslData.cert?.issuer || 'N\/A'}`\r\n          });\r\n        } else if (sslData.grade) {\r\n          analysis.checks.push({\r\n            status: 'pass',\r\n            title: currentLang === 'ro' ? 'SSL: Certificat valid' : 'SSL: Valid certificate',\r\n            description: currentLang === 'ro'\r\n              ? `Certificat SSL valid (grad ${sslData.grade}). Emis de: ${sslData.cert?.issuer || 'N\/A'}`\r\n              : `Valid SSL certificate (grade ${sslData.grade}). Issued by: ${sslData.cert?.issuer || 'N\/A'}`\r\n          });\r\n        }\r\n      }\r\n\r\n      \/\/ Recalculate risk level\r\n      analysis.riskLevel = analysis.score >= SCORE_THRESHOLDS.safe ? 'safe' : analysis.score >= SCORE_THRESHOLDS.warning ? 'warning' : 'danger';\r\n      displayResults(analysis);\r\n\r\n      \/\/ Announce result to screen readers\r\n      const riskLabel = analysis.riskLevel === 'danger'\r\n        ? (currentLang === 'ro' ? 'Periculos' : 'Dangerous')\r\n        : analysis.riskLevel === 'warning'\r\n          ? (currentLang === 'ro' ? 'Aten\u021bie' : 'Warning')\r\n          : (currentLang === 'ro' ? 'Sigur' : 'Safe');\r\n      announceToSR(\r\n        currentLang === 'ro'\r\n          ? `Analiz\u0103 complet\u0103. Scor: ${analysis.score} din 100. Nivel de risc: ${riskLabel}.`\r\n          : `Analysis complete. Score: ${analysis.score} out of 100. Risk level: ${riskLabel}.`,\r\n        analysis.riskLevel === 'danger' ? 'assertive' : 'polite'\r\n      );\r\n\r\n    } catch (error) {\r\n      console.error('Analysis error:', error);\r\n      elements.errors.textContent = t('errorGeneral');\r\n      elements.errors.classList.remove('is-hidden');\r\n    } finally {\r\n      isAnalyzing = false;\r\n      \/\/ Hide loading indicator\r\n      if (elements.loading) {\r\n        elements.loading.classList.add('is-hidden');\r\n      }\r\n      if (analyzeBtn) {\r\n        analyzeBtn.innerHTML = originalBtnText;\r\n        analyzeBtn.disabled = false;\r\n      }\r\n    }\r\n  }\r\n\r\n  function reset() {\r\n    elements.urlInput.value = '';\r\n    if (elements.urlBatch) elements.urlBatch.value = '';\r\n    elements.errors.classList.add('is-hidden');\r\n    elements.errors.textContent = '';\r\n    elements.scoreCard.classList.add('is-hidden');\r\n    elements.checksCard.classList.add('is-hidden');\r\n    if (elements.apiStatus) elements.apiStatus.classList.add('is-hidden');\r\n    if (elements.loading) elements.loading.classList.add('is-hidden');\r\n    if (elements.exportButtons) elements.exportButtons.classList.add('is-hidden');\r\n    if (elements.batchResults) elements.batchResults.classList.add('is-hidden');\r\n    while (elements.checksList.firstChild) elements.checksList.removeChild(elements.checksList.firstChild);\r\n    if (elements.batchTbody) while (elements.batchTbody.firstChild) elements.batchTbody.removeChild(elements.batchTbody.firstChild);\r\n    lastAnalysis = null;\r\n    lastBatchResults = [];\r\n    elements.urlInput.focus();\r\n  }\r\n\r\n  \/\/ === BATCH MODE ===\r\n  function toggleBatchMode() {\r\n    const isBatch = elements.batchMode?.checked;\r\n    if (elements.singleInput) elements.singleInput.classList.toggle('is-hidden', isBatch);\r\n    if (elements.batchInput) elements.batchInput.classList.toggle('is-hidden', !isBatch);\r\n  }\r\n\r\n  async function analyzeBatch() {\r\n    const batchText = elements.urlBatch?.value || '';\r\n    const allUrls = batchText.split('\\n').map(u => u.trim()).filter(u => u.length > 0);\r\n    const urls = allUrls.slice(0, BATCH_LIMIT);\r\n\r\n    if (urls.length === 0) {\r\n      elements.errors.textContent = currentLang === 'ro' ? 'Introdu cel pu\u021bin un URL.' : 'Enter at least one URL.';\r\n      elements.errors.classList.remove('is-hidden');\r\n      return;\r\n    }\r\n\r\n    \/\/ Show warning if URLs were truncated\r\n    if (allUrls.length > BATCH_LIMIT) {\r\n      const warningMsg = t('batchTruncated', { count: BATCH_LIMIT, total: allUrls.length });\r\n      elements.errors.textContent = warningMsg;\r\n      elements.errors.classList.remove('is-hidden');\r\n      elements.errors.style.background = 'var(--zic-warning-light)';\r\n      elements.errors.style.borderColor = 'var(--zic-warning)';\r\n      elements.errors.style.color = 'var(--zic-ink)';\r\n    } else {\r\n      elements.errors.classList.add('is-hidden');\r\n      elements.errors.style.background = '';\r\n      elements.errors.style.borderColor = '';\r\n      elements.errors.style.color = '';\r\n    }\r\n\r\n    if (elements.loading) {\r\n      const loadingText = elements.loading.querySelector('.zic2__loadingText');\r\n      const loadingSub = elements.loading.querySelector('.zic2__loadingSubtext');\r\n      if (loadingText) loadingText.textContent = currentLang === 'ro' ? `Se verific\u0103 ${urls.length} URL-uri...` : `Checking ${urls.length} URLs...`;\r\n      if (loadingSub) loadingSub.textContent = currentLang === 'ro' ? 'Acest proces poate dura c\u00e2teva minute' : 'This may take a few minutes';\r\n      elements.loading.classList.remove('is-hidden');\r\n    }\r\n\r\n    \/\/ Don't hide errors if we just showed a truncation warning\r\n    if (allUrls.length <= BATCH_LIMIT) {\r\n      elements.errors.classList.add('is-hidden');\r\n    }\r\n    elements.scoreCard.classList.add('is-hidden');\r\n    elements.checksCard.classList.add('is-hidden');\r\n    lastBatchResults = [];\r\n\r\n    try {\r\n      for (let i = 0; i < urls.length; i++) {\r\n        const url = urls[i];\r\n        try {\r\n          let fullUrl = sanitizeInput(url);\r\n          if (!fullUrl.match(\/^https?:\\\/\\\/\/i)) fullUrl = 'https:\/\/' + fullUrl;\r\n\r\n          const extraction = extractDomain(fullUrl);\r\n          if (!extraction.valid) {\r\n            lastBatchResults.push({ url: url, score: 0, riskLevel: 'danger', error: currentLang === 'ro' ? 'URL invalid' : 'Invalid URL', checks: [] });\r\n            continue;\r\n          }\r\n\r\n          const analysis = analyzeUrlLocally(extraction);\r\n          analysis.url = fullUrl;\r\n          const apiResults = await runAPIChecks(fullUrl);\r\n\r\n          if (apiResults.googleSafeBrowsing?.checked && !apiResults.googleSafeBrowsing.safe) analysis.score = Math.max(0, analysis.score - 40);\r\n          if (apiResults.virusTotal?.checked && !apiResults.virusTotal.safe) analysis.score = Math.max(0, analysis.score - 30);\r\n          if (apiResults.urlhaus?.checked && !apiResults.urlhaus.safe) analysis.score = Math.max(0, analysis.score - 35);\r\n          if (apiResults.whois?.checked && apiResults.whois.analysis?.isNew) analysis.score = Math.max(0, analysis.score - 25);\r\n\r\n          analysis.riskLevel = analysis.score >= SCORE_THRESHOLDS.safe ? 'safe' : analysis.score >= SCORE_THRESHOLDS.warning ? 'warning' : 'danger';\r\n          lastBatchResults.push(analysis);\r\n        } catch (err) {\r\n          lastBatchResults.push({ url: url, score: 0, riskLevel: 'danger', error: err.message, checks: [] });\r\n        }\r\n      }\r\n      displayBatchResults();\r\n    } catch (error) {\r\n      console.error('Batch analysis error:', error);\r\n      elements.errors.textContent = currentLang === 'ro' ? 'Eroare \u00een analiza batch.' : 'Batch analysis error.';\r\n      elements.errors.classList.remove('is-hidden');\r\n    } finally {\r\n      if (elements.loading) elements.loading.classList.add('is-hidden');\r\n    }\r\n  }\r\n\r\n  function displayBatchResults() {\r\n    if (!elements.batchTbody || lastBatchResults.length === 0) return;\r\n    while (elements.batchTbody.firstChild) elements.batchTbody.removeChild(elements.batchTbody.firstChild);\r\n\r\n    const riskColors = getRiskColors();\r\n    const riskLabels = { safe: currentLang === 'ro' ? 'Sigur' : 'Safe', warning: currentLang === 'ro' ? 'Aten\u021bie' : 'Warning', danger: currentLang === 'ro' ? 'Pericol' : 'Danger' };\r\n\r\n    lastBatchResults.forEach((result, idx) => {\r\n      const tr = document.createElement('tr');\r\n      tr.style.borderBottom = '1px solid rgba(138, 136, 255, 0.1)';\r\n\r\n      const failChecks = result.checks?.filter(c => c.status === 'fail').map(c => c.title).slice(0, 3) || [];\r\n      const issues = result.error || failChecks.join(', ') || (currentLang === 'ro' ? 'Nicio problem\u0103' : 'No issues');\r\n\r\n      \/\/ Create cells safely with textContent\r\n      const tdNum = document.createElement('td');\r\n      tdNum.style.cssText = 'padding: 10px; font-weight: 600;';\r\n      tdNum.textContent = String(idx + 1);\r\n\r\n      const tdUrl = document.createElement('td');\r\n      tdUrl.style.cssText = 'padding: 10px; max-width: 300px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap;';\r\n      tdUrl.title = result.url;\r\n      tdUrl.textContent = result.url;\r\n\r\n      const tdScore = document.createElement('td');\r\n      tdScore.style.cssText = 'padding: 10px; text-align: center; font-weight: 700;';\r\n      tdScore.style.color = riskColors[result.riskLevel];\r\n      tdScore.textContent = String(result.score);\r\n\r\n      const tdRisk = document.createElement('td');\r\n      tdRisk.style.cssText = 'padding: 10px; text-align: center;';\r\n      const riskSpan = document.createElement('span');\r\n      riskSpan.style.cssText = `background: ${riskColors[result.riskLevel]}20; color: ${riskColors[result.riskLevel]}; padding: 4px 8px; border-radius: 4px; font-size: 12px; font-weight: 600;`;\r\n      riskSpan.textContent = riskLabels[result.riskLevel];\r\n      tdRisk.appendChild(riskSpan);\r\n\r\n      const tdIssues = document.createElement('td');\r\n      tdIssues.style.cssText = 'padding: 10px; font-size: 12px;';\r\n      if (result.error) tdIssues.style.color = '#ef4444';\r\n      tdIssues.textContent = issues;\r\n\r\n      tr.appendChild(tdNum);\r\n      tr.appendChild(tdUrl);\r\n      tr.appendChild(tdScore);\r\n      tr.appendChild(tdRisk);\r\n      tr.appendChild(tdIssues);\r\n      elements.batchTbody.appendChild(tr);\r\n    });\r\n\r\n    elements.batchResults.classList.remove('is-hidden');\r\n  }\r\n\r\n  \/\/ === EXPORT FUNCTIONS ===\r\n  function exportJSON(data, filename) {\r\n    const blob = new Blob([JSON.stringify(data, null, 2)], { type: 'application\/json' });\r\n    const url = URL.createObjectURL(blob);\r\n    const a = document.createElement('a');\r\n    a.href = url;\r\n    a.download = filename;\r\n    document.body.appendChild(a);\r\n    a.click();\r\n    document.body.removeChild(a);\r\n    URL.revokeObjectURL(url);\r\n  }\r\n\r\n  function exportCSV(data, filename) {\r\n    let csv = '';\r\n    if (Array.isArray(data)) {\r\n      csv = 'Nr,URL,Scor,Risc,Probleme\\n';\r\n      data.forEach((r, i) => {\r\n        const issues = r.error || r.checks?.filter(c => c.status === 'fail').map(c => c.title).join('; ') || '';\r\n        csv += `${i + 1},\"${r.url}\",${r.score},${r.riskLevel},\"${issues}\"\\n`;\r\n      });\r\n    } else {\r\n      csv = 'URL,Scor,Risc,Verificare,Status,Detalii\\n';\r\n      data.checks?.forEach(c => {\r\n        csv += `\"${data.url}\",${data.score},${data.riskLevel},\"${c.title}\",${c.status},\"${(c.description || '').replace(\/\"\/g, '\"\"')}\"\\n`;\r\n      });\r\n    }\r\n    const blob = new Blob([csv], { type: 'text\/csv;charset=utf-8;' });\r\n    const url = URL.createObjectURL(blob);\r\n    const a = document.createElement('a');\r\n    a.href = url;\r\n    a.download = filename;\r\n    document.body.appendChild(a);\r\n    a.click();\r\n    document.body.removeChild(a);\r\n    URL.revokeObjectURL(url);\r\n  }\r\n\r\n  function copyResultsToClipboard() {\r\n    if (!lastAnalysis) return;\r\n    let text = `=== ZIC Security Check ===\\nURL: ${lastAnalysis.url}\\nScor: ${lastAnalysis.score}\/100 (${lastAnalysis.riskLevel})\\n\\nVerific\u0103ri:\\n`;\r\n    lastAnalysis.checks?.forEach(c => {\r\n      const icon = c.status === 'pass' ? '\u2713' : c.status === 'fail' ? '\u2717' : '&#x26a0;';\r\n      text += `${icon} ${c.title}\\n`;\r\n    });\r\n    navigator.clipboard.writeText(text).then(() => {\r\n      alert(currentLang === 'ro' ? 'Rezultatele au fost copiate!' : 'Results copied!');\r\n    }).catch(err => console.error('Copy failed:', err));\r\n  }\r\n\r\n  \/\/ === SHARE FUNCTIONS ===\r\n  function shareResultLink(button) {\r\n    if (!lastAnalysis) return;\r\n\r\n    \/\/ Compress minimal result data to share\r\n    const shareData = {\r\n      u: lastAnalysis.url,\r\n      s: lastAnalysis.score,\r\n      r: lastAnalysis.riskLevel,\r\n      t: Date.now()\r\n    };\r\n\r\n    try {\r\n      \/\/ Encode to base64 for URL safety\r\n      const encoded = btoa(JSON.stringify(shareData));\r\n      const shareUrl = window.location.origin + window.location.pathname + '#share=' + encoded;\r\n\r\n      \/\/ Copy to clipboard\r\n      navigator.clipboard.writeText(shareUrl).then(() => {\r\n        \/\/ Show feedback\r\n        const originalText = button.querySelector('[data-i18n=\"shareLink\"]');\r\n        if (originalText) {\r\n          const original = originalText.textContent;\r\n          originalText.textContent = t('shareLinkCopied');\r\n          button.classList.add('is-success');\r\n          setTimeout(() => {\r\n            originalText.textContent = original;\r\n            button.classList.remove('is-success');\r\n          }, 2000);\r\n        }\r\n      }).catch(err => {\r\n        console.error('Share link copy failed:', err);\r\n        alert(currentLang === 'ro' ? 'Nu s-a putut copia link-ul' : 'Could not copy link');\r\n      });\r\n    } catch (e) {\r\n      console.error('Share encoding failed:', e);\r\n    }\r\n  }\r\n\r\n  \/\/ Check for shared results on page load\r\n  function loadSharedResults() {\r\n    const hash = window.location.hash;\r\n    if (!hash.startsWith('#share=')) return;\r\n\r\n    try {\r\n      const encoded = hash.slice(7);\r\n      const shareData = JSON.parse(atob(encoded));\r\n\r\n      if (shareData.u && typeof shareData.s === 'number') {\r\n        \/\/ Pre-fill the URL and show a minimal result display\r\n        elements.urlInput.value = shareData.u;\r\n\r\n        \/\/ Create a minimal analysis object for display\r\n        const sharedAnalysis = {\r\n          url: shareData.u,\r\n          score: shareData.s,\r\n          riskLevel: shareData.r || (shareData.s >= 70 ? 'safe' : shareData.s >= 40 ? 'warning' : 'danger'),\r\n          checks: [],\r\n          apiResults: {},\r\n          timestamp: shareData.t\r\n        };\r\n\r\n        \/\/ Display shared results with a note\r\n        displayResults(sharedAnalysis);\r\n\r\n        \/\/ Add shared indicator\r\n        const note = document.createElement('p');\r\n        note.className = 'zic2__sharedNote';\r\n        note.textContent = currentLang === 'ro'\r\n          ? '&#x26a0; Acesta este un rezultat partajat. Ruleaz\u0103 o verificare nou\u0103 pentru rezultate complete.'\r\n          : '&#x26a0; This is a shared result. Run a new check for complete results.';\r\n        elements.scoreCard.insertBefore(note, elements.scoreCard.firstChild);\r\n      }\r\n    } catch (e) {\r\n      console.error('Invalid share data:', e);\r\n    }\r\n  }\r\n\r\n  \/\/ === HISTORY FUNCTIONS ===\r\n  const HISTORY_KEY = 'zic_spoofing_history';\r\n  const MAX_HISTORY = 50;\r\n  const HISTORY_MAX_AGE_DAYS = 30;\r\n\r\n  function getHistory() {\r\n    try {\r\n      const history = JSON.parse(localStorage.getItem(HISTORY_KEY) || '[]');\r\n      \/\/ Sort by timestamp descending (newest first)\r\n      return history.sort((a, b) => (b.timestamp || 0) - (a.timestamp || 0));\r\n    } catch (e) {\r\n      return [];\r\n    }\r\n  }\r\n\r\n  function cleanOldHistory() {\r\n    try {\r\n      const history = JSON.parse(localStorage.getItem(HISTORY_KEY) || '[]');\r\n      const cutoff = Date.now() - (HISTORY_MAX_AGE_DAYS * 24 * 60 * 60 * 1000);\r\n      const cleaned = history.filter(item => (item.timestamp || 0) > cutoff);\r\n      if (cleaned.length !== history.length) {\r\n        localStorage.setItem(HISTORY_KEY, JSON.stringify(cleaned.slice(0, MAX_HISTORY)));\r\n        return true;\r\n      }\r\n      return false;\r\n    } catch (e) {\r\n      return false;\r\n    }\r\n  }\r\n\r\n  function saveToHistory(analysis) {\r\n    if (!analysis?.url) return;\r\n    try {\r\n      const history = getHistory();\r\n      history.unshift({\r\n        url: analysis.url,\r\n        score: analysis.score,\r\n        riskLevel: analysis.riskLevel,\r\n        timestamp: Date.now(),\r\n        checksCount: analysis.checks?.length || 0,\r\n        failCount: analysis.checks?.filter(c => c.status === 'fail').length || 0\r\n      });\r\n      localStorage.setItem(HISTORY_KEY, JSON.stringify(history.slice(0, MAX_HISTORY)));\r\n      updateHistoryBadge();\r\n    } catch (e) {\r\n      console.warn('Could not save to history:', e);\r\n    }\r\n  }\r\n\r\n  function updateHistoryBadge() {\r\n    const history = getHistory();\r\n    if (elements.historyBadge) {\r\n      elements.historyBadge.textContent = history.length > 0 ? String(history.length) : '';\r\n      elements.historyBadge.style.display = history.length > 0 ? 'inline' : 'none';\r\n    }\r\n    if (elements.historyCount) {\r\n      elements.historyCount.textContent = history.length > 0 ? `(${history.length})` : '';\r\n    }\r\n  }\r\n\r\n  function displayHistory() {\r\n    const history = getHistory();\r\n    if (!elements.historyList) return;\r\n\r\n    while (elements.historyList.firstChild) elements.historyList.removeChild(elements.historyList.firstChild);\r\n\r\n    if (history.length === 0) {\r\n      const emptyMsg = document.createElement('div');\r\n      emptyMsg.style.cssText = 'padding: 20px; text-align: center; color: var(--zic-text-muted); font-size: 13px;';\r\n      emptyMsg.textContent = currentLang === 'ro' ? 'Nu exist\u0103 verific\u0103ri anterioare.' : 'No previous checks.';\r\n      elements.historyList.appendChild(emptyMsg);\r\n      return;\r\n    }\r\n\r\n    const riskColors = getRiskColors();\r\n\r\n    history.forEach((item, idx) => {\r\n      const div = document.createElement('div');\r\n      div.style.cssText = 'padding: 10px 12px; border-bottom: 1px solid rgba(138, 136, 255, 0.1); display: flex; align-items: center; gap: 10px; cursor: pointer;';\r\n      div.addEventListener('click', () => {\r\n        elements.urlInput.value = item.url;\r\n        if (elements.batchMode) elements.batchMode.checked = false;\r\n        toggleBatchMode();\r\n        elements.historySection?.classList.add('is-hidden');\r\n      });\r\n\r\n      const scoreSpan = document.createElement('span');\r\n      scoreSpan.style.cssText = `min-width: 36px; height: 36px; border-radius: 50%; display: flex; align-items: center; justify-content: center; font-weight: 700; font-size: 13px; background: ${riskColors[item.riskLevel]}20; color: ${riskColors[item.riskLevel]};`;\r\n      scoreSpan.textContent = String(item.score);\r\n\r\n      const infoDiv = document.createElement('div');\r\n      infoDiv.style.cssText = 'flex: 1; min-width: 0;';\r\n\r\n      const urlDiv = document.createElement('div');\r\n      urlDiv.style.cssText = 'font-size: 13px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap;';\r\n      urlDiv.textContent = item.url;\r\n      urlDiv.title = item.url;\r\n\r\n      const metaDiv = document.createElement('div');\r\n      metaDiv.style.cssText = 'font-size: 11px; color: var(--zic-text-muted); margin-top: 2px;';\r\n      const date = new Date(item.timestamp);\r\n      metaDiv.textContent = date.toLocaleDateString() + ' ' + date.toLocaleTimeString([], { hour: '2-digit', minute: '2-digit' });\r\n      if (item.failCount > 0) metaDiv.textContent += ` \u2022 ${item.failCount} ${currentLang === 'ro' ? 'probleme' : 'issues'}`;\r\n\r\n      infoDiv.appendChild(urlDiv);\r\n      infoDiv.appendChild(metaDiv);\r\n      div.appendChild(scoreSpan);\r\n      div.appendChild(infoDiv);\r\n      elements.historyList.appendChild(div);\r\n    });\r\n  }\r\n\r\n  function showHistory() {\r\n    displayHistory();\r\n    elements.historySection?.classList.remove('is-hidden');\r\n    elements.historySection?.scrollIntoView({ behavior: 'smooth', block: 'nearest' });\r\n  }\r\n\r\n  function clearHistory() {\r\n    if (!confirm(currentLang === 'ro' ? '\u0218tergi tot istoricul?' : 'Clear all history?')) return;\r\n    try {\r\n      localStorage.removeItem(HISTORY_KEY);\r\n      updateHistoryBadge();\r\n      displayHistory();\r\n    } catch (e) {\r\n      console.warn('Could not clear history:', e);\r\n    }\r\n  }\r\n\r\n  \/\/ QR Code Processing\r\n  function processQRCode(file) {\r\n    if (!file || !file.type.startsWith('image\/')) {\r\n      showQRStatus('error', currentLang === 'ro' ? 'Fi\u0219ier invalid. \u00cencarc\u0103 o imagine.' : 'Invalid file. Please upload an image.');\r\n      return;\r\n    }\r\n\r\n    showQRStatus('loading', currentLang === 'ro' ? 'Se proceseaz\u0103 codul QR...' : 'Processing QR code...');\r\n\r\n    const reader = new FileReader();\r\n    reader.onload = function(e) {\r\n      const img = new Image();\r\n      img.onload = function() {\r\n        const canvas = document.createElement('canvas');\r\n        const ctx = canvas.getContext('2d');\r\n        canvas.width = img.width;\r\n        canvas.height = img.height;\r\n        ctx.drawImage(img, 0, 0);\r\n\r\n        const imageData = ctx.getImageData(0, 0, canvas.width, canvas.height);\r\n\r\n        if (typeof jsQR === 'undefined') {\r\n          showQRStatus('error', currentLang === 'ro' ? 'Biblioteca QR nu este \u00eenc\u0103rcat\u0103.' : 'QR library not loaded.');\r\n          return;\r\n        }\r\n\r\n        const code = jsQR(imageData.data, imageData.width, imageData.height);\r\n\r\n        if (code && code.data) {\r\n          const detectedUrl = code.data.trim();\r\n          \/\/ Check if it looks like a URL\r\n          if (detectedUrl.match(\/^https?:\\\/\\\/\/i) || detectedUrl.match(\/^www\\.\/i)) {\r\n            elements.urlInput.value = detectedUrl;\r\n            showQRStatus('success', currentLang === 'ro'\r\n              ? `URL detectat: ${truncateUrl(detectedUrl, 50)}`\r\n              : `URL detected: ${truncateUrl(detectedUrl, 50)}`);\r\n          } else {\r\n            showQRStatus('warning', currentLang === 'ro'\r\n              ? `Text detectat (nu e URL): ${truncateUrl(detectedUrl, 40)}`\r\n              : `Text detected (not URL): ${truncateUrl(detectedUrl, 40)}`);\r\n          }\r\n        } else {\r\n          showQRStatus('error', currentLang === 'ro'\r\n            ? 'Nu s-a g\u0103sit niciun cod QR \u00een imagine.'\r\n            : 'No QR code found in image.');\r\n        }\r\n      };\r\n      img.onerror = function() {\r\n        showQRStatus('error', currentLang === 'ro' ? 'Nu s-a putut \u00eenc\u0103rca imaginea.' : 'Could not load image.');\r\n      };\r\n      img.src = e.target.result;\r\n    };\r\n    reader.onerror = function() {\r\n      showQRStatus('error', currentLang === 'ro' ? 'Eroare la citirea fi\u0219ierului.' : 'Error reading file.');\r\n    };\r\n    reader.readAsDataURL(file);\r\n  }\r\n\r\n  function truncateUrl(url, maxLen) {\r\n    return url.length > maxLen ? url.substring(0, maxLen) + '...' : url;\r\n  }\r\n\r\n  function showQRStatus(type, message) {\r\n    if (!elements.qrStatus) return;\r\n    elements.qrStatus.classList.remove('is-hidden');\r\n    elements.qrStatus.textContent = message;\r\n    elements.qrStatus.style.background = type === 'success' ? 'var(--zic-safe-bg)' :\r\n                                          type === 'error' ? 'var(--zic-danger-bg)' :\r\n                                          type === 'warning' ? 'var(--zic-warning-bg)' :\r\n                                          'var(--zic-surface)';\r\n    elements.qrStatus.style.color = type === 'success' ? 'var(--zic-safe)' :\r\n                                     type === 'error' ? 'var(--zic-danger)' :\r\n                                     type === 'warning' ? 'var(--zic-warning)' :\r\n                                     'var(--zic-muted)';\r\n  }\r\n\r\n  function loadExample() {\r\n    const examples = [\r\n      'https:\/\/www.bancatransllvania.ro\/autentificare',\r\n      'https:\/\/paypa1-secure-login.suspicious-site.tk\/verify-account',\r\n      'https:\/\/secure.ernag-verificare.xyz\/cont',\r\n      'https:\/\/www.raiffelsen.ro\/login',\r\n      'https:\/\/anaf.gov.ro.verificare-ramburs.tk\/urgent'\r\n    ];\r\n    elements.urlInput.value = examples[Math.floor(Math.random() * examples.length)];\r\n  }\r\n\r\n  const VALID_ACTIONS = ['analyze', 'reset', 'example', 'toggleLang', 'toggleTheme', 'exportJSON', 'exportCSV', 'copyResults', 'exportBatchJSON', 'exportBatchCSV', 'showHistory', 'clearHistory', 'shareLink', 'printReport'];\r\n\r\n  function handleClick(e) {\r\n    const button = e.target.closest('[data-action]');\r\n    if (!button) return;\r\n    const action = button.dataset.action;\r\n    if (!VALID_ACTIONS.includes(action)) return;\r\n\r\n    if (action === 'analyze') {\r\n      if (elements.batchMode?.checked) analyzeBatch();\r\n      else analyze();\r\n    }\r\n    else if (action === 'reset') reset();\r\n    else if (action === 'example') loadExample();\r\n    else if (action === 'toggleLang') toggleLanguage();\r\n    else if (action === 'toggleTheme') toggleTheme();\r\n    else if (action === 'exportJSON' && lastAnalysis) exportJSON(lastAnalysis, `zic-security-${Date.now()}.json`);\r\n    else if (action === 'exportCSV' && lastAnalysis) exportCSV(lastAnalysis, `zic-security-${Date.now()}.csv`);\r\n    else if (action === 'copyResults') copyResultsToClipboard();\r\n    else if (action === 'exportBatchJSON' && lastBatchResults.length) exportJSON(lastBatchResults, `zic-batch-${Date.now()}.json`);\r\n    else if (action === 'exportBatchCSV' && lastBatchResults.length) exportCSV(lastBatchResults, `zic-batch-${Date.now()}.csv`);\r\n    else if (action === 'showHistory') showHistory();\r\n    else if (action === 'clearHistory') clearHistory();\r\n    else if (action === 'shareLink') shareResultLink(button);\r\n    else if (action === 'printReport') window.print();\r\n  }\r\n\r\n  function handleKeypress(e) {\r\n    if (e.key === 'Enter' && e.target === elements.urlInput) {\r\n      e.preventDefault();\r\n      analyze();\r\n    }\r\n  }\r\n\r\n  function init() {\r\n    if (!root || !elements.urlInput) {\r\n      console.error('ZIC Website Spoofing v2: Required elements not found');\r\n      return;\r\n    }\r\n    \/\/ Apply initial translations based on browser language\r\n    applyTranslations();\r\n\r\n    \/\/ Check for shared results in URL hash\r\n    loadSharedResults();\r\n\r\n    root.addEventListener('click', handleClick);\r\n    root.addEventListener('keypress', handleKeypress);\r\n\r\n    \/\/ Batch mode toggle listener\r\n    if (elements.batchMode) {\r\n      elements.batchMode.addEventListener('change', toggleBatchMode);\r\n    }\r\n\r\n    \/\/ Initialize history badge\r\n    updateHistoryBadge();\r\n\r\n    \/\/ QR Code upload listener\r\n    if (elements.qrUpload) {\r\n      elements.qrUpload.addEventListener('change', function(e) {\r\n        if (e.target.files && e.target.files[0]) {\r\n          processQRCode(e.target.files[0]);\r\n        }\r\n      });\r\n    }\r\n  }\r\n\r\n  if (document.readyState === 'loading') {\r\n    document.addEventListener('DOMContentLoaded', init);\r\n  } else {\r\n    init();\r\n  }\r\n})();\r\n<\/script>\r\n<\/div>\r\n<\/div><!--\r\n  ZIC Tools - Author Section\r\n  Version: 1.0\r\n\r\n  USAGE: Create a new WPCode snippet with this code and add it AFTER the tools hub on \/tools\/ page\r\n-->\r\n\r\n<div id=\"zic-author-section\">\r\n  <div class=\"zic-author__container\">\r\n    <div class=\"zic-author__card\">\r\n\r\n      <!-- Photo -->\r\n      <div class=\"zic-author__photo\">\r\n        <img decoding=\"async\"\r\n          src=\"https:\/\/zic.legal\/wp-content\/uploads\/2025\/03\/Zlati_Close_Up.jpg\"\r\n          alt=\"George Zlati - Avocat\"\r\n          loading=\"lazy\"\r\n        \/>\r\n      <\/div>\r\n\r\n      <!-- Content -->\r\n      <div class=\"zic-author__content\">\r\n        <div class=\"zic-author__badge\">\r\n          <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n            <path d=\"M12 2l3.09 6.26L22 9.27l-5 4.87 1.18 6.88L12 17.77l-6.18 3.25L7 14.14 2 9.27l6.91-1.01L12 2z\"\/>\r\n          <\/svg>\r\n          <span>Dezvoltator instrumente<\/span>\r\n        <\/div>\r\n\r\n        <h3 class=\"zic-author__name\">George Zlati<\/h3>\r\n        <p class=\"zic-author__title\">Lect. univ. dr. avocat | Partener ZIC Legal<\/p>\r\n\r\n        <p class=\"zic-author__bio\">\r\n          Avocat cu peste 13 ani de experienta in drept penal, specializat in criminalitate informatica,\r\n          blockchain si crypto-assets. Autor al primului Tratat de Criminalitate Informatica din Romania,\r\n          citat in decizii obligatorii ale ICCJ.\r\n        <\/p>\r\n\r\n        <div class=\"zic-author__tags\">\r\n          <span class=\"zic-author__tag\">Drept Penal<\/span>\r\n          <span class=\"zic-author__tag zic-author__tag--cyber\">Cybercrime<\/span>\r\n          <span class=\"zic-author__tag\">Blockchain & Crypto<\/span>\r\n          <span class=\"zic-author__tag\">MiCA Compliance<\/span>\r\n        <\/div>\r\n\r\n        <a href=\"https:\/\/zic.legal\/team\/zlatigeorge\/\" class=\"zic-author__link\">\r\n          <span>Vezi profilul complet<\/span>\r\n          <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n            <path d=\"M5 12h14\"\/>\r\n            <path d=\"M12 5l7 7-7 7\"\/>\r\n          <\/svg>\r\n        <\/a>\r\n      <\/div>\r\n\r\n    <\/div>\r\n  <\/div>\r\n<\/div>\r\n\r\n<style>\r\n\/* ============================================================\r\n   ZIC Author Section - Matches Tools Hub Design System\r\n   ============================================================ *\/\r\n\r\n#zic-author-section {\r\n  --author-primary: #8A88FF;\r\n  --author-primary-dark: #6F6CFF;\r\n  --author-primary-light: rgba(138, 136, 255, 0.08);\r\n  --author-primary-glow: rgba(138, 136, 255, 0.25);\r\n\r\n  --author-cyber: #308D98;\r\n  --author-cyber-light: rgba(48, 141, 152, 0.08);\r\n\r\n  --author-ink: #1F2937;\r\n  --author-ink-light: #374151;\r\n  --author-muted: #6B7280;\r\n\r\n  --author-bg: #F9FAFB;\r\n  --author-surface: #FFFFFF;\r\n  --author-border: #E5E7EB;\r\n\r\n  --author-shadow: 0 4px 6px -1px rgba(0,0,0,0.1), 0 2px 4px -1px rgba(0,0,0,0.06);\r\n  --author-shadow-lg: 0 10px 15px -3px rgba(0,0,0,0.1), 0 4px 6px -2px rgba(0,0,0,0.05);\r\n\r\n  --author-radius: 20px;\r\n  --author-radius-sm: 14px;\r\n  --author-radius-xs: 10px;\r\n\r\n  --author-transition: 200ms cubic-bezier(0.4, 0, 0.2, 1);\r\n\r\n  font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif;\r\n  -webkit-font-smoothing: antialiased;\r\n}\r\n\r\n#zic-author-section *,\r\n#zic-author-section *::before,\r\n#zic-author-section *::after {\r\n  box-sizing: border-box;\r\n}\r\n\r\n.zic-author__container {\r\n  max-width: 1100px;\r\n  margin: 0 auto;\r\n}\r\n\r\n@media (max-width: 1100px) {\r\n  .zic-author__container {\r\n    max-width: 760px;\r\n  }\r\n}\r\n\r\n@media (max-width: 680px) {\r\n  .zic-author__container {\r\n    max-width: 400px;\r\n  }\r\n}\r\n\r\n\/* === Card === *\/\r\n.zic-author__card {\r\n  position: relative;\r\n  background: var(--author-surface);\r\n  border: 1px solid var(--author-border);\r\n  border-radius: var(--author-radius);\r\n  padding: 32px;\r\n  display: flex;\r\n  align-items: center;\r\n  gap: 32px;\r\n  overflow: hidden;\r\n  transition: all var(--author-transition);\r\n}\r\n\r\n.zic-author__card::before {\r\n  content: '';\r\n  position: absolute;\r\n  top: 0;\r\n  left: 0;\r\n  right: 0;\r\n  height: 4px;\r\n  background: linear-gradient(90deg, var(--author-primary), var(--author-cyber));\r\n}\r\n\r\n\/* === Photo === *\/\r\n.zic-author__photo {\r\n  flex-shrink: 0;\r\n  width: 160px;\r\n  height: 200px;\r\n  border-radius: var(--author-radius);\r\n  overflow: hidden;\r\n  background: var(--author-bg);\r\n  box-shadow: var(--author-shadow);\r\n}\r\n\r\n.zic-author__photo img {\r\n  width: 100%;\r\n  height: 100%;\r\n  object-fit: cover;\r\n  object-position: center top;\r\n}\r\n\r\n\/* === Content === *\/\r\n.zic-author__content {\r\n  flex: 1;\r\n  min-width: 0;\r\n}\r\n\r\n\/* Badge *\/\r\n.zic-author__badge {\r\n  display: inline-flex;\r\n  align-items: center;\r\n  gap: 6px;\r\n  padding: 6px 12px;\r\n  background: var(--author-primary-light);\r\n  color: var(--author-primary-dark);\r\n  font-size: 12px;\r\n  font-weight: 700;\r\n  text-transform: uppercase;\r\n  letter-spacing: 0.5px;\r\n  border-radius: 20px;\r\n  margin-bottom: 12px;\r\n}\r\n\r\n.zic-author__badge svg {\r\n  color: var(--author-primary);\r\n}\r\n\r\n\/* Name & Title *\/\r\n.zic-author__name {\r\n  margin: 0 0 4px 0;\r\n  font-size: 24px;\r\n  font-weight: 800;\r\n  color: var(--author-ink);\r\n  line-height: 1.2;\r\n}\r\n\r\n.zic-author__title {\r\n  margin: 0 0 12px 0;\r\n  font-size: 15px;\r\n  font-weight: 600;\r\n  color: var(--author-primary-dark);\r\n}\r\n\r\n\/* Bio *\/\r\n.zic-author__bio {\r\n  margin: 0 0 16px 0;\r\n  font-size: 15px;\r\n  line-height: 1.6;\r\n  color: var(--author-muted);\r\n  max-width: 600px;\r\n}\r\n\r\n\/* Tags *\/\r\n.zic-author__tags {\r\n  display: flex;\r\n  flex-wrap: wrap;\r\n  gap: 8px;\r\n  margin-bottom: 20px;\r\n}\r\n\r\n.zic-author__tag {\r\n  display: inline-block;\r\n  padding: 5px 12px;\r\n  background: var(--author-bg);\r\n  color: var(--author-ink-light);\r\n  font-size: 12px;\r\n  font-weight: 600;\r\n  border-radius: 20px;\r\n  border: 1px solid var(--author-border);\r\n  transition: all var(--author-transition);\r\n}\r\n\r\n.zic-author__tag:hover {\r\n  background: var(--author-primary-light);\r\n  border-color: var(--author-primary);\r\n  color: var(--author-primary-dark);\r\n}\r\n\r\n.zic-author__tag--cyber {\r\n  background: var(--author-cyber-light);\r\n  border-color: transparent;\r\n  color: var(--author-cyber);\r\n}\r\n\r\n.zic-author__tag--cyber:hover {\r\n  background: var(--author-cyber);\r\n  color: #fff;\r\n}\r\n\r\n\/* Link Button *\/\r\n.zic-author__link {\r\n  display: inline-flex;\r\n  align-items: center;\r\n  gap: 8px;\r\n  padding: 12px 24px;\r\n  background: linear-gradient(135deg, var(--author-primary), var(--author-primary-dark));\r\n  color: #fff;\r\n  font-size: 14px;\r\n  font-weight: 700;\r\n  text-decoration: none;\r\n  border-radius: var(--author-radius-sm);\r\n  box-shadow: 0 4px 14px var(--author-primary-glow);\r\n  transition: all var(--author-transition);\r\n}\r\n\r\n.zic-author__link:hover {\r\n  transform: translateY(-2px);\r\n  box-shadow: 0 6px 20px var(--author-primary-glow);\r\n}\r\n\r\n.zic-author__link:active {\r\n  transform: translateY(0);\r\n}\r\n\r\n.zic-author__link svg {\r\n  transition: transform var(--author-transition);\r\n}\r\n\r\n.zic-author__link:hover svg {\r\n  transform: translateX(4px);\r\n}\r\n\r\n\/* === Responsive === *\/\r\n\r\n\/* Tablet *\/\r\n@media (max-width: 768px) {\r\n  .zic-author__card {\r\n    flex-direction: column;\r\n    text-align: center;\r\n    padding: 28px 24px;\r\n    gap: 24px;\r\n  }\r\n\r\n  .zic-author__photo {\r\n    width: 140px;\r\n    height: 175px;\r\n  }\r\n\r\n  .zic-author__badge {\r\n    justify-content: center;\r\n  }\r\n\r\n  .zic-author__bio {\r\n    max-width: none;\r\n  }\r\n\r\n  .zic-author__tags {\r\n    justify-content: center;\r\n  }\r\n\r\n  .zic-author__name {\r\n    font-size: 22px;\r\n  }\r\n}\r\n\r\n\/* Mobile *\/\r\n@media (max-width: 480px) {\r\n  .zic-author__card {\r\n    padding: 24px 20px;\r\n  }\r\n\r\n  .zic-author__photo {\r\n    width: 120px;\r\n    height: 150px;\r\n  }\r\n\r\n  .zic-author__name {\r\n    font-size: 20px;\r\n  }\r\n\r\n  .zic-author__title {\r\n    font-size: 14px;\r\n  }\r\n\r\n  .zic-author__bio {\r\n    font-size: 14px;\r\n  }\r\n\r\n  .zic-author__link {\r\n    width: 100%;\r\n    justify-content: center;\r\n  }\r\n}\r\n\r\n\/* === Animation === *\/\r\n.zic-author__card {\r\n  animation: authorFadeIn 0.6s cubic-bezier(0.34, 1.56, 0.64, 1);\r\n}\r\n\r\n@keyframes authorFadeIn {\r\n  from {\r\n    opacity: 0;\r\n    transform: translateY(20px);\r\n  }\r\n  to {\r\n    opacity: 1;\r\n    transform: translateY(0);\r\n  }\r\n}\r\n\r\n\/* Disable dark mode - consistent with tools hub *\/\r\n#zic-author-section {\r\n  color-scheme: light only;\r\n}\r\n<\/style>\r\n<\/div><\/div><\/div><\/div>\n","protected":false},"excerpt":{"rendered":"","protected":false},"author":8,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"100-width.php","meta":{"_acf_changed":false,"footnotes":""},"class_list":["post-4099","page","type-page","status-publish","hentry"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.6 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Instrumente juridice | Zlati Ionescu Chiperi<\/title>\n<meta name=\"description\" content=\"Instrumente juridice care s\u0103 te ajute \u00een activitatea profesional\u0103: calculator prescrip\u021bie, concurs de infrac\u021biuni, liberare condi\u021bionat\u0103 etc.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/zic.legal\/ro\/unelte\/\" \/>\n<meta property=\"og:locale\" content=\"ro_RO\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Instrumente juridice\" \/>\n<meta property=\"og:description\" content=\"Instrumente juridice care s\u0103 te ajute \u00een activitatea profesional\u0103: calculator prescrip\u021bie, concurs de infrac\u021biuni, liberare condi\u021bionat\u0103 etc.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/zic.legal\/ro\/unelte\/\" \/>\n<meta property=\"og:site_name\" content=\"ZIC Legal\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/profile.php?id=61573624655319\" \/>\n<meta property=\"article:modified_time\" content=\"2025-12-29T18:24:14+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/zic.legal\/wp-content\/uploads\/2025\/12\/tools.webp\" \/>\n\t<meta property=\"og:image:width\" content=\"1536\" \/>\n\t<meta property=\"og:image:height\" content=\"1024\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/webp\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Timp estimat pentru citire\" \/>\n\t<meta name=\"twitter:data1\" content=\"6 minute\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/zic.legal\\\/tools\\\/\",\"url\":\"https:\\\/\\\/zic.legal\\\/tools\\\/\",\"name\":\"Instrumente juridice | Zlati Ionescu Chiperi\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/zic.legal\\\/#website\"},\"datePublished\":\"2025-12-29T08:14:21+00:00\",\"dateModified\":\"2025-12-29T18:24:14+00:00\",\"description\":\"Instrumente juridice care s\u0103 te ajute \u00een activitatea profesional\u0103: calculator prescrip\u021bie, concurs de infrac\u021biuni, liberare condi\u021bionat\u0103 etc.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/zic.legal\\\/tools\\\/#breadcrumb\"},\"inLanguage\":\"ro-RO\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/zic.legal\\\/tools\\\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/zic.legal\\\/tools\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/zic.legal\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Tools\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/zic.legal\\\/#website\",\"url\":\"https:\\\/\\\/zic.legal\\\/\",\"name\":\"Zlati Ionescu Chiperi SCA\",\"description\":\"Not another brick in the law\",\"publisher\":{\"@id\":\"https:\\\/\\\/zic.legal\\\/#organization\"},\"alternateName\":\"Zlati Ionescu Chiperi - SCA\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/zic.legal\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"ro-RO\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/zic.legal\\\/#organization\",\"name\":\"Zlati Ionescu Chiperi SCA\",\"url\":\"https:\\\/\\\/zic.legal\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"ro-RO\",\"@id\":\"https:\\\/\\\/zic.legal\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/zic.legal\\\/wp-content\\\/uploads\\\/2025\\\/02\\\/Logo-Color-RGB@0.5x.png\",\"contentUrl\":\"https:\\\/\\\/zic.legal\\\/wp-content\\\/uploads\\\/2025\\\/02\\\/Logo-Color-RGB@0.5x.png\",\"width\":306,\"height\":306,\"caption\":\"Zlati Ionescu Chiperi SCA\"},\"image\":{\"@id\":\"https:\\\/\\\/zic.legal\\\/#\\\/schema\\\/logo\\\/image\\\/\"},\"sameAs\":[\"https:\\\/\\\/www.facebook.com\\\/profile.php?id=61573624655319\",\"https:\\\/\\\/www.linkedin.com\\\/company\\\/zic-legal\\\/\",\"https:\\\/\\\/www.wikidata.org\\\/wiki\\\/Q139905998\"]}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Instrumente juridice | Zlati Ionescu Chiperi","description":"Instrumente juridice care s\u0103 te ajute \u00een activitatea profesional\u0103: calculator prescrip\u021bie, concurs de infrac\u021biuni, liberare conteaz\u0103 etc.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/zic.legal\/ro\/unelte\/","og_locale":"ro_RO","og_type":"article","og_title":"Instrumente juridice","og_description":"Instrumente juridice care s\u0103 te ajute \u00een activitatea profesional\u0103: calculator prescrip\u021bie, concurs de infrac\u021biuni, liberare condi\u021bionat\u0103 etc.","og_url":"https:\/\/zic.legal\/ro\/unelte\/","og_site_name":"ZIC Legal","article_publisher":"https:\/\/www.facebook.com\/profile.php?id=61573624655319","article_modified_time":"2025-12-29T18:24:14+00:00","og_image":[{"width":1536,"height":1024,"url":"https:\/\/zic.legal\/wp-content\/uploads\/2025\/12\/tools.webp","type":"image\/webp"}],"twitter_card":"summary_large_image","twitter_misc":{"Timp estimat pentru citire":"6 minute"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/zic.legal\/tools\/","url":"https:\/\/zic.legal\/tools\/","name":"Instrumente juridice | Zlati Ionescu Chiperi","isPartOf":{"@id":"https:\/\/zic.legal\/#website"},"datePublished":"2025-12-29T08:14:21+00:00","dateModified":"2025-12-29T18:24:14+00:00","description":"Instrumente juridice care s\u0103 te ajute \u00een activitatea profesional\u0103: calculator prescrip\u021bie, concurs de infrac\u021biuni, liberare conteaz\u0103 etc.","breadcrumb":{"@id":"https:\/\/zic.legal\/tools\/#breadcrumb"},"inLanguage":"ro-RO","potentialAction":[{"@type":"ReadAction","target":["https:\/\/zic.legal\/tools\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/zic.legal\/tools\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/zic.legal\/"},{"@type":"ListItem","position":2,"name":"Tools"}]},{"@type":"WebSite","@id":"https:\/\/zic.legal\/#website","url":"https:\/\/zic.legal\/","name":"Zlati Ionescu Chiperi SCA","description":"Nu \u00eenc\u0103 o c\u0103r\u0103mid\u0103 \u00een lege","publisher":{"@id":"https:\/\/zic.legal\/#organization"},"alternateName":"Zlati Ionescu Chiperi - SCA","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/zic.legal\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"ro-RO"},{"@type":"Organization","@id":"https:\/\/zic.legal\/#organization","name":"Zlati Ionescu Chiperi SCA","url":"https:\/\/zic.legal\/","logo":{"@type":"ImageObject","inLanguage":"ro-RO","@id":"https:\/\/zic.legal\/#\/schema\/logo\/image\/","url":"https:\/\/zic.legal\/wp-content\/uploads\/2025\/02\/Logo-Color-RGB@0.5x.png","contentUrl":"https:\/\/zic.legal\/wp-content\/uploads\/2025\/02\/Logo-Color-RGB@0.5x.png","width":306,"height":306,"caption":"Zlati Ionescu Chiperi SCA"},"image":{"@id":"https:\/\/zic.legal\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/profile.php?id=61573624655319","https:\/\/www.linkedin.com\/company\/zic-legal\/","https:\/\/www.wikidata.org\/wiki\/Q139905998"]}]}},"jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/zic.legal\/ro\/wp-json\/wp\/v2\/pages\/4099","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/zic.legal\/ro\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/zic.legal\/ro\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/zic.legal\/ro\/wp-json\/wp\/v2\/users\/8"}],"replies":[{"embeddable":true,"href":"https:\/\/zic.legal\/ro\/wp-json\/wp\/v2\/comments?post=4099"}],"version-history":[{"count":15,"href":"https:\/\/zic.legal\/ro\/wp-json\/wp\/v2\/pages\/4099\/revisions"}],"predecessor-version":[{"id":4131,"href":"https:\/\/zic.legal\/ro\/wp-json\/wp\/v2\/pages\/4099\/revisions\/4131"}],"wp:attachment":[{"href":"https:\/\/zic.legal\/ro\/wp-json\/wp\/v2\/media?parent=4099"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}