<!DOCTYPE html>
<html lang="en" itemscope itemtype="http://schema.org/WebPage">
<head>
    <meta charset="utf-8" />
  <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
  <base href="/" />
  <style>
    /* Local fonts used by admin rich editor options (and can be used on public pages). */
    @font-face {
      font-family: "TrajanRegular";
      src: url("/assets/fonts/trajan-regular.ttf") format("truetype");
      font-weight: 400;
      font-style: normal;
      font-display: swap;
    }
  </style>
      <style>
    html.ac-loading,
    html.ac-loading body {
      overflow: hidden !important;
    }
    html.ac-loading body > * {
      visibility: hidden !important;
    }
    html.ac-loading::before {
      content: "";
      position: fixed;
      inset: 0;
      z-index: 99998;
      background: #f5f6f8;
    }
    html.ac-loading::after {
      content: "";
      position: fixed;
      left: 50%;
      top: 50%;
      width: 120px;
      height: 120px;
      margin-left: -60px;
      margin-top: -60px;
      border-radius: 999px;
      border: 4px solid rgba(33, 105, 105, 0.20);
      border-top-color: #216969;
      z-index: 99999;
      animation: ac-global-loader-spin 1s linear infinite;
      box-shadow: 0 8px 24px rgba(0, 0, 0, 0.08);
      background: rgba(255, 255, 255, 0.5);
    }
    html.ac-loading body::before {
      content: "";
      position: fixed;
      left: 50%;
      top: 50%;
      width: 60px;
      height: 60px;
      margin-left: -30px;
      margin-top: -30px;
      z-index: 100000;
      background: url('/assets/images/logo_AC_transparente.png') center center / contain no-repeat;
      pointer-events: none;
    }
    @keyframes ac-global-loader-spin {
      to { transform: rotate(360deg); }
    }
    @media (prefers-reduced-motion: reduce) {
      html.ac-loading::after {
        animation: none;
      }
    }
  </style>
  <script>
    (function () {
      var root = document.documentElement;
      root.classList.add("ac-loading");
      var unlocked = false;
      var pageLoadDone = false;
      var pendingImages = 0;
      var settleTimer = null;
      var hardTimeout = null;
      var observer = null;
      var tracked = new WeakSet();

      function unlockPage() {
        if (unlocked) return;
        unlocked = true;
        if (observer) observer.disconnect();
        if (settleTimer) window.clearTimeout(settleTimer);
        if (hardTimeout) window.clearTimeout(hardTimeout);
        root.classList.remove("ac-loading");
      }

      function scheduleUnlockCheck() {
        if (settleTimer) window.clearTimeout(settleTimer);
        settleTimer = window.setTimeout(tryUnlock, 120);
      }

      function tryUnlock() {
        if (!pageLoadDone) return;
        if (pendingImages > 0) return;
        if (document.readyState !== "complete") return;
        unlockPage();
      }

      function trackImage(img) {
        if (!img || tracked.has(img)) return;
        tracked.add(img);

        try {
          var dataSrc = img.getAttribute("data-src");
          if ((!img.getAttribute("src") || img.getAttribute("src") === "") && dataSrc) {
            img.setAttribute("src", dataSrc);
          }
          if (img.loading === "lazy") img.loading = "eager";
        } catch (_err) {}

        if (img.complete) return;

        pendingImages += 1;
        var done = false;
        var onDone = function () {
          if (done) return;
          done = true;
          pendingImages = Math.max(0, pendingImages - 1);
          scheduleUnlockCheck();
        };
        img.addEventListener("load", onDone, { once: true });
        img.addEventListener("error", onDone, { once: true });
      }

      function scanImages() {
        var list = document.querySelectorAll("img");
        for (var i = 0; i < list.length; i += 1) {
          trackImage(list[i]);
        }
      }

      function trackFromNode(node) {
        if (!node || node.nodeType !== 1) return;
        if (node.tagName === "IMG") {
          trackImage(node);
        }
        var imgs = node.querySelectorAll ? node.querySelectorAll("img") : [];
        for (var i = 0; i < imgs.length; i += 1) {
          trackImage(imgs[i]);
        }
      }

      observer = new MutationObserver(function (mutations) {
        for (var i = 0; i < mutations.length; i += 1) {
          var m = mutations[i];
          if (m.type === "childList") {
            for (var j = 0; j < m.addedNodes.length; j += 1) {
              trackFromNode(m.addedNodes[j]);
            }
          } else if (m.type === "attributes" && m.target && m.target.tagName === "IMG") {
            trackImage(m.target);
          }
        }
        scheduleUnlockCheck();
      });

      if (document.documentElement) {
        observer.observe(document.documentElement, {
          childList: true,
          subtree: true,
          attributes: true,
          attributeFilter: ["src", "srcset", "data-src"]
        });
      }

      if (document.readyState === "loading") {
        document.addEventListener("DOMContentLoaded", function () {
          scanImages();
          scheduleUnlockCheck();
        }, { once: true });
      } else {
        scanImages();
      }

      window.addEventListener("load", function () {
        pageLoadDone = true;
        scanImages();
        scheduleUnlockCheck();
      }, { once: true });

      // Fallback para não travar overlay em caso de recurso externo lento.
      hardTimeout = window.setTimeout(unlockPage, 20000);
    })();
  </script>
    <link rel="apple-touch-icon" sizes="76x76" href="/assets/images/logo_AC_transparente.png">
  <link rel="icon" type="image/png" href="/assets/images/logo_AC_transparente.png">
    <link rel="preload" href="/assets/fonts/nucleo-icons.woff2" as="font" type="font/woff2" crossorigin>
  <title>[Início] - AEROCARTA - Fotografando e Traçando Soluções</title>
  <link href="assets/css/nucleo-icons.css" rel="stylesheet" />
  <link href="assets/css/nucleo-svg.css" rel="stylesheet" />
  <script src="assets/js/fontawesome.js" crossorigin="anonymous"></script>
  <link href="assets/css/nucleo-svg.css" rel="stylesheet" />
  <link id="pagestyle" href="assets/css/soft-design-system-pro.css" rel="stylesheet" />
  <link href="assets/css/custom.css" rel="stylesheet" />
</head>
<body class="presentation-page" style="font-family:var(--bs-body-font-family, 'Open Sans', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Helvetica, Arial, sans-serif);">
  
<div class="container position-sticky z-index-sticky top-0">
    <div class="row">
        <div class="col-12">
            <nav class="navbar navbar-expand-lg  blur blur-rounded top-0 z-index-fixed shadow position-absolute my-3 py-2 start-0 end-0 mx-4">
                <div class="container-fluid px-0">
                    <a class="navbar-brand font-weight-bolder ms-sm-3" href="inicio" rel="tooltip" title="Aerocarta" data-placement="bottom">
                        <img src="assets/images/logo-aerocarta.png" class="navbar-brand-img h-100" alt="main_logo" style="width:150px;"> 
                    </a>
                    <button class="navbar-toggler shadow-none ms-md-2" type="button" data-bs-toggle="collapse" data-bs-target="#navigation" aria-controls="navigation" aria-expanded="false" aria-label="Toggle navigation">
                        <span class="navbar-toggler-icon mt-2">
                            <span class="navbar-toggler-bar bar1"></span>
                            <span class="navbar-toggler-bar bar2"></span>
                            <span class="navbar-toggler-bar bar3"></span>
                        </span>
                    </button>                    
                    <div class="collapse navbar-collapse w-100 pt-1 pb-1 py-lg-0" id="navigation">
                        <ul class="navbar-nav navbar-nav-hover mx-auto">
                            <li class="nav-item dropdown dropdown-hover mx-2 is-current" >
                                <a role="button" href="inicio" class="nav-link ps-2 d-flex justify-content-between cursor-pointer align-items-center is-current" aria-current="page">
                                    Início
                                </a>
                            </li>                                                    
                                                        <li class="nav-item dropdown dropdown-hover mx-2" >
                                <a role="button" class="nav-link ps-2 d-flex justify-content-between cursor-pointer align-items-center" id="dropdownMenuAccount" data-bs-toggle="dropdown" aria-expanded="false">
                                    Quem Somos
                                    <img src="assets/images/down-arrow-dark.svg" alt="down-arrow" class="arrow ms-1">
                                </a>
                                <div class="dropdown-menu dropdown-menu-animation dropdown-lg border-radius-xl p-3 mt-0 mt-lg-3" aria-labelledby="dropdownMenuAccount">
                                    <div class="row d-none d-lg-flex">
                                        <div class="col-6">
                                            <div class="py-6 h-100 w-100 d-flex border-radius-lg position-relative dropdown-image" style="background-image:url('assets/images/curved8.jpg')">
                                                <div class="mask bg-gradient-primary border-radius-lg"></div>
                                                <div class="d-flex justify-content-center align-items-center text-center text-white font-weight-bold w-100 z-index-1 flex-column">
                                                    <div class="icon icon-shape rounded-circle bg-white shadow text-center">
                                                        <i class="ni ni-diamond text-primary text-gradient text-lg" aria-hidden="true"></i>
                                                    </div>
                                                    <span class="text-lg mt-2">Conheça a <br> AEROCARTA</span>
                                                </div>
                                            </div>
                                        </div>
                                        <div class="col-6 ps-0 d-flex justify-content-center flex-column">
                                                                                        <ul class="list-group">                                                
                                                <li class="nav-item list-group-item border-0 p-0" >
                                                    <a href="a-empresa" class="dropdown-item border-radius-md ps-3 d-flex align-items-center justify-content-between mb-1">
                                                        <span>A Empresa</span>
                                                    </a>
                                                </li>                                                
                                            </ul>
                                                                                                                                    <ul class="list-group">                                                
                                                <li class="nav-item list-group-item border-0 p-0" >
                                                    <a href="equipe" class="dropdown-item border-radius-md ps-3 d-flex align-items-center justify-content-between mb-1">
                                                        <span>Equipe</span>
                                                    </a>
                                                </li>
                                            </ul>
                                                                                                                                    <ul class="list-group">                                                
                                                <li class="nav-item list-group-item border-0 p-0" >
                                                    <a href="certificacoes" class="dropdown-item border-radius-md ps-3 d-flex align-items-center justify-content-between mb-1">
                                                        <span>Certificações</span>
                                                    </a>
                                                </li>
                                            </ul>
                                                                                                                                    <ul class="list-group">                                                
                                                <li class="nav-item list-group-item border-0 p-0" >
                                                    <a href="politica-de-qualidade" class="dropdown-item border-radius-md ps-3 d-flex align-items-center justify-content-between mb-1">
                                                        <span>Política de Qualidade</span>
                                                    </a>
                                                </li>
                                            </ul>
                                                                                                                                    <ul class="list-group">                                                
                                                <li class="nav-item list-group-item border-0 p-0" >
                                                    <a href="lgpd" class="dropdown-item border-radius-md ps-3 d-flex align-items-center justify-content-between mb-1">
                                                        <span>LGPD</span>
                                                    </a>
                                                </li>
                                            </ul>
                                                                                        
                                        </div>
                                    </div>
                                    <div class="d-lg-none">
                                        <ul class="list-group">
                                            <li class="nav-item list-group-item border-0 p-0" >
                                                <a href="a-empresa" class="dropdown-item border-radius-md ps-3 d-flex align-items-center justify-content-between mb-1">
                                                    <span>A Empresa</span>
                                                </a>
                                            </li>
                                            <li class="nav-item list-group-item border-0 p-0" >
                                                <a href="equipe" class="dropdown-item border-radius-md ps-3 d-flex align-items-center justify-content-between mb-1">
                                                    <span>Equipe</span>
                                                </a>
                                            </li>
                                            <li class="nav-item list-group-item border-0 p-0" >
                                                <a href="certificacoes" class="dropdown-item border-radius-md ps-3 d-flex align-items-center justify-content-between mb-1">
                                                    <span>Certificações</span>
                                                </a>
                                            </li>
                                            <li class="nav-item list-group-item border-0 p-0" >
                                                <a href="politica-de-qualidade" class="dropdown-item border-radius-md ps-3 d-flex align-items-center justify-content-between mb-1">
                                                    <span>Política de Qualidade</span>
                                                </a>
                                            </li>
                                            <li class="nav-item list-group-item border-0 p-0" >
                                                <a href="lgpd" class="dropdown-item border-radius-md ps-3 d-flex align-items-center justify-content-between mb-1">
                                                    <span>LGPD</span>
                                                </a>
                                            </li>
                                        </ul>
                                    </div>
                                </div>
                            </li>
                              
                                                        <li class="nav-item dropdown dropdown-hover mx-2" >
                                <a role="button" class="nav-link ps-2 d-flex justify-content-between cursor-pointer align-items-center" id="dropdownMenuAccount" data-bs-toggle="dropdown" data-bs-auto-close="outside" aria-expanded="false">
                                    Serviços
                                    <img src="assets/images/down-arrow-dark.svg" alt="down-arrow" class="arrow ms-1">
                                </a>
                                <div class="dropdown-menu dropdown-menu-animation dropdown-lg border-radius-xl p-3 mt-0 mt-lg-3 services-dropdown-menu" aria-labelledby="dropdownMenuAccount">
                                    <div class="row d-none d-lg-flex">
                                        <div class="col-5 service-menu-media">
                                            <div class="py-6 h-100 w-100 d-flex border-radius-lg position-relative dropdown-image" style="background-image:url('assets/images/curved8.jpg')">
                                                <div class="mask bg-gradient-primary border-radius-lg"></div>
                                                <div class="d-flex justify-content-center align-items-center text-center text-white font-weight-bold w-100 z-index-1 flex-column">
                                                    <div class="icon icon-shape rounded-circle bg-white shadow text-center">
                                                        <i class="ni ni-diamond text-primary text-gradient text-lg" aria-hidden="true"></i>
                                                    </div>
                                                    <span class="text-lg mt-2">Conheça os nossos<br>serviços e produtos</span>
                                                </div>
                                            </div>
                                        </div>
                                        <div class="col-7 ps-0 d-flex justify-content-center flex-column service-menu-list">
                                            <ul class="list-group">
                                                                                                                                              <li class="nav-item list-group-item border-0 p-0">
                                                                                                    <a href="/servicos/apoio-de-campo" class="dropdown-item border-radius-md ps-3 d-flex align-items-center justify-content-between mb-1">
                                                    <span>Apoio de Campo</span>
                                                  </a>
                                                                                                  </li>
                                                                                                                                              <li class="nav-item list-group-item border-0 p-0">
                                                                                                    <a href="/servicos/aerofotogrametria" class="dropdown-item border-radius-md ps-3 d-flex align-items-center justify-content-between mb-1">
                                                    <span>Aerofotogrametria</span>
                                                  </a>
                                                                                                  </li>
                                                                                                                                              <li class="nav-item list-group-item border-0 p-0">
                                                                                                    <a href="/servicos/perfilamento-a-laser" class="dropdown-item border-radius-md ps-3 d-flex align-items-center justify-content-between mb-1">
                                                    <span>Perfilamento a Laser</span>
                                                  </a>
                                                                                                  </li>
                                                                                                                                              <li class="nav-item list-group-item border-0 p-0">
                                                                                                    <a href="/servicos/ortofoto" class="dropdown-item border-radius-md ps-3 d-flex align-items-center justify-content-between mb-1">
                                                    <span>Ortofoto</span>
                                                  </a>
                                                                                                  </li>
                                                                                                                                              <li class="nav-item list-group-item border-0 p-0">
                                                                                                    <a href="/servicos/mapeamento-movel-laser" class="dropdown-item border-radius-md ps-3 d-flex align-items-center justify-content-between mb-1">
                                                    <span>Mapeamento Móvel</span>
                                                  </a>
                                                                                                  </li>
                                                                                                                                              <li class="nav-item list-group-item border-0 p-0">
                                                                                                    <a href="/servicos/restituicao" class="dropdown-item border-radius-md ps-3 d-flex align-items-center justify-content-between mb-1">
                                                    <span>Restituição Digital</span>
                                                  </a>
                                                                                                  </li>
                                                                                                                                              <li class="nav-item list-group-item border-0 p-0">
                                                                                                    <a href="/servicos/ctm" class="dropdown-item border-radius-md ps-3 d-flex align-items-center justify-content-between mb-1" title="Cadastro Técnico Multifinalitário">
                                                    <span>CTM</span>
                                                  </a>
                                                                                                  </li>
                                                                                                                                              <li class="nav-item list-group-item border-0 p-0">
                                                                                                    <a href="/servicos/proprios" class="dropdown-item border-radius-md ps-3 d-flex align-items-center justify-content-between mb-1">
                                                    <span>Cadastro de Imóveis Públicos</span>
                                                  </a>
                                                                                                  </li>
                                                                                                                                              <li class="nav-item list-group-item border-0 p-0">
                                                                                                    <a href="/servicos/pvg" class="dropdown-item border-radius-md ps-3 d-flex align-items-center justify-content-between mb-1" title="Planta de Valores Genêricos">
                                                    <span>PVG</span>
                                                  </a>
                                                                                                  </li>
                                                                                                                                              <li class="nav-item list-group-item border-0 p-0">
                                                                                                    <a href="/servicos/sigcarta" class="dropdown-item border-radius-md ps-3 d-flex align-items-center justify-content-between mb-1" title="Sistema de Informações Geográficas">
                                                    <span>SiGCarta</span>
                                                  </a>
                                                                                                  </li>
                                                                                          </ul>
                                        </div>
                                    </div>
                                    <div class="d-lg-none">
                                        <ul class="list-group">
                                                                                                                                  <li class="nav-item list-group-item border-0 p-0">
                                                                                            <a href="/servicos/apoio-de-campo" class="dropdown-item border-radius-md ps-3 d-flex align-items-center justify-content-between mb-1">
                                                <span>Apoio de Campo</span>
                                              </a>
                                                                                          </li>
                                                                                                                                  <li class="nav-item list-group-item border-0 p-0">
                                                                                            <a href="/servicos/aerofotogrametria" class="dropdown-item border-radius-md ps-3 d-flex align-items-center justify-content-between mb-1">
                                                <span>Aerofotogrametria</span>
                                              </a>
                                                                                          </li>
                                                                                                                                  <li class="nav-item list-group-item border-0 p-0">
                                                                                            <a href="/servicos/perfilamento-a-laser" class="dropdown-item border-radius-md ps-3 d-flex align-items-center justify-content-between mb-1">
                                                <span>Perfilamento a Laser</span>
                                              </a>
                                                                                          </li>
                                                                                                                                  <li class="nav-item list-group-item border-0 p-0">
                                                                                            <a href="/servicos/ortofoto" class="dropdown-item border-radius-md ps-3 d-flex align-items-center justify-content-between mb-1">
                                                <span>Ortofoto</span>
                                              </a>
                                                                                          </li>
                                                                                                                                  <li class="nav-item list-group-item border-0 p-0">
                                                                                            <a href="/servicos/mapeamento-movel-laser" class="dropdown-item border-radius-md ps-3 d-flex align-items-center justify-content-between mb-1">
                                                <span>Mapeamento Móvel</span>
                                              </a>
                                                                                          </li>
                                                                                                                                  <li class="nav-item list-group-item border-0 p-0">
                                                                                            <a href="/servicos/restituicao" class="dropdown-item border-radius-md ps-3 d-flex align-items-center justify-content-between mb-1">
                                                <span>Restituição Digital</span>
                                              </a>
                                                                                          </li>
                                                                                                                                  <li class="nav-item list-group-item border-0 p-0">
                                                                                            <a href="/servicos/ctm" class="dropdown-item border-radius-md ps-3 d-flex align-items-center justify-content-between mb-1" title="Cadastro Técnico Multifinalitário">
                                                <span>CTM</span>
                                              </a>
                                                                                          </li>
                                                                                                                                  <li class="nav-item list-group-item border-0 p-0">
                                                                                            <a href="/servicos/proprios" class="dropdown-item border-radius-md ps-3 d-flex align-items-center justify-content-between mb-1">
                                                <span>Cadastro de Imóveis Públicos</span>
                                              </a>
                                                                                          </li>
                                                                                                                                  <li class="nav-item list-group-item border-0 p-0">
                                                                                            <a href="/servicos/pvg" class="dropdown-item border-radius-md ps-3 d-flex align-items-center justify-content-between mb-1" title="Planta de Valores Genêricos">
                                                <span>PVG</span>
                                              </a>
                                                                                          </li>
                                                                                                                                  <li class="nav-item list-group-item border-0 p-0">
                                                                                            <a href="/servicos/sigcarta" class="dropdown-item border-radius-md ps-3 d-flex align-items-center justify-content-between mb-1" title="Sistema de Informações Geográficas">
                                                <span>SiGCarta</span>
                                              </a>
                                                                                          </li>
                                                                                  </ul>
                                    </div>
                                </div>
                            </li>  
                              
                                                        <li class="nav-item dropdown dropdown-hover mx-2" >
                                <a role="button" href="clientes" class="nav-link ps-2 d-flex justify-content-between cursor-pointer align-items-center">
                                    Clientes                                    
                                </a>                                
                            </li>                                      
                              
                                                        <li class="nav-item dropdown dropdown-hover mx-2" >
                                <a role="button" href="blog" class="nav-link ps-2 d-flex justify-content-between cursor-pointer align-items-center">
                                    Notícias                                    
                                </a>                                
                            </li>                
                              
                                                        <li class="nav-item dropdown dropdown-hover mx-2" >
                                <a role="button" href="contatos" class="nav-link ps-2 d-flex justify-content-between cursor-pointer align-items-center">
                                    Contatos                                    
                                </a>                                
                            </li>           
                              
                        </ul>                        
                                                <div class="ms-md-auto pe-md-3 d-flex align-items-center">
                            <div class="input-group site-search-wrapper" >
                                <span class="input-group-text text-body"><i class="fas fa-search" aria-hidden="true"></i></span>
                                <input type="text" class="form-control" id="site-search-input" placeholder="Procurar...">
                                <div class="site-search-dropdown" id="site-search-dropdown" hidden></div>
                            </div>
                        </div>
                          
                    </div>
                </div>
            </nav>
        </div>
    </div>
</div>
<style>
  .navbar .nav-link.is-current,
  .navbar .nav-link.is-current-group {
    color: #216969 !important;
    font-weight: 700;
    position: relative;
  }
  .navbar .navbar-nav > .nav-item > .nav-link.is-current::after,
  .navbar .navbar-nav > .nav-item > .nav-link.is-current-group::after {
    content: "";
    position: absolute;
    left: 0.5rem;
    right: 0.5rem;
    bottom: -0.25rem;
    height: 2px;
    border-radius: 999px;
    background: var(--aerocarta-green, #216969);
    opacity: 0.95;
  }
  .navbar .dropdown-item.is-current {
    background: rgba(33, 105, 105, 0.10);
    color: #1d5e5e;
    font-weight: 700;
  }
  .navbar .nav-item.is-current-group > .nav-link .arrow {
    opacity: 1;
    transform: rotate(180deg);
  }
  .site-search-wrapper {
    position: relative;
    min-width: min(300px, 60vw);
    max-width: 340px;
  }
  .site-search-dropdown {
    position: absolute;
    top: calc(100% + 6px);
    left: 0;
    right: 0;
    max-height: 340px;
    overflow: auto;
    background: #fff;
    border: 1px solid rgba(33, 105, 105, 0.22);
    border-radius: 0.6rem;
    box-shadow: 0 14px 32px rgba(15, 23, 42, 0.18);
    z-index: 2000;
  }
  .site-search-item {
    display: block;
    padding: 0.65rem 0.75rem;
    text-decoration: none;
    border-bottom: 1px solid rgba(33, 105, 105, 0.10);
  }
  .site-search-item:last-child {
    border-bottom: 0;
  }
  .site-search-item:hover,
  .site-search-item:focus {
    background: rgba(33, 105, 105, 0.08);
  }
  .site-search-title {
    color: #216969;
    font-weight: 600;
    line-height: 1.2;
    margin-bottom: 0.15rem;
  }
  .site-search-meta {
    color: #5d6f95;
    font-size: 0.78rem;
    line-height: 1.25;
  }
  .site-search-mark {
    background: rgba(33, 105, 105, 0.2);
    color: #0f3f3f;
    padding: 0 0.15rem;
    border-radius: 0.2rem;
    font-weight: 700;
  }
  .service-submenu-list {
    list-style: none;
    margin: 0 0 0.25rem 0;
    padding: 0 0 0 0.95rem;
  }
  .service-submenu-item .dropdown-item {
    font-size: 0.9rem;
    opacity: 0.92;
  }
  .service-submenu-item .dropdown-item span::before {
    content: "• ";
    opacity: 0.7;
  }
  .service-submenu-list[hidden] {
    display: none !important;
  }
  .js-service-parent-link[aria-expanded="true"] span::after {
    content: " \25B2";
    font-size: 0.7em;
    opacity: 0.75;
    margin-left: 1.1rem;
  }
  .js-service-parent-link[aria-expanded="false"] span::after {
    content: " \25BC";
    font-size: 0.7em;
    opacity: 0.75;
    margin-left: 1.1rem;
  }
  #navigation {
    --services-dropdown-min-width: 22.6rem;
    --services-dropdown-width: min(82vw, 25.6rem);
  }
  @media (min-width: 992px) {
    #navigation .services-dropdown-menu {
      min-width: var(--services-dropdown-min-width);
      width: var(--services-dropdown-width);
      max-height: min(78vh, 760px);
      overflow-y: auto;
      overflow-x: hidden;
    }
    #navigation .services-dropdown-menu .service-menu-list .dropdown-item {
      white-space: normal !important;
      overflow: visible !important;
      text-overflow: unset !important;
      line-height: 1.25;
    }
    #navigation .services-dropdown-menu .service-menu-list .dropdown-item span {
      white-space: normal !important;
      overflow-wrap: anywhere;
    }
  }
  @media (max-width: 991.98px) {
    .navbar.navbar-expand-lg.blur.position-absolute.mx-4 {
      margin-left: 0.5rem !important;
      margin-right: 0.5rem !important;
    }
    #navigation .navbar-nav {
      width: 100%;
    }
    #navigation .nav-item.dropdown .dropdown-menu {
      min-width: 0 !important;
      width: 100% !important;
      max-width: 100% !important;
      margin-top: 0.35rem !important;
      padding: 0.4rem !important;
      overflow-x: hidden !important;
      overflow-y: visible !important;
      max-height: none !important;
      height: auto !important;
      transform: none !important;
      box-shadow: none !important;
    }
    #navigation .dropdown.nav-item .dropdown-menu-animation,
    #navigation .dropdown.nav-item .dropdown-menu-animation.show {
      height: auto !important;
      min-height: 0 !important;
      padding-top: 0.4rem !important;
      padding-bottom: 0.4rem !important;
      transition: none !important;
    }
    #navigation .dropdown.nav-item .dropdown-menu-animation {
      display: none !important;
      opacity: 0 !important;
      visibility: hidden !important;
      pointer-events: none !important;
    }
    #navigation .dropdown.nav-item .dropdown-menu-animation.show {
      display: block !important;
      opacity: 1 !important;
      visibility: visible !important;
      pointer-events: auto !important;
    }
    #navigation .dropdown-menu:before {
      content: none !important;
    }
    #navigation .dropdown-menu .row {
      margin-left: 0 !important;
      margin-right: 0 !important;
    }
    #navigation .dropdown-menu .list-group {
      width: 100%;
    }
    #navigation .dropdown-menu .dropdown-item {
      white-space: normal !important;
      overflow-wrap: anywhere;
    }
    .site-search-wrapper {
      min-width: 100%;
      width: 100%;
    }
  }
