;(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

Sem votar, Boulos quer tirar São Paulo de Covas em pleito com vices no foco

Eduardo Gayer

São Paulo

29/11/2020 09h38

Considerada a "joia da coroa" por pavimentar os caminhos das eleições estadual e presidencial, a disputa pela prefeitura de São Paulo neste ano, amena no início, esquentou na reta final em um pleito com vices sob holofotes. Ainda que mantenha vantagem em pesquisas de intenção de voto, o candidato à reeleição Bruno Covas (PSDB) pode perder o cargo para Guilherme Boulos (PSOL), filiado a um partido que nunca esteve no segundo turno da capital e impossibilitado de votar. Ele está em isolamento social após testar positivo para covid-19.

Com a vitrine do combate à pandemia, Covas quer repetir o feito inédito de Gilberto Kassab (PSD) e se tornar o segundo prefeito a conquistar a reeleição na história da capital paulista. Ele conta com o apoio do governador João Doria (PSDB), mas manteve o aliado, com rejeição significativa na capital, sob discrição desde a pré-campanha. Embarcaram no voo tucano candidatos derrotados no primeiro turno, como Celso Russomanno (Republicanos) e Joice Hasselmann (PSL).

Já Boulos chega às urnas tentando guinar o maior colégio eleitoral do País de novo à esquerda. Tem apoio de lideranças políticas como o ex-presidente Luiz Inácio Lula da Silva (PT) e o ex-governador do Ceará Ciro Gomes (PDT). Os candidatos do primeiro turno Jilmar Tatto (PT), Orlando Silva (PCdoB) e Marina Helou (Rede) também estão com Boulos. "A coalizão que PSOL construiu no segundo turno foi mais ampla do que estava acostumada a fazer", comentou ao Broadcast Político a cientista política Graziella Testa, da Fundação Getulio Vargas, ressaltando o fim da dicotomia PT x PSDB no município.

Se os desdobramentos da covid-19 desenharam um cenário favorável para prefeitos já nos cargos e experientes em todo o País, como diz a maioria dos especialistas, o líder do Movimento dos Trabalhadores Sem Teto (MTST), sem nunca ter conquistado um cargo eletivo, quer surpreender e se tornar exceção à regra.

O afunilamento da corrida na reta final, aferido em pesquisas de intenção de voto, veio junto a certo ganho de atenções dos candidatos a vice-prefeito. Polêmicas envolvendo o companheiro de chapa de Bruno Covas, Ricardo Nunes (MDB), aram a ser cada vez mais exploradas pela campanha adversária. Em 2011, a esposa de Nunes registrou um boletim de ocorrência por agressão contra o hoje vereador. Ainda pesa sobre ele a revelação, feita pelo Estadão/Broadcast, de que uma empresa de sua família recebeu dinheiro de creches conveniadas pela prefeitura para a prestação de serviços sem licitação.

Como mostrou o Broadcast Político, o PSDB, em reação, patrocinou anúncios na internet com informações positivas sobre o emedebista, estratégia confirmada à reportagem pela campanha.

Ao mesmo tempo em que trouxe Nunes para o debate, o PSOL ampliou o destaque dado à vice de Boulos, a ex-prefeita e deputada federal Luiza Erundina (PSOL). Ela tem grande recall nas periferias e, que completa 86 anos na próxima segunda-feira, assumiu a campanha de rua na véspera da eleição, quando Boulos precisou se isolar.

Errata: este conteúdo foi atualizado
Uma versão anterior deste texto informava incorretamente que Joice Hasselmann é do PT. Na verdade, é do PSL. A informação foi corrigida.