{"id":610,"date":"2015-07-29T13:49:24","date_gmt":"2015-07-29T13:49:24","guid":{"rendered":"https:\/\/sichu-blockart-eduskill.sites.qsandbox.com\/?page_id=11"},"modified":"2026-09-17T16:09:07","modified_gmt":"2026-09-17T15:09:07","slug":"blog","status":"publish","type":"page","link":"https:\/\/cctvacademy.be\/fr\/blog\/","title":{"rendered":"Blog"},"content":{"rendered":"\t\t<div data-elementor-type=\"masteriyo-course-archive-page\" data-elementor-id=\"610\" class=\"elementor elementor-610\">\n\t\t\t\t<div class=\"elementor-element elementor-element-5714e7d e-flex e-con-boxed e-con e-parent\" data-id=\"5714e7d\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-971478b elementor-widget elementor-widget-html\" data-id=\"971478b\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<style>\r\n\/* ==========================================================\r\n   CCTV ACADEMY\r\n   SMART KNOWLEDGE HUB\r\n   WARM BLUEPRINT \/ EDITORIAL EDITION\r\n   ========================================================== *\/\r\n\r\n#cctv-knowledge{\r\n  --paper:#f2ead8;\r\n  --paper-light:#fbf7ed;\r\n  --paper-soft:#e9ddc7;\r\n  --paper-deep:#ddcbaa;\r\n\r\n  --ink:#191b18;\r\n  --muted:#5b5d54;\r\n\r\n  --blue:#285e72;\r\n  --blue-dark:#173f51;\r\n  --blue-deep:#102f3d;\r\n\r\n  --red:#c9362e;\r\n  --red-dark:#a92d27;\r\n\r\n  --yellow:#e3ab40;\r\n  --orange:#d9822e;\r\n  --green:#566b4d;\r\n  --purple:#685c79;\r\n\r\n  --line:rgba(25,32,29,.20);\r\n  --line-dark:rgba(25,32,29,.42);\r\n\r\n  position:relative;\r\n  isolation:isolate;\r\n  overflow:hidden;\r\n\r\n  max-width:1320px;\r\n  margin:0 auto;\r\n\r\n  color:var(--ink);\r\n\r\n  background:\r\n    linear-gradient(\r\n      rgba(40,50,45,.03) 1px,\r\n      transparent 1px\r\n    ),\r\n    linear-gradient(\r\n      90deg,\r\n      rgba(40,50,45,.03) 1px,\r\n      transparent 1px\r\n    ),\r\n    radial-gradient(\r\n      circle at 8% 8%,\r\n      rgba(201,54,46,.045),\r\n      transparent 24%\r\n    ),\r\n    radial-gradient(\r\n      circle at 94% 30%,\r\n      rgba(40,94,114,.05),\r\n      transparent 25%\r\n    ),\r\n    var(--paper);\r\n\r\n  background-size:\r\n    34px 34px,\r\n    34px 34px,\r\n    auto,\r\n    auto,\r\n    auto;\r\n\r\n  font-family:Arial,Helvetica,sans-serif;\r\n  font-size:16px;\r\n  line-height:1.7;\r\n}\r\n\r\n\r\n#cctv-knowledge *,\r\n#cctv-knowledge *::before,\r\n#cctv-knowledge *::after{\r\n  box-sizing:border-box;\r\n}\r\n\r\n\r\n#cctv-knowledge a{\r\n  color:inherit;\r\n  text-decoration:none;\r\n}\r\n\r\n\r\n#cctv-knowledge img{\r\n  display:block;\r\n  max-width:100%;\r\n}\r\n\r\n\r\n#cctv-knowledge button,\r\n#cctv-knowledge input{\r\n  font:inherit;\r\n}\r\n\r\n\r\n#cctv-knowledge button{\r\n  cursor:pointer;\r\n}\r\n\r\n\r\n.cvk-wrap{\r\n  position:relative;\r\n  z-index:2;\r\n\r\n  width:min(1180px,calc(100% - 56px));\r\n  margin:0 auto;\r\n}\r\n\r\n\r\n\/* ==========================================================\r\n   BLUEPRINT GUIDES\r\n   ========================================================== *\/\r\n\r\n.cvk-guide{\r\n  position:absolute;\r\n  z-index:0;\r\n\r\n  top:0;\r\n  bottom:0;\r\n\r\n  width:1px;\r\n\r\n  border-left:1px dashed rgba(29,39,35,.12);\r\n\r\n  pointer-events:none;\r\n}\r\n\r\n\r\n.cvk-guide--left{\r\n  left:50px;\r\n}\r\n\r\n\r\n.cvk-guide--middle{\r\n  left:50%;\r\n}\r\n\r\n\r\n.cvk-guide--right{\r\n  right:50px;\r\n}\r\n\r\n\r\n\/* ==========================================================\r\n   TYPOGRAPHY\r\n   ========================================================== *\/\r\n\r\n.cvk-eyebrow{\r\n  display:flex;\r\n  align-items:center;\r\n  gap:11px;\r\n\r\n  margin-bottom:17px;\r\n\r\n  color:var(--blue);\r\n\r\n  font-size:10px;\r\n  font-weight:900;\r\n  letter-spacing:.14em;\r\n  text-transform:uppercase;\r\n}\r\n\r\n\r\n.cvk-eyebrow::before{\r\n  content:\"\";\r\n\r\n  width:35px;\r\n  height:3px;\r\n\r\n  flex:0 0 auto;\r\n\r\n  background:var(--red);\r\n\r\n  transform:rotate(-2deg);\r\n}\r\n\r\n\r\n.cvk-title{\r\n  max-width:900px;\r\n\r\n  margin:0 0 22px;\r\n\r\n  color:var(--ink);\r\n\r\n  font-family:Georgia,\"Times New Roman\",serif;\r\n  font-size:clamp(38px,5vw,62px);\r\n  font-weight:900;\r\n  line-height:.98;\r\n  letter-spacing:-.045em;\r\n}\r\n\r\n\r\n.cvk-title span{\r\n  color:var(--red);\r\n}\r\n\r\n\r\n.cvk-lead{\r\n  max-width:800px;\r\n\r\n  margin:0;\r\n\r\n  color:var(--muted);\r\n\r\n  font-size:18px;\r\n  line-height:1.8;\r\n}\r\n\r\n\r\n\/* ==========================================================\r\n   BUTTONS\r\n   ========================================================== *\/\r\n\r\n.cvk-button,\r\n.cvk-btn{\r\n  display:inline-flex;\r\n  align-items:center;\r\n  justify-content:center;\r\n  gap:9px;\r\n\r\n  min-height:50px;\r\n  padding:12px 21px;\r\n\r\n  border:2px solid var(--ink);\r\n\r\n  background:var(--red);\r\n  color:#fff!important;\r\n\r\n  font-size:12px;\r\n  font-weight:900;\r\n\r\n  box-shadow:5px 5px 0 var(--ink);\r\n\r\n  transition:\r\n    transform .2s ease,\r\n    box-shadow .2s ease,\r\n    background .2s ease;\r\n}\r\n\r\n\r\n.cvk-button::after{\r\n  content:\"\u2192\";\r\n}\r\n\r\n\r\n.cvk-button:hover,\r\n.cvk-btn:hover{\r\n  transform:translate(3px,3px);\r\n\r\n  box-shadow:2px 2px 0 var(--ink);\r\n}\r\n\r\n\r\n.cvk-button--paper{\r\n  background:var(--paper-light);\r\n\r\n  color:var(--ink)!important;\r\n}\r\n\r\n\r\n\/* ==========================================================\r\n   HEADER\r\n   ========================================================== *\/\r\n\r\n.cvk-header{\r\n  position:relative;\r\n  z-index:10;\r\n\r\n  padding:24px 0;\r\n}\r\n\r\n\r\n.cvk-nav{\r\n  display:flex;\r\n  align-items:center;\r\n  justify-content:space-between;\r\n  gap:24px;\r\n\r\n  padding:13px 17px;\r\n\r\n  border:1px solid var(--line-dark);\r\n\r\n  background:rgba(251,247,237,.84);\r\n}\r\n\r\n\r\n.cvk-brand{\r\n  display:flex;\r\n  align-items:center;\r\n  gap:12px;\r\n}\r\n\r\n\r\n.cvk-brand-mark{\r\n  display:grid;\r\n  place-items:center;\r\n\r\n  width:42px;\r\n  height:42px;\r\n\r\n  border:1px solid var(--ink);\r\n\r\n  background:var(--blue);\r\n  color:#fff;\r\n\r\n  font-family:Georgia,serif;\r\n  font-size:13px;\r\n  font-weight:900;\r\n\r\n  box-shadow:3px 3px 0 var(--ink);\r\n}\r\n\r\n\r\n.cvk-brand strong{\r\n  display:block;\r\n\r\n  color:var(--blue-dark);\r\n\r\n  font-size:13px;\r\n}\r\n\r\n\r\n.cvk-brand small{\r\n  display:block;\r\n\r\n  margin-top:2px;\r\n\r\n  color:var(--muted);\r\n\r\n  font-size:8px;\r\n  font-weight:900;\r\n  letter-spacing:.12em;\r\n}\r\n\r\n\r\n.cvk-links{\r\n  display:flex;\r\n  gap:5px;\r\n}\r\n\r\n\r\n.cvk-links a{\r\n  padding:8px 10px;\r\n\r\n  color:var(--muted);\r\n\r\n  font-size:10px;\r\n  font-weight:900;\r\n}\r\n\r\n\r\n.cvk-links a:hover,\r\n.cvk-links a.active{\r\n  color:var(--red);\r\n}\r\n\r\n\r\n.cvk-nav-cta{\r\n  padding:8px 11px;\r\n\r\n  border:1px solid var(--ink);\r\n\r\n  background:var(--yellow);\r\n  color:var(--ink)!important;\r\n\r\n  font-size:10px;\r\n  font-weight:900;\r\n\r\n  box-shadow:3px 3px 0 var(--ink);\r\n}\r\n\r\n\r\n\/* ==========================================================\r\n   HERO\r\n   ========================================================== *\/\r\n\r\n.cvk-hero{\r\n  position:relative;\r\n\r\n  margin:0 28px 145px;\r\n  padding:42px;\r\n\r\n  border:1px solid var(--line-dark);\r\n\r\n  background:\r\n    linear-gradient(\r\n      rgba(40,50,45,.04) 1px,\r\n      transparent 1px\r\n    ),\r\n    linear-gradient(\r\n      90deg,\r\n      rgba(40,50,45,.04) 1px,\r\n      transparent 1px\r\n    ),\r\n    var(--paper-light);\r\n\r\n  background-size:38px 38px;\r\n\r\n  box-shadow:\r\n    0 20px 60px rgba(56,43,24,.08),\r\n    inset 0 0 100px rgba(120,92,43,.04);\r\n}\r\n\r\n\r\n.cvk-hero::before,\r\n.cvk-hero::after{\r\n  content:\"\";\r\n\r\n  position:absolute;\r\n\r\n  width:74px;\r\n  height:74px;\r\n\r\n  pointer-events:none;\r\n}\r\n\r\n\r\n.cvk-hero::before{\r\n  left:15px;\r\n  top:15px;\r\n\r\n  border-top:1px solid var(--ink);\r\n  border-left:1px solid var(--ink);\r\n}\r\n\r\n\r\n.cvk-hero::after{\r\n  right:15px;\r\n  bottom:15px;\r\n\r\n  border-right:1px solid var(--ink);\r\n  border-bottom:1px solid var(--ink);\r\n}\r\n\r\n\r\n.cvk-hero-meta{\r\n  display:flex;\r\n  align-items:center;\r\n  justify-content:space-between;\r\n  gap:20px;\r\n\r\n  margin-bottom:30px;\r\n  padding-bottom:14px;\r\n\r\n  border-bottom:1px solid var(--line);\r\n}\r\n\r\n\r\n.cvk-hero-meta strong{\r\n  color:var(--blue);\r\n\r\n  font-size:10px;\r\n  font-weight:900;\r\n  letter-spacing:.14em;\r\n  text-transform:uppercase;\r\n}\r\n\r\n\r\n.cvk-hero-meta span{\r\n  color:var(--muted);\r\n\r\n  font-family:\"Comic Sans MS\",\"Bradley Hand\",cursive;\r\n  font-size:14px;\r\n\r\n  transform:rotate(-2deg);\r\n}\r\n\r\n\r\n.cvk-hero-grid{\r\n  display:grid;\r\n  grid-template-columns:.9fr 1.1fr;\r\n  gap:52px;\r\n\r\n  align-items:center;\r\n}\r\n\r\n\r\n.cvk-hero-label{\r\n  display:inline-flex;\r\n  align-items:center;\r\n  gap:8px;\r\n\r\n  margin-bottom:24px;\r\n  padding:8px 12px;\r\n\r\n  border:1px solid var(--ink);\r\n\r\n  background:var(--yellow);\r\n\r\n  font-size:9px;\r\n  font-weight:900;\r\n  letter-spacing:.11em;\r\n  text-transform:uppercase;\r\n\r\n  box-shadow:3px 3px 0 var(--ink);\r\n\r\n  transform:rotate(-1deg);\r\n}\r\n\r\n\r\n.cvk-hero-label b{\r\n  padding:3px 6px;\r\n\r\n  background:var(--green);\r\n  color:#fff;\r\n}\r\n\r\n\r\n.cvk-hero h1{\r\n  max-width:640px;\r\n\r\n  margin:0 0 26px;\r\n\r\n  color:var(--ink);\r\n\r\n  font-family:Georgia,\"Times New Roman\",serif;\r\n  font-size:clamp(49px,6vw,80px);\r\n  font-weight:900;\r\n  line-height:.9;\r\n  letter-spacing:-.055em;\r\n}\r\n\r\n\r\n.cvk-hero h1 span{\r\n  display:block;\r\n\r\n  margin-top:14px;\r\n\r\n  color:var(--red);\r\n\r\n  font-family:\"Comic Sans MS\",\"Bradley Hand\",cursive;\r\n  font-size:.59em;\r\n  line-height:1.05;\r\n\r\n  transform:rotate(-2deg);\r\n}\r\n\r\n\r\n.cvk-hero-copy p{\r\n  max-width:620px;\r\n\r\n  color:var(--muted);\r\n\r\n  font-size:18px;\r\n}\r\n\r\n\r\n.cvk-hero-copy strong{\r\n  color:var(--ink);\r\n}\r\n\r\n\r\n.cvk-hero-info{\r\n  display:flex;\r\n  flex-wrap:wrap;\r\n  gap:8px;\r\n\r\n  margin-top:27px;\r\n}\r\n\r\n\r\n.cvk-hero-info span{\r\n  padding:6px 9px;\r\n\r\n  border:1px solid var(--line-dark);\r\n\r\n  background:var(--paper-soft);\r\n\r\n  font-size:9px;\r\n  font-weight:900;\r\n}\r\n\r\n\r\n\/* ==========================================================\r\n   HERO ARTWORK\r\n   ========================================================== *\/\r\n\r\n.cvk-hero-art{\r\n  position:relative;\r\n\r\n  min-height:630px;\r\n}\r\n\r\n\r\n.cvk-art-frame{\r\n  position:relative;\r\n\r\n  display:flex;\r\n  align-items:center;\r\n  justify-content:center;\r\n\r\n  min-height:600px;\r\n\r\n  margin:0;\r\n  padding:12px;\r\n\r\n  border:1px solid var(--line-dark);\r\n\r\n  background:#f5ecd9;\r\n\r\n  box-shadow:9px 10px 0 rgba(24,26,25,.09);\r\n\r\n  transform:rotate(.65deg);\r\n}\r\n\r\n\r\n.cvk-art-frame::before{\r\n  content:\"\";\r\n\r\n  position:absolute;\r\n  inset:20px;\r\n\r\n  border:1px solid rgba(28,36,33,.12);\r\n\r\n  pointer-events:none;\r\n}\r\n\r\n\r\n.cvk-art-frame img{\r\n  width:100%;\r\n  max-height:575px;\r\n\r\n  object-fit:contain;\r\n\r\n  mix-blend-mode:multiply;\r\n}\r\n\r\n\r\n.cvk-art-note{\r\n  position:absolute;\r\n  z-index:4;\r\n\r\n  left:-5px;\r\n  top:55px;\r\n\r\n  max-width:180px;\r\n\r\n  padding:11px 14px;\r\n\r\n  border:1px solid var(--ink);\r\n\r\n  background:var(--blue);\r\n  color:#fff;\r\n\r\n  font-family:\"Comic Sans MS\",\"Bradley Hand\",cursive;\r\n  font-size:15px;\r\n  line-height:1.2;\r\n\r\n  box-shadow:4px 4px 0 var(--ink);\r\n\r\n  transform:rotate(-4deg);\r\n}\r\n\r\n\r\n.cvk-art-note strong{\r\n  color:#ffd36a;\r\n}\r\n\r\n\r\n.cvk-art-caption{\r\n  position:absolute;\r\n\r\n  right:0;\r\n  bottom:0;\r\n\r\n  padding:5px 8px;\r\n\r\n  background:var(--paper-light);\r\n\r\n  color:var(--muted);\r\n\r\n  font-size:8px;\r\n  font-weight:900;\r\n  letter-spacing:.1em;\r\n  text-transform:uppercase;\r\n}\r\n\r\n\r\n\/* ==========================================================\r\n   SMART SEARCH\r\n   ========================================================== *\/\r\n\r\n.cvk-search-wrap{\r\n  position:relative;\r\n  z-index:5;\r\n\r\n  width:min(1080px,calc(100% - 56px));\r\n\r\n  margin:-205px auto 125px;\r\n  padding-top:130px;\r\n}\r\n\r\n\r\n.cvk-search{\r\n  padding:29px;\r\n\r\n  border:2px solid var(--ink);\r\n\r\n  background:var(--paper-light);\r\n\r\n  box-shadow:8px 9px 0 var(--ink);\r\n}\r\n\r\n\r\n.smart-label{\r\n  display:flex;\r\n  align-items:center;\r\n  gap:9px;\r\n\r\n  margin-bottom:14px;\r\n\r\n  color:var(--blue);\r\n\r\n  font-size:9px;\r\n  font-weight:900;\r\n  letter-spacing:.13em;\r\n  text-transform:uppercase;\r\n}\r\n\r\n\r\n.smart-label::before{\r\n  content:\"\u25cf\";\r\n\r\n  color:var(--green);\r\n}\r\n\r\n\r\n.search-row{\r\n  display:grid;\r\n  grid-template-columns:minmax(0,1fr) auto;\r\n  gap:11px;\r\n}\r\n\r\n\r\n.search-field{\r\n  position:relative;\r\n}\r\n\r\n\r\n\/* GEEN VERGROOTGLAS\r\n   tekst start gewoon links *\/\r\n\r\n.search-input{\r\n  width:100%;\r\n  min-height:61px;\r\n\r\n  padding:0 48px 0 16px;\r\n\r\n  border:1px solid var(--line-dark);\r\n  border-radius:0;\r\n\r\n  outline:none;\r\n\r\n  background:#fff;\r\n  color:var(--ink);\r\n\r\n  font-size:15px;\r\n}\r\n\r\n\r\n.search-input::placeholder{\r\n  color:#8d8c82;\r\n}\r\n\r\n\r\n.search-input:focus{\r\n  border:2px solid var(--blue);\r\n\r\n  box-shadow:3px 3px 0 var(--blue);\r\n}\r\n\r\n\r\n.clear-search{\r\n  position:absolute;\r\n\r\n  right:13px;\r\n  top:50%;\r\n\r\n  display:none;\r\n  place-items:center;\r\n\r\n  width:29px;\r\n  height:29px;\r\n\r\n  border:1px solid var(--line-dark);\r\n  border-radius:0;\r\n\r\n  background:var(--paper-soft);\r\n  color:var(--ink);\r\n\r\n  transform:translateY(-50%);\r\n}\r\n\r\n\r\n.clear-search.visible{\r\n  display:grid;\r\n}\r\n\r\n\r\n.search-button{\r\n  min-width:175px;\r\n\r\n  border:2px solid var(--ink);\r\n\r\n  background:var(--red);\r\n  color:#fff;\r\n\r\n  font-size:12px;\r\n  font-weight:900;\r\n\r\n  box-shadow:4px 4px 0 var(--ink);\r\n}\r\n\r\n\r\n.search-button:hover{\r\n  background:var(--red-dark);\r\n}\r\n\r\n\r\n.search-button.is-loading{\r\n  opacity:.7;\r\n\r\n  cursor:progress;\r\n}\r\n\r\n\r\n.search-examples{\r\n  display:flex;\r\n  flex-wrap:wrap;\r\n  gap:7px;\r\n\r\n  margin-top:16px;\r\n}\r\n\r\n\r\n.search-examples > span{\r\n  display:flex;\r\n  align-items:center;\r\n\r\n  color:var(--muted);\r\n\r\n  font-size:9px;\r\n  font-weight:900;\r\n}\r\n\r\n\r\n.example-search{\r\n  padding:6px 9px;\r\n\r\n  border:1px solid var(--line-dark);\r\n  border-radius:0;\r\n\r\n  background:var(--paper-soft);\r\n  color:var(--muted);\r\n\r\n  font-size:9px;\r\n  font-weight:900;\r\n}\r\n\r\n\r\n.example-search:hover{\r\n  border-color:var(--red);\r\n\r\n  color:var(--red);\r\n}\r\n\r\n\r\n.search-intelligence{\r\n  display:none;\r\n\r\n  margin-top:18px;\r\n  padding-top:17px;\r\n\r\n  border-top:1px solid var(--line);\r\n}\r\n\r\n\r\n.search-intelligence.visible{\r\n  display:block;\r\n}\r\n\r\n\r\n.interpretation{\r\n  display:flex;\r\n  flex-wrap:wrap;\r\n  align-items:center;\r\n  gap:7px;\r\n}\r\n\r\n\r\n.interpretation-label{\r\n  color:var(--muted);\r\n\r\n  font-size:9px;\r\n  font-weight:900;\r\n}\r\n\r\n\r\n.concept-chip{\r\n  padding:5px 8px;\r\n\r\n  border:1px solid var(--blue);\r\n\r\n  background:#e6ede9;\r\n  color:var(--blue);\r\n\r\n  font-size:8px;\r\n  font-weight:900;\r\n}\r\n\r\n\r\n.search-scope{\r\n  margin-top:9px;\r\n\r\n  color:var(--muted);\r\n\r\n  font-size:8px;\r\n}\r\n\r\n\r\n\/* ==========================================================\r\n   FEATURED ARTICLE\r\n   ========================================================== *\/\r\n\r\n.cvk-featured{\r\n  margin-bottom:145px;\r\n}\r\n\r\n\r\n.featured-card{\r\n  display:grid;\r\n  grid-template-columns:1fr 1fr;\r\n\r\n  overflow:hidden;\r\n\r\n  min-height:480px;\r\n\r\n  border:1px solid var(--ink);\r\n\r\n  background:var(--blue-dark);\r\n\r\n  box-shadow:9px 10px 0 var(--ink);\r\n}\r\n\r\n\r\n.featured-visual{\r\n  position:relative;\r\n  overflow:hidden;\r\n\r\n  min-height:470px;\r\n\r\n  background:\r\n    linear-gradient(\r\n      rgba(255,255,255,.04) 1px,\r\n      transparent 1px\r\n    ),\r\n    linear-gradient(\r\n      90deg,\r\n      rgba(255,255,255,.04) 1px,\r\n      transparent 1px\r\n    ),\r\n    var(--blue-deep);\r\n\r\n  background-size:31px 31px;\r\n}\r\n\r\n\r\n.featured-placeholder,\r\n.image-placeholder{\r\n  position:absolute;\r\n  inset:0;\r\n\r\n  display:grid;\r\n  place-items:center;\r\n\r\n  color:rgba(255,255,255,.25);\r\n}\r\n\r\n\r\n.featured-placeholder svg{\r\n  width:90px;\r\n}\r\n\r\n\r\n.featured-visual img{\r\n  position:absolute;\r\n  inset:0;\r\n\r\n  width:100%;\r\n  height:100%;\r\n\r\n  object-fit:cover;\r\n\r\n  opacity:0;\r\n\r\n  filter:\r\n    sepia(.12)\r\n    saturate(.75)\r\n    contrast(1.05);\r\n\r\n  transition:\r\n    opacity .3s ease,\r\n    transform .4s ease;\r\n}\r\n\r\n\r\n.featured-visual img.loaded{\r\n  opacity:.72;\r\n}\r\n\r\n\r\n.featured-card:hover\r\n.featured-visual img.loaded{\r\n  transform:scale(1.035);\r\n}\r\n\r\n\r\n.featured-content{\r\n  display:flex;\r\n  flex-direction:column;\r\n  justify-content:center;\r\n\r\n  padding:48px;\r\n\r\n  color:#fff;\r\n}\r\n\r\n\r\n.featured-label{\r\n  margin-bottom:18px;\r\n\r\n  color:#f0bd4d;\r\n\r\n  font-size:9px;\r\n  font-weight:900;\r\n  letter-spacing:.14em;\r\n  text-transform:uppercase;\r\n}\r\n\r\n\r\n.featured-topic{\r\n  margin-bottom:9px;\r\n\r\n  color:#b7ced4;\r\n\r\n  font-size:9px;\r\n  font-weight:900;\r\n  text-transform:uppercase;\r\n}\r\n\r\n\r\n.featured-title{\r\n  margin:0;\r\n\r\n  color:#fff;\r\n\r\n  font-family:Georgia,serif;\r\n  font-size:clamp(30px,4vw,46px);\r\n  line-height:1.05;\r\n}\r\n\r\n\r\n.featured-excerpt{\r\n  margin:19px 0 25px;\r\n\r\n  color:#d3dedb;\r\n\r\n  font-size:13px;\r\n}\r\n\r\n\r\n.featured-footer{\r\n  display:flex;\r\n  align-items:center;\r\n  justify-content:space-between;\r\n  gap:18px;\r\n\r\n  margin-top:auto;\r\n}\r\n\r\n\r\n.read-more{\r\n  color:#f0bd4d!important;\r\n\r\n  font-size:11px;\r\n  font-weight:900;\r\n}\r\n\r\n\r\n.featured-date{\r\n  color:#9cafaf;\r\n\r\n  font-size:9px;\r\n}\r\n\r\n\r\n\/* ==========================================================\r\n   KNOWLEDGE RESULTS\r\n   ========================================================== *\/\r\n\r\n.cvk-knowledge{\r\n  margin-bottom:145px;\r\n\r\n  scroll-margin-top:25px;\r\n}\r\n\r\n\r\n.results-head{\r\n  display:grid;\r\n  grid-template-columns:minmax(0,1fr) auto;\r\n  gap:35px;\r\n\r\n  align-items:start;\r\n\r\n  margin-bottom:34px;\r\n}\r\n\r\n\r\n.result-summary{\r\n  padding:7px 10px;\r\n\r\n  border:1px solid var(--line-dark);\r\n\r\n  background:var(--paper-light);\r\n  color:var(--muted);\r\n\r\n  font-size:9px;\r\n  font-weight:900;\r\n}\r\n\r\n\r\n.result-query{\r\n  display:none;\r\n\r\n  margin-top:12px;\r\n\r\n  color:var(--muted);\r\n\r\n  font-size:11px;\r\n}\r\n\r\n\r\n.result-query.visible{\r\n  display:block;\r\n}\r\n\r\n\r\n.result-query strong{\r\n  color:var(--ink);\r\n}\r\n\r\n\r\n\/* ==========================================================\r\n   SEARCH PROGRESS\r\n   ========================================================== *\/\r\n\r\n.search-progress{\r\n  display:none;\r\n\r\n  grid-template-columns:auto 1fr auto;\r\n  gap:15px;\r\n\r\n  align-items:center;\r\n\r\n  margin-top:22px;\r\n  padding:15px;\r\n\r\n  border:1px solid var(--blue);\r\n\r\n  background:#e9eee8;\r\n}\r\n\r\n\r\n.search-progress.visible{\r\n  display:grid;\r\n}\r\n\r\n\r\n.search-progress.has-results{\r\n  border-color:var(--green);\r\n\r\n  background:#e9eedf;\r\n}\r\n\r\n\r\n.search-spinner{\r\n  width:39px;\r\n  height:39px;\r\n\r\n  border:5px solid rgba(40,94,114,.15);\r\n  border-top-color:var(--blue);\r\n  border-radius:50%;\r\n\r\n  animation:cvk-spin .75s linear infinite;\r\n}\r\n\r\n\r\n@keyframes cvk-spin{\r\n  to{\r\n    transform:rotate(360deg);\r\n  }\r\n}\r\n\r\n\r\n.search-progress-copy strong{\r\n  display:block;\r\n\r\n  color:var(--blue-dark);\r\n\r\n  font-size:12px;\r\n}\r\n\r\n\r\n.search-progress-copy > span{\r\n  display:block;\r\n\r\n  margin-top:2px;\r\n\r\n  color:var(--muted);\r\n\r\n  font-size:9px;\r\n}\r\n\r\n\r\n.search-progress-bar{\r\n  overflow:hidden;\r\n\r\n  height:5px;\r\n\r\n  margin-top:9px;\r\n\r\n  background:var(--paper-deep);\r\n}\r\n\r\n\r\n.search-progress-value{\r\n  width:0;\r\n  height:100%;\r\n\r\n  background:var(--red);\r\n\r\n  transition:width .2s ease;\r\n}\r\n\r\n\r\n.speed-status{\r\n  display:flex;\r\n  flex-wrap:wrap;\r\n  gap:5px;\r\n\r\n  margin-top:8px;\r\n}\r\n\r\n\r\n.speed-chip{\r\n  padding:3px 6px;\r\n\r\n  border:1px solid var(--line-dark);\r\n\r\n  color:var(--muted);\r\n\r\n  font-size:7px;\r\n  font-weight:900;\r\n}\r\n\r\n\r\n.speed-chip.done{\r\n  border-color:var(--green);\r\n\r\n  color:var(--green);\r\n}\r\n\r\n\r\n.search-countdown{\r\n  min-width:65px;\r\n\r\n  padding:8px;\r\n\r\n  border:1px solid var(--line-dark);\r\n\r\n  background:var(--paper-light);\r\n\r\n  text-align:center;\r\n}\r\n\r\n\r\n.search-countdown strong{\r\n  display:block;\r\n\r\n  color:var(--red);\r\n\r\n  font-family:Georgia,serif;\r\n  font-size:23px;\r\n  line-height:1;\r\n}\r\n\r\n\r\n.search-countdown span{\r\n  display:block;\r\n\r\n  margin-top:4px;\r\n\r\n  color:var(--muted);\r\n\r\n  font-size:7px;\r\n  font-weight:900;\r\n}\r\n\r\n\r\n.live-result-note{\r\n  display:none;\r\n\r\n  margin-bottom:18px;\r\n  padding:11px 13px;\r\n\r\n  border-left:4px solid var(--green);\r\n\r\n  background:#e8eddf;\r\n\r\n  color:var(--green);\r\n\r\n  font-size:9px;\r\n  font-weight:900;\r\n}\r\n\r\n\r\n.live-result-note.visible{\r\n  display:block;\r\n}\r\n\r\n\r\n\/* ==========================================================\r\n   ARTICLE GRID\r\n   ========================================================== *\/\r\n\r\n.article-grid{\r\n  display:grid;\r\n  grid-template-columns:repeat(3,1fr);\r\n  gap:20px;\r\n}\r\n\r\n\r\n.article-card{\r\n  position:relative;\r\n  overflow:hidden;\r\n\r\n  display:flex;\r\n  flex-direction:column;\r\n\r\n  min-height:100%;\r\n\r\n  border:1px solid var(--line-dark);\r\n\r\n  background:var(--paper-light);\r\n\r\n  box-shadow:5px 6px 0 rgba(24,26,25,.07);\r\n\r\n  transition:\r\n    transform .2s ease,\r\n    box-shadow .2s ease;\r\n}\r\n\r\n\r\n.article-card:hover{\r\n  transform:translateY(-5px);\r\n\r\n  box-shadow:8px 9px 0 rgba(24,26,25,.11);\r\n}\r\n\r\n\r\n.article-image{\r\n  position:relative;\r\n  overflow:hidden;\r\n\r\n  aspect-ratio:16 \/ 9;\r\n\r\n  border-bottom:1px solid var(--line-dark);\r\n\r\n  background:\r\n    linear-gradient(\r\n      rgba(40,94,114,.06) 1px,\r\n      transparent 1px\r\n    ),\r\n    linear-gradient(\r\n      90deg,\r\n      rgba(40,94,114,.06) 1px,\r\n      transparent 1px\r\n    ),\r\n    var(--paper-soft);\r\n\r\n  background-size:24px 24px;\r\n}\r\n\r\n\r\n.image-placeholder{\r\n  color:var(--blue);\r\n}\r\n\r\n\r\n.image-placeholder svg{\r\n  width:58px;\r\n}\r\n\r\n\r\n.article-image img{\r\n  position:absolute;\r\n  inset:0;\r\n\r\n  width:100%;\r\n  height:100%;\r\n\r\n  object-fit:cover;\r\n\r\n  opacity:0;\r\n\r\n  filter:\r\n    sepia(.1)\r\n    saturate(.76)\r\n    contrast(1.04);\r\n\r\n  transition:\r\n    opacity .3s ease,\r\n    transform .4s ease;\r\n}\r\n\r\n\r\n.article-image img.loaded{\r\n  opacity:1;\r\n}\r\n\r\n\r\n.article-card:hover\r\n.article-image img.loaded{\r\n  transform:scale(1.04);\r\n}\r\n\r\n\r\n.topic-badge{\r\n  position:absolute;\r\n  z-index:3;\r\n\r\n  left:11px;\r\n  top:11px;\r\n\r\n  padding:5px 8px;\r\n\r\n  border:1px solid var(--ink);\r\n\r\n  background:var(--yellow);\r\n  color:var(--ink);\r\n\r\n  font-size:8px;\r\n  font-weight:900;\r\n}\r\n\r\n\r\n.relevance{\r\n  position:absolute;\r\n  z-index:3;\r\n\r\n  right:11px;\r\n  top:11px;\r\n\r\n  padding:5px 8px;\r\n\r\n  border:1px solid var(--ink);\r\n\r\n  background:var(--green);\r\n  color:#fff;\r\n\r\n  font-size:7px;\r\n  font-weight:900;\r\n}\r\n\r\n\r\n.article-body{\r\n  display:flex;\r\n  flex:1;\r\n  flex-direction:column;\r\n\r\n  padding:21px;\r\n}\r\n\r\n\r\n.article-meta{\r\n  display:flex;\r\n  align-items:center;\r\n  gap:7px;\r\n\r\n  margin-bottom:10px;\r\n\r\n  color:var(--muted);\r\n\r\n  font-size:8px;\r\n  font-weight:900;\r\n}\r\n\r\n\r\n.meta-dot{\r\n  width:3px;\r\n  height:3px;\r\n\r\n  border-radius:50%;\r\n\r\n  background:var(--red);\r\n}\r\n\r\n\r\n.article-title{\r\n  margin:0;\r\n\r\n  color:var(--blue-dark);\r\n\r\n  font-family:Georgia,serif;\r\n  font-size:20px;\r\n  line-height:1.2;\r\n}\r\n\r\n\r\n.article-excerpt{\r\n  margin:11px 0 18px;\r\n\r\n  color:var(--muted);\r\n\r\n  font-size:11px;\r\n}\r\n\r\n\r\n.matched-on{\r\n  margin-bottom:15px;\r\n\r\n  color:var(--green);\r\n\r\n  font-size:8px;\r\n  font-weight:900;\r\n}\r\n\r\n\r\n.article-footer{\r\n  display:flex;\r\n  justify-content:space-between;\r\n\r\n  margin-top:auto;\r\n  padding-top:15px;\r\n\r\n  border-top:1px solid var(--line);\r\n\r\n  color:var(--red);\r\n\r\n  font-size:9px;\r\n  font-weight:900;\r\n}\r\n\r\n\r\n\/* ==========================================================\r\n   EMPTY \/ LOAD MORE\r\n   ========================================================== *\/\r\n\r\n.empty{\r\n  grid-column:1 \/ -1;\r\n\r\n  padding:55px 24px;\r\n\r\n  border:2px dashed var(--blue);\r\n\r\n  background:var(--paper-light);\r\n\r\n  text-align:center;\r\n}\r\n\r\n\r\n.empty h3{\r\n  margin:0;\r\n\r\n  font-family:Georgia,serif;\r\n}\r\n\r\n\r\n.empty p{\r\n  color:var(--muted);\r\n\r\n  font-size:11px;\r\n}\r\n\r\n\r\n.load-more-wrap{\r\n  display:flex;\r\n  justify-content:center;\r\n\r\n  margin-top:37px;\r\n}\r\n\r\n\r\n.load-more{\r\n  display:none;\r\n\r\n  background:var(--paper-light);\r\n\r\n  color:var(--ink)!important;\r\n}\r\n\r\n\r\n\/* ==========================================================\r\n   LEARNING BRIDGE\r\n   ========================================================== *\/\r\n\r\n.cvk-learning{\r\n  display:grid;\r\n  grid-template-columns:1fr .8fr;\r\n  gap:50px;\r\n\r\n  align-items:center;\r\n\r\n  margin-bottom:145px;\r\n  padding:47px;\r\n\r\n  border:2px solid var(--ink);\r\n\r\n  background:\r\n    linear-gradient(\r\n      rgba(255,255,255,.035) 1px,\r\n      transparent 1px\r\n    ),\r\n    linear-gradient(\r\n      90deg,\r\n      rgba(255,255,255,.035) 1px,\r\n      transparent 1px\r\n    ),\r\n    var(--blue-dark);\r\n\r\n  background-size:31px 31px;\r\n\r\n  color:#fff;\r\n\r\n  box-shadow:9px 10px 0 var(--ink);\r\n}\r\n\r\n\r\n.cvk-learning .cvk-eyebrow{\r\n  color:#d7e4e6;\r\n}\r\n\r\n\r\n.cvk-learning .cvk-eyebrow::before{\r\n  background:var(--yellow);\r\n}\r\n\r\n\r\n.cvk-learning h2{\r\n  margin:0 0 19px;\r\n\r\n  color:#fff;\r\n\r\n  font-family:Georgia,serif;\r\n  font-size:clamp(36px,4.5vw,55px);\r\n  line-height:.98;\r\n}\r\n\r\n\r\n.cvk-learning h2 span{\r\n  display:block;\r\n\r\n  margin-top:8px;\r\n\r\n  color:#f0bd4d;\r\n\r\n  font-family:\"Comic Sans MS\",\"Bradley Hand\",cursive;\r\n}\r\n\r\n\r\n.cvk-learning p{\r\n  max-width:690px;\r\n\r\n  color:#d6e1df;\r\n}\r\n\r\n\r\n.cvk-learning-actions{\r\n  display:flex;\r\n  flex-wrap:wrap;\r\n  gap:11px;\r\n\r\n  margin-top:27px;\r\n}\r\n\r\n\r\n.cvk-learning-card{\r\n  position:relative;\r\n\r\n  min-height:400px;\r\n}\r\n\r\n\r\n.cvk-learning-art{\r\n  height:370px;\r\n\r\n  margin:0;\r\n  padding:9px;\r\n\r\n  border:1px solid rgba(255,255,255,.25);\r\n\r\n  background:#efe4cf;\r\n\r\n  box-shadow:6px 7px 0 #0a1110;\r\n\r\n  transform:rotate(2deg);\r\n}\r\n\r\n\r\n.cvk-learning-art img{\r\n  width:100%;\r\n  height:100%;\r\n\r\n  object-fit:contain;\r\n\r\n  mix-blend-mode:multiply;\r\n}\r\n\r\n\r\n.cvk-learning-note{\r\n  position:absolute;\r\n\r\n  left:-8px;\r\n  bottom:13px;\r\n\r\n  padding:10px 12px;\r\n\r\n  border:1px solid var(--ink);\r\n\r\n  background:var(--red);\r\n  color:#fff;\r\n\r\n  font-family:\"Comic Sans MS\",\"Bradley Hand\",cursive;\r\n  font-size:14px;\r\n\r\n  box-shadow:4px 4px 0 var(--ink);\r\n\r\n  transform:rotate(-4deg);\r\n}\r\n\r\n\r\n\/* ==========================================================\r\n   FOOTER\r\n   ========================================================== *\/\r\n\r\n.cvk-footer{\r\n  padding:55px 0 30px;\r\n\r\n  border-top:1px solid var(--line-dark);\r\n\r\n  background:#e8dcc5;\r\n}\r\n\r\n\r\n.cvk-footer-grid{\r\n  display:grid;\r\n  grid-template-columns:1.3fr repeat(3,.7fr);\r\n  gap:40px;\r\n\r\n  padding-bottom:40px;\r\n\r\n  border-bottom:1px solid var(--line-dark);\r\n}\r\n\r\n\r\n.cvk-footer-brand strong{\r\n  color:var(--blue-dark);\r\n\r\n  font-family:Georgia,serif;\r\n  font-size:21px;\r\n}\r\n\r\n\r\n.cvk-footer-brand p{\r\n  max-width:350px;\r\n\r\n  color:var(--muted);\r\n\r\n  font-size:10px;\r\n}\r\n\r\n\r\n.cvk-footer-column h4{\r\n  margin:0 0 10px;\r\n\r\n  color:var(--red);\r\n\r\n  font-size:9px;\r\n  text-transform:uppercase;\r\n}\r\n\r\n\r\n.cvk-footer-column a{\r\n  display:block;\r\n\r\n  margin-top:7px;\r\n\r\n  color:var(--muted);\r\n\r\n  font-size:10px;\r\n}\r\n\r\n\r\n.cvk-footer-column a:hover{\r\n  color:var(--red);\r\n}\r\n\r\n\r\n.cvk-footer-bottom{\r\n  display:flex;\r\n  justify-content:space-between;\r\n  gap:20px;\r\n\r\n  padding-top:23px;\r\n\r\n  color:var(--muted);\r\n\r\n  font-size:9px;\r\n}\r\n\r\n\r\n.cvk-status::before{\r\n  content:\"\u25cf\";\r\n\r\n  margin-right:7px;\r\n\r\n  color:var(--green);\r\n}\r\n\r\n\r\n\/* ==========================================================\r\n   RESPONSIVE\r\n   ========================================================== *\/\r\n\r\n@media(max-width:1000px){\r\n\r\n  .cvk-links{\r\n    display:none;\r\n  }\r\n\r\n\r\n  .cvk-hero-grid,\r\n  .featured-card,\r\n  .cvk-learning{\r\n    grid-template-columns:1fr;\r\n  }\r\n\r\n\r\n  .cvk-hero-art{\r\n    width:100%;\r\n    max-width:750px;\r\n\r\n    margin:0 auto;\r\n  }\r\n\r\n\r\n  .article-grid{\r\n    grid-template-columns:1fr 1fr;\r\n  }\r\n\r\n\r\n  .cvk-footer-grid{\r\n    grid-template-columns:1fr 1fr;\r\n  }\r\n\r\n}\r\n\r\n\r\n@media(max-width:700px){\r\n\r\n  .cvk-wrap{\r\n    width:min(100% - 28px,1180px);\r\n  }\r\n\r\n\r\n  .cvk-guide{\r\n    display:none;\r\n  }\r\n\r\n\r\n  .cvk-header{\r\n    padding:14px 0;\r\n  }\r\n\r\n\r\n  .cvk-nav{\r\n    padding:10px;\r\n  }\r\n\r\n\r\n  .cvk-brand small{\r\n    display:none;\r\n  }\r\n\r\n\r\n  .cvk-nav-cta{\r\n    font-size:8px;\r\n  }\r\n\r\n\r\n  .cvk-hero{\r\n    margin:0 14px 110px;\r\n    padding:24px 19px 30px;\r\n  }\r\n\r\n\r\n  .cvk-hero-meta{\r\n    align-items:flex-start;\r\n    flex-direction:column;\r\n  }\r\n\r\n\r\n  .cvk-hero h1{\r\n    font-size:45px;\r\n  }\r\n\r\n\r\n  .cvk-hero-art{\r\n    min-height:500px;\r\n  }\r\n\r\n\r\n  .cvk-art-frame{\r\n    min-height:475px;\r\n  }\r\n\r\n\r\n  .cvk-art-frame img{\r\n    max-height:450px;\r\n  }\r\n\r\n\r\n  .cvk-art-note{\r\n    left:4px;\r\n    top:30px;\r\n\r\n    max-width:145px;\r\n\r\n    font-size:13px;\r\n  }\r\n\r\n\r\n  .cvk-search-wrap{\r\n    width:min(100% - 28px,1080px);\r\n\r\n    margin:-170px auto 90px;\r\n    padding-top:100px;\r\n  }\r\n\r\n\r\n  .cvk-search{\r\n    padding:20px;\r\n  }\r\n\r\n\r\n  .search-row{\r\n    grid-template-columns:1fr;\r\n  }\r\n\r\n\r\n  .search-button{\r\n    min-height:52px;\r\n  }\r\n\r\n\r\n  .results-head{\r\n    grid-template-columns:1fr;\r\n  }\r\n\r\n\r\n  .search-progress{\r\n    grid-template-columns:auto 1fr;\r\n  }\r\n\r\n\r\n  .search-countdown{\r\n    grid-column:1 \/ -1;\r\n  }\r\n\r\n\r\n  .article-grid{\r\n    grid-template-columns:1fr;\r\n  }\r\n\r\n\r\n  .featured-content{\r\n    padding:30px 23px;\r\n  }\r\n\r\n\r\n  .featured-visual{\r\n    min-height:300px;\r\n  }\r\n\r\n\r\n  .cvk-learning{\r\n    padding:29px 21px;\r\n  }\r\n\r\n\r\n  .cvk-learning-art{\r\n    height:330px;\r\n  }\r\n\r\n\r\n  .cvk-footer-grid{\r\n    grid-template-columns:1fr;\r\n  }\r\n\r\n\r\n  .cvk-footer-bottom{\r\n    flex-direction:column;\r\n  }\r\n\r\n}\r\n\r\n\r\n@media(prefers-reduced-motion:reduce){\r\n\r\n  #cctv-knowledge *,\r\n  #cctv-knowledge *::before,\r\n  #cctv-knowledge *::after{\r\n    animation:none!important;\r\n    transition:none!important;\r\n  }\r\n\r\n}\r\n<\/style>\r\n\r\n\r\n<main id=\"cctv-knowledge\">\r\n\r\n\r\n  <span\r\n    class=\"cvk-guide cvk-guide--left\"\r\n    aria-hidden=\"true\">\r\n  <\/span>\r\n\r\n  <span\r\n    class=\"cvk-guide cvk-guide--middle\"\r\n    aria-hidden=\"true\">\r\n  <\/span>\r\n\r\n  <span\r\n    class=\"cvk-guide cvk-guide--right\"\r\n    aria-hidden=\"true\">\r\n  <\/span>\r\n\r\n\r\n  <!-- ======================================================\r\n       HEADER\r\n       ====================================================== -->\r\n\r\n  <header class=\"cvk-header\">\r\n\r\n    <div class=\"cvk-wrap\">\r\n\r\n      <div class=\"cvk-nav\">\r\n\r\n\r\n        <a\r\n          class=\"cvk-brand\"\r\n          href=\"https:\/\/cctvacademy.be\/nl\/\">\r\n\r\n          <span class=\"cvk-brand-mark\">\r\n            CCTV\r\n          <\/span>\r\n\r\n\r\n          <span>\r\n\r\n            <strong>\r\n              CCTV Academy\r\n            <\/strong>\r\n\r\n            <small>\r\n              CCTV \u00b7 AI \u00b7 SECURITY \u00b7 TRAINING\r\n            <\/small>\r\n\r\n          <\/span>\r\n\r\n        <\/a>\r\n\r\n\r\n        <nav class=\"cvk-links\">\r\n\r\n          <a href=\"https:\/\/cctvacademy.be\/nl\/\">\r\n            Home\r\n          <\/a>\r\n\r\n          <a\r\n            class=\"active\"\r\n            href=\"https:\/\/cctvacademy.be\/nl\/blog\/\">\r\n            Kennisbank\r\n          <\/a>\r\n\r\n          <a href=\"https:\/\/cctvacademy.be\/nl\/opleidingen\/\">\r\n            Opleidingen\r\n          <\/a>\r\n\r\n          <a href=\"https:\/\/cctvacademy.be\/nl\/contact\/\">\r\n            Contact\r\n          <\/a>\r\n\r\n        <\/nav>\r\n\r\n\r\n        <a\r\n          class=\"cvk-nav-cta\"\r\n          href=\"https:\/\/cctvacademy.be\/nl\/opleidingen\/\">\r\n\r\n          Bekijk opleidingen \u2197\r\n\r\n        <\/a>\r\n\r\n\r\n      <\/div>\r\n\r\n    <\/div>\r\n\r\n  <\/header>\r\n\r\n\r\n  <!-- ======================================================\r\n       HERO\r\n       ====================================================== -->\r\n\r\n  <section class=\"cvk-hero\">\r\n\r\n\r\n    <div class=\"cvk-hero-meta\">\r\n\r\n      <strong>\r\n        CCTV Academy \u00b7 Smart Knowledge Search\r\n      <\/strong>\r\n\r\n      <span>\r\n        vraag \u2192 techniek \u2192 antwoord\r\n      <\/span>\r\n\r\n    <\/div>\r\n\r\n\r\n    <div class=\"cvk-hero-grid\">\r\n\r\n\r\n      <div class=\"cvk-hero-copy\">\r\n\r\n\r\n        <div class=\"cvk-hero-label\">\r\n\r\n          <b>\r\n            LIVE\r\n          <\/b>\r\n\r\n          CCTV Kennisbank\r\n\r\n        <\/div>\r\n\r\n\r\n        <h1>\r\n\r\n          Zoek een probleem.\r\n\r\n          <span>\r\n            Vind de oplossing.\r\n          <\/span>\r\n\r\n        <\/h1>\r\n\r\n\r\n        <p>\r\n\r\n          Doorzoek de CCTV Academy-kennisbank\r\n          in gewone taal.\r\n\r\n          Zoek bijvoorbeeld op\r\n\r\n          <strong>\r\n            \u201ccamera neemt geen nummerplaat\u201d,\r\n            \u201choe reset ik mijn NVR?\u201d\r\n          <\/strong>\r\n\r\n          of\r\n\r\n          <strong>\r\n            \u201cmag ik mijn buur filmen?\u201d.\r\n          <\/strong>\r\n\r\n        <\/p>\r\n\r\n\r\n        <p>\r\n\r\n          De zoekmachine koppelt\r\n          jouw vraag automatisch\r\n          aan relevante technische CCTV-termen.\r\n\r\n        <\/p>\r\n\r\n\r\n        <div class=\"cvk-hero-info\">\r\n\r\n          \r\n          <span>\r\n            CCTV-synoniemen\r\n          <\/span>\r\n\r\n          <span>\r\n            Relevantie\r\n          <\/span>\r\n\r\n          <span>\r\n            Slim zoeken\r\n          <\/span>\r\n\r\n        <\/div>\r\n\r\n\r\n      <\/div>\r\n\r\n\r\n      <div class=\"cvk-hero-art\">\r\n\r\n\r\n        <div class=\"cvk-art-note\">\r\n\r\n          Niet zoeken naar\r\n          de juiste knop.\r\n\r\n          <br><br>\r\n\r\n          <strong>\r\n            Begrijpen wat er gebeurt.\r\n          <\/strong>\r\n\r\n        <\/div>\r\n\r\n\r\n        <figure class=\"cvk-art-frame\">\r\n\r\n          <img data-recalc-dims=\"1\"\r\n            src=\"https:\/\/i0.wp.com\/cctvacademy.be\/wp-content\/uploads\/2026\/09\/CCTV-Academy-Wouter-Rooseboom-CCTV-Micro-Learning.png?w=812&#038;ssl=1\"\r\n            alt=\"CCTV Academy technische Micro-Learning illustratie\"\r\n            loading=\"eager\"\r\n            fetchpriority=\"high\"\r\n            decoding=\"async\">\r\n\r\n        <\/figure>\r\n\r\n\r\n        <span class=\"cvk-art-caption\">\r\n          Fig. 01 \u00b7 CCTV Academy Knowledge Map\r\n        <\/span>\r\n\r\n\r\n      <\/div>\r\n\r\n\r\n    <\/div>\r\n\r\n  <\/section>\r\n\r\n\r\n  <!-- ======================================================\r\n       SMART SEARCH\r\n       ====================================================== -->\r\n\r\n  <section class=\"cvk-search-wrap\">\r\n\r\n    <div class=\"cvk-search\">\r\n\r\n\r\n      <div class=\"smart-label\">\r\n        Slim zoeken in CCTV kennis\r\n      <\/div>\r\n\r\n\r\n      <div class=\"search-row\">\r\n\r\n\r\n        <div class=\"search-field\">\r\n\r\n\r\n          <input\r\n            id=\"searchInput\"\r\n            class=\"search-input\"\r\n            type=\"search\"\r\n            autocomplete=\"off\"\r\n            spellcheck=\"false\"\r\n            aria-label=\"Doorzoek de CCTV kennisbank\"\r\n            placeholder=\"Beschrijf je vraag: bv. camera neemt geen nummerplaat...\">\r\n\r\n\r\n          <button\r\n            id=\"clearSearch\"\r\n            class=\"clear-search\"\r\n            type=\"button\"\r\n            aria-label=\"Zoekopdracht wissen\">\r\n\r\n            \u00d7\r\n\r\n          <\/button>\r\n\r\n\r\n        <\/div>\r\n\r\n\r\n        <button\r\n          id=\"searchButton\"\r\n          class=\"search-button\"\r\n          type=\"button\">\r\n\r\n          Zoek in kennisbank\r\n\r\n        <\/button>\r\n\r\n\r\n      <\/div>\r\n\r\n\r\n      <div class=\"search-examples\">\r\n\r\n\r\n        <span>\r\n          Probeer:\r\n        <\/span>\r\n\r\n\r\n        <button\r\n          class=\"example-search\"\r\n          type=\"button\"\r\n          data-query=\"camera neemt geen nummerplaat\">\r\n\r\n          Nummerplaat niet leesbaar\r\n\r\n        <\/button>\r\n\r\n\r\n        <button\r\n          class=\"example-search\"\r\n          type=\"button\"\r\n          data-query=\"hoe reset ik mijn NVR\">\r\n\r\n          NVR resetten\r\n\r\n        <\/button>\r\n\r\n\r\n        <button\r\n          class=\"example-search\"\r\n          type=\"button\"\r\n          data-query=\"mag ik mijn buur filmen\">\r\n\r\n          Buur filmen\r\n\r\n        <\/button>\r\n\r\n\r\n        <button\r\n          class=\"example-search\"\r\n          type=\"button\"\r\n          data-query=\"PoE voeding camera\">\r\n\r\n          PoE voeding\r\n\r\n        <\/button>\r\n\r\n\r\n        <button\r\n          class=\"example-search\"\r\n          type=\"button\"\r\n          data-query=\"camerabeelden smartphone\">\r\n\r\n          Smartphone\r\n\r\n        <\/button>\r\n\r\n\r\n      <\/div>\r\n\r\n\r\n      <div\r\n        id=\"searchIntelligence\"\r\n        class=\"search-intelligence\">\r\n\r\n\r\n        <div\r\n          id=\"interpretation\"\r\n          class=\"interpretation\">\r\n        <\/div>\r\n\r\n\r\n        <div class=\"search-scope\">\r\n\r\n          Jouw vraag wordt gecombineerd\r\n          met technische CCTV-termen\r\n          en doorzocht\r\n          in de bestaande WordPress-kennisbank.\r\n\r\n        <\/div>\r\n\r\n\r\n      <\/div>\r\n\r\n\r\n    <\/div>\r\n\r\n  <\/section>\r\n\r\n\r\n  <!-- ======================================================\r\n       FEATURED\r\n       ====================================================== -->\r\n\r\n  <section class=\"cvk-featured\">\r\n\r\n    <div class=\"cvk-wrap\">\r\n\r\n\r\n      <span class=\"cvk-eyebrow\">\r\n        Nieuw in de kennisbank\r\n      <\/span>\r\n\r\n\r\n      <article class=\"featured-card\">\r\n\r\n\r\n        <div class=\"featured-visual\">\r\n\r\n\r\n          <div class=\"featured-placeholder\">\r\n\r\n            <svg\r\n              viewBox=\"0 0 100 70\"\r\n              fill=\"none\"\r\n              aria-hidden=\"true\">\r\n\r\n              <rect\r\n                x=\"7\"\r\n                y=\"15\"\r\n                width=\"58\"\r\n                height=\"40\"\r\n                rx=\"2\"\r\n                stroke=\"currentColor\"\r\n                stroke-width=\"2.5\">\r\n              <\/rect>\r\n\r\n              <path\r\n                d=\"m65 26 28-11v40L65 44\"\r\n                stroke=\"currentColor\"\r\n                stroke-width=\"2.5\">\r\n              <\/path>\r\n\r\n            <\/svg>\r\n\r\n          <\/div>\r\n\r\n\r\n          <img decoding=\"async\"\r\n            id=\"featuredImage\"\r\n            src=\"\"\r\n            alt=\"\">\r\n\r\n\r\n        <\/div>\r\n\r\n\r\n        <div class=\"featured-content\">\r\n\r\n\r\n          <span class=\"featured-label\">\r\n            Laatste technische artikel\r\n          <\/span>\r\n\r\n\r\n          <span\r\n            id=\"featuredTopic\"\r\n            class=\"featured-topic\">\r\n\r\n            CCTV Academy\r\n\r\n          <\/span>\r\n\r\n\r\n          <h2\r\n            id=\"featuredTitle\"\r\n            class=\"featured-title\">\r\n\r\n            Kennisbank wordt geladen\u2026\r\n\r\n          <\/h2>\r\n\r\n\r\n          <p\r\n            id=\"featuredExcerpt\"\r\n            class=\"featured-excerpt\">\r\n\r\n            De nieuwste praktische CCTV-kennis\r\n            wordt opgehaald.\r\n\r\n          <\/p>\r\n\r\n\r\n          <div class=\"featured-footer\">\r\n\r\n            <a\r\n              id=\"featuredLink\"\r\n              class=\"read-more\"\r\n              href=\"#\">\r\n\r\n              Lees artikel \u2192\r\n\r\n            <\/a>\r\n\r\n\r\n            <span\r\n              id=\"featuredDate\"\r\n              class=\"featured-date\">\r\n\r\n              CCTV Academy\r\n\r\n            <\/span>\r\n\r\n          <\/div>\r\n\r\n\r\n        <\/div>\r\n\r\n\r\n      <\/article>\r\n\r\n\r\n    <\/div>\r\n\r\n  <\/section>\r\n\r\n\r\n  <!-- ======================================================\r\n       KNOWLEDGE RESULTS\r\n       ====================================================== -->\r\n\r\n  <section\r\n    id=\"kennisbank\"\r\n    class=\"cvk-knowledge\">\r\n\r\n    <div class=\"cvk-wrap\">\r\n\r\n\r\n      <div class=\"results-head\">\r\n\r\n\r\n        <div>\r\n\r\n\r\n          <span class=\"cvk-eyebrow\">\r\n            CCTV Kennisbank\r\n          <\/span>\r\n\r\n\r\n          <h2\r\n            id=\"searchResultsTitle\"\r\n            class=\"cvk-title\">\r\n\r\n            Vind precies\r\n\r\n            <span>\r\n              wat je nodig hebt.\r\n            <\/span>\r\n\r\n          <\/h2>\r\n\r\n\r\n          <div\r\n            id=\"searchProgress\"\r\n            class=\"search-progress\"\r\n            aria-live=\"polite\">\r\n\r\n\r\n            <div class=\"search-spinner\">\r\n            <\/div>\r\n\r\n\r\n            <div class=\"search-progress-copy\">\r\n\r\n\r\n              <strong id=\"searchProgressTitle\">\r\n                Kennisbank wordt doorzocht\u2026\r\n              <\/strong>\r\n\r\n\r\n              <span id=\"searchProgressDetail\">\r\n                Zoekvraag analyseren.\r\n              <\/span>\r\n\r\n\r\n              <div class=\"search-progress-bar\">\r\n\r\n                <div\r\n                  id=\"searchProgressValue\"\r\n                  class=\"search-progress-value\">\r\n                <\/div>\r\n\r\n              <\/div>\r\n\r\n\r\n              <div\r\n                id=\"speedStatus\"\r\n                class=\"speed-status\">\r\n              <\/div>\r\n\r\n\r\n            <\/div>\r\n\r\n\r\n            <div class=\"search-countdown\">\r\n\r\n              <strong id=\"searchCountdown\">\r\n                8\r\n              <\/strong>\r\n\r\n              <span>\r\n                sec richttijd\r\n              <\/span>\r\n\r\n            <\/div>\r\n\r\n\r\n          <\/div>\r\n\r\n\r\n          <div\r\n            id=\"resultQuery\"\r\n            class=\"result-query\">\r\n          <\/div>\r\n\r\n\r\n        <\/div>\r\n\r\n\r\n        <div\r\n          id=\"resultSummary\"\r\n          class=\"result-summary\">\r\n\r\n          Artikels laden...\r\n\r\n        <\/div>\r\n\r\n\r\n      <\/div>\r\n\r\n\r\n      <div\r\n        id=\"liveResultNote\"\r\n        class=\"live-result-note\">\r\n\r\n        De eerste resultaten zijn beschikbaar.\r\n        Andere technische zoekroutes\r\n        worden nog gecontroleerd.\r\n\r\n      <\/div>\r\n\r\n\r\n      <div\r\n        id=\"articleGrid\"\r\n        class=\"article-grid\">\r\n      <\/div>\r\n\r\n\r\n      <div class=\"load-more-wrap\">\r\n\r\n        <button\r\n          id=\"loadMore\"\r\n          class=\"cvk-btn load-more\"\r\n          type=\"button\">\r\n\r\n          Meer resultaten tonen\r\n\r\n        <\/button>\r\n\r\n      <\/div>\r\n\r\n\r\n    <\/div>\r\n\r\n  <\/section>\r\n\r\n\r\n  <!-- ======================================================\r\n       LEARNING BRIDGE\r\n       ====================================================== -->\r\n\r\n  <section class=\"cvk-wrap\">\r\n\r\n\r\n    <div class=\"cvk-learning\">\r\n\r\n\r\n      <div>\r\n\r\n\r\n        <span class=\"cvk-eyebrow\">\r\n          Van zoeken naar kunnen\r\n        <\/span>\r\n\r\n\r\n        <h2>\r\n\r\n          Een artikel geeft antwoord.\r\n\r\n          <span>\r\n            Zelf testen geeft inzicht.\r\n          <\/span>\r\n\r\n        <\/h2>\r\n\r\n\r\n        <p>\r\n\r\n          Wil je camera's,\r\n          NVR's,\r\n          IP-netwerken\r\n          en AI-functies\r\n          niet alleen opzoeken,\r\n          maar ook zelf aansluiten,\r\n          configureren\r\n          en testen?\r\n\r\n        <\/p>\r\n\r\n\r\n        <div class=\"cvk-learning-actions\">\r\n\r\n\r\n          <a\r\n            class=\"cvk-button\"\r\n            href=\"https:\/\/cctvacademy.be\/nl\/opleidingen\/\">\r\n\r\n            Bekijk opleidingen\r\n\r\n          <\/a>\r\n\r\n\r\n          <a\r\n            class=\"cvk-button cvk-button--paper\"\r\n            href=\"https:\/\/cctvacademy.be\/nl\/contact\/\">\r\n\r\n            Stel een vraag\r\n\r\n          <\/a>\r\n\r\n\r\n        <\/div>\r\n\r\n\r\n      <\/div>\r\n\r\n\r\n      <div class=\"cvk-learning-card\">\r\n\r\n\r\n        <figure class=\"cvk-learning-art\">\r\n\r\n          <img data-recalc-dims=\"1\"\r\n            src=\"https:\/\/i0.wp.com\/cctvacademy.be\/wp-content\/uploads\/2026\/09\/CCTV-Academy-Wouter-Rooseboom-CCTV-Micro-Learning.png?w=812&#038;ssl=1\"\r\n            alt=\"CCTV Academy Micro-Learning\"\r\n            loading=\"lazy\"\r\n            decoding=\"async\">\r\n\r\n        <\/figure>\r\n\r\n\r\n        <div class=\"cvk-learning-note\">\r\n\r\n          lezen \u2192 aansluiten<br>\r\n          configureren \u2192 testen\r\n\r\n        <\/div>\r\n\r\n\r\n      <\/div>\r\n\r\n\r\n    <\/div>\r\n\r\n\r\n  <\/section>\r\n\r\n\r\n  <!-- ======================================================\r\n       FOOTER\r\n       ====================================================== -->\r\n\r\n  <footer class=\"cvk-footer\">\r\n\r\n    <div class=\"cvk-wrap\">\r\n\r\n\r\n      <div class=\"cvk-footer-grid\">\r\n\r\n\r\n        <div class=\"cvk-footer-brand\">\r\n\r\n          <strong>\r\n            CCTV Academy\r\n          <\/strong>\r\n\r\n          <p>\r\n            Praktische CCTV-kennis\r\n            en opleidingen\r\n            voor installateurs,\r\n            integratoren\r\n            en beveiligingsprofessionals.\r\n          <\/p>\r\n\r\n        <\/div>\r\n\r\n\r\n        <div class=\"cvk-footer-column\">\r\n\r\n          <h4>\r\n            Kennis\r\n          <\/h4>\r\n\r\n          <a href=\"#kennisbank\">\r\n            Kennisbank\r\n          <\/a>\r\n\r\n          <a href=\"#kennisbank\">\r\n            ANPR\r\n          <\/a>\r\n\r\n          <a href=\"#kennisbank\">\r\n            AI-CCTV\r\n          <\/a>\r\n\r\n        <\/div>\r\n\r\n\r\n        <div class=\"cvk-footer-column\">\r\n\r\n          <h4>\r\n            Opleidingen\r\n          <\/h4>\r\n\r\n          <a href=\"https:\/\/cctvacademy.be\/nl\/opleidingen\/\">\r\n            Basis CCTV\r\n          <\/a>\r\n\r\n          <a href=\"https:\/\/cctvacademy.be\/nl\/opleidingen\/\">\r\n            Basis AI\r\n          <\/a>\r\n\r\n          <a href=\"https:\/\/cctvacademy.be\/nl\/opleidingen\/\">\r\n            Advanced AI\r\n          <\/a>\r\n\r\n        <\/div>\r\n\r\n\r\n        <div class=\"cvk-footer-column\">\r\n\r\n          <h4>\r\n            CCTV Academy\r\n          <\/h4>\r\n\r\n          <a href=\"https:\/\/cctvacademy.be\/nl\/\">\r\n            Home\r\n          <\/a>\r\n\r\n          <a href=\"https:\/\/cctvacademy.be\/nl\/contact\/\">\r\n            Contact\r\n          <\/a>\r\n\r\n        <\/div>\r\n\r\n\r\n      <\/div>\r\n\r\n\r\n      <div class=\"cvk-footer-bottom\">\r\n\r\n        <span>\r\n          \u00a9 2026 Wouter Rooseboom \/ CCTV Academy\r\n        <\/span>\r\n\r\n        <span class=\"cvk-status\">\r\n          Smart Knowledge Search actief\r\n        <\/span>\r\n\r\n      <\/div>\r\n\r\n\r\n    <\/div>\r\n\r\n  <\/footer>\r\n\r\n\r\n<\/main>\r\n\r\n\r\n<script>\r\n(function(){\r\n\r\n\"use strict\";\r\n\r\n\r\n\/* ==========================================================\r\n   CONFIG\r\n   ========================================================== *\/\r\n\r\nconst CONFIG = {\r\n\r\n  postsApi:\r\n    \"https:\/\/cctvacademy.be\/wp-json\/wp\/v2\/posts\",\r\n\r\n  mediaApi:\r\n    \"https:\/\/cctvacademy.be\/wp-json\/wp\/v2\/media\",\r\n\r\n  browsePosts:18,\r\n\r\n  searchPerTerm:25,\r\n\r\n  maxSearchRoutes:5,\r\n\r\n  initialVisible:12,\r\n\r\n  loadIncrement:12,\r\n\r\n  countdownStart:8,\r\n\r\n  cacheLifetime:\r\n    30 * 60 * 1000\r\n\r\n};\r\n\r\n\r\n\/* ==========================================================\r\n   DOM\r\n   ========================================================== *\/\r\n\r\nconst searchInput =\r\n  document.getElementById(\r\n    \"searchInput\"\r\n  );\r\n\r\nconst searchButton =\r\n  document.getElementById(\r\n    \"searchButton\"\r\n  );\r\n\r\nconst clearSearch =\r\n  document.getElementById(\r\n    \"clearSearch\"\r\n  );\r\n\r\nconst searchIntelligence =\r\n  document.getElementById(\r\n    \"searchIntelligence\"\r\n  );\r\n\r\nconst interpretation =\r\n  document.getElementById(\r\n    \"interpretation\"\r\n  );\r\n\r\nconst articleGrid =\r\n  document.getElementById(\r\n    \"articleGrid\"\r\n  );\r\n\r\nconst resultSummary =\r\n  document.getElementById(\r\n    \"resultSummary\"\r\n  );\r\n\r\nconst resultQuery =\r\n  document.getElementById(\r\n    \"resultQuery\"\r\n  );\r\n\r\nconst loadMore =\r\n  document.getElementById(\r\n    \"loadMore\"\r\n  );\r\n\r\nconst searchProgress =\r\n  document.getElementById(\r\n    \"searchProgress\"\r\n  );\r\n\r\nconst searchProgressTitle =\r\n  document.getElementById(\r\n    \"searchProgressTitle\"\r\n  );\r\n\r\nconst searchProgressDetail =\r\n  document.getElementById(\r\n    \"searchProgressDetail\"\r\n  );\r\n\r\nconst searchProgressValue =\r\n  document.getElementById(\r\n    \"searchProgressValue\"\r\n  );\r\n\r\nconst searchCountdown =\r\n  document.getElementById(\r\n    \"searchCountdown\"\r\n  );\r\n\r\nconst speedStatus =\r\n  document.getElementById(\r\n    \"speedStatus\"\r\n  );\r\n\r\nconst liveResultNote =\r\n  document.getElementById(\r\n    \"liveResultNote\"\r\n  );\r\n\r\nconst searchResultsTitle =\r\n  document.getElementById(\r\n    \"searchResultsTitle\"\r\n  );\r\n\r\n\r\nif(\r\n  !searchInput ||\r\n  !searchButton ||\r\n  !articleGrid\r\n){\r\n  return;\r\n}\r\n\r\n\r\n\/* ==========================================================\r\n   STATE\r\n   ========================================================== *\/\r\n\r\nconst state = {\r\n\r\n  browsePosts:[],\r\n\r\n  searchResults:[],\r\n\r\n  query:\"\",\r\n\r\n  visible:\r\n    CONFIG.initialVisible,\r\n\r\n  controller:null,\r\n\r\n  countdownTimer:null,\r\n\r\n  mediaCache:\r\n    loadMediaCache()\r\n\r\n};\r\n\r\n\r\n\/* ==========================================================\r\n   CCTV CONCEPTS\r\n   ========================================================== *\/\r\n\r\nconst CONCEPTS = {\r\n\r\n  anpr:{\r\n\r\n    label:\r\n      \"ANPR \/ nummerplaat\",\r\n\r\n    search:[\r\n      \"ANPR\",\r\n      \"nummerplaat\",\r\n      \"LPR\"\r\n    ],\r\n\r\n    detect:[\r\n      \"anpr\",\r\n      \"nummerplaat\",\r\n      \"nummerplaten\",\r\n      \"nummerplaatherkenning\",\r\n      \"kenteken\",\r\n      \"lpr\"\r\n    ]\r\n\r\n  },\r\n\r\n\r\n  nvr:{\r\n\r\n    label:\r\n      \"NVR \/ recorder\",\r\n\r\n    search:[\r\n      \"NVR\",\r\n      \"recorder\",\r\n      \"opnamesysteem\"\r\n    ],\r\n\r\n    detect:[\r\n      \"nvr\",\r\n      \"recorder\",\r\n      \"xvr\",\r\n      \"dvr\",\r\n      \"opnamesysteem\"\r\n    ]\r\n\r\n  },\r\n\r\n\r\n  poe:{\r\n\r\n    label:\r\n      \"PoE \/ voeding\",\r\n\r\n    search:[\r\n      \"PoE\",\r\n      \"voeding\",\r\n      \"power over ethernet\"\r\n    ],\r\n\r\n    detect:[\r\n      \"poe\",\r\n      \"epoe\",\r\n      \"voeding\",\r\n      \"power over ethernet\",\r\n      \"watt\"\r\n    ]\r\n\r\n  },\r\n\r\n\r\n  network:{\r\n\r\n    label:\r\n      \"IP-netwerk\",\r\n\r\n    search:[\r\n      \"IP netwerk\",\r\n      \"IP adres\",\r\n      \"DHCP\",\r\n      \"router\"\r\n    ],\r\n\r\n    detect:[\r\n      \"ip\",\r\n      \"netwerk\",\r\n      \"subnet\",\r\n      \"gateway\",\r\n      \"router\",\r\n      \"dhcp\",\r\n      \"switch\",\r\n      \"lan\",\r\n      \"wan\"\r\n    ]\r\n\r\n  },\r\n\r\n\r\n  ai:{\r\n\r\n    label:\r\n      \"AI-CCTV\",\r\n\r\n    search:[\r\n      \"AI CCTV\",\r\n      \"AI detectie\",\r\n      \"IVS\",\r\n      \"SMD\"\r\n    ],\r\n\r\n    detect:[\r\n      \"ai\",\r\n      \"ivs\",\r\n      \"smd\",\r\n      \"acupick\",\r\n      \"wizsense\",\r\n      \"detectie\"\r\n    ]\r\n\r\n  },\r\n\r\n\r\n  law:{\r\n\r\n    label:\r\n      \"Wetgeving \/ privacy\",\r\n\r\n    search:[\r\n      \"camerawet\",\r\n      \"privacy\",\r\n      \"wetgeving\"\r\n    ],\r\n\r\n    detect:[\r\n      \"camerawet\",\r\n      \"privacy\",\r\n      \"wetgeving\",\r\n      \"proportionaliteit\",\r\n      \"werknemer\",\r\n      \"buur\",\r\n      \"pictogram\"\r\n    ]\r\n\r\n  },\r\n\r\n\r\n  mobile:{\r\n\r\n    label:\r\n      \"Smartphone \/ DMSS\",\r\n\r\n    search:[\r\n      \"DMSS\",\r\n      \"smartphone\",\r\n      \"meldingen\"\r\n    ],\r\n\r\n    detect:[\r\n      \"smartphone\",\r\n      \"telefoon\",\r\n      \"gsm\",\r\n      \"dmss\",\r\n      \"melding\"\r\n    ]\r\n\r\n  },\r\n\r\n\r\n  reset:{\r\n\r\n    label:\r\n      \"Reset \/ wachtwoord\",\r\n\r\n    search:[\r\n      \"factory reset\",\r\n      \"reset\",\r\n      \"wachtwoord\"\r\n    ],\r\n\r\n    detect:[\r\n      \"reset\",\r\n      \"factory reset\",\r\n      \"fabrieksinstellingen\",\r\n      \"wachtwoord\"\r\n    ]\r\n\r\n  }\r\n\r\n};\r\n\r\n\r\n\/* ==========================================================\r\n   HELPERS\r\n   ========================================================== *\/\r\n\r\nfunction normalize(value){\r\n\r\n  return String(value || \"\")\r\n    .toLowerCase()\r\n    .normalize(\"NFD\")\r\n    .replace(\r\n      \/[\\u0300-\\u036f]\/g,\r\n      \"\"\r\n    )\r\n    .replace(\r\n      \/[^\\p{L}\\p{N}+.]+\/gu,\r\n      \" \"\r\n    )\r\n    .replace(\r\n      \/\\s+\/g,\r\n      \" \"\r\n    )\r\n    .trim();\r\n\r\n}\r\n\r\n\r\nfunction stripHTML(value){\r\n\r\n  const node =\r\n    document.createElement(\r\n      \"div\"\r\n    );\r\n\r\n\r\n  node.innerHTML =\r\n    value || \"\";\r\n\r\n\r\n  return (\r\n    node.textContent ||\r\n    node.innerText ||\r\n    \"\"\r\n  )\r\n  .replace(\r\n    \/\\s+\/g,\r\n    \" \"\r\n  )\r\n  .trim();\r\n\r\n}\r\n\r\n\r\nfunction decodeHTML(value){\r\n\r\n  const node =\r\n    document.createElement(\r\n      \"textarea\"\r\n    );\r\n\r\n\r\n  node.innerHTML =\r\n    value || \"\";\r\n\r\n\r\n  return node.value;\r\n\r\n}\r\n\r\n\r\nfunction escapeHTML(value){\r\n\r\n  return String(value || \"\")\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\r\n\r\nfunction truncate(\r\n  value,\r\n  length\r\n){\r\n\r\n  const text =\r\n    String(value || \"\");\r\n\r\n\r\n  if(\r\n    text.length <= length\r\n  ){\r\n    return text;\r\n  }\r\n\r\n\r\n  return (\r\n    text\r\n      .slice(\r\n        0,\r\n        length\r\n      )\r\n      .trim()\r\n    +\r\n    \"\u2026\"\r\n  );\r\n\r\n}\r\n\r\n\r\nfunction formatDate(value){\r\n\r\n  try{\r\n\r\n    return new Intl.DateTimeFormat(\r\n      \"nl-BE\",\r\n      {\r\n        day:\"numeric\",\r\n        month:\"short\",\r\n        year:\"numeric\"\r\n      }\r\n    )\r\n    .format(\r\n      new Date(value)\r\n    );\r\n\r\n  }\r\n\r\n  catch(error){\r\n\r\n    return \"CCTV Academy\";\r\n\r\n  }\r\n\r\n}\r\n\r\n\r\n\/* ==========================================================\r\n   CONCEPT DETECTION\r\n   ========================================================== *\/\r\n\r\nfunction findConcepts(query){\r\n\r\n  const value =\r\n    normalize(query);\r\n\r\n\r\n  return Object\r\n    .values(CONCEPTS)\r\n    .filter(\r\n      concept =>\r\n        concept.detect.some(\r\n          term =>\r\n            value.includes(\r\n              normalize(term)\r\n            )\r\n        )\r\n    );\r\n\r\n}\r\n\r\n\r\nfunction buildSearchRoutes(query){\r\n\r\n  const routes =\r\n    new Set();\r\n\r\n\r\n  routes.add(\r\n    query.trim()\r\n  );\r\n\r\n\r\n  findConcepts(query)\r\n    .forEach(\r\n      concept => {\r\n\r\n        concept.search\r\n          .slice(0,2)\r\n          .forEach(\r\n            term =>\r\n              routes.add(term)\r\n          );\r\n\r\n      }\r\n    );\r\n\r\n\r\n  normalize(query)\r\n    .split(\" \")\r\n    .filter(\r\n      word =>\r\n        word.length >= 4\r\n    )\r\n    .slice(0,2)\r\n    .forEach(\r\n      word =>\r\n        routes.add(word)\r\n    );\r\n\r\n\r\n  return Array\r\n    .from(routes)\r\n    .filter(Boolean)\r\n    .slice(\r\n      0,\r\n      CONFIG.maxSearchRoutes\r\n    );\r\n\r\n}\r\n\r\n\r\n\/* ==========================================================\r\n   CLASSIFICATION\r\n   Alleen nog gebruikt voor de labels op artikelen.\r\n   Geen filterknoppen meer.\r\n   ========================================================== *\/\r\n\r\nfunction classify(post){\r\n\r\n  const text =\r\n    normalize(\r\n      decodeHTML(\r\n        post.title?.rendered\r\n      )\r\n      +\r\n      \" \"\r\n      +\r\n      stripHTML(\r\n        post.excerpt?.rendered\r\n      )\r\n      +\r\n      \" \"\r\n      +\r\n      stripHTML(\r\n        post.content?.rendered\r\n      )\r\n    );\r\n\r\n\r\n  if(\r\n    \/(anpr|nummerplaat|kenteken|lpr)\/.test(\r\n      text\r\n    )\r\n  ){\r\n\r\n    return {\r\n      id:\"anpr\",\r\n      label:\"ANPR\"\r\n    };\r\n\r\n  }\r\n\r\n\r\n  if(\r\n    \/(camerawet|wetgeving|privacy|proportionaliteit|werknemer|pictogram)\/.test(\r\n      text\r\n    )\r\n  ){\r\n\r\n    return {\r\n      id:\"law\",\r\n      label:\"CCTV Wetgeving\"\r\n    };\r\n\r\n  }\r\n\r\n\r\n  if(\r\n    \/(subnet|gateway|router|dhcp|switch|poe|epoe|ip adres|lan|wan)\/.test(\r\n      text\r\n    )\r\n  ){\r\n\r\n    return {\r\n      id:\"network\",\r\n      label:\"IP Netwerken\"\r\n    };\r\n\r\n  }\r\n\r\n\r\n  if(\r\n    \/(nvr|xvr|dvr|recorder|opnamesysteem|opslag|harde schijf)\/.test(\r\n      text\r\n    )\r\n  ){\r\n\r\n    return {\r\n      id:\"nvr\",\r\n      label:\"NVR & Opname\"\r\n    };\r\n\r\n  }\r\n\r\n\r\n  if(\r\n    \/(stap voor stap|stap per stap|configuratie|hoe installeer|hoe programmeer)\/.test(\r\n      text\r\n    )\r\n  ){\r\n\r\n    return {\r\n      id:\"howto\",\r\n      label:\"Stap voor stap\"\r\n    };\r\n\r\n  }\r\n\r\n\r\n  if(\r\n    \/(\\bai\\b|ivs|smd|acupick|wizsense|detectie)\/.test(\r\n      text\r\n    )\r\n  ){\r\n\r\n    return {\r\n      id:\"ai\",\r\n      label:\"AI-CCTV\"\r\n    };\r\n\r\n  }\r\n\r\n\r\n  return {\r\n    id:\"technical\",\r\n    label:\"CCTV Techniek\"\r\n  };\r\n\r\n}\r\n\r\n\r\n\/* ==========================================================\r\n   WORDPRESS API\r\n   ========================================================== *\/\r\n\r\nasync function fetchPosts(\r\n  params,\r\n  signal\r\n){\r\n\r\n  const url =\r\n    new URL(\r\n      CONFIG.postsApi\r\n    );\r\n\r\n\r\n  Object.entries(\r\n    params\r\n  )\r\n  .forEach(\r\n    ([key,value]) => {\r\n\r\n      url.searchParams.set(\r\n        key,\r\n        value\r\n      );\r\n\r\n    }\r\n  );\r\n\r\n\r\n  url.searchParams.set(\r\n    \"_fields\",\r\n    \"id,date,link,slug,title,excerpt,content,featured_media\"\r\n  );\r\n\r\n\r\n  const response =\r\n    await fetch(\r\n      url.toString(),\r\n      {\r\n        signal\r\n      }\r\n    );\r\n\r\n\r\n  if(\r\n    !response.ok\r\n  ){\r\n\r\n    throw new Error(\r\n      \"WordPress API fout\"\r\n    );\r\n\r\n  }\r\n\r\n\r\n  return response.json();\r\n\r\n}\r\n\r\n\r\n\/* ==========================================================\r\n   SCORING\r\n   ========================================================== *\/\r\n\r\nfunction scorePost(\r\n  post,\r\n  query,\r\n  route\r\n){\r\n\r\n  const q =\r\n    normalize(query);\r\n\r\n  const r =\r\n    normalize(route);\r\n\r\n\r\n  const title =\r\n    normalize(\r\n      decodeHTML(\r\n        post.title?.rendered\r\n      )\r\n    );\r\n\r\n\r\n  const excerpt =\r\n    normalize(\r\n      stripHTML(\r\n        post.excerpt?.rendered\r\n      )\r\n    );\r\n\r\n\r\n  const content =\r\n    normalize(\r\n      stripHTML(\r\n        post.content?.rendered\r\n      )\r\n    );\r\n\r\n\r\n  const all =\r\n    title +\r\n    \" \" +\r\n    excerpt +\r\n    \" \" +\r\n    content;\r\n\r\n\r\n  let score = 0;\r\n\r\n  const matched =\r\n    new Set();\r\n\r\n\r\n  if(\r\n    q &&\r\n    title.includes(q)\r\n  ){\r\n\r\n    score += 100;\r\n\r\n    matched.add(\r\n      \"titel\"\r\n    );\r\n\r\n  }\r\n\r\n\r\n  if(\r\n    q &&\r\n    excerpt.includes(q)\r\n  ){\r\n\r\n    score += 45;\r\n\r\n    matched.add(\r\n      \"samenvatting\"\r\n    );\r\n\r\n  }\r\n\r\n\r\n  if(\r\n    q &&\r\n    content.includes(q)\r\n  ){\r\n\r\n    score += 25;\r\n\r\n    matched.add(\r\n      \"inhoud\"\r\n    );\r\n\r\n  }\r\n\r\n\r\n  if(\r\n    r &&\r\n    title.includes(r)\r\n  ){\r\n\r\n    score += 35;\r\n\r\n    matched.add(\r\n      \"technische term\"\r\n    );\r\n\r\n  }\r\n\r\n\r\n  if(\r\n    r &&\r\n    all.includes(r)\r\n  ){\r\n\r\n    score += 15;\r\n\r\n  }\r\n\r\n\r\n  normalize(query)\r\n    .split(\" \")\r\n    .filter(\r\n      word =>\r\n        word.length > 3\r\n    )\r\n    .forEach(\r\n      word => {\r\n\r\n        if(\r\n          title.includes(word)\r\n        ){\r\n\r\n          score += 11;\r\n\r\n        }\r\n\r\n        else if(\r\n          excerpt.includes(word)\r\n        ){\r\n\r\n          score += 6;\r\n\r\n        }\r\n\r\n        else if(\r\n          content.includes(word)\r\n        ){\r\n\r\n          score += 2;\r\n\r\n        }\r\n\r\n      }\r\n    );\r\n\r\n\r\n  return {\r\n\r\n    score,\r\n\r\n    matched:\r\n      Array.from(\r\n        matched\r\n      )\r\n      .slice(\r\n        0,\r\n        3\r\n      )\r\n\r\n  };\r\n\r\n}\r\n\r\n\r\n\/* ==========================================================\r\n   CACHE\r\n   ========================================================== *\/\r\n\r\nfunction cacheKey(query){\r\n\r\n  return (\r\n    \"cctv_knowledge_\" +\r\n    normalize(query)\r\n  );\r\n\r\n}\r\n\r\n\r\nfunction getCachedSearch(query){\r\n\r\n  try{\r\n\r\n    const raw =\r\n      sessionStorage.getItem(\r\n        cacheKey(query)\r\n      );\r\n\r\n\r\n    if(\r\n      !raw\r\n    ){\r\n      return null;\r\n    }\r\n\r\n\r\n    const data =\r\n      JSON.parse(raw);\r\n\r\n\r\n    if(\r\n      Date.now() -\r\n      data.time >\r\n      CONFIG.cacheLifetime\r\n    ){\r\n\r\n      sessionStorage.removeItem(\r\n        cacheKey(query)\r\n      );\r\n\r\n      return null;\r\n\r\n    }\r\n\r\n\r\n    return data.results;\r\n\r\n  }\r\n\r\n  catch(error){\r\n\r\n    return null;\r\n\r\n  }\r\n\r\n}\r\n\r\n\r\nfunction saveCachedSearch(\r\n  query,\r\n  results\r\n){\r\n\r\n  try{\r\n\r\n    sessionStorage.setItem(\r\n      cacheKey(query),\r\n      JSON.stringify({\r\n        time:\r\n          Date.now(),\r\n\r\n        results:\r\n          results.slice(\r\n            0,\r\n            60\r\n          )\r\n      })\r\n    );\r\n\r\n  }\r\n\r\n  catch(error){\r\n\r\n    \/* cache is optioneel *\/\r\n\r\n  }\r\n\r\n}\r\n\r\n\r\n\/* ==========================================================\r\n   MEDIA CACHE\r\n   ========================================================== *\/\r\n\r\nfunction loadMediaCache(){\r\n\r\n  try{\r\n\r\n    return JSON.parse(\r\n      sessionStorage.getItem(\r\n        \"cctv_knowledge_media\"\r\n      )\r\n      ||\r\n      \"{}\"\r\n    );\r\n\r\n  }\r\n\r\n  catch(error){\r\n\r\n    return {};\r\n\r\n  }\r\n\r\n}\r\n\r\n\r\nfunction saveMediaCache(){\r\n\r\n  try{\r\n\r\n    sessionStorage.setItem(\r\n      \"cctv_knowledge_media\",\r\n      JSON.stringify(\r\n        state.mediaCache\r\n      )\r\n    );\r\n\r\n  }\r\n\r\n  catch(error){\r\n\r\n    \/* optioneel *\/\r\n\r\n  }\r\n\r\n}\r\n\r\n\r\nfunction bestMediaURL(item){\r\n\r\n  return (\r\n    item?.media_details\r\n      ?.sizes\r\n      ?.medium_large\r\n      ?.source_url\r\n    ||\r\n    item?.media_details\r\n      ?.sizes\r\n      ?.large\r\n      ?.source_url\r\n    ||\r\n    item?.source_url\r\n    ||\r\n    \"\"\r\n  );\r\n\r\n}\r\n\r\n\r\nfunction applyMedia(\r\n  id,\r\n  url\r\n){\r\n\r\n  if(\r\n    !id ||\r\n    !url\r\n  ){\r\n    return;\r\n  }\r\n\r\n\r\n  document\r\n    .querySelectorAll(\r\n      `[data-media-id=\"${id}\"]`\r\n    )\r\n    .forEach(\r\n      image => {\r\n\r\n        image.src =\r\n          url;\r\n\r\n        image.classList.add(\r\n          \"loaded\"\r\n        );\r\n\r\n      }\r\n    );\r\n\r\n}\r\n\r\n\r\nasync function hydrateImages(posts){\r\n\r\n  const ids =\r\n    Array.from(\r\n      new Set(\r\n        posts\r\n          .map(\r\n            post =>\r\n              Number(\r\n                post.featured_media\r\n              )\r\n          )\r\n          .filter(Boolean)\r\n      )\r\n    );\r\n\r\n\r\n  ids.forEach(\r\n    id => {\r\n\r\n      if(\r\n        state.mediaCache[id]\r\n      ){\r\n\r\n        applyMedia(\r\n          id,\r\n          state.mediaCache[id]\r\n        );\r\n\r\n      }\r\n\r\n    }\r\n  );\r\n\r\n\r\n  const missing =\r\n    ids.filter(\r\n      id =>\r\n        !state.mediaCache[id]\r\n    );\r\n\r\n\r\n  if(\r\n    !missing.length\r\n  ){\r\n    return;\r\n  }\r\n\r\n\r\n  try{\r\n\r\n    const url =\r\n      new URL(\r\n        CONFIG.mediaApi\r\n      );\r\n\r\n\r\n    url.searchParams.set(\r\n      \"include\",\r\n      missing.join(\",\")\r\n    );\r\n\r\n\r\n    url.searchParams.set(\r\n      \"per_page\",\r\n      Math.min(\r\n        100,\r\n        missing.length\r\n      )\r\n    );\r\n\r\n\r\n    url.searchParams.set(\r\n      \"_fields\",\r\n      \"id,source_url,media_details\"\r\n    );\r\n\r\n\r\n    const response =\r\n      await fetch(\r\n        url.toString()\r\n      );\r\n\r\n\r\n    if(\r\n      !response.ok\r\n    ){\r\n      return;\r\n    }\r\n\r\n\r\n    const media =\r\n      await response.json();\r\n\r\n\r\n    media.forEach(\r\n      item => {\r\n\r\n        const image =\r\n          bestMediaURL(item);\r\n\r\n\r\n        if(\r\n          !image\r\n        ){\r\n          return;\r\n        }\r\n\r\n\r\n        state.mediaCache[\r\n          item.id\r\n        ] =\r\n          image;\r\n\r\n\r\n        applyMedia(\r\n          item.id,\r\n          image\r\n        );\r\n\r\n      }\r\n    );\r\n\r\n\r\n    saveMediaCache();\r\n\r\n  }\r\n\r\n  catch(error){\r\n\r\n    \/* afbeeldingen blokkeren de pagina niet *\/\r\n\r\n  }\r\n\r\n}\r\n\r\n\r\n\/* ==========================================================\r\n   ARTICLE CARD\r\n   ========================================================== *\/\r\n\r\nfunction createCard(item){\r\n\r\n  const post =\r\n    item.post;\r\n\r\n\r\n  const topic =\r\n    item.topic ||\r\n    classify(post);\r\n\r\n\r\n  const title =\r\n    decodeHTML(\r\n      post.title?.rendered\r\n    );\r\n\r\n\r\n  const excerpt =\r\n    truncate(\r\n      stripHTML(\r\n        post.excerpt?.rendered\r\n      )\r\n      ||\r\n      stripHTML(\r\n        post.content?.rendered\r\n      ),\r\n      155\r\n    );\r\n\r\n\r\n  const mediaId =\r\n    Number(\r\n      post.featured_media\r\n    );\r\n\r\n\r\n  const image =\r\n    state.mediaCache[\r\n      mediaId\r\n    ];\r\n\r\n\r\n  return `\r\n\r\n    <a\r\n      class=\"article-card\"\r\n      href=\"${escapeHTML(post.link)}\">\r\n\r\n\r\n      <div class=\"article-image\">\r\n\r\n\r\n        <div class=\"image-placeholder\">\r\n\r\n          <svg\r\n            viewBox=\"0 0 70 50\"\r\n            fill=\"none\"\r\n            aria-hidden=\"true\">\r\n\r\n            <rect\r\n              x=\"5\"\r\n              y=\"11\"\r\n              width=\"40\"\r\n              height=\"28\"\r\n              rx=\"2\"\r\n              stroke=\"currentColor\"\r\n              stroke-width=\"2\">\r\n            <\/rect>\r\n\r\n            <path\r\n              d=\"m45 18 20-8v29l-20-8\"\r\n              stroke=\"currentColor\"\r\n              stroke-width=\"2\">\r\n            <\/path>\r\n\r\n          <\/svg>\r\n\r\n        <\/div>\r\n\r\n\r\n        ${\r\n          mediaId\r\n          ?\r\n          `\r\n          <img\r\n            ${\r\n              image\r\n              ?\r\n              `src=\"${escapeHTML(image)}\"`\r\n              :\r\n              \"\"\r\n            }\r\n            class=\"${image ? \"loaded\" : \"\"}\"\r\n            data-media-id=\"${mediaId}\"\r\n            alt=\"${escapeHTML(title)}\"\r\n            loading=\"lazy\">\r\n          `\r\n          :\r\n          \"\"\r\n        }\r\n\r\n\r\n        <span class=\"topic-badge\">\r\n          ${escapeHTML(topic.label)}\r\n        <\/span>\r\n\r\n\r\n        ${\r\n          state.query\r\n          ?\r\n          `\r\n          <span class=\"relevance\">\r\n            Relevante match\r\n          <\/span>\r\n          `\r\n          :\r\n          \"\"\r\n        }\r\n\r\n\r\n      <\/div>\r\n\r\n\r\n      <div class=\"article-body\">\r\n\r\n\r\n        <div class=\"article-meta\">\r\n\r\n          <span>\r\n            ${formatDate(post.date)}\r\n          <\/span>\r\n\r\n          <span class=\"meta-dot\">\r\n          <\/span>\r\n\r\n          <span>\r\n            CCTV Academy\r\n          <\/span>\r\n\r\n        <\/div>\r\n\r\n\r\n        <h3 class=\"article-title\">\r\n          ${escapeHTML(title)}\r\n        <\/h3>\r\n\r\n\r\n        <p class=\"article-excerpt\">\r\n          ${escapeHTML(excerpt)}\r\n        <\/p>\r\n\r\n\r\n        ${\r\n          item.matched?.length\r\n          ?\r\n          `\r\n          <div class=\"matched-on\">\r\n\r\n            Gevonden via:\r\n            ${escapeHTML(\r\n              item.matched.join(\", \")\r\n            )}\r\n\r\n          <\/div>\r\n          `\r\n          :\r\n          \"\"\r\n        }\r\n\r\n\r\n        <div class=\"article-footer\">\r\n\r\n          <span>\r\n            Bekijk uitleg\r\n          <\/span>\r\n\r\n          <span>\r\n            \u2192\r\n          <\/span>\r\n\r\n        <\/div>\r\n\r\n\r\n      <\/div>\r\n\r\n\r\n    <\/a>\r\n\r\n  `;\r\n\r\n}\r\n\r\n\r\n\/* ==========================================================\r\n   RESULTS\r\n   Geen filterlogica meer.\r\n   ========================================================== *\/\r\n\r\nfunction getActiveResults(){\r\n\r\n  if(\r\n    state.query\r\n  ){\r\n\r\n    return state.searchResults;\r\n\r\n  }\r\n\r\n\r\n  return state.browsePosts.map(\r\n    post => ({\r\n\r\n      post,\r\n\r\n      score:0,\r\n\r\n      matched:[],\r\n\r\n      topic:\r\n        classify(post)\r\n\r\n    })\r\n  );\r\n\r\n}\r\n\r\n\r\nfunction renderResults(){\r\n\r\n  const allResults =\r\n    getActiveResults();\r\n\r\n\r\n  const results =\r\n    allResults.slice(\r\n      0,\r\n      state.visible\r\n    );\r\n\r\n\r\n  if(\r\n    !results.length\r\n  ){\r\n\r\n    articleGrid.innerHTML = `\r\n\r\n      <div class=\"empty\">\r\n\r\n        <h3>\r\n          Geen passend artikel gevonden.\r\n        <\/h3>\r\n\r\n        <p>\r\n          Probeer bijvoorbeeld\r\n          ANPR,\r\n          NVR,\r\n          PoE,\r\n          IP-netwerk,\r\n          AI\r\n          of wetgeving.\r\n        <\/p>\r\n\r\n      <\/div>\r\n\r\n    `;\r\n\r\n\r\n    resultSummary.textContent =\r\n      \"0 resultaten\";\r\n\r\n\r\n    loadMore.style.display =\r\n      \"none\";\r\n\r\n\r\n    updateQueryText();\r\n\r\n    return;\r\n\r\n  }\r\n\r\n\r\n  articleGrid.innerHTML =\r\n    results\r\n      .map(createCard)\r\n      .join(\"\");\r\n\r\n\r\n  resultSummary.textContent =\r\n    allResults.length\r\n    +\r\n    (\r\n      allResults.length === 1\r\n        ? \" resultaat\"\r\n        : \" resultaten\"\r\n    );\r\n\r\n\r\n  loadMore.style.display =\r\n    state.visible <\r\n    allResults.length\r\n\r\n      ? \"inline-flex\"\r\n\r\n      : \"none\";\r\n\r\n\r\n  updateQueryText();\r\n\r\n\r\n  hydrateImages(\r\n    results.map(\r\n      item =>\r\n        item.post\r\n    )\r\n  );\r\n\r\n}\r\n\r\n\r\nfunction updateQueryText(){\r\n\r\n  if(\r\n    !state.query\r\n  ){\r\n\r\n    resultQuery.classList.remove(\r\n      \"visible\"\r\n    );\r\n\r\n\r\n    resultQuery.innerHTML =\r\n      \"\";\r\n\r\n\r\n    return;\r\n\r\n  }\r\n\r\n\r\n  resultQuery.innerHTML = `\r\n\r\n    Zoekresultaten voor\r\n\r\n    <strong>\r\n      \u201c${escapeHTML(state.query)}\u201d\r\n    <\/strong>\r\n\r\n  `;\r\n\r\n\r\n  resultQuery.classList.add(\r\n    \"visible\"\r\n  );\r\n\r\n}\r\n\r\n\r\n\/* ==========================================================\r\n   INTERPRETATION\r\n   ========================================================== *\/\r\n\r\nfunction renderInterpretation(query){\r\n\r\n  const concepts =\r\n    findConcepts(query);\r\n\r\n\r\n  const labels =\r\n    concepts.length\r\n\r\n      ? concepts.map(\r\n          concept =>\r\n            concept.label\r\n        )\r\n\r\n      : [\r\n          \"Letterlijke zoekopdracht\"\r\n        ];\r\n\r\n\r\n  interpretation.innerHTML = `\r\n\r\n    <span class=\"interpretation-label\">\r\n      Zoekopdracht ge\u00efnterpreteerd als:\r\n    <\/span>\r\n\r\n    ${\r\n      labels\r\n        .map(\r\n          label => `\r\n\r\n            <span class=\"concept-chip\">\r\n              ${escapeHTML(label)}\r\n            <\/span>\r\n\r\n          `\r\n        )\r\n        .join(\"\")\r\n    }\r\n\r\n  `;\r\n\r\n\r\n  searchIntelligence.classList.add(\r\n    \"visible\"\r\n  );\r\n\r\n}\r\n\r\n\r\n\/* ==========================================================\r\n   FEATURED ARTICLE\r\n   ========================================================== *\/\r\n\r\nfunction renderFeatured(post){\r\n\r\n  const topic =\r\n    classify(post);\r\n\r\n\r\n  const title =\r\n    decodeHTML(\r\n      post.title?.rendered\r\n    );\r\n\r\n\r\n  const excerpt =\r\n    truncate(\r\n      stripHTML(\r\n        post.excerpt?.rendered\r\n      ),\r\n      245\r\n    );\r\n\r\n\r\n  document.getElementById(\r\n    \"featuredTopic\"\r\n  ).textContent =\r\n    topic.label;\r\n\r\n\r\n  document.getElementById(\r\n    \"featuredTitle\"\r\n  ).textContent =\r\n    title;\r\n\r\n\r\n  document.getElementById(\r\n    \"featuredExcerpt\"\r\n  ).textContent =\r\n    excerpt\r\n    ||\r\n    \"Bekijk het nieuwste artikel uit de CCTV Academy kennisbank.\";\r\n\r\n\r\n  document.getElementById(\r\n    \"featuredDate\"\r\n  ).textContent =\r\n    formatDate(\r\n      post.date\r\n    );\r\n\r\n\r\n  document.getElementById(\r\n    \"featuredLink\"\r\n  ).href =\r\n    post.link;\r\n\r\n\r\n  const mediaId =\r\n    Number(\r\n      post.featured_media\r\n    );\r\n\r\n\r\n  const featuredImage =\r\n    document.getElementById(\r\n      \"featuredImage\"\r\n    );\r\n\r\n\r\n  featuredImage.dataset.mediaId =\r\n    mediaId || \"\";\r\n\r\n\r\n  hydrateImages(\r\n    [post]\r\n  );\r\n\r\n}\r\n\r\n\r\n\/* ==========================================================\r\n   PROGRESS\r\n   ========================================================== *\/\r\n\r\nfunction startProgress(routeCount){\r\n\r\n  clearInterval(\r\n    state.countdownTimer\r\n  );\r\n\r\n\r\n  let remaining =\r\n    CONFIG.countdownStart;\r\n\r\n\r\n  searchCountdown.textContent =\r\n    remaining;\r\n\r\n\r\n  searchProgressValue.style.width =\r\n    \"5%\";\r\n\r\n\r\n  searchProgress.classList.remove(\r\n    \"has-results\"\r\n  );\r\n\r\n\r\n  searchProgress.classList.add(\r\n    \"visible\"\r\n  );\r\n\r\n\r\n  searchProgressTitle.textContent =\r\n    \"Kennisbank wordt doorzocht\u2026\";\r\n\r\n\r\n  searchProgressDetail.textContent =\r\n    routeCount\r\n    +\r\n    (\r\n      routeCount === 1\r\n        ? \" zoekroute wordt gecontroleerd.\"\r\n        : \" zoekroutes worden gecontroleerd.\"\r\n    );\r\n\r\n\r\n  speedStatus.innerHTML =\r\n    Array.from({\r\n      length:\r\n        routeCount\r\n    })\r\n    .map(\r\n      (_,index) => `\r\n\r\n        <span\r\n          class=\"speed-chip\"\r\n          data-route=\"${index}\">\r\n\r\n          route ${index + 1}\r\n\r\n        <\/span>\r\n\r\n      `\r\n    )\r\n    .join(\"\");\r\n\r\n\r\n  searchButton.textContent =\r\n    \"Zoeken\u2026\";\r\n\r\n\r\n  searchButton.classList.add(\r\n    \"is-loading\"\r\n  );\r\n\r\n\r\n  state.countdownTimer =\r\n    setInterval(\r\n      function(){\r\n\r\n        remaining =\r\n          Math.max(\r\n            0,\r\n            remaining - 1\r\n          );\r\n\r\n\r\n        searchCountdown.textContent =\r\n          remaining;\r\n\r\n\r\n        if(\r\n          remaining === 0\r\n        ){\r\n\r\n          clearInterval(\r\n            state.countdownTimer\r\n          );\r\n\r\n        }\r\n\r\n      },\r\n      1000\r\n    );\r\n\r\n}\r\n\r\n\r\nfunction updateProgress(\r\n  index,\r\n  completed,\r\n  total,\r\n  hasResults\r\n){\r\n\r\n  const chip =\r\n    speedStatus.querySelector(\r\n      `[data-route=\"${index}\"]`\r\n    );\r\n\r\n\r\n  if(\r\n    chip\r\n  ){\r\n\r\n    chip.classList.add(\r\n      \"done\"\r\n    );\r\n\r\n\r\n    chip.textContent =\r\n      \"\u2713 route \"\r\n      +\r\n      (index + 1);\r\n\r\n  }\r\n\r\n\r\n  searchProgressValue.style.width =\r\n    Math.round(\r\n      completed \/\r\n      total *\r\n      100\r\n    )\r\n    +\r\n    \"%\";\r\n\r\n\r\n  searchProgressDetail.textContent =\r\n    completed\r\n    +\r\n    \" van \"\r\n    +\r\n    total\r\n    +\r\n    \" zoekroutes gecontroleerd.\";\r\n\r\n\r\n  if(\r\n    hasResults\r\n  ){\r\n\r\n    searchProgress.classList.add(\r\n      \"has-results\"\r\n    );\r\n\r\n\r\n    searchProgressTitle.textContent =\r\n      \"Eerste resultaten gevonden\";\r\n\r\n\r\n    liveResultNote.classList.add(\r\n      \"visible\"\r\n    );\r\n\r\n  }\r\n\r\n}\r\n\r\n\r\nfunction finishProgress(count){\r\n\r\n  clearInterval(\r\n    state.countdownTimer\r\n  );\r\n\r\n\r\n  searchProgressValue.style.width =\r\n    \"100%\";\r\n\r\n\r\n  searchCountdown.textContent =\r\n    \"\u2713\";\r\n\r\n\r\n  searchProgress.classList.add(\r\n    \"has-results\"\r\n  );\r\n\r\n\r\n  searchProgressTitle.textContent =\r\n    count\r\n    +\r\n    (\r\n      count === 1\r\n        ? \" relevant artikel gevonden\"\r\n        : \" relevante artikels gevonden\"\r\n    );\r\n\r\n\r\n  searchProgressDetail.textContent =\r\n    \"Zoeken en rangschikken voltooid.\";\r\n\r\n\r\n  searchButton.textContent =\r\n    \"Zoek in kennisbank\";\r\n\r\n\r\n  searchButton.classList.remove(\r\n    \"is-loading\"\r\n  );\r\n\r\n\r\n  setTimeout(\r\n    function(){\r\n\r\n      searchProgress.classList.remove(\r\n        \"visible\"\r\n      );\r\n\r\n\r\n      liveResultNote.classList.remove(\r\n        \"visible\"\r\n      );\r\n\r\n    },\r\n    1400\r\n  );\r\n\r\n}\r\n\r\n\r\n\/* ==========================================================\r\n   SEARCH\r\n   ========================================================== *\/\r\n\r\nasync function executeSearch(){\r\n\r\n  const query =\r\n    searchInput.value.trim();\r\n\r\n\r\n  if(\r\n    !query\r\n  ){\r\n\r\n    resetSearch();\r\n\r\n    return;\r\n\r\n  }\r\n\r\n\r\n  if(\r\n    state.controller\r\n  ){\r\n\r\n    state.controller.abort();\r\n\r\n  }\r\n\r\n\r\n  state.controller =\r\n    new AbortController();\r\n\r\n\r\n  const signal =\r\n    state.controller.signal;\r\n\r\n\r\n  state.query =\r\n    query;\r\n\r\n\r\n  state.visible =\r\n    CONFIG.initialVisible;\r\n\r\n\r\n  clearSearch.classList.add(\r\n    \"visible\"\r\n  );\r\n\r\n\r\n  renderInterpretation(\r\n    query\r\n  );\r\n\r\n\r\n  updateURL();\r\n\r\n\r\n  if(\r\n    searchResultsTitle\r\n  ){\r\n\r\n    searchResultsTitle.scrollIntoView({\r\n\r\n      behavior:\r\n        window.matchMedia(\r\n          \"(prefers-reduced-motion: reduce)\"\r\n        ).matches\r\n          ? \"auto\"\r\n          : \"smooth\",\r\n\r\n      block:\r\n        \"start\"\r\n\r\n    });\r\n\r\n  }\r\n\r\n\r\n  const cached =\r\n    getCachedSearch(\r\n      query\r\n    );\r\n\r\n\r\n  if(\r\n    cached &&\r\n    cached.length\r\n  ){\r\n\r\n    state.searchResults =\r\n      cached;\r\n\r\n\r\n    renderResults();\r\n\r\n\r\n    searchButton.textContent =\r\n      \"Zoek in kennisbank\";\r\n\r\n\r\n    searchButton.classList.remove(\r\n      \"is-loading\"\r\n    );\r\n\r\n\r\n    return;\r\n\r\n  }\r\n\r\n\r\n  const routes =\r\n    buildSearchRoutes(\r\n      query\r\n    );\r\n\r\n\r\n  startProgress(\r\n    routes.length\r\n  );\r\n\r\n\r\n  const candidates =\r\n    new Map();\r\n\r\n\r\n  let completed =\r\n    0;\r\n\r\n\r\n  await Promise.allSettled(\r\n\r\n    routes.map(\r\n\r\n      async (\r\n        route,\r\n        index\r\n      ) => {\r\n\r\n        try{\r\n\r\n          const posts =\r\n            await fetchPosts(\r\n              {\r\n                search:\r\n                  route,\r\n\r\n                per_page:\r\n                  CONFIG.searchPerTerm,\r\n\r\n                orderby:\r\n                  \"relevance\",\r\n\r\n                order:\r\n                  \"desc\"\r\n              },\r\n              signal\r\n            );\r\n\r\n\r\n          posts.forEach(\r\n            post => {\r\n\r\n              const scoring =\r\n                scorePost(\r\n                  post,\r\n                  query,\r\n                  route\r\n                );\r\n\r\n\r\n              const existing =\r\n                candidates.get(\r\n                  post.id\r\n                );\r\n\r\n\r\n              if(\r\n                !existing\r\n              ){\r\n\r\n                candidates.set(\r\n                  post.id,\r\n                  {\r\n\r\n                    post,\r\n\r\n                    score:\r\n                      scoring.score,\r\n\r\n                    matched:\r\n                      scoring.matched,\r\n\r\n                    topic:\r\n                      classify(post)\r\n\r\n                  }\r\n                );\r\n\r\n              }\r\n\r\n              else{\r\n\r\n                existing.score +=\r\n                  Math.max(\r\n                    2,\r\n                    scoring.score * .15\r\n                  );\r\n\r\n\r\n                existing.matched =\r\n                  Array.from(\r\n                    new Set([\r\n                      ...existing.matched,\r\n                      ...scoring.matched\r\n                    ])\r\n                  )\r\n                  .slice(\r\n                    0,\r\n                    3\r\n                  );\r\n\r\n              }\r\n\r\n            }\r\n          );\r\n\r\n\r\n          completed++;\r\n\r\n\r\n          state.searchResults =\r\n            Array.from(\r\n              candidates.values()\r\n            )\r\n            .sort(\r\n              (a,b) =>\r\n                b.score -\r\n                a.score\r\n            );\r\n\r\n\r\n          if(\r\n            state.searchResults.length\r\n          ){\r\n\r\n            renderResults();\r\n\r\n          }\r\n\r\n\r\n          updateProgress(\r\n            index,\r\n            completed,\r\n            routes.length,\r\n            candidates.size > 0\r\n          );\r\n\r\n        }\r\n\r\n        catch(error){\r\n\r\n          if(\r\n            error.name ===\r\n            \"AbortError\"\r\n          ){\r\n\r\n            return;\r\n\r\n          }\r\n\r\n\r\n          completed++;\r\n\r\n\r\n          updateProgress(\r\n            index,\r\n            completed,\r\n            routes.length,\r\n            candidates.size > 0\r\n          );\r\n\r\n        }\r\n\r\n      }\r\n\r\n    )\r\n\r\n  );\r\n\r\n\r\n  if(\r\n    signal.aborted\r\n  ){\r\n    return;\r\n  }\r\n\r\n\r\n  state.searchResults =\r\n    Array.from(\r\n      candidates.values()\r\n    )\r\n    .sort(\r\n      (a,b) =>\r\n        b.score -\r\n        a.score\r\n\r\n        ||\r\n\r\n        new Date(\r\n          b.post.date\r\n        )\r\n        -\r\n        new Date(\r\n          a.post.date\r\n        )\r\n    );\r\n\r\n\r\n  saveCachedSearch(\r\n    query,\r\n    state.searchResults\r\n  );\r\n\r\n\r\n  renderResults();\r\n\r\n\r\n  finishProgress(\r\n    state.searchResults.length\r\n  );\r\n\r\n}\r\n\r\n\r\n\/* ==========================================================\r\n   RESET\r\n   ========================================================== *\/\r\n\r\nfunction resetSearch(){\r\n\r\n  if(\r\n    state.controller\r\n  ){\r\n\r\n    state.controller.abort();\r\n\r\n  }\r\n\r\n\r\n  state.query =\r\n    \"\";\r\n\r\n\r\n  state.searchResults =\r\n    [];\r\n\r\n\r\n  state.visible =\r\n    CONFIG.initialVisible;\r\n\r\n\r\n  clearInterval(\r\n    state.countdownTimer\r\n  );\r\n\r\n\r\n  searchProgress.classList.remove(\r\n    \"visible\",\r\n    \"has-results\"\r\n  );\r\n\r\n\r\n  searchProgressValue.style.width =\r\n    \"0%\";\r\n\r\n\r\n  searchCountdown.textContent =\r\n    CONFIG.countdownStart;\r\n\r\n\r\n  searchIntelligence.classList.remove(\r\n    \"visible\"\r\n  );\r\n\r\n\r\n  liveResultNote.classList.remove(\r\n    \"visible\"\r\n  );\r\n\r\n\r\n  clearSearch.classList.remove(\r\n    \"visible\"\r\n  );\r\n\r\n\r\n  searchButton.textContent =\r\n    \"Zoek in kennisbank\";\r\n\r\n\r\n  searchButton.classList.remove(\r\n    \"is-loading\"\r\n  );\r\n\r\n\r\n  renderResults();\r\n\r\n\r\n  updateURL();\r\n\r\n}\r\n\r\n\r\n\/* ==========================================================\r\n   URL\r\n   Alleen zoekterm.\r\n   Geen topic\/filter-parameter meer.\r\n   ========================================================== *\/\r\n\r\nfunction updateURL(){\r\n\r\n  const url =\r\n    new URL(\r\n      window.location.href\r\n    );\r\n\r\n\r\n  if(\r\n    state.query\r\n  ){\r\n\r\n    url.searchParams.set(\r\n      \"q\",\r\n      state.query\r\n    );\r\n\r\n  }\r\n\r\n  else{\r\n\r\n    url.searchParams.delete(\r\n      \"q\"\r\n    );\r\n\r\n  }\r\n\r\n\r\n  url.searchParams.delete(\r\n    \"topic\"\r\n  );\r\n\r\n\r\n  history.replaceState(\r\n    {},\r\n    \"\",\r\n    url\r\n  );\r\n\r\n}\r\n\r\n\r\n\/* ==========================================================\r\n   EVENTS\r\n   ========================================================== *\/\r\n\r\nsearchButton.addEventListener(\r\n  \"click\",\r\n  executeSearch\r\n);\r\n\r\n\r\nsearchInput.addEventListener(\r\n  \"keydown\",\r\n  event => {\r\n\r\n    if(\r\n      event.key ===\r\n      \"Enter\"\r\n    ){\r\n\r\n      executeSearch();\r\n\r\n    }\r\n\r\n  }\r\n);\r\n\r\n\r\nsearchInput.addEventListener(\r\n  \"input\",\r\n  function(){\r\n\r\n    clearSearch.classList.toggle(\r\n      \"visible\",\r\n      Boolean(\r\n        searchInput.value\r\n      )\r\n    );\r\n\r\n\r\n    if(\r\n      searchInput.value === \"\"\r\n      &&\r\n      state.query\r\n    ){\r\n\r\n      resetSearch();\r\n\r\n    }\r\n\r\n  }\r\n);\r\n\r\n\r\nclearSearch.addEventListener(\r\n  \"click\",\r\n  function(){\r\n\r\n    searchInput.value =\r\n      \"\";\r\n\r\n\r\n    resetSearch();\r\n\r\n\r\n    searchInput.focus();\r\n\r\n  }\r\n);\r\n\r\n\r\ndocument\r\n  .querySelectorAll(\r\n    \".example-search\"\r\n  )\r\n  .forEach(\r\n    button => {\r\n\r\n      button.addEventListener(\r\n        \"click\",\r\n        function(){\r\n\r\n          searchInput.value =\r\n            button.dataset.query;\r\n\r\n\r\n          executeSearch();\r\n\r\n        }\r\n      );\r\n\r\n    }\r\n  );\r\n\r\n\r\nloadMore.addEventListener(\r\n  \"click\",\r\n  function(){\r\n\r\n    state.visible +=\r\n      CONFIG.loadIncrement;\r\n\r\n\r\n    renderResults();\r\n\r\n  }\r\n);\r\n\r\n\r\n\/* ==========================================================\r\n   INITIAL POSTS\r\n   ========================================================== *\/\r\n\r\nasync function loadInitialPosts(){\r\n\r\n  try{\r\n\r\n    const posts =\r\n      await fetchPosts(\r\n        {\r\n          per_page:\r\n            CONFIG.browsePosts,\r\n\r\n          orderby:\r\n            \"date\",\r\n\r\n          order:\r\n            \"desc\"\r\n        }\r\n      );\r\n\r\n\r\n    state.browsePosts =\r\n      posts;\r\n\r\n\r\n    renderResults();\r\n\r\n\r\n    if(\r\n      posts[0]\r\n    ){\r\n\r\n      renderFeatured(\r\n        posts[0]\r\n      );\r\n\r\n    }\r\n\r\n\r\n    hydrateImages(\r\n      posts\r\n    );\r\n\r\n  }\r\n\r\n  catch(error){\r\n\r\n    articleGrid.innerHTML = `\r\n\r\n      <div class=\"empty\">\r\n\r\n        <h3>\r\n          De kennisbank kan momenteel niet geladen worden.\r\n        <\/h3>\r\n\r\n        <p>\r\n          Controleer de WordPress REST API\r\n          of probeer later opnieuw.\r\n        <\/p>\r\n\r\n      <\/div>\r\n\r\n    `;\r\n\r\n\r\n    resultSummary.textContent =\r\n      \"API niet bereikbaar\";\r\n\r\n  }\r\n\r\n}\r\n\r\n\r\n\/* ==========================================================\r\n   RESTORE SEARCH FROM URL\r\n   ========================================================== *\/\r\n\r\nconst params =\r\n  new URLSearchParams(\r\n    window.location.search\r\n  );\r\n\r\n\r\nconst qParam =\r\n  params.get(\r\n    \"q\"\r\n  );\r\n\r\n\r\nloadInitialPosts()\r\n  .then(\r\n    function(){\r\n\r\n      if(\r\n        qParam\r\n      ){\r\n\r\n        searchInput.value =\r\n          qParam;\r\n\r\n\r\n        clearSearch.classList.add(\r\n          \"visible\"\r\n        );\r\n\r\n\r\n        executeSearch();\r\n\r\n      }\r\n\r\n    }\r\n  );\r\n\r\n\r\n})();\r\n<\/script>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-46de81e e-flex e-con-boxed e-con e-parent\" data-id=\"46de81e\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-d2d27ee elementor-widget elementor-widget-spacer\" data-id=\"d2d27ee\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"spacer.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<div class=\"elementor-spacer\">\n\t\t\t<div class=\"elementor-spacer-inner\"><\/div>\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-3ec24f7 e-flex e-con-boxed e-con e-parent\" data-id=\"3ec24f7\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-6ea40dc elementor-widget elementor-widget-video\" data-id=\"6ea40dc\" data-element_type=\"widget\" data-e-type=\"widget\" data-settings=\"{&quot;video_type&quot;:&quot;hosted&quot;,&quot;autoplay&quot;:&quot;yes&quot;,&quot;mute&quot;:&quot;yes&quot;,&quot;loop&quot;:&quot;yes&quot;,&quot;play_on_mobile&quot;:&quot;yes&quot;}\" data-widget_type=\"video.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<div class=\"e-hosted-video elementor-wrapper elementor-open-inline\">\n\t\t\t\t\t<video class=\"elementor-video\" src=\"https:\/\/cctvacademy.be\/wp-content\/uploads\/2026\/03\/PixVerse_V6_Image_Text_360P_maak_een_nieuwe_af.mp4\" autoplay=\"\" loop=\"\" muted=\"muted\" playsinline=\"\" controlsList=\"nodownload\"><\/video>\n\t\t\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-267b1e4 e-flex e-con-boxed e-con e-parent\" data-id=\"267b1e4\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-46dd0bb elementor-widget elementor-widget-text-editor\" data-id=\"46dd0bb\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<h6><span style=\"color: #ffffff;\">\u201cWaar traditionele camera\u2019s alleen terugkijken,\u00a0<\/span><br \/><span style=\"color: #ffffff;\">kijkt AI-CCTV vooruit.\u201d<\/span><\/h6>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-6df6208 e-flex e-con-boxed e-con e-parent\" data-id=\"6df6208\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-d2deb40 elementor-widget elementor-widget-spacer\" data-id=\"d2deb40\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"spacer.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<div class=\"elementor-spacer\">\n\t\t\t<div class=\"elementor-spacer-inner\"><\/div>\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-53f204f e-flex e-con-boxed e-con e-parent\" data-id=\"53f204f\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-6e11281 elementor-widget elementor-widget-spacer\" data-id=\"6e11281\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"spacer.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<div class=\"elementor-spacer\">\n\t\t\t<div class=\"elementor-spacer-inner\"><\/div>\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t","protected":false},"excerpt":{"rendered":"<p>CCTV CCTV Academy CCTV \u00b7 AI \u00b7 SECURITY \u00b7 TRAINING Home Kennisbank Opleidingen Contact Bekijk opleidingen \u2197 CCTV Academy \u00b7 Smart Knowledge Search vraag \u2192 techniek \u2192 antwoord LIVE CCTV Kennisbank Zoek een probleem. Vind de oplossing. Doorzoek de CCTV Academy-kennisbank in gewone taal. Zoek bijvoorbeeld op \u201ccamera neemt geen nummerplaat\u201d, \u201choe reset ik mijn [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"open","ping_status":"open","template":"elementor_canvas","meta":{"_acf_changed":false,"zakra_page_container_layout":"customizer","zakra_page_sidebar_layout":"customizer","zakra_remove_content_margin":false,"zakra_sidebar":"customizer","zakra_transparent_header":"customizer","zakra_logo":0,"zakra_main_header_style":"default","zakra_menu_item_color":"","zakra_menu_item_hover_color":"","zakra_menu_item_active_color":"","zakra_menu_active_style":"","zakra_page_header":true,"_glsr_average":0,"_glsr_ranking":0,"_glsr_reviews":0,"footnotes":""},"class_list":["post-610","page","type-page","status-publish","hentry"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.8 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Blog - RAS\/AIS CCTV Academy<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/cctvacademy.be\/fr\/blog\/\" \/>\n<meta property=\"og:locale\" content=\"fr_FR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Blog - RAS\/AIS CCTV Academy\" \/>\n<meta property=\"og:description\" content=\"CCTV CCTV Academy CCTV \u00b7 AI \u00b7 SECURITY \u00b7 TRAINING Home Kennisbank Opleidingen Contact Bekijk opleidingen \u2197 CCTV Academy \u00b7 Smart Knowledge Search vraag \u2192 techniek \u2192 antwoord LIVE CCTV Kennisbank Zoek een probleem. Vind de oplossing. Doorzoek de CCTV Academy-kennisbank in gewone taal. Zoek bijvoorbeeld op \u201ccamera neemt geen nummerplaat\u201d, \u201choe reset ik mijn [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/cctvacademy.be\/fr\/blog\/\" \/>\n<meta property=\"og:site_name\" content=\"RAS\/AIS CCTV Academy\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/profile.php?id=61576769152561\" \/>\n<meta property=\"article:modified_time\" content=\"2026-09-17T15:09:07+00:00\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/cctvacademy.be\\\/blog\\\/\",\"url\":\"https:\\\/\\\/cctvacademy.be\\\/blog\\\/\",\"name\":\"Blog - RAS\\\/AIS CCTV Academy\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/cctvacademy.be\\\/#website\"},\"datePublished\":\"2015-07-29T13:49:24+00:00\",\"dateModified\":\"2026-09-17T15:09:07+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/cctvacademy.be\\\/blog\\\/#breadcrumb\"},\"inLanguage\":\"fr-BE\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/cctvacademy.be\\\/blog\\\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/cctvacademy.be\\\/blog\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/cctvacademy.be\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Blog\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/cctvacademy.be\\\/#website\",\"url\":\"https:\\\/\\\/cctvacademy.be\\\/\",\"name\":\"CCTV Academy\",\"description\":\"CCTV Opleidingen en CCTV Micro Learning\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/cctvacademy.be\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"fr-BE\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Blog - RAS\/AIS CCTV Academy","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:\/\/cctvacademy.be\/fr\/blog\/","og_locale":"fr_FR","og_type":"article","og_title":"Blog - RAS\/AIS CCTV Academy","og_description":"CCTV CCTV Academy CCTV \u00b7 AI \u00b7 SECURITY \u00b7 TRAINING Home Kennisbank Opleidingen Contact Bekijk opleidingen \u2197 CCTV Academy \u00b7 Smart Knowledge Search vraag \u2192 techniek \u2192 antwoord LIVE CCTV Kennisbank Zoek een probleem. Vind de oplossing. Doorzoek de CCTV Academy-kennisbank in gewone taal. Zoek bijvoorbeeld op \u201ccamera neemt geen nummerplaat\u201d, \u201choe reset ik mijn [&hellip;]","og_url":"https:\/\/cctvacademy.be\/fr\/blog\/","og_site_name":"RAS\/AIS CCTV Academy","article_publisher":"https:\/\/www.facebook.com\/profile.php?id=61576769152561","article_modified_time":"2026-09-17T15:09:07+00:00","twitter_card":"summary_large_image","schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/cctvacademy.be\/blog\/","url":"https:\/\/cctvacademy.be\/blog\/","name":"Blog - RAS\/AIS CCTV Academy","isPartOf":{"@id":"https:\/\/cctvacademy.be\/#website"},"datePublished":"2015-07-29T13:49:24+00:00","dateModified":"2026-09-17T15:09:07+00:00","breadcrumb":{"@id":"https:\/\/cctvacademy.be\/blog\/#breadcrumb"},"inLanguage":"fr-BE","potentialAction":[{"@type":"ReadAction","target":["https:\/\/cctvacademy.be\/blog\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/cctvacademy.be\/blog\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/cctvacademy.be\/"},{"@type":"ListItem","position":2,"name":"Blog"}]},{"@type":"WebSite","@id":"https:\/\/cctvacademy.be\/#website","url":"https:\/\/cctvacademy.be\/","name":"CCTV Academy","description":"Formation \u00e0 la vid\u00e9osurveillance et micro-apprentissage de la vid\u00e9osurveillance","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/cctvacademy.be\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"fr-BE"}]}},"jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/cctvacademy.be\/fr\/wp-json\/wp\/v2\/pages\/610","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/cctvacademy.be\/fr\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/cctvacademy.be\/fr\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/cctvacademy.be\/fr\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/cctvacademy.be\/fr\/wp-json\/wp\/v2\/comments?post=610"}],"version-history":[{"count":21,"href":"https:\/\/cctvacademy.be\/fr\/wp-json\/wp\/v2\/pages\/610\/revisions"}],"predecessor-version":[{"id":51012,"href":"https:\/\/cctvacademy.be\/fr\/wp-json\/wp\/v2\/pages\/610\/revisions\/51012"}],"wp:attachment":[{"href":"https:\/\/cctvacademy.be\/fr\/wp-json\/wp\/v2\/media?parent=610"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}