</style>
<script>
  (function () {
    document.addEventListener('click', function (event) {
      const link = event.target ? event.target.closest('.js-service-parent-link') : null;
      if (!link) return;
      const submenu = link.nextElementSibling;
      if (!submenu || !submenu.classList.contains('js-service-submenu')) return;
      event.preventDefault();
      event.stopPropagation();
      const isExpanded = link.getAttribute('aria-expanded') === 'true';
      link.setAttribute('aria-expanded', isExpanded ? 'false' : 'true');
      submenu.hidden = isExpanded;
    });
  })();

  (function () {
    const input = document.getElementById('site-search-input');
    const dropdown = document.getElementById('site-search-dropdown');
    if (!input || !dropdown) return;

    const searchIndex = [{"title":"Início","url":"/inicio","where":"Menu principal","snippet":"Página inicial da Aerocarta.","keywords":["home","principal"]},{"title":"Quem Somos","url":"/a-empresa","where":"Quem Somos","snippet":"Conheça a empresa, equipe, certificações e políticas.","keywords":["empresa","história","sobre"]},{"title":"A Empresa","url":"/a-empresa","where":"Quem Somos","snippet":"Histórico e posicionamento institucional.","keywords":[]},{"title":"Equipe","url":"/equipe","where":"Quem Somos","snippet":"Conheça a equipe da Aerocarta.","keywords":["time","colaboradores"]},{"title":"Certificações","url":"/certificacoes","where":"Quem Somos","snippet":"Certificações e qualificações técnicas.","keywords":[]},{"title":"Política de Qualidade","url":"/politica-de-qualidade","where":"Quem Somos","snippet":"Diretrizes e compromissos de qualidade.","keywords":[]},{"title":"LGPD","url":"/lgpd","where":"Quem Somos","snippet":"Diretrizes de privacidade e proteção de dados.","keywords":[]},{"title":"História e Estrutura da Empresa","url":"/a-empresa","where":"Quem Somos / A Empresa","snippet":"Trajetória, atuação nacional, diferenciais técnicos e capacidade operacional da Aerocarta.","keywords":["historia","estrutura","institucional","desde 1987","aerocarta engenharia"]},{"title":"Equipe Técnica","url":"/equipe","where":"Quem Somos / Equipe","snippet":"Profissionais especializados em aerolevantamento, geoprocessamento e engenharia cartográfica.","keywords":["time","profissionais","especialistas","engenheiros","cartografia"]},{"title":"Normas e Certificações","url":"/certificacoes","where":"Quem Somos / Certificações","snippet":"Certificações, conformidades e qualificação técnica para execução dos projetos.","keywords":["iso","conformidade","qualidade","certificação","normas"]},{"title":"Compromissos de Qualidade","url":"/politica-de-qualidade","where":"Quem Somos / Política de Qualidade","snippet":"Diretrizes de melhoria contínua, controle de processo e foco em excelência técnica.","keywords":["politica","qualidade","melhoria continua","processos","excelencia"]},{"title":"Privacidade e Proteção de Dados","url":"/lgpd","where":"Quem Somos / LGPD","snippet":"Práticas de tratamento de dados pessoais, segurança e conformidade com a LGPD.","keywords":["privacidade","dados pessoais","compliance","protecao de dados","seguranca"]},{"title":"Clientes","url":"/clientes","where":"Menu principal","snippet":"Portfólio e depoimentos de clientes.","keywords":["obras","projetos"]},{"title":"Notícias","url":"/blog","where":"Menu principal","snippet":"Notícias e conteúdos técnicos.","keywords":[]},{"title":"Contatos","url":"/contatos","where":"Menu principal","snippet":"Fale com a Aerocarta.","keywords":[]},{"title":"Laser Riegl VQ-780 II-S","url":"/inicio","where":"Início / Tecnologia em Destaque","snippet":"O equipamento laser Riegl VQ-780 II-S &eacute; um avan&ccedil;ado sistema de sensoriamento a laser projetado para aplica&ccedil;&otilde;e...","keywords":["home","tecnologia","destaque","spotlight","Laser Riegl VQ-780 II-S"]},{"title":"Mapeamento Móvel","url":"/inicio","where":"Início / Tecnologia em Destaque","snippet":"Cada projeto &eacute; uma jornada. Aproveite o percurso.\nO sistema Trimble&reg; MX60 integra uma solu&ccedil;&atilde;o completa de mapeam...","keywords":["home","tecnologia","destaque","spotlight","Mapeamento Móvel"]},{"title":"CTM","url":"/inicio","where":"Início / Serviços em Destaque / CTM","snippet":"Abordagem do Cadastro T&eacute;cnico Multifinalit&aacute;rio permite a otimiza&ccedil;&atilde;o de recursos e a obten&ccedil;&atilde;o de...","keywords":["home","serviços","destaque","CTM","CTM"]},{"title":"Ortofoto","url":"/inicio","where":"Início / Serviços em Destaque / Ortofoto","snippet":"&Eacute; uma imagem a&eacute;rea que foi&nbsp;geometricamente&nbsp;corrigida&nbsp;para remover as distor&ccedil;&otilde;es causadas pela ...","keywords":["home","serviços","destaque","Ortofoto","Ortofoto"]},{"title":"Aerolevantamento","url":"/inicio","where":"Início / Serviços em Destaque / Aerolevantamento","snippet":"&Eacute; o conjunto de opera&ccedil;&otilde;es realizadas a partir de plataformas a&eacute;reas  com o objetivo de coletar dados e imagen...","keywords":["home","serviços","destaque","Aerolevantamento","Aerolevantamento"]},{"title":"Perfilamento a laser","url":"/inicio","where":"Início / Serviços em Destaque / Perfilamento a Laser","snippet":"Conhecido como LiDAR (Light Detection and Ranging), &eacute; uma tecnologia de sensoriamento remoto ativo que utiliza pulsos de luz para ...","keywords":["home","serviços","destaque","Perfilamento a Laser","Perfilamento a laser"]},{"title":"Integração","url":"/inicio","where":"Início / Serviços em Destaque / CTM","snippet":"Base cartogr&aacute;fica e banco de dados s&atilde;o cora&ccedil;&atilde;o do CTM &eacute; a liga&ccedil;&atilde;o precisa entre o desenh...","keywords":["home","serviços","destaque","CTM","Integração"]},{"title":"Resolução Espacial","url":"/inicio","where":"Início / Serviços em Destaque / Ortofoto","snippet":"Para definir a qualidade t&eacute;cnica do produto, utilizamos o&nbsp;GSD, que&nbsp;&nbsp;&eacute; o tamanho do pixel no ch&atilde;o. Uma...","keywords":["home","serviços","destaque","Ortofoto","Resolução Espacial"]},{"title":"Aeronave","url":"/inicio","where":"Início / Serviços em Destaque / Aerolevantamento","snippet":"A Aerocarta utiliza Aeronave do modelo&nbsp;Navajo EMBRAER/EMB-820C&nbsp;com autonomia de&nbsp;6:00&nbsp;de voo","keywords":["home","serviços","destaque","Aerolevantamento","Aeronave"]},{"title":"Precisão","url":"/inicio","where":"Início / Serviços em Destaque / Perfilamento a Laser","snippet":"O LiDAR &eacute; a refer&ecirc;ncia t&eacute;cnica para obten&ccedil;&atilde;o da coordenada vertical (Z). Ele entrega a altimetria exata...","keywords":["home","serviços","destaque","Perfilamento a Laser","Precisão"]},{"title":"Justiça Fiscal","url":"/inicio","where":"Início / Serviços em Destaque / CTM","snippet":"&nbsp;O CTM identifica im&oacute;veis que foram ampliados sem a devida notifica&ccedil;&atilde;o &agrave; prefeitura. Isso permite cobrar...","keywords":["home","serviços","destaque","CTM","Justiça Fiscal"]},{"title":"True Ortofoto","url":"/inicio","where":"Início / Serviços em Destaque / Ortofoto","snippet":"Utiliza um Modelo Digital de Superf&iacute;cie (MDS) detalhado para corrigir tudo, inclusive edifica&ccedil;&otilde;es. O resultado &eacu...","keywords":["home","serviços","destaque","Ortofoto","True Ortofoto"]},{"title":"Equipamentos","url":"/inicio","where":"Início / Serviços em Destaque / Aerolevantamento","snippet":"Aeronave equipada com laser Riegl, GPS e c&acirc;meras RGB e IR da Phase One.","keywords":["home","serviços","destaque","Aerolevantamento","Equipamentos"]},{"title":"Quantidade de pontos","url":"/inicio","where":"Início / Serviços em Destaque / Perfilamento a Laser","snippet":"Equipamento emite alta densidade de pontos, sendo 1,3 milh&otilde;es de pontos por segundo","keywords":["home","serviços","destaque","Perfilamento a Laser","Quantidade de pontos"]},{"title":"Notificação","url":"/inicio","where":"Início / Serviços em Destaque / CTM","snippet":"Seu objetivo principal &eacute; dar transpar&ecirc;ncia ao processo de atualiza&ccedil;&atilde;o cadastral e abrir um canal para o contra...","keywords":["home","serviços","destaque","CTM","Notificação"]},{"title":"Homogeneização","url":"/inicio","where":"Início / Serviços em Destaque / Ortofoto","snippet":"Como o voo pode durar horas, a ilumina&ccedil;&atilde;o do sol muda entre a primeira e a &uacute;ltima&nbsp;foto. O processamento aplica ...","keywords":["home","serviços","destaque","Ortofoto","Homogeneização"]},{"title":"Equipe","url":"/inicio","where":"Início / Serviços em Destaque / Aerolevantamento","snippet":"Tripula&ccedil;&atilde;o altamente treinada e experiente em aerolevantamento, composta por piloto e operador t&eacute;cnico dos equipamen...","keywords":["home","serviços","destaque","Aerolevantamento","Equipe"]},{"title":"Mútiplos Alvos","url":"/inicio","where":"Início / Serviços em Destaque / Perfilamento a Laser","snippet":"O sistema registra m&uacute;ltiplos retornos de um mesmo pulso de luz. Isso permite que o laser \"atravesse\" a vegeta&ccedil;&atilde;o, at...","keywords":["home","serviços","destaque","Perfilamento a Laser","Mútiplos Alvos"]},{"title":"Apoio de Campo","url":"/servicos/apoio-de-campo","where":"Serviços","snippet":"Constitui a base&nbsp;geodésica fundamental&nbsp;para a execução de levantamentos&nbsp;topográficos,&nbsp;mapeamentos&nbsp;e atividades d...","keywords":["apoio-de-campo","Rede de Referência Cadastral Municipal","Apoio de Campo","serviço","solução"]},{"title":"Aerofotogrametria","url":"/servicos/aerofotogrametria","where":"Serviços","snippet":"É um&nbsp;processo&nbsp;avançado de coleta e produção de dados geoespaciais que envolve a captura sistemática de imagens&nbsp;aéreas&nbsp...","keywords":["aerofotogrametria","Aerofotogrametria","Cobertura Aerofotogramétrica","serviço","solução"]},{"title":"Perfilamento a Laser","url":"/servicos/perfilamento-a-laser","where":"Serviços","snippet":"O&nbsp;LiDAR&nbsp;(Light Detection and Ranging) é uma avançada tecnologia de&nbsp;coleta de dados&nbsp;geoespaciais baseada na emissão de...","keywords":["perfilamento-a-laser","Perfilamento a Laser","O Poder do LiDAR","serviço","solução"]},{"title":"Ortofoto","url":"/servicos/ortofoto","where":"Serviços","snippet":"É uma representação&nbsp;fotográfica&nbsp;de uma região da\nsuperfície terrestre na qual todos os elementos apresentam a mesma escala,\nliv...","keywords":["ortofoto","Ortofoto","Muito mais que uma Imagem, um mapa.","serviço","solução"]},{"title":"Mapeamento Móvel","url":"/servicos/mapeamento-movel-laser","where":"Serviços","snippet":"É uma tecnologia&nbsp;avançada&nbsp;de coleta de dados geoespaciais que integra sensores LiDAR, câmeras panorâmicas 360° de alta resoluçã...","keywords":["mapeamento-movel-laser","Mapeamento Móvel","O poder do  360 integrado com LiDAR","serviço","solução"]},{"title":"Restituição Digital","url":"/servicos/restituicao","where":"Serviços","snippet":"É um processo de&nbsp;interpretação&nbsp;de imagens aéreas para produzir informações&nbsp;geoespaciais&nbsp;detalhadas e precisas a fim d...","keywords":["restituicao","Restituição Digital","Estereofotogramétrica","serviço","solução"]},{"title":"CTM","url":"/servicos/ctm","where":"Serviços","snippet":"É um&nbsp;sistema&nbsp;de registro de informações georreferenciadas relacionadas a diversos aspectos do uso do solo&nbsp;e do&nbsp;meio a...","keywords":["ctm","CTM","Cadastro Técnico Multifinalitário","serviço","solução"]},{"title":"Cadastro de Imóveis Públicos","url":"/servicos/proprios","where":"Serviços","snippet":"Os&nbsp;Próprios Municipais&nbsp;são todos os bens imóveis (terrenos, prédios e instalações) que pertencem ao&nbsp;patrimônio&nbsp;de um ...","keywords":["proprios","Cadastro de Imóveis Públicos","Certificação e Georreferenciamento","serviço","solução"]},{"title":"PVG","url":"/servicos/pvg","where":"Serviços","snippet":"É um documento utilizado por&nbsp;órgãos públicos, como prefeituras, para estabelecer a política tributária municipal,&nbsp;necessária&nb...","keywords":["pvg","Planta de Valores Genéricos","Referencial técnico para avaliação imobiliária","serviço","solução"]},{"title":"SiGCarta","url":"/servicos/sigcarta","where":"Serviços","snippet":"O&nbsp;SiGCarta&nbsp;é uma plataforma integrada de ferramentas&nbsp;desktop&nbsp;e&nbsp;web&nbsp;criada para&nbsp;consolidar&nbsp;e&nbsp;...","keywords":["sigcarta","SiGCarta","O poder do SiG customizado","serviço","solução"]},{"title":"CATEGORIA  A","url":"/servicos/aerofotogrametria","where":"Serviços / Aerofotogrametria","snippet":"Indica que a&nbsp;AEROCARTA&nbsp;atende aos mais altos&nbsp;padrões&nbsp;de&nbsp;segurança&nbsp;e integridade necessários para\noperar no ...","keywords":["intro_image_text","Aerofotogrametria","aerofotogrametria","seção","serviços"]},{"title":"Arquitetura Tecnológica do Sistema","url":"/servicos/mapeamento-movel-laser","where":"Serviços / Mapeamento Móvel","snippet":"Conheça a arquitetura por trás do nosso&nbsp;sistema&nbsp;de mapeamento móvel. A estrutura do sistema é composta por unidades modulares e...","keywords":["intro_image_text","Mapeamento Móvel","mapeamento-movel-laser","seção","serviços"]},{"title":"Ortorretificação","url":"/servicos/ortofoto","where":"Serviços / Ortofoto","snippet":"Tem por objetivo corrigir as deformações&nbsp;geométricas&nbsp;sofridas pelas imagens, devido à plataforma da câmara&nbsp;fotográfica, do...","keywords":["intro_image_text","Ortofoto","ortofoto","seção","serviços"]},{"title":"Como Funciona o Perfilamento?","url":"/servicos/perfilamento-a-laser","where":"Serviços / Perfilamento a Laser","snippet":"Funciona emitindo pulsos de&nbsp;laser&nbsp;de um sensor montado em uma aeronave ou veículo. Esses pulsos atingem a superfície terrestre ...","keywords":["intro_image_text","Perfilamento a Laser","perfilamento-a-laser","seção","serviços"]},{"title":"Bom para o Município","url":"/servicos/pvg","where":"Serviços / PVG","snippet":"Uma&nbsp;planta genérica&nbsp;atualizada reflete com maior precisão o valor dos imóveis\ndentro do&nbsp;município.&nbsp;Isso significa que...","keywords":["intro_image_text","PVG","pvg","seção","serviços"]},{"title":"Quais os tipos de Próprios Municipais?","url":"/servicos/proprios","where":"Serviços / Cadastro de Imóveis Públicos","snippet":"Os&nbsp;Próprios Municipais&nbsp;são divididos em três tipos distintos sendo eles:","keywords":["intro_image_text","Cadastro de Imóveis Públicos","proprios","seção","serviços"]},{"title":"Arquitetura Tecnológica Aberta","url":"/servicos/sigcarta","where":"Serviços / SiGCarta","snippet":"O&nbsp;SiGCarta&nbsp;é construído sobre uma arquitetura&nbsp;tecnológica moderna&nbsp;baseada em padrões abertos amplamente utilizados no...","keywords":["intro_image_text","SiGCarta","sigcarta","seção","serviços"]},{"title":"Cadastro Imobiliário","url":"/servicos/ctm","where":"Serviços / CTM","snippet":"É a base&nbsp;fundamental&nbsp;para a gestão do território urbano e rural. Ele consiste no&nbsp;registro&nbsp;detalhado de todas as unida...","keywords":["intro_image_text","CTM","ctm","seção","serviços"]},{"title":"Marcos Geodésicos","url":"/servicos/apoio-de-campo","where":"Serviços / Apoio de Campo","snippet":"São pontos físicos&nbsp;materializados&nbsp;no terreno que servem como&nbsp;referência&nbsp;espacial absoluta para qualquer levantamento....","keywords":["imagem_cards_3","Apoio de Campo","apoio-de-campo","seção","serviços"]},{"title":"Nova Seção","url":"/servicos/mapeamento-movel-laser","where":"Serviços / Mapeamento Móvel","snippet":"","keywords":["cards_3","Mapeamento Móvel","mapeamento-movel-laser","seção","serviços"]},{"title":"Nova Seção","url":"/servicos/ortofoto","where":"Serviços / Ortofoto","snippet":"","keywords":["cards_3","Ortofoto","ortofoto","seção","serviços"]},{"title":"Seção","url":"/servicos/aerofotogrametria","where":"Serviços / Aerofotogrametria","snippet":"","keywords":["cards_3","Aerofotogrametria","aerofotogrametria","seção","serviços"]},{"title":"Equipamentos","url":"/servicos/aerofotogrametria","where":"Serviços / Aerofotogrametria","snippet":"A&nbsp;precisão&nbsp;dos nossos resultados é sustentada por um ecossistema tecnológico de alto nível. Ao integrar sensores&nbsp;laser&nbs...","keywords":["intro_image_text","Aerofotogrametria","aerofotogrametria","seção","serviços"]},{"title":"Nova Seção","url":"/servicos/aerofotogrametria","where":"Serviços / Aerofotogrametria","snippet":"","keywords":["cards_3","Aerofotogrametria","aerofotogrametria","seção","serviços"]},{"title":"Nosso Laser","url":"/servicos/perfilamento-a-laser","where":"Serviços / Perfilamento a Laser","snippet":"Utilizamos o&nbsp;Laser\nVQ-780 II-S&nbsp;desenvolvido\npela&nbsp;Riegl, um sensor de mapeamento aéreo de\nalto desempenho, robusto, leve e ...","keywords":["intro_image_text","Perfilamento a Laser","perfilamento-a-laser","seção","serviços"]},{"title":"Bom para Munícipe","url":"/servicos/pvg","where":"Serviços / PVG","snippet":"A atualização da&nbsp;Planta Genérica de Valores&nbsp;promove maior&nbsp;justiça fiscal&nbsp;ao distribuir de forma mais equilibrada a ca...","keywords":["intro_image_text","PVG","pvg","seção","serviços"]},{"title":"Restituição Aerofotogramétrica","url":"/servicos/restituicao","where":"Serviços / Restituição Digital","snippet":"É um procedimento que transforma&nbsp;imagens aéreas&nbsp;em dados&nbsp;geoespaciais&nbsp;detalhados. Essa técnica envolve a&nbsp;análise...","keywords":["intro_image_text","Restituição Digital","restituicao","seção","serviços"]},{"title":"Seção","url":"/servicos/proprios","where":"Serviços / Cadastro de Imóveis Públicos","snippet":"","keywords":["cards_3","Cadastro de Imóveis Públicos","proprios","seção","serviços"]},{"title":"Nova Seção","url":"/servicos/sigcarta","where":"Serviços / SiGCarta","snippet":"","keywords":["cards_3","SiGCarta","sigcarta","seção","serviços"]},{"title":"Nova Seção","url":"/servicos/ctm","where":"Serviços / CTM","snippet":"","keywords":["cards_3","CTM","ctm","seção","serviços"]},{"title":"Composição do Sensor Unit","url":"/servicos/mapeamento-movel-laser","where":"Serviços / Mapeamento Móvel","snippet":"Sensor Unit&nbsp;é o local onde concentra todos o sensores do sistema, responsável pela captura do dados LiDAR, imagens e localização do&...","keywords":["intro_image_text","Mapeamento Móvel","mapeamento-movel-laser","seção","serviços"]},{"title":"Composição de Bandas","url":"/servicos/ortofoto","where":"Serviços / Ortofoto","snippet":"Uma ortofoto de quatro&nbsp;bandas&nbsp;captura a luz visível (Vermelho, Verde e Azul - RGB) e a luz invisível do Infravermelho (IR). Ao ...","keywords":["intro_image_text","Ortofoto","ortofoto","seção","serviços"]},{"title":"Produtos Provenientes da Aerofotogrametria","url":"/servicos/aerofotogrametria","where":"Serviços / Aerofotogrametria","snippet":"","keywords":["stats_4","Aerofotogrametria","aerofotogrametria","seção","serviços"]},{"title":"Nova Seção","url":"/servicos/perfilamento-a-laser","where":"Serviços / Perfilamento a Laser","snippet":"","keywords":["cards_3","Perfilamento a Laser","perfilamento-a-laser","seção","serviços"]},{"title":"Veja todos os benefícios","url":"/servicos/pvg","where":"Serviços / PVG","snippet":"","keywords":["stats_4","PVG","pvg","seção","serviços"]},{"title":"Processo de Restituição","url":"/servicos/restituicao","where":"Serviços / Restituição Digital","snippet":"","keywords":["intro_image_text","Restituição Digital","restituicao","seção","serviços"]},{"title":"Módulos","url":"/servicos/sigcarta","where":"Serviços / SiGCarta","snippet":"Os módulos especializam o&nbsp;SiG&nbsp;para atender às necessidades de diferentes áreas da&nbsp;gestão municipal, integrando informações...","keywords":["text","SiGCarta","sigcarta","seção","serviços"]},{"title":"Monografia de Marcos Geodésicos","url":"/servicos/apoio-de-campo","where":"Serviços / Apoio de Campo","snippet":"A implantação de um&nbsp;marco geodésico&nbsp;é apenas a primeira etapa do apoio de campo. Para que esse ponto tenha valor técnico e lega...","keywords":["pdf_cards_3","Apoio de Campo","apoio-de-campo","seção","serviços"]},{"title":"Atendimento ao Contribuinte","url":"/servicos/ctm","where":"Serviços / CTM","snippet":"Muitas vezes, o volume de atendimentos gerado após o envio de&nbsp;notificações&nbsp;fiscais ou atualizações cadastrais supera a capacida...","keywords":["intro_image_text","CTM","ctm","seção","serviços"]},{"title":"Seção","url":"/servicos/mapeamento-movel-laser","where":"Serviços / Mapeamento Móvel","snippet":"","keywords":["cards_3","Mapeamento Móvel","mapeamento-movel-laser","seção","serviços"]},{"title":"Monitoramento em tempo Real","url":"/servicos/mapeamento-movel-laser","where":"Serviços / Mapeamento Móvel","snippet":"Gestão de Dados via&nbsp;Trimble&nbsp;Mobile Imaging&nbsp;(TMI)Durante a operação de&nbsp;mapeamento, o controle total do sistema é reali...","keywords":["intro_image_text","Mapeamento Móvel","mapeamento-movel-laser","seção","serviços"]},{"title":"Nova Seção","url":"/servicos/mapeamento-movel-laser","where":"Serviços / Mapeamento Móvel","snippet":"","keywords":["cards_3","Mapeamento Móvel","mapeamento-movel-laser","seção","serviços"]},{"title":"GSD, o que é?","url":"/servicos/ortofoto","where":"Serviços / Ortofoto","snippet":"GSD - Ground Sample Distance&nbsp;é o parâmetro que determina a clareza e o nível de detalhamento de um mapeamento aéreo, representando a...","keywords":["intro_image_text","Ortofoto","ortofoto","seção","serviços"]},{"title":"Nova Seção","url":"/servicos/restituicao","where":"Serviços / Restituição Digital","snippet":"","keywords":["cards_3","Restituição Digital","restituicao","seção","serviços"]},{"title":"Porque Certificar um Próprio?","url":"/servicos/proprios","where":"Serviços / Cadastro de Imóveis Públicos","snippet":"Certificar um próprio é&nbsp;transformar&nbsp;informação em segurança patrimonial.&nbsp;Ao validar tecnicamente&nbsp;localização, limites...","keywords":["text","Cadastro de Imóveis Públicos","proprios","seção","serviços"]},{"title":"Seção","url":"/servicos/sigcarta","where":"Serviços / SiGCarta","snippet":"","keywords":["stats_4","SiGCarta","sigcarta","seção","serviços"]},{"title":"Controle de Qualidade","url":"/servicos/apoio-de-campo","where":"Serviços / Apoio de Campo","snippet":"O&nbsp;Apoio Suplementar&nbsp;atua como o mecanismo\nde auditoria&nbsp;e&nbsp;garantia&nbsp;de qualidade&nbsp;(QA/QC)&nbsp;do\naerolevantam...","keywords":["imagem_cards_3","Apoio de Campo","apoio-de-campo","seção","serviços"]},{"title":"MAPA PVG - Simulação transforma dados em decisões rápidas.","url":"/servicos/pvg","where":"Serviços / PVG","snippet":"Com apenas alguns cliques,&nbsp;visualize&nbsp;cenários de valorização, compare impactos no&nbsp;IPTU&nbsp;e&nbsp;identifique, no mapa te...","keywords":["mapa_pgv","PVG","pvg","seção","serviços"]},{"title":"Nova Seção","url":"/servicos/ctm","where":"Serviços / CTM","snippet":"","keywords":["cards_3","CTM","ctm","seção","serviços"]},{"title":"Laser","url":"/servicos/mapeamento-movel-laser","where":"Serviços / Mapeamento Móvel","snippet":"A partir da&nbsp;nuvem de pontos&nbsp;tridimensional gerada pelo sistema&nbsp;MX60 PRO,&nbsp;é possível identificar com precisão a locali...","keywords":["intro_image_text","Mapeamento Móvel","mapeamento-movel-laser","seção","serviços"]},{"title":"Nova Seção","url":"/servicos/mapeamento-movel-laser","where":"Serviços / Mapeamento Móvel","snippet":"","keywords":["cards_3","Mapeamento Móvel","mapeamento-movel-laser","seção","serviços"]},{"title":"GSD, o que é?","url":"/servicos/ortofoto","where":"Serviços / Ortofoto","snippet":"","keywords":["cards_3","Ortofoto","ortofoto","seção","serviços"]},{"title":"Elementos Alvos da Restituição","url":"/servicos/restituicao","where":"Serviços / Restituição Digital","snippet":"","keywords":["stats_4","Restituição Digital","restituicao","seção","serviços"]},{"title":"Porque Certificar?","url":"/servicos/proprios","where":"Serviços / Cadastro de Imóveis Públicos","snippet":"","keywords":["cards_3","Cadastro de Imóveis Públicos","proprios","seção","serviços"]},{"title":"Suporte SIGCarta","url":"/servicos/sigcarta","where":"Serviços / SiGCarta","snippet":"Tão\nimportante quanto ter um&nbsp;ótimo&nbsp;produto é ter um suporte a altura. Sabendo disso\na&nbsp;AEROCARTA&nbsp;dá suporte total ante...","keywords":["intro_image_text","SiGCarta","sigcarta","seção","serviços"]},{"title":"Estações RBMC - IBGE","url":"/servicos/apoio-de-campo","where":"Serviços / Apoio de Campo","snippet":"Apresentamos as estações&nbsp;Rede Brasileira de Monitoramento Contínuo&nbsp;-&nbsp;RBMC&nbsp;do&nbsp;IBGE&nbsp;com clareza e padronizaçã...","keywords":["kmz","Apoio de Campo","apoio-de-campo","seção","serviços"]},{"title":"Cadastro de Logradouros","url":"/servicos/ctm","where":"Serviços / CTM","snippet":"Organiza o&nbsp;sistema viário&nbsp;e os espaços públicos (praças, parques e vias). É essencial para a&nbsp;logística urbana, serviços de...","keywords":["intro_image_text","CTM","ctm","seção","serviços"]},{"title":"Comparação de Produtos","url":"/servicos/perfilamento-a-laser","where":"Serviços / Perfilamento a Laser","snippet":"Compare três importantes produtos derivados do aerolevantamento: a&nbsp;Ortofoto, que apresenta a imagem real do território corrigida geo...","keywords":["comparacao_imagem_v2","Perfilamento a Laser","perfilamento-a-laser","seção","serviços"]},{"title":"Produtos Provenientes do Mapeamento Móvel","url":"/servicos/mapeamento-movel-laser","where":"Serviços / Mapeamento Móvel","snippet":"","keywords":["stats_4","Mapeamento Móvel","mapeamento-movel-laser","seção","serviços"]},{"title":"Nuvem de Pontos","url":"/servicos/perfilamento-a-laser","where":"Serviços / Perfilamento a Laser","snippet":"A&nbsp;nuvem de pontos&nbsp;representa milhões de medições tridimensionais capturadas por sensores LiDAR ou fotogrametria, formando uma b...","keywords":["nuvem_pontos","Perfilamento a Laser","perfilamento-a-laser","seção","serviços"]},{"title":"Nova Seção","url":"/servicos/sigcarta","where":"Serviços / SiGCarta","snippet":"","keywords":["cards_3","SiGCarta","sigcarta","seção","serviços"]},{"title":"Comparação de GSD`s","url":"/servicos/ortofoto","where":"Serviços / Ortofoto","snippet":"Ao comparar diferentes GSD’s, é possível visualizar como a&nbsp;resolução&nbsp;da imagem influencia na identificação de elementos do&nbsp...","keywords":["comparacao_imagem_v2","Ortofoto","ortofoto","seção","serviços"]},{"title":"Nova Seção","url":"/servicos/ctm","where":"Serviços / CTM","snippet":"","keywords":["cards_3","CTM","ctm","seção","serviços"]},{"title":"Amostra de imagem 360°","url":"/servicos/mapeamento-movel-laser","where":"Serviços / Mapeamento Móvel","snippet":"Com as imagens&nbsp;panorâmicas&nbsp;em 360°, é possível visualizar o território com alto nível de detalhe, explorando ruas, edificações ...","keywords":["visualizador_360","Mapeamento Móvel","mapeamento-movel-laser","seção","serviços"]},{"title":"Produtos Provenientes do Perfilamento a Laser","url":"/servicos/perfilamento-a-laser","where":"Serviços / Perfilamento a Laser","snippet":"","keywords":["stats_4","Perfilamento a Laser","perfilamento-a-laser","seção","serviços"]},{"title":"Perguntas Frequentes","url":"/servicos/sigcarta","where":"Serviços / SiGCarta","snippet":"Algumas perguntas frequentes com relação ao SiGCarta, esperamos que encontre todas as respostas que precisa aqui","keywords":["faq","SiGCarta","sigcarta","seção","serviços"]},{"title":"Cadastro Mobiliário","url":"/servicos/ctm","where":"Serviços / CTM","snippet":"O Cadastro Mobiliário foca nos agentes&nbsp;econômicos: empresas, profissionais liberais e prestadores de serviço. Ao georreferenciar o&n...","keywords":["intro_image_text","CTM","ctm","seção","serviços"]},{"title":"True Ortofoto","url":"/servicos/ortofoto","where":"Serviços / Ortofoto","snippet":"Diferente da&nbsp;ortofoto&nbsp;convencional, a&nbsp;True Ortofoto&nbsp;(ou Ortofoto Verdadeira) é o nível mais alto de precisão e realis...","keywords":["transicao_imagem_cards_3","Ortofoto","ortofoto","seção","serviços"]},{"title":"Nova Seção","url":"/servicos/ctm","where":"Serviços / CTM","snippet":"","keywords":["cards_3","CTM","ctm","seção","serviços"]},{"title":"Os benefícios de diversas secretarias com CTM","url":"/servicos/ctm","where":"Serviços / CTM","snippet":"","keywords":["stats_4","CTM","ctm","seção","serviços"]},{"title":"Produtos que Derivam da Ortofoto","url":"/servicos/ortofoto","where":"Serviços / Ortofoto","snippet":"","keywords":["stats_4","Ortofoto","ortofoto","seção","serviços"]},{"title":"Mapa Geográfico - CTM","url":"/servicos/ctm","where":"Serviços / CTM","snippet":"A&nbsp;base territorial&nbsp;do município integrada ao cadastro técnico, em um ambiente visual, interativo e&nbsp;inteligente.&nbsp;Veja ...","keywords":["mapa_modelo","CTM","ctm","seção","serviços"]},{"title":"Seção","url":"/servicos/ortofoto","where":"Serviços / Ortofoto","snippet":"","keywords":["full_image_text","Ortofoto","ortofoto","seção","serviços"]},{"title":"Rack","url":"/servicos/mapeamento-movel-laser","where":"Serviços / Mapeamento Móvel / Nova Seção","snippet":"Acoplado ao teto do veiculo, sustenta todo o sistema de sensores","keywords":["Mapeamento Móvel","mapeamento-movel-laser","Nova Seção","Rack","item"]},{"title":"Novo Item","url":"/servicos/mapeamento-movel-laser","where":"Serviços / Mapeamento Móvel / Arquitetura Tecnológica do Sistema","snippet":"","keywords":["Mapeamento Móvel","mapeamento-movel-laser","Arquitetura Tecnológica do Sistema","Novo Item","item"]},{"title":"Receptor GNSS","url":"/servicos/mapeamento-movel-laser","where":"Serviços / Mapeamento Móvel / Seção","snippet":"Responsável pela referência geográfica do sistema","keywords":["Mapeamento Móvel","mapeamento-movel-laser","Seção","Receptor GNSS","item"]},{"title":"Postes de  energia e fiação elétrica","url":"/servicos/mapeamento-movel-laser","where":"Serviços / Mapeamento Móvel / Produtos Provenientes do Mapeamento Móvel","snippet":"Inventário Urbano","keywords":["Mapeamento Móvel","mapeamento-movel-laser","Produtos Provenientes do Mapeamento Móvel","Postes de  energia e fiação elétrica","<span style=\"font-size:16px\">Inventário Urbano</span>","item"]},{"title":"Postes","url":"/servicos/mapeamento-movel-laser","where":"Serviços / Mapeamento Móvel / Nova Seção","snippet":"Identificação, medição e qualificação","keywords":["Mapeamento Móvel","mapeamento-movel-laser","Nova Seção","Postes","Postes","item"]},{"title":"Controle em tempo Real","url":"/servicos/mapeamento-movel-laser","where":"Serviços / Mapeamento Móvel / Nova Seção","snippet":"Controle absoluto de todas as imagens e logradouros percorridos","keywords":["Mapeamento Móvel","mapeamento-movel-laser","Nova Seção","Controle em tempo Real","item"]},{"title":"Amostra 1","url":"/servicos/mapeamento-movel-laser","where":"Serviços / Mapeamento Móvel / Amostra de imagem 360°","snippet":"","keywords":["Mapeamento Móvel","mapeamento-movel-laser","Amostra de imagem 360°","Amostra 1","item"]},{"title":"Detalhamento","url":"/servicos/ortofoto","where":"Serviços / Ortofoto / GSD, o que é?","snippet":"Quanto menor o valor do GSD (ex: 2 cm vs 10 cm), maior é a resolução da imagem e mais fácil é identificar objetos pequenos, como bueiros,...","keywords":["Ortofoto","ortofoto","GSD, o que é?","Detalhamento","item"]},{"title":"Imagem Aérea","url":"/servicos/ortofoto","where":"Serviços / Ortofoto / Nova Seção","snippet":"É  a captura bruta da imagem, feita por câmeras RGB e IR embarcadas em aeronave tripulada","keywords":["Ortofoto","ortofoto","Nova Seção","Imagem Aérea","item"]},{"title":"Permite a atualização da base de dados municipal, identificando aumentos de área construída, novos imóveis e alterações em logradouros para fins tributários e de planejamento urbano","url":"/servicos/ortofoto","where":"Serviços / Ortofoto / Produtos que Derivam da Ortofoto","snippet":"Cadastro Imobiliário e Multifinalitário","keywords":["Ortofoto","ortofoto","Produtos que Derivam da Ortofoto","Permite a atualização da base de dados municipal, identificando aumentos de área construída, novos imóveis e alterações em logradouros para fins tributários e de planejamento urbano","<span style=\"font-size:16px\">Cadastro Imobiliário e Multifinalitário</span>","item"]},{"title":"Homologação","url":"/servicos/aerofotogrametria","where":"Serviços / Aerofotogrametria / Seção","snippet":"A Homologação oferece aos nossos clientes total segurança jurídica e a garantia de que os dados coletados seguem as normas de segurança e...","keywords":["Aerofotogrametria","aerofotogrametria","Seção","Homologação","item"]},{"title":"<span style=\"font-size:16px\">Perfilamento A Laser</span>","url":"/servicos/aerofotogrametria","where":"Serviços / Aerofotogrametria / Produtos Provenientes da Aerofotogrametria","snippet":"Perfilamento A Laser","keywords":["Aerofotogrametria","aerofotogrametria","Produtos Provenientes da Aerofotogrametria","<span style=\"font-size:16px\">Perfilamento A Laser</span>","item"]},{"title":"Aeronave","url":"/servicos/aerofotogrametria","where":"Serviços / Aerofotogrametria / Nova Seção","snippet":"A aeronave EMB 820C Navajo é um avião bimotor fabricado pela Embraer, tem um alcance de voo de cerca de 1.000 a 1.200 milhas náuticas (5 ...","keywords":["Aerofotogrametria","aerofotogrametria","Nova Seção","Aeronave","item"]},{"title":"Supressão de ruído atmosférico","url":"/servicos/perfilamento-a-laser","where":"Serviços / Perfilamento a Laser / Nova Seção","snippet":"Filtra automaticamente interferências causadas por partículas no ar","keywords":["Perfilamento a Laser","perfilamento-a-laser","Nova Seção","Supressão de ruído atmosférico","item"]},{"title":"Novo Item","url":"/servicos/perfilamento-a-laser","where":"Serviços / Perfilamento a Laser / Como Funciona o Perfilamento?","snippet":"","keywords":["Perfilamento a Laser","perfilamento-a-laser","Como Funciona o Perfilamento?","Novo Item","item"]},{"title":"Distribuição de forma Justa dos impostos.","url":"/servicos/pvg","where":"Serviços / PVG / Veja todos os benefícios","snippet":"Segurança Jurídica","keywords":["PVG","pvg","Veja todos os benefícios","Distribuição de forma Justa dos impostos.","<span style=\"font-size:16px\">Segurança Jurídica</span>","item"]},{"title":"Urbano","url":"/servicos/perfilamento-a-laser","where":"Serviços / Perfilamento a Laser / Nuvem de Pontos","snippet":"","keywords":["Perfilamento a Laser","perfilamento-a-laser","Nuvem de Pontos","Urbano","item"]},{"title":"Aquisição de imagens","url":"/servicos/restituicao","where":"Serviços / Restituição Digital / Nova Seção","snippet":"O processo começa com a aquisição de imagens aéreas da área de interesse. Essas imagens são capturadas por aeronaves equipadas com câmera...","keywords":["Restituição Digital","restituicao","Nova Seção","Aquisição de imagens","O processo começa com a aquisição de imagens aéreas da área de interesse. Essas imagens são capturadas por aeronaves equipadas com câmeras fotográficas especiais, que registram informações visuais da paisagem.","item"]},{"title":"O contorno exato de casas, prédios e galpões","url":"/servicos/restituicao","where":"Serviços / Restituição Digital / Elementos Alvos da Restituição","snippet":"Edificações","keywords":["Restituição Digital","restituicao","Elementos Alvos da Restituição","O contorno exato de casas, prédios e galpões","<span style=\"font-size:16px\">Edificações</span>","item"]},{"title":"Bens de Uso Comum do Povo","url":"/servicos/proprios","where":"Serviços / Cadastro de Imóveis Públicos / Seção","snippet":"São os locais onde a população tem acesso livre, sem necessidade de autorização especial; embora o município deva mantê-los e fiscalizá-l...","keywords":["Cadastro de Imóveis Públicos","proprios","Seção","Bens de Uso Comum do Povo","item"]},{"title":"Regularização Jurídica","url":"/servicos/proprios","where":"Serviços / Cadastro de Imóveis Públicos / Porque Certificar?","snippet":"A certificação garante que o imóvel público possua matrícula e registro atualizados no Cartório de Registro de Imóveis. Isso evita confli...","keywords":["Cadastro de Imóveis Públicos","proprios","Porque Certificar?","Regularização Jurídica","item"]},{"title":"C#","url":"/servicos/sigcarta","where":"Serviços / SiGCarta / Nova Seção","snippet":"Oferece uma interface amigável, alto desempenho e ampla integração com outras tecnologias Microsoft, tornando-o uma escolha eficiente e a...","keywords":["SiGCarta","sigcarta","Nova Seção","C#","item"]},{"title":"Novo Item","url":"/servicos/sigcarta","where":"Serviços / SiGCarta / Arquitetura Tecnológica Aberta","snippet":"","keywords":["SiGCarta","sigcarta","Arquitetura Tecnológica Aberta","Novo Item","item"]},{"title":"Item","url":"/servicos/sigcarta","where":"Serviços / SiGCarta / Módulos","snippet":"","keywords":["SiGCarta","sigcarta","Módulos","item"]},{"title":"Visualize de forma simples informações vetoriais de quadras, lotes e edificações além do vinculo das informações cadastrais.","url":"/servicos/sigcarta","where":"Serviços / SiGCarta / Seção","snippet":"Cadastro Imobiliário","keywords":["SiGCarta","sigcarta","Seção","Visualize de forma simples informações vetoriais de quadras, lotes e edificações além do vinculo das informações cadastrais.","<span style=\"font-size:16px\">Cadastro Imobiliário</span>","item"]},{"title":"Treinamento","url":"/servicos/sigcarta","where":"Serviços / SiGCarta / Nova Seção","snippet":"Capacitação personalizada para que sua equipe domine todas as funcionalidades e otimize o fluxo de trabalho.","keywords":["SiGCarta","sigcarta","Nova Seção","Treinamento","item"]},{"title":"<span style=\"font-size:16px\">O que é um SIG?</span>","url":"/servicos/sigcarta","where":"Serviços / SiGCarta / Perguntas Frequentes","snippet":"Um SiG - Sistema de Informação Geográfica -&nbsp;é uma estrutura computacional que permite coletar, armazenar, analisar e visualizar dado...","keywords":["SiGCarta","sigcarta","Perguntas Frequentes","<span style=\"font-size:16px\">O que é um SIG?</span>","item"]},{"title":"GSD 6 cm","url":"/servicos/ortofoto","where":"Serviços / Ortofoto / Comparação de GSD`s","snippet":"","keywords":["Ortofoto","ortofoto","Comparação de GSD`s","GSD 6 cm","item"]},{"title":"Vetorização de Quadras e Lotes","url":"/servicos/ctm","where":"Serviços / CTM / Nova Seção","snippet":"Desenho de lotes e quadras são fundamentais para o inicio do processo de cadastro","keywords":["CTM","ctm","Nova Seção","Vetorização de Quadras e Lotes","item"]},{"title":"Novo Item","url":"/servicos/ctm","where":"Serviços / CTM / Cadastro Imobiliário","snippet":"","keywords":["CTM","ctm","Cadastro Imobiliário","Novo Item","item"]},{"title":"Vetorização de Eixos","url":"/servicos/ctm","where":"Serviços / CTM / Nova Seção","snippet":"Desenho do eixo de logradouro de cada via.","keywords":["CTM","ctm","Nova Seção","Vetorização de Eixos","item"]},{"title":"Classificação","url":"/servicos/ctm","where":"Serviços / CTM / Nova Seção","snippet":"Identificar imóveis com atividade comercial por meio de imagens do mapeamento móvel.","keywords":["CTM","ctm","Nova Seção","Classificação","item"]},{"title":"Garantia de justiça fiscal e aumento da arrecadação com dados reais.","url":"/servicos/ctm","where":"Serviços / CTM / Os benefícios de diversas secretarias com CTM","snippet":"Tributos","keywords":["CTM","ctm","Os benefícios de diversas secretarias com CTM","Garantia de justiça fiscal e aumento da arrecadação com dados reais.","<span style=\"font-size:16px\">Tributos</span>","item"]},{"title":"Nenhum / Padrão","url":"/servicos/ctm","where":"Serviços / CTM / Mapa Geográfico - CTM","snippet":"none","keywords":["CTM","ctm","Mapa Geográfico - CTM","Nenhum / Padrão","none","basemap","0","item"]},{"title":"Identificação Única","url":"/servicos/apoio-de-campo","where":"Serviços / Apoio de Campo / Monografia de Marcos Geodésicos","snippet":"Nome e código do marco conforme padrões do IBGE ou INCRA","keywords":["Apoio de Campo","apoio-de-campo","Monografia de Marcos Geodésicos","Identificação Única","item"]},{"title":"Função","url":"/servicos/apoio-de-campo","where":"Serviços / Apoio de Campo / Controle de Qualidade","snippet":"Funcionam como \"testemunhas\" independentes. Após a geração do modelo, as coordenadas desses pontos são comparadas com as coordenadas extr...","keywords":["Apoio de Campo","apoio-de-campo","Controle de Qualidade","Função","item"]},{"title":"Precisão Técnica","url":"/servicos/apoio-de-campo","where":"Serviços / Apoio de Campo / Marcos Geodésicos","snippet":"Implantação com coordenadas rigorosas, garantindo estabilidade e confiabilidade nos marcos geodésicos","keywords":["Apoio de Campo","apoio-de-campo","Marcos Geodésicos","Precisão Técnica","item"]},{"title":"Nenhum / Padrão","url":"/servicos/pvg","where":"Serviços / PVG / MAPA PVG - Simulação transforma dados em decisões rápidas.","snippet":"none","keywords":["PVG","pvg","MAPA PVG - Simulação transforma dados em decisões rápidas.","Nenhum / Padrão","none","basemap","0","item"]},{"title":"Visibilidade Total","url":"/servicos/ortofoto","where":"Serviços / Ortofoto / True Ortofoto","snippet":"Sem pontos cegos, em cidades densas, prédios altos costumam \"tombar\" na foto comum, cobrindo calçadas e ruas próximas. Na True Ortofoto, ...","keywords":["Ortofoto","ortofoto","True Ortofoto","Visibilidade Total","item"]},{"title":"Ortofoto","url":"/servicos/perfilamento-a-laser","where":"Serviços / Perfilamento a Laser / Comparação de Produtos","snippet":"","keywords":["Perfilamento a Laser","perfilamento-a-laser","Comparação de Produtos","Ortofoto","item"]},{"title":"Centralização via SiGCarta","url":"/servicos/ctm","where":"Serviços / CTM / Nova Seção","snippet":"Todos os chamados, independentemente da origem, são unificados em nossa plataforma proprietária, o SIGCARTA, eliminando a dispersão de in...","keywords":["CTM","ctm","Nova Seção","Centralização via SiGCarta","item"]},{"title":"Sensor Unit","url":"/servicos/mapeamento-movel-laser","where":"Serviços / Mapeamento Móvel / Nova Seção","snippet":"Unidade de captura de informações (laser, imagem, inercial e gps)","keywords":["Mapeamento Móvel","mapeamento-movel-laser","Nova Seção","Sensor Unit","item"]},{"title":"Camera Ladybug","url":"/servicos/mapeamento-movel-laser","where":"Serviços / Mapeamento Móvel / Seção","snippet":"Composta por 6 câmeras, é responsável por geração de imagens panorâmicas de 72 MP","keywords":["Mapeamento Móvel","mapeamento-movel-laser","Seção","Camera Ladybug","item"]},{"title":"Novo Item","url":"/servicos/mapeamento-movel-laser","where":"Serviços / Mapeamento Móvel / Arquitetura Tecnológica do Sistema","snippet":"","keywords":["Mapeamento Móvel","mapeamento-movel-laser","Arquitetura Tecnológica do Sistema","Novo Item","item"]},{"title":"Identificação arbórea e vegetação","url":"/servicos/mapeamento-movel-laser","where":"Serviços / Mapeamento Móvel / Produtos Provenientes do Mapeamento Móvel","snippet":"Árvores","keywords":["Mapeamento Móvel","mapeamento-movel-laser","Produtos Provenientes do Mapeamento Móvel","Identificação arbórea e vegetação","<span style=\"font-size:16px\">Árvores</span>","item"]},{"title":"Árvores","url":"/servicos/mapeamento-movel-laser","where":"Serviços / Mapeamento Móvel / Nova Seção","snippet":"Detecção e qualificação de tipos arbóreos","keywords":["Mapeamento Móvel","mapeamento-movel-laser","Nova Seção","Árvores","Árvores","item"]},{"title":"Conexão via Wifi","url":"/servicos/mapeamento-movel-laser","where":"Serviços / Mapeamento Móvel / Nova Seção","snippet":"Totalmente sem fio, garante maior mobilidade para operador","keywords":["Mapeamento Móvel","mapeamento-movel-laser","Nova Seção","Conexão via Wifi","item"]},{"title":"Amostra 2","url":"/servicos/mapeamento-movel-laser","where":"Serviços / Mapeamento Móvel / Amostra de imagem 360°","snippet":"","keywords":["Mapeamento Móvel","mapeamento-movel-laser","Amostra de imagem 360°","Amostra 2","item"]},{"title":"Acurácia Posicional","url":"/servicos/ortofoto","where":"Serviços / Ortofoto / GSD, o que é?","snippet":"O GSD está diretamente ligado à precisão cartográfica do projeto. Um GSD menor geralmente permite uma extração de dados mais precisa para...","keywords":["Ortofoto","ortofoto","GSD, o que é?","Acurácia Posicional","item"]},{"title":"Superfície (MDE)","url":"/servicos/ortofoto","where":"Serviços / Ortofoto / Nova Seção","snippet":"É a representação do terreno real, com todos seus formatos","keywords":["Ortofoto","ortofoto","Nova Seção","Superfície (MDE)","item"]},{"title":"Classificação detalhada da cobertura vegetal, áreas impermeabilizadas, corpos d'água e zonas de preservação, auxiliando na gestão ambiental e no plano diretor das cidades","url":"/servicos/ortofoto","where":"Serviços / Ortofoto / Produtos que Derivam da Ortofoto","snippet":"Mapeamento Temático","keywords":["Ortofoto","ortofoto","Produtos que Derivam da Ortofoto","Classificação detalhada da cobertura vegetal, áreas impermeabilizadas, corpos d'água e zonas de preservação, auxiliando na gestão ambiental e no plano diretor das cidades","<span style=\"font-size:16px\">Mapeamento Temático</span>","item"]},{"title":"Rigor Metodológico","url":"/servicos/aerofotogrametria","where":"Serviços / Aerofotogrametria / Seção","snippet":"Nossa certificação não é apenas um selo, mas o reflexo de um processo que segue rigorosamente o Decreto-Lei nº 1.177","keywords":["Aerofotogrametria","aerofotogrametria","Seção","Rigor Metodológico","item"]},{"title":"<span style=\"font-size:16px\">Ortofoto</span>","url":"/servicos/aerofotogrametria","where":"Serviços / Aerofotogrametria / Produtos Provenientes da Aerofotogrametria","snippet":"Ortofoto","keywords":["Aerofotogrametria","aerofotogrametria","Produtos Provenientes da Aerofotogrametria","<span style=\"font-size:16px\">Ortofoto</span>","item"]},{"title":"Câmera RGB","url":"/servicos/aerofotogrametria","where":"Serviços / Aerofotogrametria / Nova Seção","snippet":"Sensor métrico de grande formato com resolução de 100 megapixels, equipado com obturador central que elimina distorções de movimento, pro...","keywords":["Aerofotogrametria","aerofotogrametria","Nova Seção","Câmera RGB","item"]},{"title":"Densidade","url":"/servicos/perfilamento-a-laser","where":"Serviços / Perfilamento a Laser / Nova Seção","snippet":"Alta taxa de medição, de 1,3 milhões de pontos por segundo","keywords":["Perfilamento a Laser","perfilamento-a-laser","Nova Seção","Densidade","item"]},{"title":"São conjuntos de coordenadas 3D que representam os pontos medidos durante o perfilamento a laser. Elas podem ser usadas para várias análises, como detecção de mudanças no terreno","url":"/servicos/perfilamento-a-laser","where":"Serviços / Perfilamento a Laser / Produtos Provenientes do Perfilamento a Laser","snippet":"Nuvens de Pontos","keywords":["Perfilamento a Laser","perfilamento-a-laser","Produtos Provenientes do Perfilamento a Laser","São conjuntos de coordenadas 3D que representam os pontos medidos durante o perfilamento a laser. Elas podem ser usadas para várias análises, como detecção de mudanças no terreno","<span style=\"font-size:16px\">Nuvens de Pontos</span>","item"]},{"title":"Atualização na arrecadação de tributos.","url":"/servicos/pvg","where":"Serviços / PVG / Veja todos os benefícios","snippet":"Arrecadação","keywords":["PVG","pvg","Veja todos os benefícios","Atualização na arrecadação de tributos.","<span style=\"font-size:16px\">Arrecadação</span>","item"]},{"title":"Estereoscopia","url":"/servicos/restituicao","where":"Serviços / Restituição Digital / Nova Seção","snippet":"Para permitir a interpretação tridimensional das imagens, os fotogrametristas utilizam estereoscópios. Isso cria uma ilusão de profundida...","keywords":["Restituição Digital","restituicao","Nova Seção","Estereoscopia","item"]},{"title":"Eixos de ruas, meio-fio, rodovias, ferrovias e caminhos de terra","url":"/servicos/restituicao","where":"Serviços / Restituição Digital / Elementos Alvos da Restituição","snippet":"Sistema Viário","keywords":["Restituição Digital","restituicao","Elementos Alvos da Restituição","Eixos de ruas, meio-fio, rodovias, ferrovias e caminhos de terra","<span style=\"font-size:16px\">Sistema Viário</span>","item"]},{"title":"Bens de Uso Especial","url":"/servicos/proprios","where":"Serviços / Cadastro de Imóveis Públicos / Seção","snippet":"São os imóveis destinados especificamente à execução de serviços administrativos ou à prestação de serviços públicos, por exemplo, a sede...","keywords":["Cadastro de Imóveis Públicos","proprios","Seção","Bens de Uso Especial","item"]},{"title":"Eficiência na Gestão","url":"/servicos/proprios","where":"Serviços / Cadastro de Imóveis Públicos / Porque Certificar?","snippet":"Com os próprios certificados e cadastrados, a prefeitura passa a ter uma visão clara do que possui. Isso permite identificar prédios ocio...","keywords":["Cadastro de Imóveis Públicos","proprios","Porque Certificar?","Eficiência na Gestão","item"]},{"title":"C++","url":"/servicos/sigcarta","where":"Serviços / SiGCarta / Nova Seção","snippet":"Desempenho excepcional, eficiência de recursos e flexibilidade para análises geoespaciais de alto nível.","keywords":["SiGCarta","sigcarta","Nova Seção","C++","item"]},{"title":"Controle total dos próprios municipais, saiba aonde estão e quanto valem para melhor planejamento da gestão pública","url":"/servicos/sigcarta","where":"Serviços / SiGCarta / Seção","snippet":"Gestão de Próprios","keywords":["SiGCarta","sigcarta","Seção","Controle total dos próprios municipais, saiba aonde estão e quanto valem para melhor planejamento da gestão pública","<span style=\"font-size:16px\">Gestão de Próprios</span>","item"]},{"title":"Documentação","url":"/servicos/sigcarta","where":"Serviços / SiGCarta / Nova Seção","snippet":"Manuais detalhados e guias técnicos sempre atualizados para consulta rápida e resolução de dúvidas.","keywords":["SiGCarta","sigcarta","Nova Seção","Documentação","item"]},{"title":"<span style=\"font-size:16px\">O&nbsp;<span style=\"color: rgb(33, 105, 105); font-weight: 700;\">SiGCarta&nbsp;</span>permite a importação de shapefile?</span>","url":"/servicos/sigcarta","where":"Serviços / SiGCarta / Perguntas Frequentes","snippet":"Sim. O&nbsp;SiGCarta&nbsp;possui suporte nativo para a importação e visualização de arquivos no formato&nbsp;Shapefile&nbsp;(.shp), que é...","keywords":["SiGCarta","sigcarta","Perguntas Frequentes","<span style=\"font-size:16px\">O&nbsp;<span style=\"color: rgb(33, 105, 105); font-weight: 700;\">SiGCarta&nbsp;</span>permite a importação de shapefile?</span>","item"]},{"title":"Rural","url":"/servicos/perfilamento-a-laser","where":"Serviços / Perfilamento a Laser / Nuvem de Pontos","snippet":"","keywords":["Perfilamento a Laser","perfilamento-a-laser","Nuvem de Pontos","Rural","item"]},{"title":"Codificação de Quadras e Lotes","url":"/servicos/ctm","where":"Serviços / CTM / Nova Seção","snippet":"Consiste na etapa de atribuir o código da quadra e lotes, que irá se conectar ao banco de dados do município.","keywords":["CTM","ctm","Nova Seção","Codificação de Quadras e Lotes","item"]},{"title":"Codificação Logradouros","url":"/servicos/ctm","where":"Serviços / CTM / Nova Seção","snippet":"Inserção do código de logradouro, que posteriormente irá se conectar com o banco de dados do município.","keywords":["CTM","ctm","Nova Seção","Codificação Logradouros","item"]},{"title":"Comparação","url":"/servicos/ctm","where":"Serviços / CTM / Nova Seção","snippet":"Realizar cruzamento de informações entre o que foi constatado e o que está registrado no banco de dados do município.","keywords":["CTM","ctm","Nova Seção","Comparação","item"]},{"title":"Mapeamento epidemiológico e localização estratégica de unidades de atendimento","url":"/servicos/ctm","where":"Serviços / CTM / Os benefícios de diversas secretarias com CTM","snippet":"Saúde","keywords":["CTM","ctm","Os benefícios de diversas secretarias com CTM","Mapeamento epidemiológico e localização estratégica de unidades de atendimento","<span style=\"font-size:16px\">Saúde</span>","item"]},{"title":"OpenStreetMap","url":"/servicos/ctm","where":"Serviços / CTM / Mapa Geográfico - CTM","snippet":"osm","keywords":["CTM","ctm","Mapa Geográfico - CTM","OpenStreetMap","osm","basemap","0","item"]},{"title":"Coordenadas","url":"/servicos/apoio-de-campo","where":"Serviços / Apoio de Campo / Monografia de Marcos Geodésicos","snippet":"Determinação precisa de Latitude, Longitude, Altitude Elipsoidal h e Altitude Ortométrica, além das coordenadas N e E no sistema UTM (SIR...","keywords":["Apoio de Campo","apoio-de-campo","Monografia de Marcos Geodésicos","Coordenadas","item"]},{"title":"Aplicação","url":"/servicos/apoio-de-campo","where":"Serviços / Apoio de Campo / Controle de Qualidade","snippet":"Essa comparação permite calcular o Erro Médio Quadrático (RMS) e gerar o Relatório de Qualidade Posicional. É através do apoio suplementa...","keywords":["Apoio de Campo","apoio-de-campo","Controle de Qualidade","Aplicação","item"]},{"title":"Controle de Qualidade","url":"/servicos/apoio-de-campo","where":"Serviços / Apoio de Campo / Marcos Geodésicos","snippet":"Verificações em campo e ajustes garantem aderência às normas e consistência dos pontos de apoio","keywords":["Apoio de Campo","apoio-de-campo","Marcos Geodésicos","Controle de Qualidade","item"]},{"title":"OpenStreetMap","url":"/servicos/pvg","where":"Serviços / PVG / MAPA PVG - Simulação transforma dados em decisões rápidas.","snippet":"osm","keywords":["PVG","pvg","MAPA PVG - Simulação transforma dados em decisões rápidas.","OpenStreetMap","osm","basemap","0","item"]},{"title":"Geometria Perfeita","url":"/servicos/ortofoto","where":"Serviços / Ortofoto / True Ortofoto","snippet":"Como os prédios aparecem estritamente de cima, a projeção do telhado coincide exatamente com a projeção da base no solo. Isso é fundament...","keywords":["Ortofoto","ortofoto","True Ortofoto","Geometria Perfeita","item"]},{"title":"MDS","url":"/servicos/perfilamento-a-laser","where":"Serviços / Perfilamento a Laser / Comparação de Produtos","snippet":"","keywords":["Perfilamento a Laser","perfilamento-a-laser","Comparação de Produtos","MDS","item"]},{"title":"MultiCanais","url":"/servicos/ctm","where":"Serviços / CTM / Nova Seção","snippet":"Oferecemos suporte completo através de múltiplos canais, incluindo portal web, e-mail, WhatsApp e telefone, garantindo que o contribuinte...","keywords":["CTM","ctm","Nova Seção","MultiCanais","item"]},{"title":"Power Unit","url":"/servicos/mapeamento-movel-laser","where":"Serviços / Mapeamento Móvel / Nova Seção","snippet":"Localizada dentro do veículo no assoalho, é a fonte de energia de todos os equipamentos","keywords":["Mapeamento Móvel","mapeamento-movel-laser","Nova Seção","Power Unit","item"]},{"title":"Laser 1","url":"/servicos/mapeamento-movel-laser","where":"Serviços / Mapeamento Móvel / Seção","snippet":"Trabalha em conjunto ao laser 2, garantindo maior quantidade de pontos","keywords":["Mapeamento Móvel","mapeamento-movel-laser","Seção","Laser 1","item"]},{"title":"Vertical e Horizontal de Trânsito","url":"/servicos/mapeamento-movel-laser","where":"Serviços / Mapeamento Móvel / Produtos Provenientes do Mapeamento Móvel","snippet":"Sinalizações","keywords":["Mapeamento Móvel","mapeamento-movel-laser","Produtos Provenientes do Mapeamento Móvel","Vertical e Horizontal de Trânsito","<span style=\"font-size:16px\">Sinalizações</span>","item"]},{"title":"Novo Item","url":"/servicos/mapeamento-movel-laser","where":"Serviços / Mapeamento Móvel / Arquitetura Tecnológica do Sistema","snippet":"","keywords":["Mapeamento Móvel","mapeamento-movel-laser","Arquitetura Tecnológica do Sistema","Novo Item","item"]},{"title":"Sinalizações","url":"/servicos/mapeamento-movel-laser","where":"Serviços / Mapeamento Móvel / Nova Seção","snippet":"Detecção de placas de transito e semáforos","keywords":["Mapeamento Móvel","mapeamento-movel-laser","Nova Seção","Sinalizações","Sinalizações","item"]},{"title":"Qualidade de Sinal","url":"/servicos/mapeamento-movel-laser","where":"Serviços / Mapeamento Móvel / Nova Seção","snippet":"Visualização dos dados de calibração e de posicionamento, o que permite qualidade na coleta de dados posicionais.","keywords":["Mapeamento Móvel","mapeamento-movel-laser","Nova Seção","Qualidade de Sinal","item"]},{"title":"amostra 3","url":"/servicos/mapeamento-movel-laser","where":"Serviços / Mapeamento Móvel / Amostra de imagem 360°","snippet":"","keywords":["Mapeamento Móvel","mapeamento-movel-laser","Amostra de imagem 360°","amostra 3","item"]},{"title":"Volume de Dados","url":"/servicos/ortofoto","where":"Serviços / Ortofoto / GSD, o que é?","snippet":"Resoluções muito altas (GSDs baixos) geram arquivos muito maiores, exigindo maior capacidade de processamento e armazenamento. Relação en...","keywords":["Ortofoto","ortofoto","GSD, o que é?","Volume de Dados","item"]},{"title":"Ortoretificação","url":"/servicos/ortofoto","where":"Serviços / Ortofoto / Nova Seção","snippet":"O processo que faz a correção das distorções provenientes da projeção cônica da aquisição das imagens brutas","keywords":["Ortofoto","ortofoto","Nova Seção","Ortoretificação","item"]},{"title":"Extração precisa de elementos de infraestrutura como redes elétricas, bueiros, hidrantes, sinalização viária e postes, criando um inventário digital georreferenciado (GIS)","url":"/servicos/ortofoto","where":"Serviços / Ortofoto / Produtos que Derivam da Ortofoto","snippet":"Vetorização de Ativos","keywords":["Ortofoto","ortofoto","Produtos que Derivam da Ortofoto","Extração precisa de elementos de infraestrutura como redes elétricas, bueiros, hidrantes, sinalização viária e postes, criando um inventário digital georreferenciado (GIS)","<span style=\"font-size:16px\">Vetorização de Ativos</span>","item"]},{"title":"Capacitação Técnica","url":"/servicos/aerofotogrametria","where":"Serviços / Aerofotogrametria / Seção","snippet":"Para manter o registro junto ao MD, a Aerocarta investe continuamente na atualização de suas aeronaves, sensores e, principalmente, na qu...","keywords":["Aerofotogrametria","aerofotogrametria","Seção","Capacitação Técnica","item"]},{"title":"<span style=\"font-size:16px\">MDT</span>","url":"/servicos/aerofotogrametria","where":"Serviços / Aerofotogrametria / Produtos Provenientes da Aerofotogrametria","snippet":"MDT","keywords":["Aerofotogrametria","aerofotogrametria","Produtos Provenientes da Aerofotogrametria","<span style=\"font-size:16px\">MDT</span>","item"]},{"title":"Câmera IR","url":"/servicos/aerofotogrametria","where":"Serviços / Aerofotogrametria / Nova Seção","snippet":"Sensor especializado em capturas no espectro infravermelho, essencial para análises ambientais, vigor vegetativo (índices como NDVI) e ma...","keywords":["Aerofotogrametria","aerofotogrametria","Nova Seção","Câmera IR","item"]},{"title":"Fornece ao gestor estimativa orçamentaria com maior precisão.","url":"/servicos/pvg","where":"Serviços / PVG / Veja todos os benefícios","snippet":"Previsão Orçamentaria","keywords":["PVG","pvg","Veja todos os benefícios","Fornece ao gestor estimativa orçamentaria com maior precisão.","<span style=\"font-size:16px\">Previsão Orçamentaria</span>","item"]},{"title":"Interpretação Visual","url":"/servicos/restituicao","where":"Serviços / Restituição Digital / Nova Seção","snippet":"Com o auxílio dos estereoscópios(óculos próprios), o restituidor realiza a interpretação visual das imagens aéreas. Eles identificam elem...","keywords":["Restituição Digital","restituicao","Nova Seção","Interpretação Visual","item"]},{"title":"Postes, bueiros, pontos de ônibus e sinalização vertical","url":"/servicos/restituicao","where":"Serviços / Restituição Digital / Elementos Alvos da Restituição","snippet":"Mobiliário Urbano","keywords":["Restituição Digital","restituicao","Elementos Alvos da Restituição","Postes, bueiros, pontos de ônibus e sinalização vertical","<span style=\"font-size:16px\">Mobiliário Urbano</span>","item"]},{"title":"Bens Dominicais","url":"/servicos/proprios","where":"Serviços / Cadastro de Imóveis Públicos / Seção","snippet":"São bens que, embora pertençam ao município, não possuem uma destinação pública específica no momento. Eles constituem o patrimônio dispo...","keywords":["Cadastro de Imóveis Públicos","proprios","Seção","Bens Dominicais","item"]},{"title":"Planejamento Urbano","url":"/servicos/proprios","where":"Serviços / Cadastro de Imóveis Públicos / Porque Certificar?","snippet":"A certificação fornece dados espaciais precisos para o Plano Diretor. Saber a localização exata e a dimensão das áreas públicas é essenci...","keywords":["Cadastro de Imóveis Públicos","proprios","Porque Certificar?","Planejamento Urbano","item"]},{"title":"TerraLib","url":"/servicos/sigcarta","where":"Serviços / SiGCarta / Nova Seção","snippet":"Possui uma série de recursos avançados que a tornam uma escolha popular entre desenvolvedores e profissionais que buscam soluções geoespa...","keywords":["SiGCarta","sigcarta","Nova Seção","TerraLib","item"]},{"title":"Saiba de forma simples e visual as regiões mais ou menos valorizadas do município","url":"/servicos/sigcarta","where":"Serviços / SiGCarta / Seção","snippet":"Planta Genérica de Valores","keywords":["SiGCarta","sigcarta","Seção","Saiba de forma simples e visual as regiões mais ou menos valorizadas do município","<span style=\"font-size:16px\">Planta Genérica de Valores</span>","item"]},{"title":"Vídeo Tutorial","url":"/servicos/sigcarta","where":"Serviços / SiGCarta / Nova Seção","snippet":"Pílulas de conhecimento em vídeo com o passo a passo visual das principais ferramentas do sistema.","keywords":["SiGCarta","sigcarta","Nova Seção","Vídeo Tutorial","item"]},{"title":"<span style=\"font-size:16px\">Por que o&nbsp;<span style=\"color:var(--aerocarta-green); font-weight:700\">SiGCarta&nbsp;</span>Opensource é um diferencial?</span>","url":"/servicos/sigcarta","where":"Serviços / SiGCarta / Perguntas Frequentes","snippet":"O modelo de código aberto (opensource) garante total transparência e autonomia para o cliente. Diferente de softwares proprietários, o&nb...","keywords":["SiGCarta","sigcarta","Perguntas Frequentes","<span style=\"font-size:16px\">Por que o&nbsp;<span style=\"color:var(--aerocarta-green); font-weight:700\">SiGCarta&nbsp;</span>Opensource é um diferencial?</span>","item"]},{"title":"Rural","url":"/servicos/perfilamento-a-laser","where":"Serviços / Perfilamento a Laser / Nuvem de Pontos","snippet":"","keywords":["Perfilamento a Laser","perfilamento-a-laser","Nuvem de Pontos","Rural","item"]},{"title":"Vetorização de Edificações","url":"/servicos/ctm","where":"Serviços / CTM / Nova Seção","snippet":"Mapeamento preciso da área construída e tipologia.","keywords":["CTM","ctm","Nova Seção","Vetorização de Edificações","item"]},{"title":"Preenchimento de Informações","url":"/servicos/ctm","where":"Serviços / CTM / Nova Seção","snippet":"Inserção de atributos pertinentes, como tipo de pavimentação (asfalto, terra ou outros)","keywords":["CTM","ctm","Nova Seção","Preenchimento de Informações","item"]},{"title":"Alteração de Status","url":"/servicos/ctm","where":"Serviços / CTM / Nova Seção","snippet":"Após identificar as divergência é realizada a mudança de status no banco com atualização das alíquotas correta para calculo de tributos.","keywords":["CTM","ctm","Nova Seção","Alteração de Status","item"]},{"title":"Planejamento de vagas e rotas escolares baseado na demanda territorial.","url":"/servicos/ctm","where":"Serviços / CTM / Os benefícios de diversas secretarias com CTM","snippet":"Educação","keywords":["CTM","ctm","Os benefícios de diversas secretarias com CTM","Planejamento de vagas e rotas escolares baseado na demanda territorial.","<span style=\"font-size:16px\">Educação</span>","item"]},{"title":"Ortofoto","url":"/servicos/ctm","where":"Serviços / CTM / Mapa Geográfico - CTM","snippet":"wms","keywords":["CTM","ctm","Mapa Geográfico - CTM","Ortofoto","wms","basemap","0","item"]},{"title":"Equipamentos","url":"/servicos/apoio-de-campo","where":"Serviços / Apoio de Campo / Controle de Qualidade","snippet":"Uso de Estações Totais e receptores GNSS para o mapeamento de áreas de sombra (onde o sinal de satélite ou laser é obstruído) e para o de...","keywords":["Apoio de Campo","apoio-de-campo","Controle de Qualidade","Equipamentos","item"]},{"title":"Registro Completo","url":"/servicos/apoio-de-campo","where":"Serviços / Apoio de Campo / Marcos Geodésicos","snippet":"Monografias claras e bem documentadas facilitam uso, rastreio e manutenção da rede geodésica","keywords":["Apoio de Campo","apoio-de-campo","Marcos Geodésicos","Registro Completo","item"]},{"title":"Ortofoto","url":"/servicos/pvg","where":"Serviços / PVG / MAPA PVG - Simulação transforma dados em decisões rápidas.","snippet":"wms","keywords":["PVG","pvg","MAPA PVG - Simulação transforma dados em decisões rápidas.","Ortofoto","wms","basemap","0","item"]},{"title":"Integração com Modelos 3D","url":"/servicos/ortofoto","where":"Serviços / Ortofoto / True Ortofoto","snippet":"A True Ortofoto é gerada a partir de modelos tridimensionais altamente detalhados. Isso permite uma fusão perfeita entre a imagem e o rel...","keywords":["Ortofoto","ortofoto","True Ortofoto","Integração com Modelos 3D","item"]},{"title":"MDT","url":"/servicos/perfilamento-a-laser","where":"Serviços / Perfilamento a Laser / Comparação de Produtos","snippet":"","keywords":["Perfilamento a Laser","perfilamento-a-laser","Comparação de Produtos","MDT","item"]},{"title":"Gestão de Protocolos","url":"/servicos/ctm","where":"Serviços / CTM / Nova Seção","snippet":"O sistema gera um histórico digital completo de cada interação, permitindo que tanto a prefeitura quanto o munícipe acompanhem o status d...","keywords":["CTM","ctm","Nova Seção","Gestão de Protocolos","item"]},{"title":"Control Unit","url":"/servicos/mapeamento-movel-laser","where":"Serviços / Mapeamento Móvel / Nova Seção","snippet":"Localizada dentro do veículo no banco de trás do motorista, responsável por armazenar todos os dados coletados","keywords":["Mapeamento Móvel","mapeamento-movel-laser","Nova Seção","Control Unit","item"]},{"title":"Laser 2","url":"/servicos/mapeamento-movel-laser","where":"Serviços / Mapeamento Móvel / Seção","snippet":"Trabalha em conjunto ao laser 1, garantindo maior quantidade de pontos","keywords":["Mapeamento Móvel","mapeamento-movel-laser","Seção","Laser 2","item"]},{"title":"Identificação de imóveis que auxiliam no recadastramento","url":"/servicos/mapeamento-movel-laser","where":"Serviços / Mapeamento Móvel / Produtos Provenientes do Mapeamento Móvel","snippet":"Imobiliário","keywords":["Mapeamento Móvel","mapeamento-movel-laser","Produtos Provenientes do Mapeamento Móvel","Identificação de imóveis que auxiliam no recadastramento","<span style=\"font-size:16px\">Imobiliário</span>","item"]},{"title":"Novo Item","url":"/servicos/mapeamento-movel-laser","where":"Serviços / Mapeamento Móvel / Arquitetura Tecnológica do Sistema","snippet":"","keywords":["Mapeamento Móvel","mapeamento-movel-laser","Arquitetura Tecnológica do Sistema","Novo Item","item"]},{"title":"Pavimentação","url":"/servicos/mapeamento-movel-laser","where":"Serviços / Mapeamento Móvel / Nova Seção","snippet":"Identificação de buracos, sinalizações e estado asfáltico","keywords":["Mapeamento Móvel","mapeamento-movel-laser","Nova Seção","Pavimentação","Pavimentação","item"]},{"title":"Base métrica para o traçado de novas rodovias, ferrovias e dutos, permitindo estudos de viabilidade e medições diretas de distâncias e áreas sem a necessidade imediata de ir a campo","url":"/servicos/ortofoto","where":"Serviços / Ortofoto / Produtos que Derivam da Ortofoto","snippet":"Projetos de Engenharia e Logística","keywords":["Ortofoto","ortofoto","Produtos que Derivam da Ortofoto","Base métrica para o traçado de novas rodovias, ferrovias e dutos, permitindo estudos de viabilidade e medições diretas de distâncias e áreas sem a necessidade imediata de ir a campo","<span style=\"font-size:16px\">Projetos de Engenharia e Logística</span>","item"]},{"title":"<span style=\"font-size:16px\">MDS</span>","url":"/servicos/aerofotogrametria","where":"Serviços / Aerofotogrametria / Produtos Provenientes da Aerofotogrametria","snippet":"MDS","keywords":["Aerofotogrametria","aerofotogrametria","Produtos Provenientes da Aerofotogrametria","<span style=\"font-size:16px\">MDS</span>","item"]},{"title":"Laser","url":"/servicos/aerofotogrametria","where":"Serviços / Aerofotogrametria / Nova Seção","snippet":"Scanner a laser aerotransportado de alta performance, capaz de gerar nuvens de pontos densas e precisas mesmo em áreas com vegetação dens...","keywords":["Aerofotogrametria","aerofotogrametria","Nova Seção","Laser","item"]},{"title":"Posicionamento","url":"/servicos/perfilamento-a-laser","where":"Serviços / Perfilamento a Laser / Nova Seção","snippet":"Capacidade de integrar e alinhar dados de diversos sistemas de posicionamento global","keywords":["Perfilamento a Laser","perfilamento-a-laser","Nova Seção","Posicionamento","item"]},{"title":"As curvas de nível são extraídas com precisão centimétrica a partir do processamento de nuvens de pontos LiDAR. Através da geração de Modelos Digitais de Terreno (MDT) de alta resolução, entregamos a representação vetorial do relevo com suavização técnica","url":"/servicos/perfilamento-a-laser","where":"Serviços / Perfilamento a Laser / Produtos Provenientes do Perfilamento a Laser","snippet":"Curvas de Nível","keywords":["Perfilamento a Laser","perfilamento-a-laser","Produtos Provenientes do Perfilamento a Laser","As curvas de nível são extraídas com precisão centimétrica a partir do processamento de nuvens de pontos LiDAR. Através da geração de Modelos Digitais de Terreno (MDT) de alta resolução, entregamos a representação vetorial do relevo com suavização técnica","<span style=\"font-size:16px\">Curvas de Nível</span>","item"]},{"title":"Promove a transparência nas finanças municipais.","url":"/servicos/pvg","where":"Serviços / PVG / Veja todos os benefícios","snippet":"Transparência","keywords":["PVG","pvg","Veja todos os benefícios","Promove a transparência nas finanças municipais.","<span style=\"font-size:16px\">Transparência</span>","item"]},{"title":"Medição e Vetorização","url":"/servicos/restituicao","where":"Serviços / Restituição Digital / Nova Seção","snippet":"Após a identificação dos elementos, os restituidores geram as coordenadas desses elementos nas imagens que ao final tornassem vetores. Is...","keywords":["Restituição Digital","restituicao","Nova Seção","Medição e Vetorização","item"]},{"title":"Muros, cercas, alambrados e divisas de propriedades","url":"/servicos/restituicao","where":"Serviços / Restituição Digital / Elementos Alvos da Restituição","snippet":"Cercamentos","keywords":["Restituição Digital","restituicao","Elementos Alvos da Restituição","Muros, cercas, alambrados e divisas de propriedades","<span style=\"font-size:16px\">Cercamentos</span>","item"]},{"title":"Transparência Pública","url":"/servicos/proprios","where":"Serviços / Cadastro de Imóveis Públicos / Porque Certificar?","snippet":"Manter o cadastro de bens móveis e imóveis atualizado é uma exigência de órgãos de controle, como o Tribunal de Contas. A certificação al...","keywords":["Cadastro de Imóveis Públicos","proprios","Porque Certificar?","Transparência Pública","item"]},{"title":"Postgres","url":"/servicos/sigcarta","where":"Serviços / SiGCarta / Nova Seção","snippet":"Significa que é gratuito para uso e distribuição. Isso reduz os custos associados à implementação de sistemas geoespaciais.","keywords":["SiGCarta","sigcarta","Nova Seção","Postgres","item"]},{"title":"Monitore área de risco, tenha de forma fácil simulações e informações ambientais cruciais para tomada de decisões.","url":"/servicos/sigcarta","where":"Serviços / SiGCarta / Seção","snippet":"Gestão Ambiental","keywords":["SiGCarta","sigcarta","Seção","Monitore área de risco, tenha de forma fácil simulações e informações ambientais cruciais para tomada de decisões.","<span style=\"font-size:16px\">Gestão Ambiental</span>","item"]},{"title":"HelpDesk","url":"/servicos/sigcarta","where":"Serviços / SiGCarta / Nova Seção","snippet":"Canal direto de atendimento para suporte técnico ágil e solução de incidentes operacionais.","keywords":["SiGCarta","sigcarta","Nova Seção","HelpDesk","item"]},{"title":"<span style=\"font-size:16px\">O&nbsp;<span style=\"color:var(--aerocarta-green); font-weight:700\">SiGCarta&nbsp;</span>pode ser acessado via navegador (Web)</span>","url":"/servicos/sigcarta","where":"Serviços / SiGCarta / Perguntas Frequentes","snippet":"Sim. O&nbsp;SiGCarta&nbsp;foi desenvolvido com tecnologia Web GIS, o que significa que pode ser acessado de qualquer dispositivo com inte...","keywords":["SiGCarta","sigcarta","Perguntas Frequentes","<span style=\"font-size:16px\">O&nbsp;<span style=\"color:var(--aerocarta-green); font-weight:700\">SiGCarta&nbsp;</span>pode ser acessado via navegador (Web)</span>","item"]},{"title":"GSD 25 cm","url":"/servicos/ortofoto","where":"Serviços / Ortofoto / Comparação de GSD`s","snippet":"","keywords":["Ortofoto","ortofoto","Comparação de GSD`s","GSD 25 cm","item"]},{"title":"Comparação de Áreas","url":"/servicos/ctm","where":"Serviços / CTM / Nova Seção","snippet":"Processo onde verifica os valores de áreas construídas e de terreno, e os compara com o banco de dados do município extraindo as diferenç...","keywords":["CTM","ctm","Nova Seção","Comparação de Áreas","item"]},{"title":"Reambulação","url":"/servicos/ctm","where":"Serviços / CTM / Nova Seção","snippet":"É a verificação de dados por meio de visita a campo e ou analise de imagens do mapeamento móvel","keywords":["CTM","ctm","Nova Seção","Reambulação","item"]},{"title":"Atualização de banco","url":"/servicos/ctm","where":"Serviços / CTM / Nova Seção","snippet":"Atualização do banco de dados do município","keywords":["CTM","ctm","Nova Seção","Atualização de banco","item"]},{"title":"Monitoramento preciso de áreas verdes e controle do uso do solo.","url":"/servicos/ctm","where":"Serviços / CTM / Os benefícios de diversas secretarias com CTM","snippet":"Meio Ambiente","keywords":["CTM","ctm","Os benefícios de diversas secretarias com CTM","Monitoramento preciso de áreas verdes e controle do uso do solo.","<span style=\"font-size:16px\">Meio Ambiente</span>","item"]},{"title":"Descrição de Acesso","url":"/servicos/apoio-de-campo","where":"Serviços / Apoio de Campo / Monografia de Marcos Geodésicos","snippet":"Texto detalhado com o roteiro para chegar ao local, partindo de pontos de referência conhecidos","keywords":["Apoio de Campo","apoio-de-campo","Monografia de Marcos Geodésicos","Descrição de Acesso","item"]},{"title":"Respostas Automáticas","url":"/servicos/ctm","where":"Serviços / CTM / Nova Seção","snippet":"Implementamos automações que, a partir da resolução técnica de uma reclamação, disparam notificações imediatas ao contribuinte, agilizand...","keywords":["CTM","ctm","Nova Seção","Respostas Automáticas","item"]},{"title":"GAMS","url":"/servicos/mapeamento-movel-laser","where":"Serviços / Mapeamento Móvel / Nova Seção","snippet":"Antena fixa por ventosa no teto do veículo, responsável por ser a redundância  posicional do sistema","keywords":["Mapeamento Móvel","mapeamento-movel-laser","Nova Seção","GAMS","item"]},{"title":"Câmera de Pavimento","url":"/servicos/mapeamento-movel-laser","where":"Serviços / Mapeamento Móvel / Seção","snippet":"Câmera exclusiva para monitoramento de pavimento, responsável por detectar alterações","keywords":["Mapeamento Móvel","mapeamento-movel-laser","Seção","Câmera de Pavimento","item"]},{"title":"Identificação da qualidade asfáltica, além de calçadas e guias","url":"/servicos/mapeamento-movel-laser","where":"Serviços / Mapeamento Móvel / Produtos Provenientes do Mapeamento Móvel","snippet":"Viário","keywords":["Mapeamento Móvel","mapeamento-movel-laser","Produtos Provenientes do Mapeamento Móvel","Identificação da qualidade asfáltica, além de calçadas e guias","<span style=\"font-size:16px\">Viário</span>","item"]},{"title":"Monitoramento do crescimento de bairros e fiscalização de loteamentos irregulares, comparando ortofotos de diferentes períodos para detectar mudanças temporais","url":"/servicos/ortofoto","where":"Serviços / Ortofoto / Produtos que Derivam da Ortofoto","snippet":"Análise de Expansão Urbana","keywords":["Ortofoto","ortofoto","Produtos que Derivam da Ortofoto","Monitoramento do crescimento de bairros e fiscalização de loteamentos irregulares, comparando ortofotos de diferentes períodos para detectar mudanças temporais","<span style=\"font-size:16px\">Análise de Expansão Urbana</span>","item"]},{"title":"<span style=\"font-size:16px\">Curvas de Nível</span>","url":"/servicos/aerofotogrametria","where":"Serviços / Aerofotogrametria / Produtos Provenientes da Aerofotogrametria","snippet":"Curvas de Nível","keywords":["Aerofotogrametria","aerofotogrametria","Produtos Provenientes da Aerofotogrametria","<span style=\"font-size:16px\">Curvas de Nível</span>","item"]},{"title":"Alvos","url":"/servicos/perfilamento-a-laser","where":"Serviços / Perfilamento a Laser / Nova Seção","snippet":"Consegue registrar vários retornos de um único pulso, permitindo \"enxergar\" o solo mesmo através de vegetação densa","keywords":["Perfilamento a Laser","perfilamento-a-laser","Nova Seção","Alvos","item"]},{"title":"Permite que o município financie projetos e serviços públicos essenciais.","url":"/servicos/pvg","where":"Serviços / PVG / Veja todos os benefícios","snippet":"Serviços Públicos","keywords":["PVG","pvg","Veja todos os benefícios","Permite que o município financie projetos e serviços públicos essenciais.","<span style=\"font-size:16px\">Serviços Públicos</span>","item"]},{"title":"Linhas que unem pontos de mesma altitude, essenciais para entender a declividade do terreno","url":"/servicos/restituicao","where":"Serviços / Restituição Digital / Elementos Alvos da Restituição","snippet":"Curvas de Nível","keywords":["Restituição Digital","restituicao","Elementos Alvos da Restituição","Linhas que unem pontos de mesma altitude, essenciais para entender a declividade do terreno","<span style=\"font-size:16px\">Curvas de Nível</span>","item"]},{"title":"Com esse modulo, é possível visualizar áreas com maior incidências de delitos e auxiliar o poder publico  a agir de forma cirúrgica","url":"/servicos/sigcarta","where":"Serviços / SiGCarta / Seção","snippet":"Segurança","keywords":["SiGCarta","sigcarta","Seção","Com esse modulo, é possível visualizar áreas com maior incidências de delitos e auxiliar o poder publico  a agir de forma cirúrgica","<span style=\"font-size:16px\">Segurança</span>","item"]},{"title":"Acesso Remoto","url":"/servicos/sigcarta","where":"Serviços / SiGCarta / Nova Seção","snippet":"Suporte em tempo real com conexão segura para diagnósticos precisos e intervenções diretas na máquina.","keywords":["SiGCarta","sigcarta","Nova Seção","Acesso Remoto","item"]},{"title":"<span style=\"font-size:16px\">É possível integrar o&nbsp;<span style=\"color:var(--aerocarta-green); font-weight:700\">SiGCarta&nbsp;</span>com bancos de dados externos (como PostGIS)</span>","url":"/servicos/sigcarta","where":"Serviços / SiGCarta / Perguntas Frequentes","snippet":"Sim. A plataforma foi projetada para ser interoperável, conectando-se facilmente com bancos de dados espaciais como o&nbsp;PostGIS/Postgr...","keywords":["SiGCarta","sigcarta","Perguntas Frequentes","<span style=\"font-size:16px\">É possível integrar o&nbsp;<span style=\"color:var(--aerocarta-green); font-weight:700\">SiGCarta&nbsp;</span>com bancos de dados externos (como PostGIS)</span>","item"]},{"title":"Um MDS é semelhante a um MDT, mas inclui informações não apenas sobre o terreno, mas também sobre elementos acima dele, como edifícios, árvores, vegetações e estruturas","url":"/servicos/perfilamento-a-laser","where":"Serviços / Perfilamento a Laser / Produtos Provenientes do Perfilamento a Laser","snippet":"Modelo Digital de Superfície (MDS)","keywords":["Perfilamento a Laser","perfilamento-a-laser","Produtos Provenientes do Perfilamento a Laser","Um MDS é semelhante a um MDT, mas inclui informações não apenas sobre o terreno, mas também sobre elementos acima dele, como edifícios, árvores, vegetações e estruturas","<span style=\"font-size:16px\">Modelo Digital de Superfície (MDS)</span>","item"]},{"title":"GSD 1 M","url":"/servicos/ortofoto","where":"Serviços / Ortofoto / Comparação de GSD`s","snippet":"","keywords":["Ortofoto","ortofoto","Comparação de GSD`s","GSD 1 M","item"]},{"title":"Notificação","url":"/servicos/ctm","where":"Serviços / CTM / Nova Seção","snippet":"Após encontrar as discrepâncias entre vetor e banco, o proprietário do imóvel é notificado, essa é  a etapa onde a contestação pode ser r...","keywords":["CTM","ctm","Nova Seção","Notificação","item"]},{"title":"Atualização de Banco","url":"/servicos/ctm","where":"Serviços / CTM / Nova Seção","snippet":"Atualização do banco de dados do município, o que irá fornecer um inventário viário completo","keywords":["CTM","ctm","Nova Seção","Atualização de Banco","item"]},{"title":"Inteligência geográfica para mapeamento de crimes e otimização de rondas.","url":"/servicos/ctm","where":"Serviços / CTM / Os benefícios de diversas secretarias com CTM","snippet":"Segurança","keywords":["CTM","ctm","Os benefícios de diversas secretarias com CTM","Inteligência geográfica para mapeamento de crimes e otimização de rondas.","<span style=\"font-size:16px\">Segurança</span>","item"]},{"title":"SMMT","url":"/servicos/ctm","where":"Serviços / CTM / Mapa Geográfico - CTM","snippet":"wms","keywords":["CTM","ctm","Mapa Geográfico - CTM","SMMT","wms","vector","0","item"]},{"title":"Registro Fotográfico","url":"/servicos/apoio-de-campo","where":"Serviços / Apoio de Campo / Monografia de Marcos Geodésicos","snippet":"Fotos do marco (proximidade) e fotos de \"testemunha\" (visão ampla) para facilitar a identificação visual no campo","keywords":["Apoio de Campo","apoio-de-campo","Monografia de Marcos Geodésicos","Registro Fotográfico","item"]},{"title":"Relatórios de Desempenho","url":"/servicos/ctm","where":"Serviços / CTM / Nova Seção","snippet":"A plataforma gera dashboards detalhados sobre o volume de atendimentos, tempos de resposta e principais motivos de contestação","keywords":["CTM","ctm","Nova Seção","Relatórios de Desempenho","item"]},{"title":"DMI","url":"/servicos/mapeamento-movel-laser","where":"Serviços / Mapeamento Móvel / Nova Seção","snippet":"Acoplado a roda traseira do veículo, responsável por garantir a posição do veículo em situações de perda de sinal","keywords":["Mapeamento Móvel","mapeamento-movel-laser","Nova Seção","DMI","item"]},{"title":"Imagens 360º esféricas","url":"/servicos/mapeamento-movel-laser","where":"Serviços / Mapeamento Móvel / Produtos Provenientes do Mapeamento Móvel","snippet":"Imagens Panorâmicas","keywords":["Mapeamento Móvel","mapeamento-movel-laser","Produtos Provenientes do Mapeamento Móvel","Imagens 360º esféricas","<span style=\"font-size:16px\">Imagens Panorâmicas</span>","item"]},{"title":"Quando integrada a dados altimétricos, a ortofoto serve de base para o mapeamento de bacias hidrográficas e simulação de áreas de risco de inundação em zonas urbanas","url":"/servicos/ortofoto","where":"Serviços / Ortofoto / Produtos que Derivam da Ortofoto","snippet":"Modelagem de Escoamento","keywords":["Ortofoto","ortofoto","Produtos que Derivam da Ortofoto","Quando integrada a dados altimétricos, a ortofoto serve de base para o mapeamento de bacias hidrográficas e simulação de áreas de risco de inundação em zonas urbanas","<span style=\"font-size:16px\">Modelagem de Escoamento</span>","item"]},{"title":"<span style=\"font-size:16px\">Mapeamento Digital</span>","url":"/servicos/aerofotogrametria","where":"Serviços / Aerofotogrametria / Produtos Provenientes da Aerofotogrametria","snippet":"Mapeamento Digital","keywords":["Aerofotogrametria","aerofotogrametria","Produtos Provenientes da Aerofotogrametria","<span style=\"font-size:16px\">Mapeamento Digital</span>","item"]},{"title":"Escaneamento","url":"/servicos/perfilamento-a-laser","where":"Serviços / Perfilamento a Laser / Nova Seção","snippet":"Garante que as linhas de varredura no solo sejam perfeitamente paralelas","keywords":["Perfilamento a Laser","perfilamento-a-laser","Nova Seção","Escaneamento","item"]},{"title":"Contribuir para a valorização das propriedades.","url":"/servicos/pvg","where":"Serviços / PVG / Veja todos os benefícios","snippet":"Valorização de Imóveis","keywords":["PVG","pvg","Veja todos os benefícios","Contribuir para a valorização das propriedades.","<span style=\"font-size:16px\">Valorização de Imóveis</span>","item"]},{"title":"Valores de altitude em locais específicos e isolados","url":"/servicos/restituicao","where":"Serviços / Restituição Digital / Elementos Alvos da Restituição","snippet":"Pontos Cotados","keywords":["Restituição Digital","restituicao","Elementos Alvos da Restituição","Valores de altitude em locais específicos e isolados","<span style=\"font-size:16px\">Pontos Cotados</span>","item"]},{"title":"Monitore a incidência de casos de dengue no município, garante a gestão publica da saúde  com maior eficácia na realização de campanhas e êxito nas politicas publicas","url":"/servicos/sigcarta","where":"Serviços / SiGCarta / Seção","snippet":"Dengue e Saúde","keywords":["SiGCarta","sigcarta","Seção","Monitore a incidência de casos de dengue no município, garante a gestão publica da saúde  com maior eficácia na realização de campanhas e êxito nas politicas publicas","<span style=\"font-size:16px\">Dengue e Saúde</span>","item"]},{"title":"Diagnóstico","url":"/servicos/sigcarta","where":"Serviços / SiGCarta / Nova Seção","snippet":"Análise técnica para garantir que o software e o hardware estejam operando com máxima eficiência e estabilidade.","keywords":["SiGCarta","sigcarta","Nova Seção","Diagnóstico","item"]},{"title":"<span style=\"font-size:16px\">Como o&nbsp;<span style=\"color:var(--aerocarta-green); font-weight:700\">SiGCarta&nbsp;</span>auxilia na gestão tributária e no IPTU?</span>","url":"/servicos/sigcarta","where":"Serviços / SiGCarta / Perguntas Frequentes","snippet":"Através do cruzamento de dados do cadastro imobiliário com ortofotos atualizadas, o&nbsp;SiGCarta&nbsp;permite identificar distorções de ...","keywords":["SiGCarta","sigcarta","Perguntas Frequentes","<span style=\"font-size:16px\">Como o&nbsp;<span style=\"color:var(--aerocarta-green); font-weight:700\">SiGCarta&nbsp;</span>auxilia na gestão tributária e no IPTU?</span>","item"]},{"title":"Um MDT é um modelo 3D que representa a topografia da superfície terrestre, incluindo elevações naturais do terreno","url":"/servicos/perfilamento-a-laser","where":"Serviços / Perfilamento a Laser / Produtos Provenientes do Perfilamento a Laser","snippet":"Modelo Digital de Terreno (MDT)","keywords":["Perfilamento a Laser","perfilamento-a-laser","Produtos Provenientes do Perfilamento a Laser","Um MDT é um modelo 3D que representa a topografia da superfície terrestre, incluindo elevações naturais do terreno","<span style=\"font-size:16px\">Modelo Digital de Terreno (MDT)</span>","item"]},{"title":"Atualização do Banco","url":"/servicos/ctm","where":"Serviços / CTM / Nova Seção","snippet":"Ao termino do processo de notificação e contestação, o banco imobiliário do município é atualizado com os novos valores apurados.","keywords":["CTM","ctm","Nova Seção","Atualização do Banco","item"]},{"title":"Projetos de infraestrutura com precisão técnica e economia de recursos.","url":"/servicos/ctm","where":"Serviços / CTM / Os benefícios de diversas secretarias com CTM","snippet":"Obras","keywords":["CTM","ctm","Os benefícios de diversas secretarias com CTM","Projetos de infraestrutura com precisão técnica e economia de recursos.","<span style=\"font-size:16px\">Obras</span>","item"]},{"title":"Edificações","url":"/servicos/ctm","where":"Serviços / CTM / Mapa Geográfico - CTM","snippet":"wms","keywords":["CTM","ctm","Mapa Geográfico - CTM","Edificações","wms","vector","0","item"]},{"title":"Croqui de Localização","url":"/servicos/apoio-de-campo","where":"Serviços / Apoio de Campo / Monografia de Marcos Geodésicos","snippet":"Desenho esquemático mostrando a posição do marco em relação a elementos fixos do terreno (estadas, cercas, edificações)","keywords":["Apoio de Campo","apoio-de-campo","Monografia de Marcos Geodésicos","Croqui de Localização","item"]},{"title":"Edificação","url":"/servicos/pvg","where":"Serviços / PVG / MAPA PVG - Simulação transforma dados em decisões rápidas.","snippet":"wms","keywords":["PVG","pvg","MAPA PVG - Simulação transforma dados em decisões rápidas.","Edificação","wms","vector","0","item"]},{"title":"Escalabilidade e Segurança","url":"/servicos/ctm","where":"Serviços / CTM / Nova Seção","snippet":"Nosso atendimento remoto permite absorver grandes picos de demanda, comuns após envios massivos de notificações","keywords":["CTM","ctm","Nova Seção","Escalabilidade e Segurança","item"]},{"title":"Repetição","url":"/servicos/perfilamento-a-laser","where":"Serviços / Perfilamento a Laser / Nova Seção","snippet":"Frequência ultra-elevada que proporciona uma resolução espacial superior","keywords":["Perfilamento a Laser","perfilamento-a-laser","Nova Seção","Repetição","item"]},{"title":"Com informações precisas,  são identificados tributos em débitos e assim, tomar medidas para recuperar esses valores, reduzindo a inadimplência fiscal","url":"/servicos/pvg","where":"Serviços / PVG / Veja todos os benefícios","snippet":"Reduz a Inadimplência","keywords":["PVG","pvg","Veja todos os benefícios","Com informações precisas,  são identificados tributos em débitos e assim, tomar medidas para recuperar esses valores, reduzindo a inadimplência fiscal","<span style=\"font-size:16px\">Reduz a Inadimplência</span>","item"]},{"title":"Margens de rios, lagos, represas, córregos e nascentes","url":"/servicos/restituicao","where":"Serviços / Restituição Digital / Elementos Alvos da Restituição","snippet":"Corpos d'água","keywords":["Restituição Digital","restituicao","Elementos Alvos da Restituição","Margens de rios, lagos, represas, córregos e nascentes","<span style=\"font-size:16px\">Corpos d'água</span>","item"]},{"title":"<span style=\"font-size:16px\">O sistema oferece controle de níveis de acesso para usuários?</span>","url":"/servicos/sigcarta","where":"Serviços / SiGCarta / Perguntas Frequentes","snippet":"Sim. O&nbsp;SiGCarta&nbsp;possui um robusto sistema de gerenciamento de permissões. É possível definir quem pode apenas visualizar os map...","keywords":["SiGCarta","sigcarta","Perguntas Frequentes","<span style=\"font-size:16px\">O sistema oferece controle de níveis de acesso para usuários?</span>","item"]},{"title":"Lotes","url":"/servicos/ctm","where":"Serviços / CTM / Mapa Geográfico - CTM","snippet":"wms","keywords":["CTM","ctm","Mapa Geográfico - CTM","Lotes","wms","vector","0","item"]},{"title":"Zona Homogênea","url":"/servicos/pvg","where":"Serviços / PVG / MAPA PVG - Simulação transforma dados em decisões rápidas.","snippet":"wms","keywords":["PVG","pvg","MAPA PVG - Simulação transforma dados em decisões rápidas.","Zona Homogênea","wms","vector","0","item"]},{"title":"Facilita a gestão municipal ao fornecer dados precisos para análises estratégicas e tomada de decisões informadas em áreas como políticas fiscais e desenvolvimento urbano.","url":"/servicos/pvg","where":"Serviços / PVG / Veja todos os benefícios","snippet":"Eficiência de Gestão","keywords":["PVG","pvg","Veja todos os benefícios","Facilita a gestão municipal ao fornecer dados precisos para análises estratégicas e tomada de decisões informadas em áreas como políticas fiscais e desenvolvimento urbano.","<span style=\"font-size:16px\">Eficiência de Gestão</span>","item"]},{"title":"Delimitação de matas nativas, árvores isoladas, áreas de reflorestamento e agricultura","url":"/servicos/restituicao","where":"Serviços / Restituição Digital / Elementos Alvos da Restituição","snippet":"Vegetação","keywords":["Restituição Digital","restituicao","Elementos Alvos da Restituição","Delimitação de matas nativas, árvores isoladas, áreas de reflorestamento e agricultura","<span style=\"font-size:16px\">Vegetação</span>","item"]},{"title":"<span style=\"font-size:16px\">O&nbsp;<span style=\"color:var(--aerocarta-green); font-weight:700\">SiGCarta&nbsp;</span>possui rotinas automáticas de backup para evitar a perda de dados?</span>","url":"/servicos/sigcarta","where":"Serviços / SiGCarta / Perguntas Frequentes","snippet":"Sim. Entendemos que os dados geoespaciais são ativos valiosos. O SiGCarta conta com rotinas automatizadas de backup incremental e complet...","keywords":["SiGCarta","sigcarta","Perguntas Frequentes","<span style=\"font-size:16px\">O&nbsp;<span style=\"color:var(--aerocarta-green); font-weight:700\">SiGCarta&nbsp;</span>possui rotinas automáticas de backup para evitar a perda de dados?</span>","item"]},{"title":"Gestão ágil da manutenção de vias, iluminação e espaços públicos.","url":"/servicos/ctm","where":"Serviços / CTM / Os benefícios de diversas secretarias com CTM","snippet":"Zeladoria Urbana","keywords":["CTM","ctm","Os benefícios de diversas secretarias com CTM","Gestão ágil da manutenção de vias, iluminação e espaços públicos.","<span style=\"font-size:16px\">Zeladoria Urbana</span>","item"]},{"title":"Quadras","url":"/servicos/ctm","where":"Serviços / CTM / Mapa Geográfico - CTM","snippet":"wms","keywords":["CTM","ctm","Mapa Geográfico - CTM","Quadras","wms","vector","1","item"]},{"title":"Pesquisas","url":"/servicos/pvg","where":"Serviços / PVG / MAPA PVG - Simulação transforma dados em decisões rápidas.","snippet":"wms","keywords":["PVG","pvg","MAPA PVG - Simulação transforma dados em decisões rápidas.","Pesquisas","wms","vector","0","item"]},{"title":"Identificação rápida de irregularidades e controle urbano eficiente.","url":"/servicos/ctm","where":"Serviços / CTM / Os benefícios de diversas secretarias com CTM","snippet":"Fiscalização","keywords":["CTM","ctm","Os benefícios de diversas secretarias com CTM","Identificação rápida de irregularidades e controle urbano eficiente.","<span style=\"font-size:16px\">Fiscalização</span>","item"]},{"title":"Faces","url":"/servicos/ctm","where":"Serviços / CTM / Mapa Geográfico - CTM","snippet":"wms","keywords":["CTM","ctm","Mapa Geográfico - CTM","Faces","wms","vector","0","item"]},{"title":"Lote","url":"/servicos/pvg","where":"Serviços / PVG / MAPA PVG - Simulação transforma dados em decisões rápidas.","snippet":"wms","keywords":["PVG","pvg","MAPA PVG - Simulação transforma dados em decisões rápidas.","Lote","wms","vector","0","item"]},{"title":"Segurança jurídica e controle total do inventário imobiliário municipal.","url":"/servicos/ctm","where":"Serviços / CTM / Os benefícios de diversas secretarias com CTM","snippet":"Patrimônio","keywords":["CTM","ctm","Os benefícios de diversas secretarias com CTM","Segurança jurídica e controle total do inventário imobiliário municipal.","<span style=\"font-size:16px\">Patrimônio</span>","item"]},{"title":"Mapeamento de áreas de risco e planos de resposta a emergências.","url":"/servicos/ctm","where":"Serviços / CTM / Os benefícios de diversas secretarias com CTM","snippet":"Defesa Civil","keywords":["CTM","ctm","Os benefícios de diversas secretarias com CTM","Mapeamento de áreas de risco e planos de resposta a emergências.","<span style=\"font-size:16px\">Defesa Civil</span>","item"]},{"title":"Otimização da malha viária e melhoria da mobilidade urbana","url":"/servicos/ctm","where":"Serviços / CTM / Os benefícios de diversas secretarias com CTM","snippet":"Transporte","keywords":["CTM","ctm","Os benefícios de diversas secretarias com CTM","Otimização da malha viária e melhoria da mobilidade urbana","<span style=\"font-size:16px\">Transporte</span>","item"]},{"title":"Identificação e foco no atendimento às famílias em vulnerabilidade.","url":"/servicos/ctm","where":"Serviços / CTM / Os benefícios de diversas secretarias com CTM","snippet":"Assistência Social","keywords":["CTM","ctm","Os benefícios de diversas secretarias com CTM","Identificação e foco no atendimento às famílias em vulnerabilidade.","<span style=\"font-size:16px\">Assistência Social</span>","item"]},{"title":"Sem informação geográfica não há cidade inteligente","url":"/blog","where":"Blog / Cidades Inteligentes","snippet":"Mapas e cadastros urbanos atualizados com frequência são a verdadeira infraestrutura digital das cidades do século XXIO conceito de cidad...","keywords":["Cidades Inteligentes","#smartcities #prefeituras #cadastrotecnicomultifinalitario #gestaoterritorial","Emerson Granemann - MundoGEO","notícia","post","blog"]},{"title":"Aerocarta marca presença na Smart City Expo Curitiba 2026","url":"/blog","where":"Blog / Evento","snippet":"A busca por soluções urbanas inteligentes e sustentáveis é uma prioridade global, e a AEROCARTA reafirma seu compromisso com a inovação a...","keywords":["Evento","tecnologia","Aerocarta","notícia","post","blog"]},{"title":"Programa BiomasBR atualiza dados do sistema Prodes","url":"/blog","where":"Blog / tecnologia","snippet":"Foram incorporados os dados consolidados do Prodes 2025 para a Amazônia e para o Pantanal, além dos dados de 2024 para os biomas Caatinga...","keywords":["tecnologia","#sistema #inpe #software #mundogeo","MundoGEO","notícia","post","blog"]},{"title":"Bem vindo ao nosso novo site","url":"/blog","where":"Blog / Aerocarta","snippet":"Rumo aos 40 anos: A AEROCARTA está de cara nova!É com grande entusiasmo que anunciamos o lançamento do novo site da AEROCARTA! Estamos vi...","keywords":["Aerocarta","#site #tecnologia #aerocarta #caranova #quevenha40anos","Aerocarta","notícia","post","blog"]}];
    if (!Array.isArray(searchIndex) || !searchIndex.length) return;

    const normalize = (value) => String(value || '')
      .toLowerCase()
      .normalize('NFD')
      .replace(/[\u0300-\u036f]/g, '')
      .trim();

    const buildItemText = (item) => normalize([
      item.title,
      item.where,
      cleanSearchText(item.snippet),
      ...(Array.isArray(item.keywords) ? item.keywords : [])
    ].join(' '));

    const db = searchIndex.map((item) => ({ ...item, _text: buildItemText(item) }));
    function cleanSearchText(value) {
      // Snippets may include HTML entities (e.g. &nbsp;) coming from rich text sources.
      return String(value || '')
        .replace(/&nbsp;/gi, ' ')
        .replace(/\u00a0/g, ' ')
        .replace(/<[^>]*>/g, ' ')
        .replace(/\s+/g, ' ')
        .trim();
    }
    const escapeHtml = (value) => String(value || '')
      .replace(/&/g, '&amp;')
      .replace(/</g, '&lt;')
      .replace(/>/g, '&gt;')
      .replace(/"/g, '&quot;')
      .replace(/'/g, '&#39;');
    const escapeRegExp = (value) => String(value || '').replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
    const highlightText = (text, query) => {
      const safeText = escapeHtml(cleanSearchText(text));
      const safeQuery = escapeHtml(String(query || '').trim());
      if (!safeQuery) return safeText;
      const re = new RegExp(`(${escapeRegExp(safeQuery)})`, 'ig');
      return safeText.replace(re, '<mark class="site-search-mark">$1</mark>');
    };

    function rank(item, term) {
      const title = normalize(item.title);
      const where = normalize(item.where);
      let score = 0;
      if (title.startsWith(term)) score += 120;
      else if (title.includes(term)) score += 80;
      if (where.includes(term)) score += 35;
      if (item._text.includes(term)) score += 20;
      return score;
    }

    function render(items, query) {
      if (!items.length) {
        dropdown.innerHTML = '<div class="site-search-item"><div class="site-search-title">Nenhum resultado</div><div class="site-search-meta">Tente outro termo.</div></div>';
        dropdown.hidden = false;
        return;
      }
      dropdown.innerHTML = items.map((item) => `
        <a class="site-search-item" href="${encodeURI(item.url)}">
          <div class="site-search-title">${highlightText(item.title, query)}</div>
          <div class="site-search-meta">Em: ${highlightText(item.where, query)}${item.snippet ? ' - ' + highlightText(item.snippet, query) : ''}</div>
        </a>
      `).join('');
      dropdown.hidden = false;
    }

    function searchNow() {
      const term = normalize(input.value);
      if (!term) {
        dropdown.hidden = true;
        dropdown.innerHTML = '';
        return [];
      }
      const items = db
        .map((item) => ({ item, score: rank(item, term) }))
        .filter((entry) => entry.score > 0)
        .sort((a, b) => b.score - a.score || a.item.title.localeCompare(b.item.title))
        .slice(0, 8)
        .map((entry) => entry.item);
      render(items, input.value || "");
      return items;
    }

    input.addEventListener('input', searchNow);
    input.addEventListener('focus', searchNow);
    input.addEventListener('keydown', (event) => {
      if (event.key !== 'Enter') return;
      const items = searchNow();
      if (!items.length) return;
      event.preventDefault();
      window.location.href = items[0].url;
    });

    document.addEventListener('click', (event) => {
      if (event.target === input || dropdown.contains(event.target)) return;
      dropdown.hidden = true;
    });
  })();
</script>
  <header class="header-2">
    <style>
        .header-carousel {
            position: relative;
            overflow: hidden;
            background: transparent;
        }
        .header-carousel .header-slides,
        .header-carousel .header-slide,
        .header-carousel .header-overlay {
            position: absolute;
            inset: 0;
        }
        .header-carousel .header-slide {
            background-size: cover;
            background-position: center;
            opacity: 0;
            transition: opacity 1400ms ease-in-out;
            will-change: opacity;
            filter: brightness(1.18) contrast(1.08) saturate(1.1);
            z-index: 0;
        }
        .header-carousel .header-slide.is-active {
            opacity: 1;
        }
        .header-carousel .header-slide::after {
            content: "";
            position: absolute;
            inset: 0;
            background: radial-gradient(circle at center, rgba(0, 0, 0, 0) 55%, rgba(0, 0, 0, 0.12) 100%);
            pointer-events: none;
        }
        .header-carousel .header-overlay {
            background: linear-gradient(180deg, rgba(15, 23, 42, 0.55) 0%, rgba(15, 23, 42, 0.15) 55%, rgba(15, 23, 42, 0.55) 100%);
            z-index: 1;
        }
        .header-carousel .header-content {
            position: relative;
            z-index: 2;
        }
        .header-carousel .carousel-progress {
            position: absolute;
            top: 1rem;
            right: 1rem;
            width: 44px;
            height: 44px;
            z-index: 3;
            pointer-events: auto;
            cursor: pointer;
            display: flex;
            align-items: center;
            justify-content: center;
        }
        .header-carousel .carousel-progress .a-base,
        .header-carousel .carousel-progress .a-fill {
            position: absolute;
            left: 50%;
            top: 50%;
            transform: translate(-50%, -50%);
            font-size: 22px;
            line-height: 1;
            user-select: none;
        }
        .header-carousel .carousel-progress .a-base {
            color: rgba(255, 255, 255, 0.28);
        }
        .header-carousel .carousel-progress .a-fill {
            color: rgba(255, 255, 255, 0.98);
            clip-path: inset(calc(100% - var(--fill, 0%)) 0 0 0);
        }
        .header-carousel .header-wave {
            position: absolute;
            inset: auto 0 0 0;
            z-index: 2;
        }
        .hero-line3-tight {
            display: inline-block;
            margin-top: 2px;
            text-transform: uppercase;
        }
        @media (prefers-reduced-motion: reduce) {
            .header-carousel .header-slide {
                transition: none;
            }
        }
    </style>
    <div class="page-header min-vh-75 relative header-carousel">
        <div class="header-slides" aria-hidden="true">
                            <span
                  class="header-slide is-active"
                                      style="background-image: url('/assets/images/ortofoto-fundo-1.jpg');"
                    data-loaded="true"
                                  ></span>
                            <span
                  class="header-slide "
                                      data-bg="/assets/images/ortofoto-fundo-2.webp"
                    data-loaded="false"
                                  ></span>
                            <span
                  class="header-slide "
                                      data-bg="/assets/images/ortofoto-fundo-3.webp"
                    data-loaded="false"
                                  ></span>
                            <span
                  class="header-slide "
                                      data-bg="/assets/images/ortofoto-fundo-4.jpg"
                    data-loaded="false"
                                  ></span>
                            <span
                  class="header-slide "
                                      data-bg="/assets/images/ortofoto-fundo-5.jpg"
                    data-loaded="false"
                                  ></span>
                            <span
                  class="header-slide "
                                      data-bg="/assets/images/ortofoto-fundo-6.webp"
                    data-loaded="false"
                                  ></span>
                    </div>
        <div class="header-overlay" aria-hidden="true"></div>
        <div class="carousel-progress hero-carousel-progress" aria-hidden="true">
            <span class="a-base"><i class="fas fa-plane"></i></span>
            <span class="a-fill"><i class="fas fa-plane"></i></span>
        </div>
        <div class="container header-content">
            <div class="row">
                <div class="col-lg-7 text-center mx-auto">
                    <h1 class="text-white pt-3 mt-n5">Desde 1987</h1>
                    <p class="lead text-white mt-3">
                                                                                          <b class="hero-line3-tight">Fotografando e Traçando Soluções</b>
                                          </p>
                </div>
            </div>
        </div>
        <div class="position-absolute w-100 z-index-1 bottom-0 header-wave">
            <svg class="waves" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 24 150 40" preserveAspectRatio="none" shape-rendering="auto">
                <defs>
                    <path id="gentle-wave" d="M-160 44c30 0 58-18 88-18s 58 18 88 18 58-18 88-18 58 18 88 18 v44h-352z" />
                </defs>
                <g class="moving-waves">
                    <use xlink:href="#gentle-wave" x="48" y="-1" fill="rgba(255,255,255,0.40" />
                    <use xlink:href="#gentle-wave" x="48" y="3" fill="rgba(255,255,255,0.35)" />
                    <use xlink:href="#gentle-wave" x="48" y="5" fill="rgba(255,255,255,0.25)" />
                    <use xlink:href="#gentle-wave" x="48" y="8" fill="rgba(255,255,255,0.20)" />
                    <use xlink:href="#gentle-wave" x="48" y="13" fill="rgba(255,255,255,0.15)" />
                    <use xlink:href="#gentle-wave" x="48" y="16" fill="rgba(255,255,255,0.95" />
                </g>
            </svg>
        </div>
    </div>
	    <script>
	      (function () {
	        const slides = Array.from(document.querySelectorAll('.header-carousel .header-slide'));
	        const intervalMs = 8000;
	        const progress = document.querySelector('.hero-carousel-progress');
	        let startAt = performance.now();
          const idle = window.requestIdleCallback || function (cb) { return setTimeout(cb, 250); };

          function ensureSlideLoaded(index) {
            const slide = slides[index];
            if (!slide) return;
            if (slide.dataset.loaded === 'true') return;
            const bg = slide.dataset.bg || '';
            if (!bg) return;
            slide.style.backgroundImage = "url('" + bg.replace(/'/g, "\\'") + "')";
            slide.dataset.loaded = 'true';
          }

          function preloadUpcomingSlides() {
            if (slides.length <= 1) return;
            idle(function () { ensureSlideLoaded(1); });
            if (slides.length > 2) {
              idle(function () { ensureSlideLoaded(2); });
            }
          }

	        function tick(now) {
	          if (!progress) return;
	          const elapsed = (now - startAt) % intervalMs;
          const fill = (elapsed / intervalMs) * 100;
          progress.style.setProperty('--fill', fill + '%');
          requestAnimationFrame(tick);
	        }
	        requestAnimationFrame(tick);
          preloadUpcomingSlides();

	        if (!slides.length || slides.length === 1) return;

	        let current = 0;
	        function goNext() {
	          slides[current].classList.remove('is-active');
	          current = (current + 1) % slides.length;
              ensureSlideLoaded(current);
	          slides[current].classList.add('is-active');
              const next = (current + 1) % slides.length;
              idle(function () { ensureSlideLoaded(next); });
	          startAt = performance.now();
	        }

        if (progress) {
          progress.addEventListener('click', goNext);
        }

        setInterval(goNext, intervalMs);
      })();
    </script>
</header>
  <section class="pt-3 pb-4" id="count-stats">
  <div class="container">
    <div class="row">
      <div class="col-lg-9 z-index-2 border-radius-xl mt-n10 mx-auto py-3 blur shadow-blur">
        <div class="row home-info-grid" style="--info-cols: 5;">
                      <div class="home-info-item with-separator">
              <div class="p-3 text-center">
                                  <div class="home-info-icon" aria-hidden="true" style="--icon-url: url('/uploads/general-settings/info-icons/info_icon_5e1cd2eaed3a149a.png');"></div>
                                <h1 class="text-gradient text-primary home-info-value">27</h1>
                <h5 class="mt-3">Estados</h5>
                <div class="text-sm home-info-text"><p>Projetos executados em todos os estados da federa&ccedil;&atilde;o e distrito federal</p></div>
              </div>
            </div>
                      <div class="home-info-item with-separator">
              <div class="p-3 text-center">
                                  <div class="home-info-icon" aria-hidden="true" style="--icon-url: url('/uploads/general-settings/info-icons/info_icon_fa1b40dd4773604f.png');"></div>
                                <h1 class="text-gradient text-primary home-info-value">+500</h1>
                <h5 class="mt-3">Projetos Executados</h5>
                <div class="text-sm home-info-text"><p>Nas esferas federal, estadual, municipal, privada</p></div>
              </div>
            </div>
                      <div class="home-info-item with-separator">
              <div class="p-3 text-center">
                                  <div class="home-info-icon" aria-hidden="true" style="--icon-url: url('/uploads/general-settings/info-icons/info_icon_b76752a494251110.png');"></div>
                                <h1 class="text-gradient text-primary home-info-value">+500k</h1>
                <h5 class="mt-3">Quilômetros Quadrados</h5>
                <div class="text-sm home-info-text"><p>Mapeamento realizado por aeronave tripulada</p></div>
              </div>
            </div>
                      <div class="home-info-item with-separator">
              <div class="p-3 text-center">
                                  <div class="home-info-icon" aria-hidden="true" style="--icon-url: url('/uploads/general-settings/info-icons/info_icon_dee54f2c06373c89.svg');"></div>
                                <h1 class="text-gradient text-primary home-info-value">+10Mi</h1>
                <h5 class="mt-3">Unidades Imobiliárias</h5>
                <div class="text-sm home-info-text"><p>Atualiza&ccedil;&atilde;o de &aacute;reas constru&iacute;das e padr&atilde;o imobili&aacute;rio</p></div>
              </div>
            </div>
                      <div class="home-info-item ">
              <div class="p-3 text-center">
                                  <div class="home-info-icon" aria-hidden="true" style="--icon-url: url('/uploads/general-settings/info-icons/info_icon_f63d2a133799095f.png');"></div>
                                <h1 class="text-gradient text-primary home-info-value">+27k</h1>
                <h5 class="mt-3">Quilômetros Percorridos</h5>
                <div class="text-sm home-info-text"><p>Vias percorridas com o Sistema de Mapeamento M&oacute;vel</p></div>
              </div>
            </div>
                  </div>
      </div>
    </div>
  </div>
</section>
<style>
  #count-stats .home-info-grid {
    display: grid;
    grid-template-columns: repeat(var(--info-cols), minmax(0, 1fr));
  }
  #count-stats .home-info-item {
    position: relative;
  }
  #count-stats .home-info-item .p-3 {
    position: relative;
    z-index: 2;
  }
  #count-stats .home-info-item.with-separator::after {
    content: "";
    position: absolute;
    top: 18%;
    right: 0;
    width: 1px;
    height: 64%;
    background: rgba(17, 24, 39, 0.18);
    z-index: 1;
    pointer-events: none;
  }
  #count-stats .home-info-icon {
    width: 56px;
    height: 56px;
    margin: 0 auto 0.45rem;
    background-color: var(--bs-primary, #216969);
    opacity: 0.75;
    -webkit-mask-image: var(--icon-url);
    mask-image: var(--icon-url);
    -webkit-mask-repeat: no-repeat;
    mask-repeat: no-repeat;
    -webkit-mask-position: center;
    mask-position: center;
    -webkit-mask-size: contain;
    mask-size: contain;
  }
  #count-stats .home-info-value {
    margin: 0;
    line-height: 1.04;
    white-space: nowrap;
    overflow: visible;
    display: block;
    max-width: 100%;
    font-size: clamp(2rem, 4.2vw, 3.2rem);
    letter-spacing: -0.01em;
  }
  #count-stats .home-info-text {
    white-space: normal;
  }
  @media (max-width: 991.98px) {
    #count-stats .home-info-grid {
      grid-template-columns: repeat(2, minmax(0, 1fr));
    }
    #count-stats .home-info-item.with-separator::after {
      display: none;
    }
  }
  @media (max-width: 575.98px) {
    #count-stats .home-info-grid {
      grid-template-columns: 1fr;
    }
  }
