;(function() { window.createMeasureObserver = (measureName) => { var markPrefix = `_uol-measure-${measureName}-${new Date().getTime()}`; performance.mark(`${markPrefix}-start`); return { end: function() { performance.mark(`${markPrefix}-end`); performance.measure(`uol-measure-${measureName}`, `${markPrefix}-start`, `${markPrefix}-end`); performance.clearMarks(`${markPrefix}-start`); performance.clearMarks(`${markPrefix}-end`); } } }; /** * Gerenciador de eventos */ window.gevent = { stack: [], RUN_ONCE: true, on: function(name, callback, once) { this.stack.push([name, callback, !!once]); }, emit: function(name, args) { for (var i = this.stack.length, item; i--;) { item = this.stack[i]; if (item[0] === name) { item[1](args); if (item[2]) { this.stack.splice(i, 1); } } } } }; var runningSearch = false; var hadAnEvent = true; var elementsToWatch = window.elementsToWatch = new Map(); var innerHeight = window.innerHeight; // timestamp da última rodada do requestAnimationFrame // É usado para limitar a procura por elementos visíveis. var lastAnimationTS = 0; // verifica se elemento está no viewport do usuário var isElementInViewport = function(el) { var rect = el.getBoundingClientRect(); var clientHeight = window.innerHeight || document.documentElement.clientHeight; // renderizando antes, evitando troca de conteúdo visível no chartbeat-related-content if(el.className.includes('related-content-front')) return true; // garante que usa ao mínimo 280px de margem para fazer o lazyload var margin = clientHeight + Math.max(280, clientHeight * 0.2); // se a base do componente está acima da altura da tela do usuário, está oculto if(rect.bottom < 0 && rect.bottom > margin * -1) { return false; } // se o topo do elemento está abaixo da altura da tela do usuário, está oculto if(rect.top > margin) { return false; } // se a posição do topo é negativa, verifica se a altura dele ainda // compensa o que já foi scrollado if(rect.top < 0 && rect.height + rect.top < 0) { return false; } return true; }; var asynxNextFreeTime = () => { return new Promise((resolve) => { if(window.requestIdleCallback) { window.requestIdleCallback(resolve, { timeout: 5000, }); } else { window.requestAnimationFrame(resolve); } }); }; var asyncValidateIfElIsInViewPort = function(promise, el) { return promise.then(() => { if(el) { if(isElementInViewport(el) == true) { const cb = elementsToWatch.get(el); // remove da lista para não ser disparado novamente elementsToWatch.delete(el); cb(); } } }).then(asynxNextFreeTime); }; // inicia o fluxo de procura de elementos procurados var look = function() { if(window.requestIdleCallback) { window.requestIdleCallback(findByVisibleElements, { timeout: 5000, }); } else { window.requestAnimationFrame(findByVisibleElements); } }; var findByVisibleElements = function(ts) { var elapsedSinceLast = ts - lastAnimationTS; // se não teve nenhum evento que possa alterar a página if(hadAnEvent == false) { return look(); } if(elementsToWatch.size == 0) { return look(); } if(runningSearch == true) { return look(); } // procura por elementos visíveis apenas 5x/seg if(elapsedSinceLast < 1000/5) { return look(); } // atualiza o último ts lastAnimationTS = ts; // reseta status de scroll para não entrar novamente aqui hadAnEvent = false; // indica que está rodando a procura por elementos no viewport runningSearch = true; const done = Array.from(elementsToWatch.keys()).reduce(asyncValidateIfElIsInViewPort, Promise.resolve()); // obtém todos os elementos que podem ter view contabilizados //elementsToWatch.forEach(function(cb, el) { // if(isElementInViewport(el) == true) { // // remove da lista para não ser disparado novamente // elementsToWatch.delete(el); // cb(el); // } //}); done.then(function() { runningSearch = false; }); // reinicia o fluxo de procura look(); }; /** * Quando o elemento `el` entrar no viewport (-20%), cb será disparado. */ window.lazyload = function(el, cb) { if(el.nodeType != Node.ELEMENT_NODE) { throw new Error("element parameter should be a Element Node"); } if(typeof cb !== 'function') { throw new Error("callback parameter should be a Function"); } elementsToWatch.set(el, cb); } var setEvent = function() { hadAnEvent = true; }; window.addEventListener('scroll', setEvent, { capture: true, ive: true }); window.addEventListener('click', setEvent, { ive: true }); window.addEventListener('resize', setEvent, { ive: true }); window.addEventListener('load', setEvent, { once: true, ive: true }); window.addEventListener('DOMContentLoaded', setEvent, { once: true, ive: true }); window.gevent.on('allJSLoadedAndCreated', setEvent, window.gevent.RUN_ONCE); // inicia a validação look(); })();
  • AssineUOL
Topo

SP: Telão do TRE para por 4 horas, e funcionários se constragem com memes

O presidente do TRE-SP, desembargador Waldir Sebastião de Nuevo Campos, sofreu para explicar o motivo da lentidão - Marcelo Oliveira/UOL
O presidente do TRE-SP, desembargador Waldir Sebastião de Nuevo Campos, sofreu para explicar o motivo da lentidão Imagem: Marcelo Oliveira/UOL

Marcelo Oliveira

Do UOL, em São Paulo

15/11/2020 23h47

No Brasil houve lentidão na totalização dos votos, e o assunto viralizou. Mas em São Paulo foi pior. No TRE-SP (Tribunal Regional Eleitoral de São Paulo), o telão congelou por quatro horas e meia, sem nenhuma atualização da apuração.

No início tudo parecia perfeito. Às 17h, a votação foi encerrada. Às 17h32, o TRE-SP divulgou a primeira parcial dos votos na capital, com 0,39% das urnas apuradas —Bruno Covas (PSDB) liderava com 32,5% dos votos válidos, e Guilherme Boulos (PSOL) aparecia em segundo, com 20,33%.

Poucos depois das 17h30, o presidente do TRE-SP, Waldir Sebastião de Nuevo Campos, deu uma entrevista coletiva protocolar e quase sem graça. Leu um discurso pronto, agradeceu os funcionários do tribunal e seus colegas desembargadores por uma "eleição sem ocorrências importantes".

Tudo indicava que a noite no TRE seria tranquila, tanto que não havia previsão de novos boletins e os equipamentos de som para a entrevista foram desligados e retirados após a coletiva do desembargador Nuevo Campos.

Porém, nada aconteceu na tela do TRE-SP depois daquela primeira parcial com 0,39% das urnas apuradas. Uma hora e meia depois, o TRE-SP informava, por meio da assessoria, que o problema era no TSE (Tribunal Superior Eleitoral) em Brasília, a quem a reportagem deveria se dirigir.

Às 20h, tudo seguia parado, mas havia a possibilidade de que Nuevo Campos falasse com os jornalistas para explicar o que estava acontecendo.

Às 20h49, o desembargador voltou. Tirou a máscara, e o semblante era bem mais tenso do que mais cedo. Explicou que a apuração estava a toda e que os dados eram enviados para Brasília, mas o TRE-SP não tinha o aos dados totalizados no TSE. A justificativa foi a de que, nas eleições deste ano, ficou estabelecido que o TSE divulgaria os dados e as parciais.

Ao final da entrevista, o presidente do TRE-SP revelou que houve uma pane no processador do TSE que cuidava dos dados de São Paulo. A informação fora ada pelo próprio tribunal localizado em Brasília, e as atualizações voltariam "em meia hora ou uma hora".

Tensão e memes

Às 21h, a tensão era grande entre os funcionários do TRE-SP. Para se ter uma ideia, na eleição municipal de 2016 o vencedor fora anunciado às 20h34. Quatro anos depois, eles liam constrangidos memes avacalhando a eficiência brasileira na contagem de votos.

O calor era infernal, por mudanças realizadas no hall do TRE em decorrência da pandemia (e o espaço foi aberto e não há mais ar condicionado). Com a tensão e a máscara, o calor só aumentava.

Enfim, às 22h, o placar da contagem dos votos descongelou nos telões do TRE-SP. Com 37,7% das urnas apuradas, Covas seguia liderando, com 32,79% dos votos, seguido por Boulos, com 20,32%.

Público seguiu sem o às atualizações

Quinze minutos a tensão voltou. Apesar de os dados que os jornalistas viam no TRE-SP, os colegas na redação seguiam sem á-los pela internet.

O trabalho ou a ser feito à moda antiga, com os jornalistas mandando as novas totalizações para as redações disponibilizarem ao público.

Às 22h14, os números mudaram de novo. Com 57,7% das urnas apuradas, o placar era semelhante ao do início: Covas tinha 32,8% e Boulos, 20,3%.

Definitivamente, 2020 não era 2016. Naquele ano, o resultado na Capital havia sido proclamado às 20h34. Dória e Covas haviam sido eleitos com 53,3%. Este ano, tudo indica, Covas disputará o segundo turno com Boulos.

Ninguém no TRE-SP sabe por que os jornalistas presentes no tribunal veem as atualizações, e os demais cidadãos não recebem os novos dados em seus celulares e computadores.

Assim que a tela do TRE-SP registrou 99,67% das urnas apuradas, o presidente Nuevo Campos voltou para conversar com os jornalistas. "É como meu filho diz: 'quando a gente grita gol antes da hora a bola não entra'."