</style>
<script>
  (function () {
    function fitInfoStatValues() {
      const nodes = document.querySelectorAll('#count-stats .home-info-value');
      nodes.forEach((el) => {
        const card = el.closest('.p-3');
        const item = el.closest('.home-info-item');
        if (!card || !item) return;
        el.style.fontSize = '';
        const minPx = 24;
        let size = parseFloat(window.getComputedStyle(el).fontSize || '32');
        const maxWidth = Math.max(56, Math.min(card.clientWidth - 36, item.clientWidth - 44));
        while (el.getBoundingClientRect().width > maxWidth && size > minPx) {
          size -= 0.5;
          el.style.fontSize = size + 'px';
        }
      });
    }

    let resizeTimer = null;
    window.addEventListener('resize', () => {
      if (resizeTimer) clearTimeout(resizeTimer);
      resizeTimer = setTimeout(fitInfoStatValues, 120);
    });
    window.addEventListener('load', fitInfoStatValues);
    document.addEventListener('DOMContentLoaded', fitInfoStatValues);
  })();
</script>
  <section class="my-5 py-5">
  <div class="container" id="featured-services-root" data-featured-rotation-sec="13" data-items-rotation-sec="30">
    <div class="row">
      <div class="col-lg-7 text-center mx-auto">
        <h1 class="font-weight-bolder pt-3 mt-n5 mb-4">Serviços</h1>
      </div>
    </div>

                <div class="row align-items-center fs-slide is-active" data-items-page-index="0">
        <div class="col-lg-6 ms-auto">
                      <div class="row g-4 fs-items-page is-active" data-item-titles="[&quot;Aerolevantamento&quot;,&quot;Aeronave&quot;,&quot;Equipamentos&quot;,&quot;Equipe&quot;]">
                              <div class="col-md-6">
                  <div class="info fs-service-item">
                    <div class="fs-service-head">
                      <div class="icon icon-sm fs-service-icon-wrap">
                        <img class="fs-service-icon" src="/uploads/featured-services/featured_610ad9f4d274f65d.png" alt="Aerolevantamento" width="25" height="25">
                      </div>
                      <h5 class="font-weight-bolder mb-0">Aerolevantamento</h5>
                    </div>
                    <div class="pe-3 fs-service-desc"><?xml encoding="utf-8" ?><div style="text-align:justify"><span>&Eacute; o conjunto de opera&ccedil;&otilde;es realizadas a partir de plataformas a&eacute;reas  com o objetivo de coletar dados e imagens da superf&iacute;cie terrestre</span></div></div>
                  </div>
                </div>
                              <div class="col-md-6">
                  <div class="info fs-service-item">
                    <div class="fs-service-head">
                      <div class="icon icon-sm fs-service-icon-wrap">
                        <img class="fs-service-icon" src="/uploads/featured-services/featured_c0f86c197d604506.svg" alt="Aeronave" width="25" height="25">
                      </div>
                      <h5 class="font-weight-bolder mb-0">Aeronave</h5>
                    </div>
                    <div class="pe-3 fs-service-desc"><?xml encoding="utf-8" ?><p style="text-align:justify">A Aerocarta utiliza Aeronave do modelo <span style="color:var(--aerocarta-green)"><b>Navajo EMBRAER/EMB-820C</b> </span>com autonomia de <span style="color:var(--aerocarta-green)">6:00</span> de voo</p></div>
                  </div>
                </div>
                              <div class="col-md-6">
                  <div class="info fs-service-item">
                    <div class="fs-service-head">
                      <div class="icon icon-sm fs-service-icon-wrap">
                        <img class="fs-service-icon" src="/uploads/featured-services/featured_e32874f63159ce7c.png" alt="Equipamentos" width="25" height="25">
                      </div>
                      <h5 class="font-weight-bolder mb-0">Equipamentos</h5>
                    </div>
                    <div class="pe-3 fs-service-desc"><?xml encoding="utf-8" ?><div style="text-align:justify"><span>Aeronave equipada com laser Riegl, GPS e c&acirc;meras RGB e IR da Phase One.</span></div></div>
                  </div>
                </div>
                              <div class="col-md-6">
                  <div class="info fs-service-item">
                    <div class="fs-service-head">
                      <div class="icon icon-sm fs-service-icon-wrap">
                        <img class="fs-service-icon" src="/uploads/featured-services/featured_b8b647f4193c1862.png" alt="Equipe" width="25" height="25">
                      </div>
                      <h5 class="font-weight-bolder mb-0">Equipe</h5>
                    </div>
                    <div class="pe-3 fs-service-desc"><?xml encoding="utf-8" ?><div style="text-align:justify"><span>Tripula&ccedil;&atilde;o altamente treinada e experiente em aerolevantamento, composta por piloto e operador t&eacute;cnico dos equipamentos.</span></div></div>
                  </div>
                </div>
                          </div>
                  </div>
        <div class="col-lg-4 ms-auto me-auto p-lg-4 mt-lg-0 mt-4">
          <div class="card card-background tilt fs-highlight-card" data-tilt>
            <div class="full-background" style="background-image: url('/uploads/featured-services/featured_059f9423cf39f31d.jpg'); filter: brightness(1.35) contrast(1);"></div>
            <div class="card-body text-center">
              <h2 class="text-white up mb-0 fs-highlight-title">Aerolevantamento</h2>
            </div>
          </div>
        </div>
      </div>
                <div class="row align-items-center fs-slide " data-items-page-index="0">
        <div class="col-lg-6 ms-auto">
                      <div class="row g-4 fs-items-page is-active" data-item-titles="[&quot;Ortofoto&quot;,&quot;Resolu\u00e7\u00e3o Espacial&quot;,&quot;True Ortofoto&quot;,&quot;Homogeneiza\u00e7\u00e3o&quot;]">
                              <div class="col-md-6">
                  <div class="info fs-service-item">
                    <div class="fs-service-head">
                      <div class="icon icon-sm fs-service-icon-wrap">
                        <img class="fs-service-icon" src="/uploads/featured-services/featured_742d05b04c13f307.png" alt="Ortofoto" width="25" height="25">
                      </div>
                      <h5 class="font-weight-bolder mb-0">Ortofoto</h5>
                    </div>
                    <div class="pe-3 fs-service-desc"><?xml encoding="utf-8" ?><p style="text-align:justify">&Eacute; uma imagem a&eacute;rea que foi <span style="color:var(--aerocarta-green) !important"><b>geometricamente corrigida</b></span> para remover as distor&ccedil;&otilde;es causadas pela perspectiva da c&acirc;mera, pela inclina&ccedil;&atilde;o do sensor e pelo relevo do terreno.</p></div>
                  </div>
                </div>
                              <div class="col-md-6">
                  <div class="info fs-service-item">
                    <div class="fs-service-head">
                      <div class="icon icon-sm fs-service-icon-wrap">
                        <img class="fs-service-icon" src="/uploads/featured-services/featured_6c71ca5efbaa8a6c.png" alt="Resolução Espacial" width="25" height="25">
                      </div>
                      <h5 class="font-weight-bolder mb-0">Resolução Espacial</h5>
                    </div>
                    <div class="pe-3 fs-service-desc"><?xml encoding="utf-8" ?><p data-path-to-node="8" style="text-align:justify">Para definir a qualidade t&eacute;cnica do produto, utilizamos o <span style="color:var(--aerocarta-green)">GSD</span>, que  &eacute; o tamanho do pixel no ch&atilde;o. Uma ortofoto com <span style="color:var(--aerocarta-green) !important"><b>GSD</b></span> de 10 cm significa que cada pixel da imagem representa um quadrado de 10 x 10cm no terreno. Quanto menor o valor, maior o detalhe.</p></div>
                  </div>
                </div>
                              <div class="col-md-6">
                  <div class="info fs-service-item">
                    <div class="fs-service-head">
                      <div class="icon icon-sm fs-service-icon-wrap">
                        <img class="fs-service-icon" src="/uploads/featured-services/featured_d35b53062c3902af.png" alt="True Ortofoto" width="25" height="25">
                      </div>
                      <h5 class="font-weight-bolder mb-0">True Ortofoto</h5>
                    </div>
                    <div class="pe-3 fs-service-desc"><?xml encoding="utf-8" ?><div style="text-align:justify"><span>Utiliza um Modelo Digital de Superf&iacute;cie (MDS) detalhado para corrigir </span><i data-path-to-node="3,1,0" data-index-in-node="82">tudo</i><span>, inclusive edifica&ccedil;&otilde;es. O resultado &eacute; uma vis&atilde;o estritamente vertical ("vista de cima"), onde se enxerga o "</span><span style="color:var(--aerocarta-green) !important"><b>ch&atilde;o</b></span><span>" em todos os becos e ruas estreitas, sem pr&eacute;dios encobrindo as vias.</span></div></div>
                  </div>
                </div>
                              <div class="col-md-6">
                  <div class="info fs-service-item">
                    <div class="fs-service-head">
                      <div class="icon icon-sm fs-service-icon-wrap">
                        <img class="fs-service-icon" src="/uploads/featured-services/featured_ead047475ecfef69.png" alt="Homogeneização" width="25" height="25">
                      </div>
                      <h5 class="font-weight-bolder mb-0">Homogeneização</h5>
                    </div>
                    <div class="pe-3 fs-service-desc"><?xml encoding="utf-8" ?><div style="text-align:justify"><span>Como o voo pode durar horas, a ilumina&ccedil;&atilde;o do sol muda entre a primeira e a &uacute;ltima </span><span style="color:var(--aerocarta-green) !important"><b>foto</b></span><span>. O processamento aplica corre&ccedil;&otilde;es de cor e brilho para que todo o mosaico fique harm&ocirc;nico. </span></div></div>
                  </div>
                </div>
                          </div>
                  </div>
        <div class="col-lg-4 ms-auto me-auto p-lg-4 mt-lg-0 mt-4">
          <div class="card card-background tilt fs-highlight-card" data-tilt>
            <div class="full-background" style="background-image: url('/uploads/featured-services/featured_2df4b740e25a08a7.webp'); filter: brightness(1.35) contrast(1);"></div>
            <div class="card-body text-center">
              <h2 class="text-white up mb-0 fs-highlight-title">Ortofoto</h2>
            </div>
          </div>
        </div>
      </div>
                <div class="row align-items-center fs-slide " data-items-page-index="0">
        <div class="col-lg-6 ms-auto">
                      <div class="row g-4 fs-items-page is-active" data-item-titles="[&quot;CTM&quot;,&quot;Integra\u00e7\u00e3o&quot;,&quot;Justi\u00e7a Fiscal&quot;,&quot;Notifica\u00e7\u00e3o&quot;]">
                              <div class="col-md-6">
                  <div class="info fs-service-item">
                    <div class="fs-service-head">
                      <div class="icon icon-sm fs-service-icon-wrap">
                        <img class="fs-service-icon" src="/uploads/featured-services/featured_644f61a09429a1d6.png" alt="CTM" width="25" height="25">
                      </div>
                      <h5 class="font-weight-bolder mb-0">CTM</h5>
                    </div>
                    <div class="pe-3 fs-service-desc"><?xml encoding="utf-8" ?><div style="text-align:justify"><span>Abordagem do Cadastro T&eacute;cnico Multifinalit&aacute;rio permite a otimiza&ccedil;&atilde;o de recursos e a obten&ccedil;&atilde;o de uma vis&atilde;o geral do territ&oacute;rio, promovendo uma gest&atilde;o mais eficiente e integrada.</span></div></div>
                  </div>
                </div>
                              <div class="col-md-6">
                  <div class="info fs-service-item">
                    <div class="fs-service-head">
                      <div class="icon icon-sm fs-service-icon-wrap">
                        <img class="fs-service-icon" src="/uploads/featured-services/featured_e1acb9113cfba0e0.png" alt="Integração" width="25" height="25">
                      </div>
                      <h5 class="font-weight-bolder mb-0">Integração</h5>
                    </div>
                    <div class="pe-3 fs-service-desc"><?xml encoding="utf-8" ?><div style="text-align:justify"><span>Base cartogr&aacute;fica e banco de dados s&atilde;o cora&ccedil;&atilde;o do CTM &eacute; a liga&ccedil;&atilde;o precisa entre o desenho (mapa) e a informa&ccedil;&atilde;o (dados)</span></div></div>
                  </div>
                </div>
                              <div class="col-md-6">
                  <div class="info fs-service-item">
                    <div class="fs-service-head">
                      <div class="icon icon-sm fs-service-icon-wrap">
                        <img class="fs-service-icon" src="/uploads/featured-services/featured_5110d8ff72140126.png" alt="Justiça Fiscal" width="25" height="25">
                      </div>
                      <h5 class="font-weight-bolder mb-0">Justiça Fiscal</h5>
                    </div>
                    <div class="pe-3 fs-service-desc"><?xml encoding="utf-8" ?><div style="text-align:justify"><span> O CTM identifica im&oacute;veis que foram ampliados sem a devida notifica&ccedil;&atilde;o &agrave; prefeitura. Isso permite cobrar o IPTU sobre a &aacute;rea constru&iacute;da real, n&atilde;o sobre o cadastro desatualizado de anos atr&aacute;s.</span></div></div>
                  </div>
                </div>
                              <div class="col-md-6">
                  <div class="info fs-service-item">
                    <div class="fs-service-head">
                      <div class="icon icon-sm fs-service-icon-wrap">
                        <img class="fs-service-icon" src="/uploads/featured-services/featured_1e5c3231ca3cf963.png" alt="Notificação" width="25" height="25">
                      </div>
                      <h5 class="font-weight-bolder mb-0">Notificação</h5>
                    </div>
                    <div class="pe-3 fs-service-desc"><?xml encoding="utf-8" ?><div style="text-align:justify"><span>Seu objetivo principal &eacute; dar transpar&ecirc;ncia ao processo de atualiza&ccedil;&atilde;o cadastral e abrir um canal para o contradit&oacute;rio (direito de defesa ou corre&ccedil;&atilde;o) antes que qualquer altera&ccedil;&atilde;o fiscal seja efetivada.</span></div></div>
                  </div>
                </div>
                          </div>
                  </div>
        <div class="col-lg-4 ms-auto me-auto p-lg-4 mt-lg-0 mt-4">
          <div class="card card-background tilt fs-highlight-card" data-tilt>
            <div class="full-background" style="background-image: url('/uploads/featured-services/featured_153f11616e4e4487.webp'); filter: brightness(1.35) contrast(1);"></div>
            <div class="card-body text-center">
              <h2 class="text-white up mb-0 fs-highlight-title">CTM</h2>
            </div>
          </div>
        </div>
      </div>
                <div class="row align-items-center fs-slide " data-items-page-index="0">
        <div class="col-lg-6 ms-auto">
                      <div class="row g-4 fs-items-page is-active" data-item-titles="[&quot;Perfilamento a laser&quot;,&quot;Precis\u00e3o&quot;,&quot;Quantidade de pontos&quot;,&quot;M\u00fatiplos Alvos&quot;]">
                              <div class="col-md-6">
                  <div class="info fs-service-item">
                    <div class="fs-service-head">
                      <div class="icon icon-sm fs-service-icon-wrap">
                        <img class="fs-service-icon" src="/uploads/featured-services/featured_55162fd0d39eb74e.png" alt="Perfilamento a laser" width="25" height="25">
                      </div>
                      <h5 class="font-weight-bolder mb-0">Perfilamento a laser</h5>
                    </div>
                    <div class="pe-3 fs-service-desc"><?xml encoding="utf-8" ?><div style="text-align:justify"><span>Conhecido como LiDAR (Light Detection and Ranging), &eacute; uma tecnologia de sensoriamento remoto ativo que utiliza pulsos de luz para medir dist&acirc;ncias com extrema precis&atilde;o.</span></div></div>
                  </div>
                </div>
                              <div class="col-md-6">
                  <div class="info fs-service-item">
                    <div class="fs-service-head">
                      <div class="icon icon-sm fs-service-icon-wrap">
                        <img class="fs-service-icon" src="/uploads/featured-services/featured_0f80c90c844eb6d9.png" alt="Precisão" width="25" height="25">
                      </div>
                      <h5 class="font-weight-bolder mb-0">Precisão</h5>
                    </div>
                    <div class="pe-3 fs-service-desc"><?xml encoding="utf-8" ?><div style="text-align:justify"><span>O LiDAR &eacute; a refer&ecirc;ncia t&eacute;cnica para obten&ccedil;&atilde;o da coordenada vertical (Z). Ele entrega a altimetria exata do terreno para gerar curvas de n&iacute;vel confi&aacute;veis, sendo indispens&aacute;vel para c&aacute;lculos de volume de terraplanagem e projetos de engenharia civil.</span></div></div>
                  </div>
                </div>
                              <div class="col-md-6">
                  <div class="info fs-service-item">
                    <div class="fs-service-head">
                      <div class="icon icon-sm fs-service-icon-wrap">
                        <img class="fs-service-icon" src="/uploads/featured-services/featured_24a620e5785df7d9.png" alt="Quantidade de pontos" width="25" height="25">
                      </div>
                      <h5 class="font-weight-bolder mb-0">Quantidade de pontos</h5>
                    </div>
                    <div class="pe-3 fs-service-desc"><?xml encoding="utf-8" ?><div style="text-align:justify"><span>Equipamento emite alta densidade de pontos, sendo 1,3 milh&otilde;es de pontos por segundo</span></div></div>
                  </div>
                </div>
                              <div class="col-md-6">
                  <div class="info fs-service-item">
                    <div class="fs-service-head">
                      <div class="icon icon-sm fs-service-icon-wrap">
                        <img class="fs-service-icon" src="/uploads/featured-services/featured_92f749d30c2cce3a.png" alt="Mútiplos Alvos" width="25" height="25">
                      </div>
                      <h5 class="font-weight-bolder mb-0">Mútiplos Alvos</h5>
                    </div>
                    <div class="pe-3 fs-service-desc"><?xml encoding="utf-8" ?><div style="text-align:justify"><span>O sistema registra m&uacute;ltiplos retornos de um mesmo pulso de luz. Isso permite que o laser "atravesse" a vegeta&ccedil;&atilde;o, atingindo o solo atrav&eacute;s de frestas nas &aacute;rvores.</span></div></div>
                  </div>
                </div>
                          </div>
                  </div>
        <div class="col-lg-4 ms-auto me-auto p-lg-4 mt-lg-0 mt-4">
          <div class="card card-background tilt fs-highlight-card" data-tilt>
            <div class="full-background" style="background-image: url('/uploads/featured-services/featured_e02c3448d521b08e.jpg'); filter: brightness(1.35) contrast(1);"></div>
            <div class="card-body text-center">
              <h2 class="text-white up mb-0 fs-highlight-title">Perfilamento a Laser</h2>
            </div>
          </div>
        </div>
      </div>
        <div class="fs-carousel-controls is-playing" aria-label="Controles do carrossel de serviços">
      <span class="fs-play-orbit" aria-hidden="true">
        <i class="fas fa-plane fs-orbit-plane"></i>
      </span>
      <button type="button" class="fs-carousel-btn js-fs-prev" title="Anterior" aria-label="Anterior">
        <i class="fas fa-chevron-left"></i>
      </button>
      <button type="button" class="fs-carousel-btn js-fs-toggle" title="Pausar" aria-label="Pausar">
        <i class="fas fa-pause"></i>
      </button>
      <button type="button" class="fs-carousel-btn js-fs-next" title="Próximo" aria-label="Próximo">
        <i class="fas fa-chevron-right"></i>
      </button>
    </div>
  </div>
</section>
<style>
  #featured-services-root .fs-slide { display: none; }
  #featured-services-root .fs-slide.is-active { display: flex; }
  #featured-services-root .fs-items-page { display: none; }
  #featured-services-root .fs-items-page.is-active { display: flex; }
  #featured-services-root .fs-highlight-card {
    position: relative;
    min-height: 520px;
  }
  #featured-services-root .fs-highlight-card .full-background {
    background-size: cover;
    background-repeat: no-repeat;
    background-position: 0% center;
    animation: fs-highlight-pan-x 24s ease-in-out infinite alternate;
    will-change: background-position;
  }
  #featured-services-root .fs-highlight-card .card-body {
    position: absolute;
    inset: 0;
    display: flex;
    align-items: center;
    justify-content: center;
    padding-top: 0;
    text-align: center;
  }
  #featured-services-root .fs-highlight-card .card-body h2 {
    width: 100%;
    margin: 0;
    text-transform: uppercase;
    word-break: normal;
    overflow-wrap: normal;
    hyphens: none;
    transition: opacity 0.35s ease;
    opacity: 1;
  }
  #featured-services-root .fs-carousel-controls {
    display: inline-flex;
    justify-content: center;
    align-items: center;
    gap: 14px;
    width: 100%;
    margin-top: 10px;
    position: relative;
  }
  #featured-services-root .fs-play-orbit {
    position: absolute;
    left: 50%;
    top: 50%;
    width: 128px;
    height: 46px;
    transform: translate(-50%, -50%);
    pointer-events: none;
    opacity: 0;
  }
  #featured-services-root .fs-carousel-controls.is-playing .fs-play-orbit {
    opacity: 1;
  }
  #featured-services-root .fs-orbit-plane {
    position: absolute;
    left: 6%;
    top: 50%;
    transform: translate(-50%, -50%) rotate(0deg);
    color: #216969;
    font-size: 0.92rem;
    line-height: 1;
    opacity: 0.95;
    animation: fs-plane-parabola 3900ms linear infinite;
  }
  @keyframes fs-plane-parabola {
    0%   { left: 6%;  top: 50%; transform: translate(-50%, -50%) rotate(0deg); }
    20%  { left: 28%; top: 28%; transform: translate(-50%, -50%) rotate(0deg); }
    40%  { left: 50%; top: 18%; transform: translate(-50%, -50%) rotate(0deg); }
    60%  { left: 72%; top: 28%; transform: translate(-50%, -50%) rotate(0deg); }
    70%  { left: 94%; top: 50%; transform: translate(-50%, -50%) rotate(180deg); }
    80%  { left: 72%; top: 72%; transform: translate(-50%, -50%) rotate(180deg); }
    90%  { left: 28%; top: 72%; transform: translate(-50%, -50%) rotate(180deg); }
    100% { left: 6%;  top: 50%; transform: translate(-50%, -50%) rotate(180deg); }
  }
  #featured-services-root .fs-carousel-btn {
    width: 44px;
    height: 44px;
    border: 0;
    background: transparent;
    color: #216969;
    display: inline-flex;
    align-items: center;
    justify-content: center;
    padding: 0;
    transition: transform 140ms ease, color 140ms ease, opacity 140ms ease;
    opacity: 0.92;
    position: relative;
    z-index: 1;
  }
  #featured-services-root .fs-carousel-btn:hover {
    transform: translateY(-1px);
    color: #1b5959;
    opacity: 1;
  }
  #featured-services-root .fs-carousel-btn i {
    font-size: 1.34rem;
    line-height: 1;
  }
  #featured-services-root .fs-highlight-card .card-body h2.is-fading {
    opacity: 0;
  }
  #featured-services-root .fs-service-item {
    display: flex;
    flex-direction: column;
  }
  #featured-services-root .fs-service-desc {
    text-align: justify;
    text-justify: inter-word;
    -webkit-hyphens: none;
    -ms-hyphens: none;
    hyphens: none;
    overflow-wrap: normal;
    word-break: normal;
    white-space: normal;
  }
  #featured-services-root .fs-service-desc * {
    text-align: justify !important;
    text-justify: inter-word;
    -webkit-hyphens: none;
    -ms-hyphens: none;
    hyphens: none;
    overflow-wrap: normal;
    word-break: normal;
    white-space: normal;
  }
  #featured-services-root .fs-service-desc > *:last-child {
    margin-bottom: 0;
  }
  #featured-services-root .fs-service-head {
    display: flex;
    align-items: flex-start;
    gap: 0.75rem;
    margin-top: 0.25rem;
  }
  #featured-services-root .fs-service-head h5 {
    margin-top: 0.18rem;
  }
  #featured-services-root .fs-service-icon {
    width: 24px;
    height: 24px;
    object-fit: contain;
    display: block;
    filter: brightness(0) saturate(100%) invert(38%) sepia(22%) saturate(744%) hue-rotate(130deg) brightness(95%) contrast(90%);
  }
  #featured-services-root .fs-service-icon-wrap {
    width: 28px;
    height: 28px;
    flex: 0 0 auto;
    display: inline-flex;
    align-items: center;
    justify-content: center;
    margin: 0;
  }
  #featured-services-root .fs-service-desc {
    margin-top: 0.9rem;
  }
  @keyframes fs-highlight-pan-x {
    0% { background-position: 0% center; }
    100% { background-position: 100% center; }
  }
  @media (prefers-reduced-motion: reduce) {
    #featured-services-root .fs-highlight-card .full-background {
      animation: none;
    }
  }
  @media (max-width: 991.98px) {
    #featured-services-root .fs-highlight-card {
      min-height: 360px;
    }
  }
</style>
<script>
  document.addEventListener('DOMContentLoaded', function () {
    const root = document.getElementById('featured-services-root');
    if (!root) return;
    const slides = root.querySelectorAll('.fs-slide');
    if (slides.length === 0) return;

    const featuredSec = Math.max(5, Number(root.dataset.featuredRotationSec || 30));
    const itemsSec = Math.max(5, Number(root.dataset.itemsRotationSec || featuredSec));
    const titleSec = 5;
    let slideIndex = 0;
    let titleIndex = 0;
    let pageTimer = null;
    let titleTimer = null;
    let slideTimer = null;
    let isPlaying = true;

    function getActiveSlide() {
      return slides[slideIndex] || null;
    }

    function getTitleEl(slide) {
      return slide ? slide.querySelector('.fs-highlight-title') : null;
    }

    function getTitlesFromPage(pageEl) {
      if (!pageEl) return [];
      try {
        const parsed = JSON.parse(pageEl.dataset.itemTitles || '[]');
        return Array.isArray(parsed) ? parsed.map((v) => String(v || '').trim()).filter(Boolean) : [];
      } catch (_) {
        return [];
      }
    }

    function getActivePage(slide) {
      return slide ? slide.querySelector('.fs-items-page.is-active') : null;
    }

    function setTitleForActiveContext(forceFirst = false) {
      const slide = getActiveSlide();
      const titleEl = getTitleEl(slide);
      const titles = getTitlesFromPage(getActivePage(slide));
      if (!titleEl || !titles.length) return;
      if (forceFirst) titleIndex = 0;
      const nextTitle = titles[titleIndex % titles.length];
      if (titleEl.textContent === nextTitle) return;
      titleEl.classList.add('is-fading');
      setTimeout(() => {
        titleEl.textContent = nextTitle;
        fitTitleFont(titleEl);
        titleEl.classList.remove('is-fading');
      }, 180);
    }

    function fitTitleFont(titleEl) {
      if (!titleEl) return;
      const raw = String(titleEl.textContent || '').trim();
      titleEl.style.fontSize = '';
      titleEl.style.whiteSpace = '';
      if (!raw) return;

      const hasSpace = /\s/.test(raw);
      if (hasSpace) return;

      titleEl.style.whiteSpace = 'nowrap';
      let size = parseFloat(window.getComputedStyle(titleEl).fontSize || '32');
      const min = 16;
      while (titleEl.scrollWidth > titleEl.clientWidth && size > min) {
        size -= 1;
        titleEl.style.fontSize = `${size}px`;
      }
    }

    function getPages(slide) {
      return slide ? slide.querySelectorAll('.fs-items-page') : [];
    }

    function setActivePage(slide, nextIndex) {
      const pages = getPages(slide);
      if (!pages.length) return;
      const safeIndex = ((nextIndex % pages.length) + pages.length) % pages.length;
      pages.forEach((page, pageIndex) => {
        page.classList.toggle('is-active', pageIndex === safeIndex);
      });
      slide.dataset.itemsPageIndex = String(safeIndex);
    }

    function resetPages(slide) {
      setActivePage(slide, 0);
      titleIndex = 0;
      setTitleForActiveContext(true);
    }

    function moveSlide(step) {
      if (slides.length <= 1) return;
      const currentSlide = slides[slideIndex];
      if (currentSlide) currentSlide.classList.remove('is-active');
      slideIndex = ((slideIndex + step) % slides.length + slides.length) % slides.length;
      const nextSlide = slides[slideIndex];
      if (nextSlide) {
        nextSlide.classList.add('is-active');
        resetPages(nextSlide);
      }
    }

    function clearTimers() {
      if (pageTimer) clearInterval(pageTimer);
      if (titleTimer) clearInterval(titleTimer);
      if (slideTimer) clearInterval(slideTimer);
      pageTimer = null;
      titleTimer = null;
      slideTimer = null;
    }

    function updateToggleButtons() {
      root.querySelectorAll('.js-fs-toggle').forEach((btn) => {
        const icon = btn.querySelector('i');
        if (!icon) return;
        if (isPlaying) {
          icon.className = 'fas fa-pause';
          btn.setAttribute('title', 'Pausar');
          btn.setAttribute('aria-label', 'Pausar');
        } else {
          icon.className = 'fas fa-play';
          btn.setAttribute('title', 'Continuar');
          btn.setAttribute('aria-label', 'Continuar');
        }
      });
      root.querySelectorAll('.fs-carousel-controls').forEach((controls) => {
        controls.classList.toggle('is-playing', isPlaying);
      });
    }

    function startAuto() {
      clearTimers();
      const hasItemsLoop = Array.from(slides).some((slide) => getPages(slide).length > 1);
      if (hasItemsLoop) {
        pageTimer = setInterval(() => {
          const activeSlide = slides[slideIndex];
          const pages = getPages(activeSlide);
          if (pages.length <= 1) return;
          const currentPage = Number(activeSlide.dataset.itemsPageIndex || 0);
          setActivePage(activeSlide, currentPage + 1);
          titleIndex = 0;
          setTitleForActiveContext(true);
        }, itemsSec * 1000);
      }

      titleTimer = setInterval(() => {
        const slide = getActiveSlide();
        const titles = getTitlesFromPage(getActivePage(slide));
        if (titles.length <= 1) return;
        titleIndex = (titleIndex + 1) % titles.length;
        setTitleForActiveContext();
      }, titleSec * 1000);

      if (slides.length > 1) {
        slideTimer = setInterval(() => {
          moveSlide(1);
        }, featuredSec * 1000);
      }
    }

    function setPlaying(nextState) {
      isPlaying = !!nextState;
      if (isPlaying) startAuto();
      else clearTimers();
      updateToggleButtons();
    }

    slides.forEach((slide) => resetPages(slide));
    window.addEventListener('resize', () => {
      const activeTitle = getTitleEl(getActiveSlide());
      fitTitleFont(activeTitle);
    });

    setTitleForActiveContext(true);
    setPlaying(true);

    root.querySelectorAll('.js-fs-prev').forEach((btn) => {
      btn.addEventListener('click', () => {
        moveSlide(-1);
        setPlaying(false);
      });
    });
    root.querySelectorAll('.js-fs-next').forEach((btn) => {
      btn.addEventListener('click', () => {
        moveSlide(1);
        setPlaying(false);
      });
    });
    root.querySelectorAll('.js-fs-toggle').forEach((btn) => {
      btn.addEventListener('click', () => {
        setPlaying(!isPlaying);
      });
    });
  });
</script>
    <div class="container mt-sm-5 mb-3">
    <h2 class="home-tech-section-title text-center mb-0">Tecnologias em Destaque</h2>
  </div>
<div class="container " id="tech-spotlight-root" data-rotation-sec="20" data-items-rotation-sec="5">
              <div class="page-header min-vh-50 my-sm-3 mb-3 border-radius-xl tech-spotlight-slide align-items-center is-active" style="background-image: url('/uploads/featured-services/featured_75420f39b042ab44.png');">
      <div class="container w-100">
        <div class="row align-items-center justify-content-start">
          <div class="col-lg-8 col-xl-7 ms-lg-5 text-start tech-spotlight-content">
            <h4 class="text-white mb-0"></h4>
            <h1 class="text-white">Laser Riegl VQ-780 II-S</h1>
            <p class="lead text-white opacity-8"><?xml encoding="utf-8" ?><p style="text-align:justify">O equipamento laser Riegl VQ-780 II-S &eacute; um avan&ccedil;ado sistema de sensoriamento a laser projetado para aplica&ccedil;&otilde;es de mapeamento topogr&aacute;fico, modelagem 3D e levantamentos geoespaciais.</p></p>
                          <a href="/servicos/perfilamento-a-laser" class="text-white icon-move-right d-inline-flex align-items-center justify-content-start">
                Saiba Mais                <i class="fas fa-arrow-right text-sm ms-1"></i>
              </a>
                      </div>
        </div>
      </div>
    </div>
              <div class="page-header min-vh-50 my-sm-3 mb-3 border-radius-xl tech-spotlight-slide align-items-center " style="background-image: url('/uploads/featured-services/featured_33b2e64acece6b80.webp');">
      <div class="container w-100">
        <div class="row align-items-center justify-content-start">
          <div class="col-lg-8 col-xl-7 ms-lg-5 text-start tech-spotlight-content">
            <h4 class="text-white mb-0"></h4>
            <h1 class="text-white">Mapeamento Móvel</h1>
            <p class="lead text-white opacity-8"><?xml encoding="utf-8" ?><p style="text-align:justify">Cada projeto &eacute; uma jornada. Aproveite o percurso.
O sistema Trimble&reg; MX60 integra uma solu&ccedil;&atilde;o completa de mapeamento m&oacute;vel, desde o trabalho de campo at&eacute; &agrave; finaliza&ccedil;&atilde;o. Combina hardware de &uacute;ltima gera&ccedil;&atilde;o com software de campo intuitivo e um fluxo de trabalho integrado no software de escrit&oacute;rio.</p></p>
                          <a href="/servicos/mapeamento-movel-laser" class="text-white icon-move-right d-inline-flex align-items-center justify-content-start">
                Saiba Mais                <i class="fas fa-arrow-right text-sm ms-1"></i>
              </a>
                      </div>
        </div>
      </div>
    </div>
  </div>
<style>
  #tech-spotlight-root {
    position: relative;
  }
  .home-tech-section-title {
    color: #216969;
  }
  #tech-spotlight-root .tech-spotlight-slide { display: none; }
  #tech-spotlight-root .tech-spotlight-slide.is-active { display: flex; }
  #tech-spotlight-root .tech-spotlight-slide {
    min-height: 520px;
    position: relative;
    overflow: hidden;
  }
  #tech-spotlight-root .tech-spotlight-slide::before {
    content: "";
    position: absolute;
    inset: 0;
    background: rgba(0, 0, 0, 0.30);
    pointer-events: none;
    z-index: 0;
  }
  #tech-spotlight-root .tech-spotlight-slide > .container {
    position: relative;
    z-index: 1;
  }
  #tech-spotlight-root .tech-spotlight-content {
    margin-inline: auto;
  }
  #tech-spotlight-root .tech-spotlight-content p { text-align: left; }
  #tech-spotlight-root .tech-spotlight-content,
  #tech-spotlight-root .tech-spotlight-content h1,
  #tech-spotlight-root .tech-spotlight-content h2,
  #tech-spotlight-root .tech-spotlight-content h3,
  #tech-spotlight-root .tech-spotlight-content h4,
  #tech-spotlight-root .tech-spotlight-content h5,
  #tech-spotlight-root .tech-spotlight-content h6,
  #tech-spotlight-root .tech-spotlight-content p,
  #tech-spotlight-root .tech-spotlight-content p * {
    color: #fff !important;
  }
  #tech-spotlight-root .tech-spotlight-content a {
    color: #fff !important;
    text-decoration-color: rgba(255, 255, 255, 0.75);
  }
  @media (max-width: 991.98px) {
    #tech-spotlight-root .tech-spotlight-slide {
      min-height: 420px;
    }
  }
</style>
<script>
  document.addEventListener('DOMContentLoaded', function () {
    const root = document.getElementById('tech-spotlight-root');
    if (!root) return;
    const itemsRoot = document.getElementById('tech-spotlight-items-root');
    const slides = root.querySelectorAll('.tech-spotlight-slide');
    const itemSlides = itemsRoot ? itemsRoot.querySelectorAll('.tech-spotlight-items-slide') : [];
    const slideSec = Math.max(5, Number(root.dataset.rotationSec || 30));
    const itemsSec = Math.max(5, Number(root.dataset.itemsRotationSec || slideSec));

    let index = 0;
    let isPlaying = true;
    let slideTimer = null;
    let itemsTimer = null;

    function getPages(itemSlide) {
      return itemSlide ? itemSlide.querySelectorAll('.tech-items-page') : [];
    }

    function setActiveItemPage(itemSlide, nextIndex) {
      const pages = getPages(itemSlide);
      if (!pages.length) return;
      const safeIndex = ((nextIndex % pages.length) + pages.length) % pages.length;
      pages.forEach((page, pageIndex) => {
        page.classList.toggle('is-active', pageIndex === safeIndex);
      });
      itemSlide.dataset.techItemsPageIndex = String(safeIndex);
    }

    function resetItemPages(itemSlide) {
      setActiveItemPage(itemSlide, 0);
    }

    function syncSlides() {
      slides.forEach((slide, slideIndex) => {
        slide.classList.toggle('is-active', slideIndex === index);
      });
      itemSlides.forEach((slide, slideIndex) => {
        slide.classList.toggle('is-active', slideIndex === index);
      });
    }

    function moveItemsPage() {
      const activeItemsSlide = itemSlides[index];
      if (!activeItemsSlide) return;
      const pages = getPages(activeItemsSlide);
      if (pages.length <= 1) return;
      const currentPage = Number(activeItemsSlide.dataset.techItemsPageIndex || 0);
      setActiveItemPage(activeItemsSlide, currentPage + 1);
    }

    function moveSlide(step) {
      if (slides.length <= 1) return;
      index = ((index + step) % slides.length + slides.length) % slides.length;
      syncSlides();
      const activeItemsSlide = itemSlides[index];
      if (activeItemsSlide) resetItemPages(activeItemsSlide);
    }

    function clearTimers() {
      if (slideTimer) clearInterval(slideTimer);
      if (itemsTimer) clearInterval(itemsTimer);
      slideTimer = null;
      itemsTimer = null;
    }

    function updateControls() {
      document.querySelectorAll('.js-tech-toggle').forEach((btn) => {
        const icon = btn.querySelector('i');
        if (!icon) return;
        if (isPlaying) {
          icon.className = 'fas fa-pause';
          btn.setAttribute('title', 'Pausar');
          btn.setAttribute('aria-label', 'Pausar');
        } else {
          icon.className = 'fas fa-play';
          btn.setAttribute('title', 'Continuar');
          btn.setAttribute('aria-label', 'Continuar');
        }
      });
      document.querySelectorAll('.tech-carousel-controls').forEach((controls) => {
        controls.classList.toggle('is-playing', isPlaying);
      });
    }

    function startAuto() {
      clearTimers();
      if (slides.length > 1) {
        slideTimer = setInterval(() => {
          moveSlide(1);
        }, slideSec * 1000);
      }
      if (Array.from(itemSlides).some((slide) => getPages(slide).length > 1)) {
        itemsTimer = setInterval(moveItemsPage, itemsSec * 1000);
      }
    }

    function setPlaying(nextState) {
      isPlaying = !!nextState;
      if (isPlaying) startAuto();
      else clearTimers();
      updateControls();
    }

    slides.forEach((slide, idx) => {
      if (slide.classList.contains('is-active')) index = idx;
    });
    itemSlides.forEach((slide) => resetItemPages(slide));
    syncSlides();
    setPlaying(true);

    window.__techSpotlightController = {
      prev: function () { moveSlide(-1); setPlaying(false); },
      next: function () { moveSlide(1); setPlaying(false); },
      toggle: function () { setPlaying(!isPlaying); },
      play: function () { setPlaying(true); },
      pause: function () { setPlaying(false); },
      isPlaying: function () { return isPlaying; }
    };

    document.querySelectorAll('.js-tech-prev').forEach((btn) => {
      btn.addEventListener('click', function () {
        window.__techSpotlightController.prev();
      });
    });
    document.querySelectorAll('.js-tech-next').forEach((btn) => {
      btn.addEventListener('click', function () {
        window.__techSpotlightController.next();
      });
    });
    document.querySelectorAll('.js-tech-toggle').forEach((btn) => {
      btn.addEventListener('click', function () {
        window.__techSpotlightController.toggle();
      });
    });
  });
</script>
  <div class="container" id="tech-spotlight-items-root" data-tech-items-rotation-sec="5">
      <div class="tech-spotlight-items-slide is-active" data-tech-items-page-index="0">
              <div class="row tech-items-page is-active">
                      <div class="col-lg-4  mt-lg-0 mt-4">
              <div class="info-horizontal bg-gray-100 border-radius-xl p-5 h-100 fs-tech-card">
                <div class="fs-tech-head">
                  <div class="icon fs-tech-icon-wrap">
                                          <img class="fs-tech-icon" src="/uploads/featured-services/featured_a5e0be8305aa3be5.png" alt="Tecnologia LiDAR" width="25" height="25" style="object-fit: contain;">
                                      </div>
                  <h5 class="mb-0">Tecnologia LiDAR</h5>
                </div>
                <p class="fs-tech-desc" style="text-align: justify"><?xml encoding="utf-8" ?><p style="text-align:justify">Excel&ecirc;ncia RIEGL em Processamento<b>, </b>equipado com o que h&aacute; de mais moderno em sensores globais, o sistema realiza a an&aacute;lise digital de cada pulso de laser. Isso resulta em nuvens de pontos mais limpas e modelos 3D de alt&iacute;ssima fidelidade, reafirmando o compromisso da Aerocarta em operar com o melhor hardware dispon&iacute;vel no mercado.</p></p>
              </div>
            </div>
                      <div class="col-lg-4  mt-lg-0 mt-4">
              <div class="info-horizontal bg-gray-100 border-radius-xl p-5 h-100 fs-tech-card">
                <div class="fs-tech-head">
                  <div class="icon fs-tech-icon-wrap">
                                          <img class="fs-tech-icon" src="/uploads/featured-services/featured_6470970c3dea9edb.png" alt="Densidade de Pontos" width="25" height="25" style="object-fit: contain;">
                                      </div>
                  <h5 class="mb-0">Densidade de Pontos</h5>
                </div>
                <p class="fs-tech-desc" style="text-align: justify"><?xml encoding="utf-8" ?><p style="text-align:justify">Entrega uma representa&ccedil;&atilde;o tridimensional rica em detalhes, ideal para projetos de engenharia, urbanismo e gest&atilde;o ambiental. S&atilde;o mais de 1,3 Milh&otilde;es de pontos emitidos por segundo de coleta.</p></p>
              </div>
            </div>
                      <div class="col-lg-4  mt-lg-0 mt-4">
              <div class="info-horizontal bg-gray-100 border-radius-xl p-5 h-100 fs-tech-card">
                <div class="fs-tech-head">
                  <div class="icon fs-tech-icon-wrap">
                                          <img class="fs-tech-icon" src="/uploads/featured-services/featured_9e6cd8ed753ad0f6.png" alt="Aplicações" width="25" height="25" style="object-fit: contain;">
                                      </div>
                  <h5 class="mb-0">Aplicações</h5>
                </div>
                <p class="fs-tech-desc" style="text-align: justify"><?xml encoding="utf-8" ?><p style="text-align:justify">Equipamento polivalente, capaz de atender desde cadastros imobili&aacute;rios urbanos at&eacute; levantamentos florestais e de infraestrutura complexa. Base para gera&ccedil;&atilde;o de curvas de n&iacute;vel, MDT e MDS.</p></p>
              </div>
            </div>
                  </div>
          </div>
      <div class="tech-spotlight-items-slide " data-tech-items-page-index="0">
              <div class="row tech-items-page is-active">
                      <div class="col-lg-4  mt-lg-0 mt-4">
              <div class="info-horizontal bg-gray-100 border-radius-xl p-5 h-100 fs-tech-card">
                <div class="fs-tech-head">
                  <div class="icon fs-tech-icon-wrap">
                                          <img class="fs-tech-icon" src="/uploads/featured-services/featured_d71e85b523c626f8.png" alt="Precisão Geoespacial" width="25" height="25" style="object-fit: contain;">
                                      </div>
                  <h5 class="mb-0">Precisão Geoespacial</h5>
                </div>
                <p class="fs-tech-desc" style="text-align: justify"><?xml encoding="utf-8" ?><p style="text-align:justify">Integrado a sistemas GNSS, IMU e odometria de alta performance, nosso sistema garante precis&atilde;o centim&eacute;trica absoluta, mesmo em ambientes urbanos complexos, como &aacute;reas com pr&eacute;dios altos e interfer&ecirc;ncias de sinal.</p></p>
              </div>
            </div>
                      <div class="col-lg-4  mt-lg-0 mt-4">
              <div class="info-horizontal bg-gray-100 border-radius-xl p-5 h-100 fs-tech-card">
                <div class="fs-tech-head">
                  <div class="icon fs-tech-icon-wrap">
                                          <img class="fs-tech-icon" src="/uploads/featured-services/featured_8c2d9e963c755cab.png" alt="Laser" width="25" height="25" style="object-fit: contain;">
                                      </div>
                  <h5 class="mb-0">Laser</h5>
                </div>
                <p class="fs-tech-desc" style="text-align: justify"><?xml encoding="utf-8" ?><div style="text-align:justify"><span>Compat&iacute;vel com c&acirc;meras panor&acirc;micas, o MX60 associa nuvens de pontos LiDAR a imagens 360&deg;, permitindo interpreta&ccedil;&atilde;o visual, valida&ccedil;&atilde;o em gabinete e extra&ccedil;&atilde;o de informa&ccedil;&otilde;es sem necessidade de retorno a campo.</span></div></p>
              </div>
            </div>
                      <div class="col-lg-4  mt-lg-0 mt-4">
              <div class="info-horizontal bg-gray-100 border-radius-xl p-5 h-100 fs-tech-card">
                <div class="fs-tech-head">
                  <div class="icon fs-tech-icon-wrap">
                                          <img class="fs-tech-icon" src="/uploads/featured-services/featured_e832a4962c8e3e32.png" alt="Alta Produtividade" width="25" height="25" style="object-fit: contain;">
                                      </div>
                  <h5 class="mb-0">Alta Produtividade</h5>
                </div>
                <p class="fs-tech-desc" style="text-align: justify"><?xml encoding="utf-8" ?><div style="text-align:justify"><span>Projetado para opera&ccedil;&atilde;o embarcada em ve&iacute;culos, nosso sistema permite o levantamento r&aacute;pido de grandes extens&otilde;es vi&aacute;rias, reduzindo drasticamente o tempo de campo e os custos operacionais em compara&ccedil;&atilde;o a m&eacute;todos tradicionais.</span></div></p>
              </div>
            </div>
                  </div>
          </div>
  </div>
<div class="container">
  <div class="tech-carousel-controls is-playing" aria-label="Controles do carrossel de tecnologia">
    <span class="tech-play-orbit" aria-hidden="true">
      <i class="fas fa-plane tech-orbit-plane"></i>
    </span>
    <button type="button" class="tech-carousel-btn js-tech-prev" title="Anterior" aria-label="Anterior">
      <i class="fas fa-chevron-left"></i>
    </button>
    <button type="button" class="tech-carousel-btn js-tech-toggle" title="Pausar" aria-label="Pausar">
      <i class="fas fa-pause"></i>
    </button>
    <button type="button" class="tech-carousel-btn js-tech-next" title="Próximo" aria-label="Próximo">
      <i class="fas fa-chevron-right"></i>
    </button>
  </div>
</div>
<style>
  #tech-spotlight-items-root .tech-spotlight-items-slide { display: none; }
  #tech-spotlight-items-root .tech-spotlight-items-slide.is-active { display: block; }
  #tech-spotlight-items-root .tech-items-page { display: none; }
  #tech-spotlight-items-root .tech-items-page.is-active { display: flex; }
  #tech-spotlight-items-root .fs-tech-icon {
    filter: brightness(0) saturate(100%) invert(31%) sepia(14%) saturate(1138%) hue-rotate(131deg) brightness(95%) contrast(90%);
  }
  #tech-spotlight-items-root .fs-tech-card {
    display: flex;
    flex-direction: column;
  }
  #tech-spotlight-items-root .fs-tech-head {
    display: flex;
    align-items: flex-start;
    gap: 0.75rem;
    margin-top: 0.25rem;
  }
  #tech-spotlight-items-root .fs-tech-head h5 {
    margin-top: 0.18rem;
    transform: none;
  }
  #tech-spotlight-items-root .fs-tech-icon-wrap {
    flex: 0 0 auto;
    margin: 0;
    width: 28px;
    height: 28px;
    display: inline-flex;
    align-items: center;
    justify-content: center;
  }
  #tech-spotlight-items-root .fs-tech-icon-wrap .fs-tech-icon {
    width: 24px;
    height: 24px;
  }
  #tech-spotlight-items-root .fs-tech-icon-wrap i {
    font-size: 24px;
    line-height: 1;
  }
  #tech-spotlight-items-root .fs-tech-desc {
    margin-top: 1rem;
    margin-bottom: 0;
  }
  .tech-carousel-controls {
    display: inline-flex;
    justify-content: center;
    align-items: center;
    gap: 14px;
    width: 100%;
    margin-top: 48px;
    margin-bottom: 8px;
    position: relative;
  }
  .tech-play-orbit {
    position: absolute;
    left: 50%;
    top: 50%;
    width: 128px;
    height: 46px;
    transform: translate(-50%, -50%);
    pointer-events: none;
    opacity: 0;
  }
  .tech-carousel-controls.is-playing .tech-play-orbit {
    opacity: 1;
  }
  .tech-orbit-plane {
    position: absolute;
    left: 6%;
    top: 50%;
    transform: translate(-50%, -50%) rotate(0deg);
    color: #216969;
    font-size: 0.92rem;
    line-height: 1;
    opacity: 0.95;
    animation: tech-plane-parabola 3900ms linear infinite;
  }
  @keyframes tech-plane-parabola {
    0%   { left: 6%;  top: 50%; transform: translate(-50%, -50%) rotate(0deg); }
    20%  { left: 28%; top: 28%; transform: translate(-50%, -50%) rotate(0deg); }
    40%  { left: 50%; top: 18%; transform: translate(-50%, -50%) rotate(0deg); }
    60%  { left: 72%; top: 28%; transform: translate(-50%, -50%) rotate(0deg); }
    70%  { left: 94%; top: 50%; transform: translate(-50%, -50%) rotate(180deg); }
    80%  { left: 72%; top: 72%; transform: translate(-50%, -50%) rotate(180deg); }
    90%  { left: 28%; top: 72%; transform: translate(-50%, -50%) rotate(180deg); }
    100% { left: 6%;  top: 50%; transform: translate(-50%, -50%) rotate(180deg); }
  }
  .tech-carousel-btn {
    width: 44px;
    height: 44px;
    border: 0;
    background: transparent;
    color: #216969;
    display: inline-flex;
    align-items: center;
    justify-content: center;
    padding: 0;
    transition: transform 140ms ease, color 140ms ease, opacity 140ms ease;
    opacity: 0.92;
    position: relative;
    z-index: 1;
  }
  .tech-carousel-btn:hover {
    transform: translateY(-1px);
    color: #1b5959;
    opacity: 1;
  }
  .tech-carousel-btn i {
    font-size: 1.34rem;
    line-height: 1;
  }
</style>
  <section class="py-7">
    <div class="container">
        <div class="row">
            <div class="col-lg-6 mx-auto text-center">
                <h2 class="mb-0">Compromisso com Resultados</h2>
            </div>
        </div>
        <div class="row mt-6">
            <div class="col-12">
                <div class="glide testimonials-glide">
                    <div class="testimonials-carousel-controls" data-glide-el="controls">
                        <button class="testimonial-nav testimonial-nav-prev" type="button" data-glide-dir="<" aria-label="Depoimento anterior">
                            <i class="fas fa-chevron-left" aria-hidden="true"></i>
                        </button>
                        <button class="testimonial-nav testimonial-nav-next" type="button" data-glide-dir=">" aria-label="Próximo depoimento">
                            <i class="fas fa-chevron-right" aria-hidden="true"></i>
                        </button>
                    </div>
                    <div class="glide__track" data-glide-el="track">
                        <ul class="glide__slides" id="testimonials-slides"></ul>
                    </div>
                </div>
            </div>
        </div>
        <hr class="horizontal dark my-5">


        <div class="container">
            <div class="row mb-5">
                <div class="col-lg-6 mx-auto text-center">
                    <h2 class="mb-0">Certificações</h2>
                </div>
            </div>
        <div class="qualify-logos" id="certifications-logos"></div>
        </div>
    </div>

    <div id="qualify-modal-backdrop" class="qualify-modal-backdrop" role="dialog" aria-modal="true" aria-hidden="true">
        <div id="qualify-modal" class="qualify-modal">
            <div class="qualify-modal-header">
                <strong id="qualify-modal-name">Qualificação</strong>
                <button id="qualify-modal-close" class="qualify-modal-close" type="button" aria-label="Fechar">&times;</button>
            </div>
            <div class="qualify-modal-body">
                <div class="qualify-modal-hero">
                    <img id="qualify-modal-logo" src="" alt="">
                </div>
                <div>
                    <p id="qualify-modal-title" class="text-gradient text-dark mb-2 text-sm"></p>
                    <p id="qualify-modal-link" class="mb-3"></p>
                    <div id="qualify-modal-body" class="text-sm"></div>
                </div>
            </div>
            <div class="qualify-modal-footer">
                <button id="qualify-modal-close-btn" type="button" class="btn btn-secondary">Fechar</button>
            </div>
        </div>
    </div>
</section>

<style>
    .testimonials-glide {
        position: relative;
        display: flex;
        flex-direction: column;
    }
    .testimonials-glide .glide__track {
        order: 1;
    }
    .testimonials-carousel-controls {
        display: none;
    }
    .testimonials-glide.has-manual-controls .testimonials-carousel-controls {
        display: flex;
        justify-content: center;
        align-items: center;
        gap: 12px;
        margin-top: 14px;
        order: 2;
    }
    .testimonial-nav {
        position: static;
        top: auto;
        transform: none;
        width: 46px;
        height: 46px;
        border-radius: 999px;
        border: 2px solid transparent;
        background: transparent;
        color: #216969;
        display: inline-flex;
        align-items: center;
        justify-content: center;
        z-index: 5;
        transition: background-color 160ms ease, color 160ms ease, box-shadow 160ms ease, border-color 160ms ease;
        box-shadow: none;
    }
    .testimonial-nav:hover,
    .testimonial-nav:focus-visible {
        background: #216969;
        border-color: #216969;
        color: #ffffff;
        outline: none;
        box-shadow: 0 12px 22px rgba(33, 105, 105, 0.35);
    }
    @media (max-width: 992px) {
        .testimonial-nav {
            width: 40px;
            height: 40px;
        }
    }
    @media (max-width: 767.98px) {
        .testimonial-nav {
            width: 38px;
            height: 38px;
        }
    }

    .qualify-logos {
        display: grid;
        gap: 8px;
    }

    .qualify-logos-row {
        --cols: 3;
        display: grid;
        grid-template-columns: repeat(var(--cols), minmax(0, 1fr));
        gap: 10px;
        align-items: center;
        justify-items: center;
        width: 100%;
        max-width: min(100%, calc(var(--cols) * 260px + (var(--cols) - 1) * 10px));
        margin: 0 auto 8px;
    }

    .qualify-logo-item {
        display: flex;
        justify-content: center;
        align-items: center;
        height: auto;
        width: 100%;
    }

    .qualify-logo-item img {
        max-height: 148px;
        width: 100%;
        max-width: 280px;
        object-fit: contain;
        display: block;
        opacity: 0.6;
    }
    .qualify-logo-item.is-crea-confea img {
        max-height: 136px;
        max-width: 265px;
    }
    .qualify-logo-item.is-md-defesa img {
        max-height: 230px;
        max-width: 425px;
        opacity: 0.72;
    }

    @media (max-width: 767.98px) {
        .qualify-logo-item img {
            max-height: 116px;
            max-width: 240px;
        }
        .qualify-logo-item.is-crea-confea img {
            max-height: 108px;
            max-width: 232px;
        }
        .qualify-logo-item.is-md-defesa img {
            max-height: 185px;
            max-width: 363px;
        }
    }

    @media (max-width: 767.98px) {
        .qualify-logos-row { max-width: 100%; }
    }

    .testimonials-row {
        align-items: stretch;
        justify-content: center;
    }

    .testimonial-col {
        display: flex;
    }

    .testimonial-card {
        width: 100%;
        display: flex;
        flex-direction: column;
        justify-content: flex-start;
        min-height: 250px;
        overflow: hidden; /* prevent logos/badges from bleeding outside rounded card */
    }

    .testimonial-card .card-body {
        display: flex;
        flex-direction: column;
        gap: 0;
        height: 100%;
        text-align: center;
        align-items: center;
        padding-top: 1.9rem;
        padding-bottom: 1.2rem;
    }
    .testimonial-card .author {
        display: flex !important;
        flex-direction: column !important;
        align-items: center !important;
        justify-content: flex-start;
        width: 100%;
        gap: 6px;
    }

    .testimonial-card .name {
        display: flex;
        flex-direction: column;
        gap: 2px;
        padding-left: 0;
        align-items: center;
        width: 100%;
    }
    .testimonial-card .name h6 {
        min-height: 3.2em;
        margin-bottom: 0 !important;
        line-height: 1.25;
        display: -webkit-box;
        -webkit-line-clamp: 2;
        -webkit-box-orient: vertical;
        overflow: hidden;
    }
    .testimonial-logo-wrap {
        display: flex;
        justify-content: center;
        align-items: center;
        min-height: 42px;
        margin-top: 6px;
        margin-bottom: 4px;
        width: 100%;
    }
    .testimonial-logo {
        max-width: 176px;
        max-height: 44px;
        width: auto;
        height: auto;
        object-fit: contain;
        display: block;
        background: transparent;
        border: 0;
    }
    .testimonial-logo-fallback {
        width: 40px;
        height: 40px;
        border-radius: 999px;
        display: inline-flex;
        align-items: center;
        justify-content: center;
        background: rgba(255, 255, 255, 0.16);
        color: #ffffff;
        font-weight: 700;
        font-size: 0.72rem;
        text-transform: uppercase;
        letter-spacing: 0.03em;
        line-height: 1;
    }
    .testimonial-card .testimonial-year-badge {
        display: inline-flex;
        align-items: center;
        justify-content: center;
        padding: 0.15rem 0.55rem;
        border-radius: 999px;
        background: rgba(255, 255, 255, 0.18);
        border: 1px solid rgba(255, 255, 255, 0.28);
        color: #ffffff !important;
        font-size: 0.75rem !important;
        font-weight: 700 !important;
        line-height: 1.2 !important;
        letter-spacing: 0.04em;
        margin-top: 6px;
        margin-bottom: 8px;
    }

    .testimonial-card .stats {
        min-height: 3em;
        display: flex !important;
        flex-direction: column !important;
        align-items: center !important;
        justify-content: center !important;
        padding-left: 0;
        line-height: 1.2;
        gap: 2px;
        width: 100%;
        text-align: center;
    }
    .testimonial-card .stats i {
        position: static;
        transform: none;
        margin-right: 0;
        margin-bottom: 2px;
        width: auto;
        text-align: center;
        display: block;
        line-height: 1;
    }
    .testimonial-card .stats .testimonial-cargo-text {
        display: block !important;
        width: 100%;
        text-align: center;
        display: -webkit-box !important;
        -webkit-line-clamp: 2;
        -webkit-box-orient: vertical;
        overflow: hidden;
    }

    .testimonial-card .rating {
        min-height: 24px;
        display: flex;
        align-items: center;
        justify-content: center;
        margin-top: auto !important;
    }

    .testimonial-card p {
        flex: 1 1 auto;
        min-height: 0;
        width: 100%;
        margin-top: 1rem !important;
        margin-bottom: 0;
        overflow: hidden;
    }

    .qualify-modal-backdrop {
        position: fixed;
        inset: 0;
        background: rgba(15, 23, 42, 0.55);
        display: none;
        align-items: center;
        justify-content: center;
        z-index: 1050;
        padding: 20px;
        backdrop-filter: blur(8px);
        -webkit-backdrop-filter: blur(8px);
        perspective: 1200px;
    }

    .qualify-modal {
        width: 100%;
        max-width: 720px;
        background: #ffffff;
        border-radius: 18px;
        box-shadow: 0 24px 60px rgba(15, 23, 42, 0.25), 0 0 0 rgba(59, 130, 246, 0);
        overflow: hidden;
        transform: none;
        opacity: 0;
        filter: none;
        animation: modalIn 560ms cubic-bezier(0.16, 1, 0.3, 1) forwards;
    }

    .qualify-modal-header {
        display: flex;
        align-items: center;
        justify-content: space-between;
        padding: 18px 22px;
        border-bottom: 1px solid #e2e8f0;
    }

    .qualify-modal-body {
        padding: 20px 22px 10px;
        display: grid;
        gap: 16px;
    }

    .qualify-modal-hero {
        display: flex;
        align-items: center;
        justify-content: center;
        padding: 12px;
        background: transparent;
        border-radius: 12px;
    }

    .qualify-modal-hero img {
        max-width: 180px;
        width: 100%;
        height: auto;
    }

    .qualify-modal-footer {
        padding: 0 22px 20px;
        display: flex;
        justify-content: flex-end;
    }

    .qualify-modal-close {
        border: 0;
        background: transparent;
        font-size: 1.4rem;
        line-height: 1;
        cursor: pointer;
    }

    @keyframes modalIn {
        0% {
            opacity: 0;
            transform: none;
            filter: none;
        }
        100% {
            opacity: 1;
            transform: none;
            filter: none;
        }
    }

    @keyframes modalOut {
        0% {
            opacity: 1;
            transform: none;
            filter: none;
        }
        100% {
            opacity: 0;
            transform: none;
            filter: none;
        }
    }
</style>

<style>
    .testimonial-card {
        min-height: 315px;
        max-height: 315px;
    }
    .testimonial-card .card-body {
        display: flex;
        flex-direction: column;
        align-items: center;
        text-align: center;
        gap: 0;
        height: 100%;
        padding-top: 1.35rem;
        padding-bottom: 1rem;
    }
    .testimonial-card .author {
        flex: 0 0 auto;
        gap: 4px;
    }
    .testimonial-card .name {
        gap: 1px;
    }
    .testimonial-card .name h6 {
        min-height: 2.7em;
    }
    .testimonial-card .stats {
        min-height: 2.4em;
        margin-top: 2px;
    }
    .testimonial-card .stats .testimonial-cargo-text {
        -webkit-line-clamp: 2;
        font-size: 0.88rem;
        line-height: 1.25;
    }
    .testimonial-card .testimonial-quote-text {
        flex: 1 1 auto;
        min-height: 0;
        width: 100%;
        margin-top: 0.65rem !important;
        margin-bottom: 0 !important;
        display: -webkit-box;
        -webkit-line-clamp: 3;
        -webkit-box-orient: vertical;
        overflow: hidden;
        line-height: 1.34;
        font-size: 0.95rem;
    }
    .testimonial-card .testimonial-quote-text.is-tight {
        font-size: 0.9rem;
        line-height: 1.3;
    }
    .testimonial-card .testimonial-quote-text.is-tightest {
        font-size: 0.84rem;
        line-height: 1.26;
    }
    .testimonial-card .testimonial-quote-text.is-empty {
        display: none;
    }
    .testimonial-card .rating {
        flex: 0 0 auto;
        min-height: 24px;
        margin-top: auto !important;
        padding-top: 0.55rem;
        padding-bottom: 0.15rem;
    }
    .testimonial-card.no-text .author {
        margin-top: auto;
        margin-bottom: auto;
    }
    .testimonial-card.no-text .stats {
        margin-top: 0.35rem;
    }

    .testimonials-glide .glide__slide {
        padding: 0 12px;
        display: flex;
    }
    .testimonial-card {
        height: 100%;
    }
    .testimonials-static .glide__slides {
        display: flex;
        gap: 24px;
        flex-wrap: wrap;
    }
    .testimonials-static .glide__slide {
        flex: 1 1 calc(33.333% - 16px);
        max-width: calc(33.333% - 16px);
    }
    @media (max-width: 992px) {
        .testimonials-static .glide__slide {
            flex: 1 1 100%;
            max-width: 100%;
        }
        .testimonial-card {
            min-height: 285px;
            max-height: 285px;
        }
    }
    @media (max-width: 767.98px) {
        .testimonials-glide .glide__slide {
            padding: 0 8px;
        }
        .testimonial-card {
            min-height: 268px;
            max-height: none;
        }
        .testimonial-card .card-body {
            padding-top: 1.2rem;
            padding-bottom: 0.95rem;
            height: auto;
        }
        .testimonial-card .name h6 {
            min-height: 2.8em;
            font-size: 0.92rem;
            line-height: 1.2;
        }
        .testimonial-card .testimonial-quote-text {
            margin-top: 0.55rem !important;
            font-size: 0.84rem;
            line-height: 1.32;
        }
        .testimonial-card .rating {
            min-height: 20px;
            margin-top: auto !important;
            margin-bottom: 0 !important;
            position: relative;
            z-index: 1;
            padding-top: 0.45rem;
        }
        .testimonial-card .rating i {
            font-size: 0.8rem;
            color: #ffffff !important;
            text-shadow: 0 1px 2px rgba(15, 23, 42, 0.45);
        }
    }
    .testimonials-empty {
        text-align: center;
        color: #94a3b8;
        padding: 24px 0;
    }
    /* Keep certifications rows as grid (see first style block). */
</style>
<script>
    document.addEventListener("DOMContentLoaded", function () {
        var list = document.getElementById("testimonials-slides");
        if (!list) return;

        fetch("/api/testimonials/list.php")
            .then(function (res) { return res.json(); })
            .then(function (data) {
                if (!data || !data.ok) return;
                var rows = data.rows || [];
                var rotationSec = Math.max(3, Number(data.rotation_sec || 30));
                if (!rows.length) {
                    var empty = document.createElement("li");
                    empty.className = "glide__slide";
                    empty.innerHTML = "<div class=\"testimonials-empty\">Sem avaliações no momento.</div>";
                    list.appendChild(empty);
                    return;
                }
                function escapeHtml(text) {
                    return String(text || "")
                        .replace(/&/g, "&amp;")
                        .replace(/</g, "&lt;")
                        .replace(/>/g, "&gt;")
                        .replace(/"/g, "&quot;")
                        .replace(/'/g, "&#039;");
                }
                function formatWithBr(text) {
                    var safe = escapeHtml(text);
                    return safe.replace(/&lt;br\s*\/?&gt;/gi, "<br>");
                }
                function getInitials(text) {
                    var source = String(text || "").trim();
                    if (!source) return "CL";
                    var words = source.replace(/[^a-zA-ZÀ-ÿ0-9\s]/g, " ").split(/\s+/).filter(Boolean);
                    if (!words.length) return "CL";
                    if (words.length === 1) return words[0].slice(0, 2).toUpperCase();
                    return (words[0].charAt(0) + words[1].charAt(0)).toUpperCase();
                }
                function stripHtml(text) {
                    return String(text || "").replace(/<[^>]*>/g, " ").replace(/\s+/g, " ").trim();
                }
                rows.forEach(function (row) {
                    var li = document.createElement("li");
                    li.className = "glide__slide";

                    var card = document.createElement("div");
                    card.className = "card bg-gradient-primary testimonial-card h-100";
                    var body = document.createElement("div");
                    body.className = "card-body";

                    var author = document.createElement("div");
                    author.className = "author";
                    var name = document.createElement("div");
                    name.className = "name";
                    var logoUrl = String(row.imagem || "").trim();
                    var logoWrap = document.createElement("div");
                    logoWrap.className = "testimonial-logo-wrap";
                    if (logoUrl) {
                        var logoImg = document.createElement("img");
                        logoImg.className = "testimonial-logo";
                        logoImg.src = logoUrl;
                        logoImg.alt = row.prefeitura || "Logo cliente";
                        logoImg.loading = "lazy";
                        logoWrap.appendChild(logoImg);
                    } else {
                        var fallback = document.createElement("span");
                        fallback.className = "testimonial-logo-fallback";
                        fallback.textContent = getInitials(row.prefeitura || "");
                        logoWrap.appendChild(fallback);
                    }
                    author.appendChild(logoWrap);
                    var h6 = document.createElement("h6");
                    h6.className = "text-white mb-0 font-weight-bolder";
                    h6.innerHTML = formatWithBr(row.prefeitura || "");
                    var stats = document.createElement("div");
                    stats.className = "stats text-white";
                    stats.innerHTML = "<span class=\"testimonial-cargo-text\">" + formatWithBr(row.cargo || "") + "</span>";

                    var year = Number(row.ano || 0);
                    if (year > 0) {
                        var yearBadge = document.createElement("span");
                        yearBadge.className = "testimonial-year-badge";
                        yearBadge.textContent = String(year);
                        name.appendChild(yearBadge);
                    }
                    name.appendChild(h6);
                    name.appendChild(stats);
                    author.appendChild(name);

                    var quoteRaw = String(row.texto || "").trim();
                    var quotePlain = stripHtml(quoteRaw);
                    var hasQuote = quotePlain.length > 0;

                    var p = document.createElement("p");
                    p.className = "testimonial-quote-text text-white";
                    p.innerHTML = formatWithBr(quoteRaw);
                    if (!hasQuote) {
                        p.classList.add("is-empty");
                    } else if (quotePlain.length > 240) {
                        p.classList.add("is-tightest");
                    } else if (quotePlain.length > 170) {
                        p.classList.add("is-tight");
                    }

                    var rating = document.createElement("div");
                    rating.className = "rating";
                    var stars = Number(row.estrelas || 0);
                    for (var i = 1; i <= 5; i++) {
                        var star = document.createElement("i");
                        star.className = (i <= stars ? "fas" : "far") + " fa-star text-white";
                        rating.appendChild(star);
                    }
                    if (!hasQuote) {
                        card.classList.add("no-text");
                    } else {
                        card.classList.add("has-text");
                    }

                    body.appendChild(author);
                    body.appendChild(p);
                    body.appendChild(rating);
                    card.appendChild(body);
                    li.appendChild(card);
                    list.appendChild(li);
                });

                var glideRoot = document.querySelector(".testimonials-glide");
                if (rows.length > 3 && typeof Glide !== "undefined") {
                    glideRoot.classList.add("has-manual-controls");
                    new Glide(".testimonials-glide", {
                        type: "carousel",
                        perView: 3,
                        gap: 24,
                        autoplay: rotationSec * 1000,
                        hoverpause: true,
                        breakpoints: {
                            1200: { perView: 2 },
                            768: { perView: 1 }
                        }
                    }).mount();
                } else if (glideRoot) {
                    glideRoot.classList.remove("has-manual-controls");
                    glideRoot.classList.add("testimonials-static");
                }
            })
            .catch(function () {});
    });
</script>
<script>
    document.addEventListener("DOMContentLoaded", function () {
        var modalBackdrop = document.getElementById("qualify-modal-backdrop");
        var modal = document.getElementById("qualify-modal");
        if (!modalBackdrop || !modal) return;

        var titleEl = document.getElementById("qualify-modal-title");
        var headerEl = document.getElementById("qualify-modal-name");
        var logoEl = document.getElementById("qualify-modal-logo");
        var linkEl = document.getElementById("qualify-modal-link");
        var bodyEl = document.getElementById("qualify-modal-body");

        function safeHttpUrl(value) {
            var raw = String(value || "").trim();
            if (!raw) return "";
            try {
                var parsed = new URL(raw, window.location.origin);
                if (parsed.protocol !== "http:" && parsed.protocol !== "https:") return "";
                return parsed.toString();
            } catch (e) {
                return "";
            }
        }

        function safeAssetUrl(value) {
            var raw = String(value || "").trim();
            if (!raw) return "";
            try {
                var parsed = new URL(raw, window.location.origin);
                if (parsed.protocol !== "http:" && parsed.protocol !== "https:") return "";
                return parsed.toString();
            } catch (e) {
                return "";
            }
        }

        function renderTextWithBreaks(target, text) {
            if (!target) return;
            target.textContent = "";
            var safe = String(text || "").replace(/<br\s*\/?>/gi, "\n");
            var parts = safe.split(/\n/);
            parts.forEach(function (part, index) {
                if (index > 0) target.appendChild(document.createElement("br"));
                target.appendChild(document.createTextNode(part));
            });
        }

        function openModal(info) {
            headerEl.textContent = info.title;
            titleEl.textContent = info.title;
            logoEl.src = safeAssetUrl(info.logo);
            logoEl.alt = info.title;
            linkEl.textContent = "";
            var safeLink = safeHttpUrl(info.link);
            if (safeLink) {
                var anchor = document.createElement("a");
                anchor.href = safeLink;
                anchor.target = "_blank";
                anchor.rel = "noopener";
                anchor.textContent = "Visitar site oficial";
                linkEl.appendChild(anchor);
            }
            renderTextWithBreaks(bodyEl, info.body || "");

            modalBackdrop.style.display = "flex";
            modalBackdrop.setAttribute("aria-hidden", "false");
            modal.style.animation = "modalIn 560ms cubic-bezier(0.16, 1, 0.3, 1) forwards";
        }

        function closeModal() {
            modal.style.animation = "modalOut 180ms ease forwards";
            setTimeout(function () {
                modalBackdrop.style.display = "none";
                modalBackdrop.setAttribute("aria-hidden", "true");
            }, 180);
        }

        document.getElementById("qualify-modal-close").addEventListener("click", closeModal);
        document.getElementById("qualify-modal-close-btn").addEventListener("click", closeModal);
        modalBackdrop.addEventListener("click", function (event) {
            if (event.target === modalBackdrop) closeModal();
        });

        var wrap = document.getElementById("certifications-logos");
        if (!wrap) return;

        function isCreaConfea(row) {
            var name = String(row && row.name ? row.name : "").toLowerCase();
            var img = String(row && row.image ? row.image : "").toLowerCase();
            return name.includes("crea") || name.includes("confea") || img.includes("crea") || img.includes("confea");
        }
        function isMdDefesa(row) {
            var name = String(row && row.name ? row.name : "").toLowerCase();
            var img = String(row && row.image ? row.image : "").toLowerCase();
            var hay = (name + " " + img)
                .replaceAll("-", " ")
                .replaceAll("_", " ")
                .replace(/\s+/g, " ")
                .trim();

            // Increase only the "MD / Ministério da Defesa" logo.
            var hasMinDef = (hay.includes("ministerio da defesa") || hay.includes("ministério da defesa"));
            var hasMd = /\bmd\b/.test(hay);
            var hasDefesa = hay.includes("defesa");
            var hasMinisterio = (hay.includes("ministerio") || hay.includes("ministério"));
            return hasMinDef || (hasDefesa && (hasMinisterio || hasMd));
        }

        function planRowSizes(total, maxCols) {
            var n = Math.max(0, Number(total || 0));
            var maxPerRow = Math.max(1, Number(maxCols || 4));
            if (n <= 0) return [];
            var rowCount = Math.ceil(n / maxPerRow);
            rowCount = Math.max(1, rowCount);
            var base = Math.floor(n / rowCount);
            var rem = n - (base * rowCount);
            var sizes = [];
            for (var i = 0; i < rowCount; i++) {
                sizes.push(base + (i < rem ? 1 : 0));
            }
            // Ensure no row is empty and no row exceeds maxPerRow.
            return sizes.filter(function (v) { return v > 0 && v <= maxPerRow; });
        }

        fetch("/api/certifications/list.php?scope=home")
            .then(function (res) { return res.json(); })
            .then(function (data) {
                if (!data || !data.ok) return;
                var rows = data.rows || [];
                wrap.innerHTML = "";
                if (!rows.length) return;
                var isMobile = window.matchMedia("(max-width: 767.98px)").matches;
                var maxCols = isMobile ? 2 : 4;
                var plan = planRowSizes(rows.length, maxCols);
                var cursor = 0;
                plan.forEach(function (cols) {
                    var rowEl = document.createElement("div");
                    rowEl.className = "qualify-logos-row";
                    rowEl.style.setProperty("--cols", String(cols));
                    wrap.appendChild(rowEl);

                    for (var i = 0; i < cols && cursor < rows.length; i++) {
                        (function (row) {
                            var item = document.createElement("div");
                            item.className = "qualify-logo-item";
                            if (isCreaConfea(row)) item.classList.add("is-crea-confea");
                            if (isMdDefesa(row)) item.classList.add("is-md-defesa");

                            var button = document.createElement("button");
                            button.type = "button";
                            button.className = "btn btn-link p-0 border-0 js-cert-modal";
                            button.setAttribute("aria-label", row.name || "Certificação");

                            var img = document.createElement("img");
                            img.src = row.image || "";
                            img.alt = row.name || "Certificação";

                            button.appendChild(img);
                            button.addEventListener("click", function () {
                                openModal({
                                    title: row.name || "",
                                    link: row.site || "",
                                    logo: row.image || "",
                                    body: row.description || ""
                                });
                            });

                            item.appendChild(button);
                            rowEl.appendChild(item);
                        })(rows[cursor]);
                        cursor++;
                    }
                });
            })
            .catch(function () {});
    });
</script>
  
      
      
  <div class="pt-5">
    <div class="container">
        <div class="row g-4 align-items-start">
            <div class="col-lg-4">
                <div class="thanks-block">
                  <h5 class="thanks-block-title mb-1">Obrigado por visitar nosso site</h5>
                  <p class="thanks-block-text mb-0">Aqui você encontra soluções digitais baseadas em tecnologia, precisão e confiabilidade para análise e gestão do território</p>
                </div>
            </div>
            <div class="col-lg-4">
                                <div class="newsletter-signup thanks-block">
                    <div class="newsletter-signup__text">
                        <h5 class="thanks-block-title mb-1">Fique por dentro das novidades</h5>
                        <p class="mb-0">Cadastre seu e-mail para receber notícias e novidades da Aerocarta</p>
                    </div>
                    <form id="newsletter-signup-form" class="newsletter-signup__form" novalidate>
                        <input type="email" id="newsletter-signup-email" class="form-control" placeholder="Digite seu e-mail" required>
                        <button type="submit" class="newsletter-signup__submit" title="Enviar" aria-label="Enviar">
                          <i class="ni ni-send"></i>
                        </button>
                    </form>
                    <div id="newsletter-signup-feedback" class="newsletter-signup__feedback" aria-live="polite"></div>
                </div>
                            </div>
            <div class="col-lg-4">
                <div class="thanks-block thanks-share" style="--thanks-icon-color:#ffffff;--thanks-btn-size:32px;">
                <h5 class="thanks-block-title mb-2">Compartilhe</h5>
                                <a href="https://facebook.com" class="btn btn-facebook thanks-share-btn mb-0 me-2" style="--thanks-btn-bg:#0064e0;background-color:#0064e0 !important;border-color:#0064e0 !important;" target="_blank" rel="noopener">
                                          <i class="fab fa-facebook-square"></i>
                                    </a>
                                <a href="https://x.com" class="btn btn-dark thanks-share-btn mb-0 me-2" style="--thanks-btn-bg:#000000;background-color:#000000 !important;border-color:#000000 !important;" target="_blank" rel="noopener">
                                          <span class="thanks-icon-asset" aria-hidden="true" style="--thanks-icon-src:url('/uploads/general-settings/info-icons/info_icon_290b663d4474f832.svg');"></span>
                                    </a>
                                <a href="https://instagram.com" class="btn btn-instagram thanks-share-btn mb-0 me-2" style="--thanks-btn-bg:#aa2b92;background-color:#aa2b92 !important;border-color:#aa2b92 !important;" target="_blank" rel="noopener">
                                          <i class="fab fa-instagram"></i>
                                    </a>
                                <a href="https://linkedin.com" class="btn btn-linkedin thanks-share-btn mb-0 me-2" style="--thanks-btn-bg:#166dc5;background-color:#166dc5 !important;border-color:#166dc5 !important;" target="_blank" rel="noopener">
                                          <i class="fab fa-linkedin"></i>
                                    </a>
                                </div>
            </div>
        </div>
    </div>
</div>

<style>
  .thanks-block {
    min-height: 100%;
    margin-left: 45px;
  }
  .thanks-block-title {
    font-size: 1.25rem;
    font-weight: 600;
    line-height: 1.2;
  }
  .thanks-block-text {
    font-size: 1rem;
    line-height: 1.5;
    color: #475569;
  }
  .newsletter-signup {
    border: 0;
    border-radius: 0;
    padding: 0;
    display: grid;
    gap: 10px;
    background: transparent;
  }
  .newsletter-signup__text p {
    color: #475569;
  }
  .newsletter-signup__form {
    display: flex;
    gap: 10px;
    flex-wrap: wrap;
  }
  .newsletter-signup__form input {
    flex: 1 1 220px;
    min-width: 180px;
  }
  .newsletter-signup__submit {
    border: 0;
    background: transparent;
    color: #216969;
    width: 34px;
    height: 34px;
    display: inline-flex;
    align-items: center;
    justify-content: center;
    border-radius: 999px;
    padding: 0;
    margin: 0;
    line-height: 1;
  }
  .newsletter-signup__submit i {
    font-size: 1rem;
    line-height: 1;
  }
  .newsletter-signup__submit:hover,
  .newsletter-signup__submit:focus {
    background: rgba(33, 105, 105, 0.08);
    color: #1a4f4f;
    outline: none;
  }
  .newsletter-signup__feedback {
    min-height: 18px;
    font-size: 0.9rem;
    color: #216969;
  }
  .thanks-share .thanks-share-btn {
    width: var(--thanks-btn-size, 44px);
    height: var(--thanks-btn-size, 44px);
    min-width: var(--thanks-btn-size, 44px);
    min-height: var(--thanks-btn-size, 44px);
    border-radius: 999px;
    display: inline-flex;
    align-items: center;
    justify-content: center;
    padding: 0 !important;
    background: var(--thanks-btn-bg, #216969) !important;
    border-color: var(--thanks-btn-bg, #216969) !important;
    color: var(--thanks-icon-color, #ffffff) !important;
    transition: filter .16s ease;
  }
  .thanks-share .thanks-share-btn i {
    color: inherit !important;
    font-size: calc(var(--thanks-btn-size, 44px) * 0.42);
    line-height: 1;
  }
  .thanks-share .thanks-share-btn img {
    filter: none;
  }
  .thanks-share .thanks-share-btn .thanks-icon-asset {
    width: 56%;
    height: 56%;
    display: block;
    background-color: var(--thanks-icon-color, #ffffff);
    -webkit-mask-image: var(--thanks-icon-src);
    mask-image: var(--thanks-icon-src);
    -webkit-mask-size: contain;
    mask-size: contain;
    -webkit-mask-repeat: no-repeat;
    mask-repeat: no-repeat;
    -webkit-mask-position: center;
    mask-position: center;
  }
  .thanks-share .thanks-share-btn:hover,
  .thanks-share .thanks-share-btn:focus {
    filter: brightness(0.92);
  }
  @media (max-width: 992px) {
    .thanks-block {
      margin-left: 0;
    }
    .newsletter-signup__form {
      flex-direction: row;
      flex-wrap: nowrap;
      align-items: center;
    }
    .newsletter-signup__form input {
      flex: 1 1 auto;
      min-width: 0;
      width: 100%;
    }
    .newsletter-signup__submit {
      flex: 0 0 auto;
    }
  }
</style>

<script>
  document.addEventListener("DOMContentLoaded", function () {
    var form = document.getElementById("newsletter-signup-form");
    if (!form) return;
    var emailInput = document.getElementById("newsletter-signup-email");
    var feedback = document.getElementById("newsletter-signup-feedback");

    function setFeedback(text, isError) {
      if (!feedback) return;
      feedback.textContent = text || "";
      feedback.style.color = isError ? "#b91c1c" : "#216969";
    }

    form.addEventListener("submit", function (event) {
      event.preventDefault();
      var email = String(emailInput && emailInput.value || "").trim();
      if (!email) {
        setFeedback("Informe um e-mail válido.", true);
        return;
      }
      var payload = new URLSearchParams({ email: email });
      fetch("/api/newsletter/subscribe.php", {
        method: "POST",
        headers: { "Content-Type": "application/x-www-form-urlencoded" },
        body: payload
      })
      .then(function (res) { return res.json().catch(function () { return {}; }); })
      .then(function (data) {
        if (!data || !data.ok) {
          setFeedback((data && data.message) || "Não foi possível cadastrar agora.", true);
          return;
        }
        if (emailInput) emailInput.value = "";
        setFeedback((data && data.message) || "Cadastro recebido com sucesso.", false);
      })
      .catch(function () {
        setFeedback("Falha de conexão. Tente novamente.", true);
      });
    });
  });
</script>
    
  <style>
  .footer .nav-link.is-current {
    color: #216969 !important;
    font-weight: 700;
  }
  .footer-recaptcha-seal {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    gap: 10px;
    padding: 0;
    border: 1px solid rgba(33, 105, 105, 0.18);
    border-radius: 999px;
    background: #f7fbfb;
    color: #355b5b;
    font-size: 0.78rem;
    line-height: 1.35;
    position: fixed;
    right: 14px;
    bottom: 14px;
    z-index: 1040;
    box-shadow: 0 12px 30px rgba(15, 23, 42, 0.14);
    width: 48px;
    height: 48px;
    overflow: hidden;
    cursor: pointer;
    transform: translateY(0) scale(1);
    transition: width 220ms ease, border-radius 220ms ease, padding 220ms ease, background-color 220ms ease, box-shadow 220ms ease, transform 180ms ease;
  }
  .footer-recaptcha-seal:hover {
    box-shadow: 0 14px 34px rgba(15, 23, 42, 0.16);
    transform: translateY(-1px) scale(1.015);
  }
  .footer-recaptcha-seal:active {
    transform: translateY(0) scale(0.985);
  }
  .footer-recaptcha-seal.is-expanded {
    width: min(250px, calc(100vw - 28px));
    height: auto;
    padding: 10px 14px;
    justify-content: flex-start;
    border-radius: 20px;
    background: #ffffff;
  }
  .footer-recaptcha-seal strong {
    color: #216969;
  }
  .footer-recaptcha-mark {
    width: 48px;
    height: 48px;
    border-radius: 999px;
    display: inline-flex;
    align-items: center;
    justify-content: center;
    background: linear-gradient(135deg, #216969 0%, #3c8a8a 100%);
    color: #ffffff;
    font-weight: 700;
    font-size: 1rem;
    flex: 0 0 48px;
    transition: width 220ms ease, height 220ms ease, flex-basis 220ms ease;
  }
  .footer-recaptcha-seal.is-expanded .footer-recaptcha-mark {
    width: 34px;
    height: 34px;
    flex-basis: 34px;
  }
  .footer-recaptcha-seal a {
    color: #216969;
    text-decoration: underline;
  }
  .footer-recaptcha-content {
    max-width: 0;
    opacity: 0;
    white-space: nowrap;
    pointer-events: none;
    transform: translateX(6px);
    transition: max-width 220ms ease, opacity 180ms ease, transform 180ms ease;
  }
  .footer-recaptcha-seal.is-expanded .footer-recaptcha-content {
    max-width: 180px;
    opacity: 1;
    white-space: normal;
    pointer-events: auto;
    transform: translateX(0);
  }
  .footer-recaptcha-wrap {
    display: contents;
  }
  @media (max-width: 575.98px) {
    .footer-recaptcha-seal {
      right: 10px;
      bottom: 10px;
      max-width: calc(100vw - 20px);
      border-radius: 18px;
    }
    .footer-recaptcha-seal.is-expanded {
      width: min(235px, calc(100vw - 20px));
    }
  }
</style>
<footer class="footer pt-5 mt-5">
    <hr class="horizontal dark mb-5">
    <div class="container">
        <div class=" row">
            <div class="col-md-3 mb-4 ms-auto">
                <div>
                    <h6 class="text-gradient text-primary font-weight-bolder"><span style="color:var(--aerocarta-green) !important"><b>A<u>EROCART</u>A&nbsp;</b></span></h6>
                </div>
                <div>
                    <h6 class="mt-3 mb-2 opacity-8">Redes Sociais</h6>
                    <ul class="d-flex flex-row ms-n3 nav">
                                                <li class="nav-item">
                            <a class="nav-link pe-1" href="https://www.facebook.com/aerocartaltda/" target="_blank" rel="noopener">
                                                                  <i class="fab fa-facebook text-lg opacity-8"></i>
                                                            </a>
                        </li>
                                                <li class="nav-item">
                            <a class="nav-link pe-1" href="https://x.com/aerocarta" target="_blank" rel="noopener">
                                                                  <span class="text-lg opacity-8 d-inline-flex align-items-center justify-content-center"><img src="assets/images/twitter.svg" alt="X (Twitter)" style="width:1.1em;height:1.1em;display:block;"></span>
                                                            </a>
                        </li>
                                                <li class="nav-item">
                            <a class="nav-link pe-1" href="https://www.instagram.com/aerocartaltda/" target="_blank" rel="noopener">
                                                                  <i class="fab fa-instagram text-lg opacity-8"></i>
                                                            </a>
                        </li>
                                                <li class="nav-item">
                            <a class="nav-link pe-1" href="https://www.linkedin.com/company/aerocartaltda/?viewAsMember=true" target="_blank" rel="noopener">
                                                                  <i class="fab fa-linkedin text-lg opacity-8"></i>
                                                            </a>
                        </li>
                                            </ul>
                </div>
            </div>
                        <div class="col-md-2 col-sm-6 col-6 mb-4">
                <div >
                    <h6 class="text-gradient text-primary text-sm">Quem Somos</h6>
                    <ul class="flex-column ms-n3 nav">
                            
                        <li class="nav-item" >
                            <a class="nav-link" href="a-empresa">
                                A Empresa
                            </a>
                        </li>
                                                                        <li class="nav-item" >
                            <a class="nav-link" href="equipe">
                                Equipe
                            </a>
                        </li>
                                                                        <li class="nav-item" >
                            <a class="nav-link" href="certificacoes">
                                Certificações
                            </a>
                        </li>
                                                                        <li class="nav-item" >
                            <a class="nav-link" href="politica-de-qualidade">
                                Política de Qualidade
                            </a>
                        </li>
                                                                        <li class="nav-item" >
                            <a class="nav-link" href="lgpd">
                                LGPD
                            </a>
                        </li>
                                                
                    </ul>
                </div>
            </div>
                                    <div class="col-md-2 col-sm-6 col-6 mb-4">
                <div >
                    <h6 class="text-gradient text-primary text-sm">Serviços</h6>
                    <ul class="flex-column ms-n3 nav">
                                                                        <li class="nav-item">
                          <a class="nav-link" href="/servicos/apoio-de-campo">
                            Apoio de Campo                          </a>
                                                  </li>
                                                                        <li class="nav-item">
                          <a class="nav-link" href="/servicos/aerofotogrametria">
                            Aerofotogrametria                          </a>
                                                  </li>
                                                                        <li class="nav-item">
                          <a class="nav-link" href="/servicos/perfilamento-a-laser">
                            Perfilamento a Laser                          </a>
                                                  </li>
                                                                        <li class="nav-item">
                          <a class="nav-link" href="/servicos/ortofoto">
                            Ortofoto                          </a>
                                                  </li>
                                                                        <li class="nav-item">
                          <a class="nav-link" href="/servicos/mapeamento-movel-laser">
                            Mapeamento Móvel                          </a>
                                                  </li>
                                                                        <li class="nav-item">
                          <a class="nav-link" href="/servicos/restituicao">
                            Restituição Digital                          </a>
                                                  </li>
                                                                        <li class="nav-item">
                          <a class="nav-link" href="/servicos/ctm">
                            CTM                          </a>
                                                  </li>
                                                                        <li class="nav-item">
                          <a class="nav-link" href="/servicos/proprios">
                            Cadastro de Imóveis Públicos                          </a>
                                                  </li>
                                                                        <li class="nav-item">
                          <a class="nav-link" href="/servicos/pvg">
                            PVG                          </a>
                                                  </li>
                                                                        <li class="nav-item">
                          <a class="nav-link" href="/servicos/sigcarta">
                            SiGCarta                          </a>
                                                  </li>
                                            </ul>
                </div>
            </div>
                        
            <div class="col-md-2 col-sm-6 col-6 mb-4">
                <div>
                    <h6 class="text-gradient text-primary text-sm">Clientes</h6>
                    <ul class="flex-column ms-n3 nav">
                        <li class="nav-item">
                            <a class="nav-link" href="/clientes">
                                Nossos Clientes
                            </a>
                        </li>
                    </ul>
                </div>
                <br>
                                <div >
                    <h6 class="text-gradient text-primary text-sm">Notícias</h6>
                    <ul class="flex-column ms-n3 nav">
                        <li class="nav-item">
                            <a class="nav-link" href="blog">
                                Notícias e Informações
                            </a>
                        </li>                        
                    </ul>
                </div>
                <br>
                       
                     
                <div >
                    <h6 class="text-gradient text-primary text-sm">Contatos</h6>
                    <ul class="flex-column ms-n3 nav">
                        <li class="nav-item">
                            <a class="nav-link" href="contatos">
                                Relacionamento com o Cliente
                            </a>
                        </li>                        
                    </ul>
                </div>
                    
            </div>            
            <div class="col-md-2 col-sm-6 col-6 mb-4 me-auto">
                <div>
                    <h6 class="text-gradient text-primary text-sm">Jurídico</h6>
                    <ul class="flex-column ms-n3 nav">
                                                <li class="nav-item">
                            <a class="nav-link" href="termos-condicoes">
                                Termos &amp; Condições                            </a>
                        </li>
                                                <li class="nav-item">
                            <a class="nav-link" href="politica-privacidade">
                                Política de Privacidade                            </a>
                        </li>
                                                <li class="nav-item">
                            <a class="nav-link" href="licencas">
                                Licenças (EULA)                            </a>
                        </li>
                                                <li class="nav-item">
                            <a class="nav-link" href="politica-cookies">
                                Política de Cookies                            </a>
                        </li>
                                            </ul>
                </div>
            </div>
            <div class="col-12">
                <div class="text-center">
                    <p class="my-4 text-sm">
                        Todos os direitos reservados. Copyright © <script>
                            document.write(new Date().getFullYear())
                        </script>. <a href="#">Aerocarta Engenharia de Aerolevantamentos Ltda</a>.
                    </p>
                                        <div class="mb-4 footer-recaptcha-wrap">
                        <button type="button" class="footer-recaptcha-seal" id="footer-recaptcha-seal" aria-label="Informações de proteção reCAPTCHA" aria-expanded="false">
                            <span class="footer-recaptcha-mark">R</span>
                            <span class="footer-recaptcha-content">
                                <strong>Protegido por reCAPTCHA</strong><br>
                                <a href="https://policies.google.com/privacy" target="_blank" rel="noopener noreferrer">Privacidade</a>
                                e
                                <a href="https://policies.google.com/terms" target="_blank" rel="noopener noreferrer">Termos</a>
                            </span>
                        </button>
                    </div>
                                    </div>
            </div>
        </div>
    </div>
</footer>
<script>
  (function () {
    var seal = document.getElementById("footer-recaptcha-seal");
    if (!seal) return;
    var timer = null;

    function collapseSeal() {
      seal.classList.remove("is-expanded");
      seal.setAttribute("aria-expanded", "false");
    }

    function expandSeal() {
      if (timer) {
        window.clearTimeout(timer);
      }
      seal.classList.add("is-expanded");
      seal.setAttribute("aria-expanded", "true");
      timer = window.setTimeout(collapseSeal, 4500);
    }

    seal.addEventListener("click", function (event) {
      var target = event.target;
      if (target && target.tagName === "A") {
        expandSeal();
        return;
      }
      if (seal.classList.contains("is-expanded")) {
        collapseSeal();
        return;
      }
      expandSeal();
    });
  })();
</script>
  <script src="https://cdn.jsdelivr.net/npm/jquery@3.7.1/dist/jquery.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/@popperjs/core@2.11.8/dist/umd/popper.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/js/bootstrap.bundle.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/perfect-scrollbar@1.5.5/dist/perfect-scrollbar.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/typed.js@2.0.12/lib/typed.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/green-audio-player@1.3.1/dist/js/green-audio-player.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/countup.js@2.8.0/dist/countUp.umd.js"></script>
<script src="https://cdn.jsdelivr.net/npm/rellax@1.12.1/rellax.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/vanilla-tilt@1.8.1/dist/vanilla-tilt.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/choices.js@10.2.0/public/assets/scripts/choices.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/parallax-js@3.1.0/dist/parallax.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/flatpickr@4.6.13/dist/flatpickr.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/nouislider@15.7.1/dist/nouislider.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/@glidejs/glide@3.6.0/dist/glide.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/animejs@3.2.1/lib/anime.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/chart.js@4.4.2/dist/chart.umd.min.js"></script>
<script>
  (function () {
    const STORAGE_KEY = "aero_cookie_consent_v1";
    const COOKIE_NAME = "aero_cookie_consent";
    const COOKIE_DAYS = 180;
    const isAdminUI = !!document.getElementById("adminNav")
      || /^\/admin(?:\/|$)/.test(window.location.pathname || "");

    function parseJson(raw) {
      if (!raw) return null;
      try {
        const parsed = JSON.parse(raw);
        return parsed && typeof parsed === "object" ? parsed : null;
      } catch (_error) {
        return null;
      }
    }

    function readStorageConsent() {
      try {
        return parseJson(localStorage.getItem(STORAGE_KEY));
      } catch (_error) {
        return null;
      }
    }

    function readCookieConsent() {
      try {
        const all = String(document.cookie || "").split(";").map(function (part) {
          return part.trim();
        });
        for (let i = 0; i < all.length; i++) {
          const part = all[i];
          if (!part || part.indexOf(COOKIE_NAME + "=") !== 0) continue;
          const value = decodeURIComponent(part.slice(COOKIE_NAME.length + 1));
          if (value === "accepted") return { necessary: true, analytics: true, source: "cookie" };
          if (value === "necessary") return { necessary: true, analytics: false, source: "cookie" };
        }
      } catch (_error) {}
      return null;
    }

    function normalizeConsent(raw) {
      if (!raw || typeof raw !== "object") return null;
      return {
        v: 1,
        necessary: true,
        analytics: raw.analytics === true,
        at: String(raw.at || new Date().toISOString())
      };
    }

    function writeCookie(value) {
      const maxAge = COOKIE_DAYS * 24 * 60 * 60;
      document.cookie = COOKIE_NAME + "=" + encodeURIComponent(value)
        + "; Max-Age=" + String(maxAge)
        + "; Path=/; SameSite=Lax";
    }

    function getConsent() {
      const storageConsent = normalizeConsent(readStorageConsent());
      if (storageConsent) return storageConsent;
      const cookieConsent = normalizeConsent(readCookieConsent());
      if (cookieConsent) {
        try { localStorage.setItem(STORAGE_KEY, JSON.stringify(cookieConsent)); } catch (_error) {}
      }
      return cookieConsent;
    }

    function persistConsent(analyticsAllowed) {
      const payload = {
        v: 1,
        necessary: true,
        analytics: analyticsAllowed === true,
        at: new Date().toISOString()
      };
      try { localStorage.setItem(STORAGE_KEY, JSON.stringify(payload)); } catch (_error) {}
      writeCookie(payload.analytics ? "accepted" : "necessary");
      window.dispatchEvent(new CustomEvent("aero:cookie-consent", { detail: payload }));
      return payload;
    }

    function clearConsent() {
      try { localStorage.removeItem(STORAGE_KEY); } catch (_error) {}
      document.cookie = COOKIE_NAME + "=; Max-Age=0; Path=/; SameSite=Lax";
      window.dispatchEvent(new CustomEvent("aero:cookie-consent-cleared"));
    }

    function hasAnalytics() {
      const consent = getConsent();
      return !!(consent && consent.analytics === true);
    }

    function removeBanner() {
      const el = document.getElementById("aero-cookie-banner");
      if (el && el.parentNode) el.parentNode.removeChild(el);
    }

    function ensureManageButton() {
      if (isAdminUI) return;
      if (document.getElementById("aero-cookie-manage")) return;
      const button = document.createElement("button");
      button.id = "aero-cookie-manage";
      button.type = "button";
      button.textContent = "Cookies";
      button.style.cssText = "position:fixed;left:14px;bottom:14px;z-index:1060;background:#1f7a7a;color:#fff;border:0;border-radius:999px;padding:8px 12px;font-size:12px;font-weight:700;box-shadow:0 8px 20px rgba(0,0,0,.2);";
      button.addEventListener("click", function () {
        showBanner(true);
      });
      document.body.appendChild(button);
    }

    function showBanner(forceOpen) {
      if (isAdminUI) return;
      removeBanner();
      const consent = getConsent();
      if (consent && forceOpen !== true) return;
      const hasSavedConsent = !!consent;
      const revokeBtnHtml = hasSavedConsent
        ? "<button type='button' data-cookie-action='revoke' style='border:1px solid #dc2626;background:#fff;color:#b91c1c;border-radius:10px;padding:8px 12px;font-size:12px;font-weight:700;'>Revogar</button>"
        : "";
      const closeBtnHtml = hasSavedConsent
        ? "<button type='button' data-cookie-action='close' aria-label='Fechar banner de cookies' title='Fechar' style='border:1px solid #cbd5e1;background:#fff;color:#334155;border-radius:999px;width:30px;height:30px;display:inline-flex;align-items:center;justify-content:center;font-size:18px;line-height:1;font-weight:700;padding:0;'>&times;</button>"
        : "";
      const chooseBtnsHtml = hasSavedConsent
        ? ""
        : ""
          + "<button type='button' data-cookie-action='necessary' style='border:1px solid #9fb7bb;background:#fff;color:#0f172a;border-radius:10px;padding:8px 12px;font-size:12px;font-weight:700;'>Somente necessários</button>"
          + "<button type='button' data-cookie-action='accept' style='border:1px solid #1f7a7a;background:#1f7a7a;color:#fff;border-radius:10px;padding:8px 12px;font-size:12px;font-weight:700;'>Aceitar todos</button>";

      const wrap = document.createElement("div");
      wrap.id = "aero-cookie-banner";
      wrap.style.cssText = "position:fixed;left:14px;right:14px;bottom:14px;z-index:1080;background:#fff;border:1px solid #dbe5e8;border-radius:14px;box-shadow:0 18px 48px rgba(0,0,0,.2);padding:14px 16px;max-width:880px;margin:0 auto;";
      wrap.innerHTML = ""
        + "<div style='display:flex;gap:12px;align-items:flex-start;justify-content:space-between;flex-wrap:wrap;'>"
        + "  <div style='flex:1 1 380px;color:#1f2937;'>"
        + "    <strong style='display:block;font-size:15px;margin-bottom:4px;'>Política de Cookies</strong>"
        + "    <span style='font-size:13px;line-height:1.45;display:block;'>Usamos cookies necessários para o site funcionar e, com sua autorização, cookies de análise para melhorar a experiência.</span>"
        + "    <a href='/politica-cookies' style='display:inline-block;margin-top:6px;font-size:12px;color:#1f7a7a;text-decoration:underline;'>Ler política de cookies</a>"
        + "  </div>"
        + "  <div style='display:flex;gap:8px;align-items:center;flex-wrap:wrap;'>"
        + revokeBtnHtml
        + chooseBtnsHtml
        + closeBtnHtml
        + "  </div>"
        + "</div>";

      wrap.addEventListener("click", function (event) {
        const btn = event.target && event.target.closest ? event.target.closest("[data-cookie-action]") : null;
        if (!btn) return;
        const action = String(btn.getAttribute("data-cookie-action") || "");
        if (action === "accept") {
          persistConsent(true);
          removeBanner();
          return;
        }
        if (action === "necessary") {
          persistConsent(false);
          removeBanner();
          return;
        }
        if (action === "revoke") {
          clearConsent();
          showBanner(true);
          return;
        }
        if (action === "close") {
          removeBanner();
        }
      });

      document.body.appendChild(wrap);
    }

    window.AeroCookieConsent = {
      get: getConsent,
      hasAnalytics: hasAnalytics,
      acceptAll: function () { return persistConsent(true); },
      acceptNecessary: function () { return persistConsent(false); },
      openSettings: function () { showBanner(true); },
      clear: clearConsent
    };

    if (document.readyState === "loading") {
      document.addEventListener("DOMContentLoaded", function () {
        ensureManageButton();
        showBanner(false);
      });
      return;
    }
    ensureManageButton();
    showBanner(false);
  })();
</script>
<script>
  (function () {
    if (typeof window === "undefined" || typeof document === "undefined") return;
    if (window.__aeroAccessTelemetryInit) return;
    window.__aeroAccessTelemetryInit = true;

    var CONFIG = {
      eventEndpoint: "/api/access/event.php",
      heartbeatEndpoint: "/api/access/heartbeat.php",
      heartbeatMs: 25000,
      dedupeMs: 1400,
      ajaxDedupeMs: 4000,
      user: null    };
    var STORAGE_KEY = "aero_access_session_id_v1";
    var lastSent = Object.create(null);
    var heartbeatTimer = null;
    var pageLoaded = false;

    function isAdminUi() {
      return !!document.getElementById("adminNav") || /^\/admin(?:\/|$)/.test(String(window.location.pathname || ""));
    }

    function sessionId() {
      try {
        var existing = String(sessionStorage.getItem(STORAGE_KEY) || "").trim();
        if (existing) return existing;
        var next = "as-" + Date.now().toString(36) + "-" + Math.random().toString(36).slice(2, 10);
        sessionStorage.setItem(STORAGE_KEY, next);
        return next;
      } catch (_error) {
        return "as-fallback-" + Date.now().toString(36);
      }
    }

    function pagePath() {
      return String(window.location.pathname || "/") || "/";
    }

    function cleanText(value, maxLen) {
      var text = String(value || "").replace(/\s+/g, " ").trim();
      if (!text) return "";
      return text.slice(0, maxLen || 180);
    }

    function elementLabel(el) {
      if (!el) return "";
      return cleanText(
        el.getAttribute("aria-label")
        || el.getAttribute("title")
        || el.getAttribute("data-label")
        || el.textContent
        || "", 120
      );
    }

    function className(el) {
      if (!el || !el.classList || !el.classList.length) return "";
      return cleanText(Array.prototype.slice.call(el.classList).slice(0, 5).join(" "), 180);
    }

    function meaningfulClickTarget(target) {
      if (!target || !target.closest) return null;
      return target.closest("a,button,[role='button'],[data-bs-toggle],[data-support-target],.btn,.nav-link,[type='submit'],[data-action]");
    }

    function shouldSkipInput(el) {
      if (!el || !el.tagName) return false;
      var tag = String(el.tagName || "").toLowerCase();
      return tag === "input" || tag === "textarea" || tag === "select";
    }

    function shouldSend(sig, ttl) {
      var now = Date.now();
      var last = Number(lastSent[sig] || 0);
      if (last && (now - last) < ttl) return false;
      lastSent[sig] = now;
      return true;
    }

    function postJson(url, payload, preferBeacon) {
      var body = JSON.stringify(payload);
      if (preferBeacon && navigator.sendBeacon) {
        try {
          return navigator.sendBeacon(url, new Blob([body], { type: "application/json" }));
        } catch (_error) {}
      }
      if (typeof fetch !== "function") return false;
      fetch(url, {
        method: "POST",
        headers: { "Content-Type": "application/json" },
        body: body,
        keepalive: true,
        credentials: "same-origin"
      }).catch(function () {});
      return true;
    }

    function basePayload(eventType) {
      var user = CONFIG.user && typeof CONFIG.user === "object" ? CONFIG.user : null;
      return {
        session_id: sessionId(),
        user_id: user && user.id ? Number(user.id) : null,
        user_name: user && user.name ? String(user.name) : "",
        source: isAdminUi() ? "admin" : "public",
        event_type: eventType,
        page: pagePath(),
        url: String(window.location.href || ""),
        referrer: String(document.referrer || ""),
        entry_url: String(window.location.href || ""),
        entry_page: pagePath()
      };
    }

    function sendEvent(eventType, extra, opts) {
      var payload = Object.assign(basePayload(eventType), extra || {});
      var label = cleanText(payload.action_label || payload.current_action || payload.page || eventType, 120);
      var sig = [eventType, payload.page, payload.url, label, payload.element_id || "", payload.element_class || ""].join("|");
      var ttl = eventType === "ajax_action" ? CONFIG.ajaxDedupeMs : CONFIG.dedupeMs;
      if (opts && opts.force !== true && !shouldSend(sig, ttl)) return;
      postJson(CONFIG.eventEndpoint, payload, !!(opts && opts.beacon));
    }

    function sendHeartbeat() {
      postJson(CONFIG.heartbeatEndpoint, basePayload("heartbeat"), true);
    }

    function scheduleHeartbeat() {
      if (heartbeatTimer) window.clearInterval(heartbeatTimer);
      heartbeatTimer = window.setInterval(function () {
        if (document.hidden) return;
        sendHeartbeat();
      }, CONFIG.heartbeatMs);
    }

    document.addEventListener("click", function (ev) {
      var target = meaningfulClickTarget(ev.target);
      if (!target || shouldSkipInput(target)) return;
      var label = elementLabel(target);
      if (!label && !target.id && !className(target)) return;
      sendEvent("click", {
        current_action: label || "click",
        action_label: label || "click",
        element_tag: String(target.tagName || "").toLowerCase(),
        element_id: cleanText(target.id || "", 120),
        element_class: className(target),
        element_text: label,
        details_json: {
          href: cleanText(target.getAttribute("href") || "", 300),
          role: cleanText(target.getAttribute("role") || "", 40)
        }
      });
    }, true);

    document.addEventListener("submit", function (ev) {
      var form = ev.target;
      if (!form || !form.tagName) return;
      sendEvent("form_submit", {
        current_action: "form_submit",
        action_label: cleanText(form.getAttribute("data-form-name") || form.getAttribute("id") || form.getAttribute("action") || "form_submit", 120),
        element_tag: "form",
        element_id: cleanText(form.id || "", 120),
        element_class: className(form),
        details_json: {
          method: cleanText(form.getAttribute("method") || "GET", 12),
          action: cleanText(form.getAttribute("action") || "", 300)
        }
      });
    }, true);

    document.addEventListener("shown.bs.modal", function (ev) {
      var modal = ev.target;
      sendEvent("modal_open", {
        current_action: "modal_open",
        action_label: cleanText(modal && (modal.getAttribute("aria-label") || modal.getAttribute("id") || modal.querySelector(".modal-title") && modal.querySelector(".modal-title").textContent || "modal"), 120),
        element_tag: "modal",
        element_id: cleanText(modal && modal.id || "", 120),
        element_class: className(modal)
      });
    });

    document.addEventListener("hidden.bs.modal", function (ev) {
      var modal = ev.target;
      sendEvent("modal_close", {
        current_action: "modal_close",
        action_label: cleanText(modal && (modal.getAttribute("aria-label") || modal.getAttribute("id") || "modal"), 120),
        element_tag: "modal",
        element_id: cleanText(modal && modal.id || "", 120),
        element_class: className(modal)
      });
    });

    window.addEventListener("error", function (ev) {
      var message = cleanText(ev && ev.message || "js_error", 180);
      if (!message) return;
      sendEvent("js_error", {
        current_action: "js_error",
        action_label: message,
        details_json: {
          file: cleanText(ev && ev.filename || "", 260),
          line: Number(ev && ev.lineno || 0),
          column: Number(ev && ev.colno || 0)
        }
      }, { force: false });
    });

    window.addEventListener("unhandledrejection", function (ev) {
      var reason = ev && ev.reason;
      var message = cleanText(reason && reason.message ? reason.message : reason, 180);
      if (!message) return;
      sendEvent("js_error", {
        current_action: "js_error",
        action_label: message,
        details_json: {
          kind: "unhandledrejection"
        }
      });
    });

    var originalFetch = typeof window.fetch === "function" ? window.fetch.bind(window) : null;
    if (originalFetch) {
      window.fetch = function (input, init) {
        var method = String(init && init.method || input && input.method || "GET").toUpperCase();
        var url = "";
        try {
          url = typeof input === "string" ? input : String(input && input.url || "");
        } catch (_error) {}
        var abs;
        try { abs = new URL(url || String(window.location.href), window.location.origin); } catch (_error) { abs = null; }
        var isSameOrigin = !!(abs && abs.origin === window.location.origin);
        var isTracked = isSameOrigin && /^\/api\//.test(String(abs.pathname || "")) && !/^\/api\/access\//.test(String(abs.pathname || ""));
        var isUpload = false;
        try {
          isUpload = !!(init && init.body && typeof FormData !== "undefined" && init.body instanceof FormData);
          if (isUpload) {
            init.body.forEach(function (value) {
              if (typeof File !== "undefined" && value instanceof File) isUpload = true;
            });
          }
        } catch (_error) {}
        if (isTracked && isUpload) {
          sendEvent("file_upload_start", {
            current_action: "file_upload_start",
            action_label: cleanText(method + " " + abs.pathname, 140),
            details_json: { url: abs.pathname, method: method }
          });
        }
        return originalFetch(input, init).then(function (response) {
          if (isTracked) {
            sendEvent(isUpload ? "file_upload_end" : "ajax_action", {
              current_action: isUpload ? "file_upload_end" : "ajax_action",
              action_label: cleanText(method + " " + abs.pathname, 140),
              details_json: {
                url: abs.pathname,
                method: method,
                status: Number(response && response.status || 0),
                ok: !!(response && response.ok)
              }
            });
          }
          return response;
        }).catch(function (error) {
          if (isTracked) {
            sendEvent("ajax_action", {
              current_action: "ajax_action",
              action_label: cleanText(method + " " + (abs ? abs.pathname : url), 140),
              details_json: {
                url: abs ? abs.pathname : cleanText(url, 220),
                method: method,
                error: cleanText(error && error.message || error, 180)
              }
            }, { force: true });
          }
          throw error;
        });
      };
    }

    window.addEventListener("pageshow", function () {
      sendEvent("route_change", { current_action: "route_change", action_label: pagePath() }, { force: true });
    });
    document.addEventListener("visibilitychange", function () {
      if (!document.hidden) sendHeartbeat();
    });
    window.addEventListener("beforeunload", function () {
      sendHeartbeat();
    });

    function boot() {
      if (pageLoaded) return;
      pageLoaded = true;
      sendEvent("page_view", { current_action: "page_view", action_label: pagePath() }, { force: true });
      sendHeartbeat();
      scheduleHeartbeat();
    }

    if (document.readyState === "loading") {
      document.addEventListener("DOMContentLoaded", boot, { once: true });
    } else {
      boot();
    }
  })();
</script>
<script>
  (function () {
    var isAdminUI = !!document.getElementById("adminNav")
      || /^\/admin(?:\/|$)/.test(String(window.location.pathname || ""));
    if (!isAdminUI || typeof window.fetch !== "function") return;

    var originalFetch = window.fetch.bind(window);
    var serverToken = "";

    function getCsrfToken() {
      return String(serverToken || "").trim();
    }

    function shouldAttach(urlObj, method) {
      if (!urlObj || !method) return false;
      var m = String(method).toUpperCase();
      if (["POST", "PUT", "PATCH", "DELETE"].indexOf(m) === -1) return false;
      return urlObj.origin === window.location.origin && /^\/api\/admin\//.test(urlObj.pathname);
    }

    window.__adminCsrfToken = getCsrfToken;
    window.__adminCsrfHeaders = function (contentType, baseHeaders) {
      var headers = new Headers(baseHeaders || {});
      var csrfToken = getCsrfToken();
      if (csrfToken && !headers.has("X-CSRF-Token")) headers.set("X-CSRF-Token", csrfToken);
      if (typeof contentType === "string" && contentType.length > 0 && !headers.has("Content-Type")) {
        headers.set("Content-Type", contentType);
      }
      return headers;
    };

    window.fetch = function (input, init) {
      var reqInit = init || {};
      var reqMethod = String(reqInit.method || (input && input.method) || "GET").toUpperCase();
      var reqUrl = "";
      try {
        if (typeof input === "string") reqUrl = input;
        else if (input && typeof input.url === "string") reqUrl = input.url;
      } catch (_error) {}

      var parsed = null;
      try { parsed = new URL(reqUrl || String(window.location.href), window.location.origin); } catch (_error) {}
      if (!shouldAttach(parsed, reqMethod)) return originalFetch(input, init);

      var headers = new Headers(reqInit.headers || (input && input.headers) || {});
      var csrfToken = getCsrfToken();
      if (csrfToken && !headers.has("X-CSRF-Token")) headers.set("X-CSRF-Token", csrfToken);

      var nextInit = Object.assign({}, reqInit, {
        method: reqMethod,
        headers,
      });
      if (!nextInit.credentials) nextInit.credentials = "same-origin";
      return originalFetch(input, nextInit);
    };
  })();
</script>
<script>
  (function () {
    const endpoint = "/api/audit/collect.php";
    const isAdminUI = !!document.getElementById("adminNav");
    const source = isAdminUI ? "admin_ui" : "public_ui";
    let lastClickTs = 0;
    let pageViewSent = false;

    function publicTrackingAllowed() {
      if (source !== "public_ui") return true;
      const consent = window.AeroCookieConsent;
      if (!consent || typeof consent.hasAnalytics !== "function") return false;
      return consent.hasAnalytics();
    }

    function sendAudit(payload) {
      if (!publicTrackingAllowed()) return;
      try {
        const body = JSON.stringify(payload || {});
        if (navigator.sendBeacon) {
          const blob = new Blob([body], { type: "application/json" });
          navigator.sendBeacon(endpoint, blob);
          return;
        }
        fetch(endpoint, {
          method: "POST",
          headers: { "Content-Type": "application/json" },
          body,
          keepalive: true
        }).catch(() => {});
      } catch (_error) {}
    }

    function compactText(value, maxLen) {
      return String(value || "").replace(/\s+/g, " ").trim().slice(0, maxLen || 160);
    }

    function buildTargetMeta(node) {
      if (!node || !node.tagName) return {};
      const id = node.id ? "#" + node.id : "";
      const className = compactText(node.className || "", 120);
      return {
        tag: String(node.tagName || "").toLowerCase(),
        id,
        class: className
      };
    }

    function sendPageView() {
      if (pageViewSent) return;
      pageViewSent = true;
      sendAudit({
        source,
        event: "page_view",
        action: document.title || "",
        path: window.location.pathname + window.location.search
      });
    }

    window.addEventListener("load", function () {
      sendPageView();
    });

    window.addEventListener("aero:cookie-consent", function (event) {
      if (source !== "public_ui") return;
      const detail = event && event.detail ? event.detail : null;
      if (!detail || detail.analytics !== true) return;
      sendPageView();
    });

    document.addEventListener("click", function (event) {
      const now = Date.now();
      if (now - lastClickTs < 200) return;
      lastClickTs = now;
      const target = event.target ? event.target.closest("button,a,input[type='button'],input[type='submit'],.btn,[role='button']") : null;
      if (!target) return;
      sendAudit({
        source,
        event: "click",
        action: compactText(target.getAttribute("title") || target.innerText || target.textContent || "", 120),
        path: window.location.pathname + window.location.search,
        target: buildTargetMeta(target)
      });
    }, { passive: true });
  })();
</script>
<script>
  // Rich editor helpers (contenteditable) used across admin screens.
  (function () {
    function getEditor(targetId) {
      if (!targetId) return null;
      return document.getElementById(String(targetId)) || null;
    }

    function selectionInside(rootEl) {
      if (!rootEl) return false;
      var sel = window.getSelection && window.getSelection();
      if (!sel || sel.rangeCount < 1) return false;
      var node = sel.anchorNode;
      if (!node) return false;
      if (node === rootEl) return true;
      return rootEl.contains(node.nodeType === Node.ELEMENT_NODE ? node : node.parentNode);
    }

    function normalizeHexColor(value) {
      var v = String(value || "").trim();
      if (!/^#([0-9a-f]{3}|[0-9a-f]{6})$/i.test(v)) return "";
      if (v.length === 4) {
        return ("#" + v[1] + v[1] + v[2] + v[2] + v[3] + v[3]).toLowerCase();
      }
      return v.toLowerCase();
    }

    function normalizeFont(value) {
      var v = String(value || "").trim();
      if (!v) return "";
      if (v === "trajan") return "\"TrajanRegular\", serif";
      if (v === "serif") return "serif";
      if (v === "sans") return "sans-serif";
      return "";
    }

    function normalizeFontSize(value) {
      var v = String(value || "").trim().toLowerCase();
      if (!v) return "";
      v = v.replace(/px$/i, "");
      if (!/^[0-9]{1,2}$/.test(v)) return "";
      var n = Number(v);
      if (!Number.isFinite(n) || n < 10 || n > 72) return "";
      return String(Math.round(n)) + "px";
    }

    function normalizeLineHeight(value) {
      var v = String(value || "").trim().toLowerCase();
      if (!v) return "";
      if (!/^[0-9]+(\.[0-9]+)?$/.test(v)) return "";
      var n = Number(v);
      if (!Number.isFinite(n) || n < 0.8 || n > 3.0) return "";
      // keep a compact string (e.g. 2 instead of 2.0)
      var s = String(n);
      return s;
    }

    function clampFontSizePx(value) {
      var n = Number(value);
      if (!Number.isFinite(n)) return 16;
      if (n < 10) return 10;
      if (n > 72) return 72;
      return Math.round(n);
    }

    function editorSelectionHost(editorEl) {
      if (!editorEl) return null;
      var sel = window.getSelection && window.getSelection();
      if (!sel || sel.rangeCount < 1 || !selectionInside(editorEl)) return editorEl;
      var node = sel.anchorNode;
      if (!node) return editorEl;
      return node.nodeType === Node.ELEMENT_NODE ? node : node.parentNode;
    }

    function getCurrentFontSizePx(editorEl) {
      if (!editorEl) return 16;
      var host = editorSelectionHost(editorEl) || editorEl;
      try {
        var cs = window.getComputedStyle(host);
        var raw = cs && cs.fontSize ? String(cs.fontSize) : "";
        var px = Number.parseFloat(raw.replace("px", ""));
        if (Number.isFinite(px) && px > 0) return clampFontSizePx(px);
      } catch (_error) {}
      return 16;
    }

    function resolveToolbarTarget(toolbar) {
      if (!toolbar) return "";
      var ownTarget = String(toolbar.dataset.target || "").trim();
      if (ownTarget) return ownTarget;
      var targetEl = toolbar.querySelector("[data-target]");
      if (!targetEl) return "";
      return String(targetEl.dataset.target || "").trim();
    }

	    function injectToolbarExtras(toolbar) {
	      if (!toolbar || !toolbar.classList || !toolbar.classList.contains("aero-rich-toolbar")) return;
	      var targetId = resolveToolbarTarget(toolbar);
	      if (!targetId) return;

      var plusBtn = document.createElement("button");
      plusBtn.type = "button";
      plusBtn.className = "btn btn-outline-primary btn-sm aero-rich-font-step";
      plusBtn.dataset.target = targetId;
      plusBtn.dataset.step = "2";
      plusBtn.title = "Aumentar fonte";
      plusBtn.textContent = "A+";

      var minusBtn = document.createElement("button");
      minusBtn.type = "button";
      minusBtn.className = "btn btn-outline-primary btn-sm aero-rich-font-step";
      minusBtn.dataset.target = targetId;
      minusBtn.dataset.step = "-2";
      minusBtn.title = "Diminuir fonte";
      minusBtn.textContent = "A-";

      var presetBtn = document.createElement("button");
      presetBtn.type = "button";
	      presetBtn.className = "btn btn-outline-primary btn-sm aero-rich-preset-aerocarta";
	      presetBtn.dataset.target = targetId;
	      presetBtn.title = "Aplicar padrão Aerocarta";
	      presetBtn.textContent = "Aero";

	      var grayPresetBtn = document.createElement("button");
	      grayPresetBtn.type = "button";
	      grayPresetBtn.className = "btn btn-outline-primary btn-sm aero-rich-preset-text-gray";
	      grayPresetBtn.dataset.target = targetId;
	      grayPresetBtn.title = "Aplicar cinza padrão do texto";
	      grayPresetBtn.textContent = "Cinza";

	      var refNode = toolbar.querySelector("input.aero-rich-color");
	      if (refNode && refNode.parentNode === toolbar) {
	        if (!toolbar.querySelector('.aero-rich-font-step[data-step="2"]')) toolbar.insertBefore(plusBtn, refNode);
	        if (!toolbar.querySelector('.aero-rich-font-step[data-step="-2"]')) toolbar.insertBefore(minusBtn, refNode);
	        if (!toolbar.querySelector(".aero-rich-preset-text-gray")) toolbar.insertBefore(grayPresetBtn, refNode);
	        if (!toolbar.querySelector(".aero-rich-preset-aerocarta")) toolbar.insertBefore(presetBtn, refNode);
	      } else {
	        if (!toolbar.querySelector('.aero-rich-font-step[data-step="2"]')) toolbar.appendChild(plusBtn);
	        if (!toolbar.querySelector('.aero-rich-font-step[data-step="-2"]')) toolbar.appendChild(minusBtn);
	        if (!toolbar.querySelector(".aero-rich-preset-text-gray")) toolbar.appendChild(grayPresetBtn);
	        if (!toolbar.querySelector(".aero-rich-preset-aerocarta")) toolbar.appendChild(presetBtn);
	      }
	    }

    function injectToolbarExtrasIn(root) {
      if (!root) return;
      if (root.matches && root.matches(".aero-rich-toolbar")) {
        injectToolbarExtras(root);
      }
      root.querySelectorAll && root.querySelectorAll(".aero-rich-toolbar").forEach(injectToolbarExtras);
    }

    function closestBlockEl(node, editorEl) {
      if (!node || !editorEl) return null;
      var el = node.nodeType === Node.ELEMENT_NODE ? node : node.parentNode;
      while (el && el !== editorEl) {
        if (el.nodeType === Node.ELEMENT_NODE) {
          var t = String(el.tagName || "").toUpperCase();
          if (["P","DIV","LI","H1","H2","H3","H4","H5","H6","BLOCKQUOTE"].includes(t)) return el;
        }
        el = el.parentNode;
      }
      return null;
    }

    function applyStyleToSelectedBlocks(editorEl, styles) {
      if (!editorEl || !styles || typeof styles !== "object") return false;
      var sel = window.getSelection && window.getSelection();
      if (!sel || sel.rangeCount < 1) return false;
      if (!selectionInside(editorEl)) editorEl.focus();
      if (sel.rangeCount < 1) return false;
      var range = sel.getRangeAt(0);
      if (!range) return false;

      // If no selection (caret), apply to current block.
      if (range.collapsed) {
        var block = closestBlockEl(sel.anchorNode, editorEl);
        if (block) {
          if (styles.fontFamily) block.style.fontFamily = styles.fontFamily;
          if (styles.fontSize) block.style.fontSize = styles.fontSize;
          if (styles.lineHeight) block.style.lineHeight = styles.lineHeight;
          if (styles.color) block.style.color = styles.color;
          if (styles.fontWeight) block.style.fontWeight = styles.fontWeight;
          if (styles.textTransform) block.style.textTransform = styles.textTransform;
          return true;
        }
        // If we don't have block elements (editor is mostly text/<br>), apply to the editor itself.
        if (styles.fontFamily) editorEl.style.fontFamily = styles.fontFamily;
        if (styles.fontSize) editorEl.style.fontSize = styles.fontSize;
        if (styles.lineHeight) editorEl.style.lineHeight = styles.lineHeight;
        if (styles.color) editorEl.style.color = styles.color;
        if (styles.fontWeight) editorEl.style.fontWeight = styles.fontWeight;
        if (styles.textTransform) editorEl.style.textTransform = styles.textTransform;
        return true;
      }

      // Apply to all block elements intersecting the selection.
      var blockTags = new Set(["P","DIV","LI","H1","H2","H3","H4","H5","H6","BLOCKQUOTE"]);
      var applied = 0;
      var walker = document.createTreeWalker(editorEl, NodeFilter.SHOW_ELEMENT, {
        acceptNode: function (node) {
          if (!node || node.nodeType !== Node.ELEMENT_NODE) return NodeFilter.FILTER_REJECT;
          if (!blockTags.has(String(node.tagName || "").toUpperCase())) return NodeFilter.FILTER_SKIP;
          try {
            return range.intersectsNode(node) ? NodeFilter.FILTER_ACCEPT : NodeFilter.FILTER_REJECT;
          } catch (_e) {
            return NodeFilter.FILTER_REJECT;
          }
        }
      });
      var node;
      while ((node = walker.nextNode())) {
        if (styles.fontFamily) node.style.fontFamily = styles.fontFamily;
        if (styles.fontSize) node.style.fontSize = styles.fontSize;
        if (styles.lineHeight) node.style.lineHeight = styles.lineHeight;
        if (styles.color) node.style.color = styles.color;
        if (styles.fontWeight) node.style.fontWeight = styles.fontWeight;
        if (styles.textTransform) node.style.textTransform = styles.textTransform;
        applied++;
      }

      // Fallback if no blocks were found.
      if (applied === 0) {
        var block2 = closestBlockEl(range.startContainer, editorEl);
        if (block2) {
          if (styles.fontFamily) block2.style.fontFamily = styles.fontFamily;
          if (styles.fontSize) block2.style.fontSize = styles.fontSize;
          if (styles.lineHeight) block2.style.lineHeight = styles.lineHeight;
          if (styles.color) block2.style.color = styles.color;
          if (styles.fontWeight) block2.style.fontWeight = styles.fontWeight;
          if (styles.textTransform) block2.style.textTransform = styles.textTransform;
          return true;
        }
        if (styles.fontFamily) editorEl.style.fontFamily = styles.fontFamily;
        if (styles.fontSize) editorEl.style.fontSize = styles.fontSize;
        if (styles.lineHeight) editorEl.style.lineHeight = styles.lineHeight;
        if (styles.color) editorEl.style.color = styles.color;
        if (styles.fontWeight) editorEl.style.fontWeight = styles.fontWeight;
        if (styles.textTransform) editorEl.style.textTransform = styles.textTransform;
        return true;
      }
      return applied > 0;
    }

    function buildStyle(styles) {
      var parts = [];
      if (!styles || typeof styles !== "object") return "";
      if (styles.color) parts.push("color:" + styles.color + (styles.colorImportant ? " !important" : ""));
      if (styles.fontFamily) parts.push("font-family:" + styles.fontFamily);
      if (styles.fontSize) parts.push("font-size:" + styles.fontSize);
      if (styles.fontWeight) parts.push("font-weight:" + styles.fontWeight);
      if (styles.textTransform) parts.push("text-transform:" + styles.textTransform);
      return parts.join("; ");
    }

    function wrapSelection(editorEl, styles) {
      if (!editorEl) return false;
      var sel = window.getSelection && window.getSelection();
      if (!sel || sel.rangeCount < 1) return false;
      if (!selectionInside(editorEl)) {
        editorEl.focus();
      }
      if (sel.rangeCount < 1) return false;
      var range = sel.getRangeAt(0);
      if (!range || range.collapsed) return false;

      var tmp = document.createElement("div");
      tmp.appendChild(range.cloneContents());
      var html = tmp.innerHTML;
      if (!html) return false;

      var style = buildStyle(styles);
      if (!style) return false;
      document.execCommand("insertHTML", false, "<span style=\"" + style.replace(/\"/g, "&quot;") + "\">" + html + "</span>");
      return true;
    }

    document.addEventListener("change", function (ev) {
      var el = ev.target;
      if (!el) return;

      if (el.classList && el.classList.contains("aero-rich-color")) {
        var editor = getEditor(el.dataset.target);
        var color = normalizeHexColor(el.value);
        if (!editor || !color) return;
        wrapSelection(editor, { color: color });
      }

      if (el.classList && el.classList.contains("aero-rich-font")) {
        var editor2 = getEditor(el.dataset.target);
        var font = normalizeFont(el.value);
        if (!editor2 || !font) return;
        if (!wrapSelection(editor2, { fontFamily: font })) {
          applyStyleToSelectedBlocks(editor2, { fontFamily: font });
        }
        el.value = ""; // keep dropdown as a "command"
      }

      if (el.classList && el.classList.contains("aero-rich-font-size")) {
        var editor3 = getEditor(el.dataset.target);
        var size = normalizeFontSize(el.value);
        if (!editor3 || !size) return;
        applyStyleToSelectedBlocks(editor3, { fontSize: size });
        el.value = ""; // keep dropdown as a "command"
      }

      if (el.classList && el.classList.contains("aero-rich-line-height")) {
        var editor4 = getEditor(el.dataset.target);
        var lh = normalizeLineHeight(el.value);
        if (!editor4 || !lh) return;
        applyStyleToSelectedBlocks(editor4, { lineHeight: lh });
        el.value = ""; // keep dropdown as a "command"
      }
    });

    document.addEventListener("click", function (ev) {
      var preset = ev.target ? ev.target.closest(".aero-rich-color-preset") : null;
      if (preset) {
        var editorP = getEditor(preset.dataset.target);
        var colorP = String(preset.dataset.color || "").trim();
        var importantP = String(preset.dataset.important || "").trim();
        var isImportant = ["1", "true", "t", "yes", "on"].includes(importantP.toLowerCase());
        if (editorP && colorP) {
          wrapSelection(editorP, { color: colorP, colorImportant: isImportant });
        }
        return;
      }

      var btn = ev.target ? ev.target.closest(".aero-rich-case") : null;
      if (btn) {
        var editor = getEditor(btn.dataset.target);
        var mode = String(btn.dataset.mode || "").toLowerCase();
        if (!editor) return;
        if (mode === "upper") wrapSelection(editor, { textTransform: "uppercase" });
        if (mode === "lower") wrapSelection(editor, { textTransform: "lowercase" });
        return;
      }

      var fontStepBtn = ev.target ? ev.target.closest(".aero-rich-font-step") : null;
      if (fontStepBtn) {
        var editorS = getEditor(fontStepBtn.dataset.target);
        var step = Number(fontStepBtn.dataset.step || 0);
        if (!editorS || !Number.isFinite(step) || step === 0) return;
        editorS.focus();
        var currentPx = getCurrentFontSizePx(editorS);
        var nextPx = clampFontSizePx(currentPx + step);
        applyStyleToSelectedBlocks(editorS, { fontSize: String(nextPx) + "px" });
        return;
      }

	      var aeroPresetBtn = ev.target ? ev.target.closest(".aero-rich-preset-aerocarta") : null;
	      if (aeroPresetBtn) {
	        var editorA = getEditor(aeroPresetBtn.dataset.target);
        if (!editorA) return;
        editorA.focus();
	        if (!wrapSelection(editorA, { color: "var(--aerocarta-green)", fontWeight: "700" })) {
	          applyStyleToSelectedBlocks(editorA, { color: "var(--aerocarta-green)", fontWeight: "700" });
	        }
	        return;
	      }

	      var grayPresetBtn = ev.target ? ev.target.closest(".aero-rich-preset-text-gray") : null;
	      if (grayPresetBtn) {
	        var editorG = getEditor(grayPresetBtn.dataset.target);
	        if (!editorG) return;
	        editorG.focus();
	        if (!wrapSelection(editorG, { color: "#495057" })) {
	          applyStyleToSelectedBlocks(editorG, { color: "#495057" });
	        }
	      }
	    });

    injectToolbarExtrasIn(document);
    var mo = new MutationObserver(function (records) {
      records.forEach(function (record) {
        if (record.type === "childList") {
          record.addedNodes.forEach(function (node) {
            if (node && node.nodeType === Node.ELEMENT_NODE) injectToolbarExtrasIn(node);
          });
        }
        if (record.type === "attributes" && record.target && record.target.nodeType === Node.ELEMENT_NODE) {
          var target = record.target;
          var toolbar = target.closest ? target.closest(".aero-rich-toolbar") : null;
          if (toolbar) injectToolbarExtras(toolbar);
        }
      });
    });
    mo.observe(document.body || document.documentElement, {
      childList: true,
      subtree: true,
      attributes: true,
      attributeFilter: ["data-target"]
    });
  })();
</script>
</body>
</html>
