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

Boulos terá mais dificuldade para ter maioria na Câmara do que Covas

Bruno Covas ()à esq.) e Guilherme Boulos, que vão disputar o segundo turno em São Paulo - Arquivo/O Globo
Bruno Covas ()à esq.) e Guilherme Boulos, que vão disputar o segundo turno em São Paulo Imagem: Arquivo/O Globo

Guilherme Botacini

Colaboração para o UOL, em São Paulo

16/11/2020 18h10

Os dois candidatos à prefeitura de São Paulo que vão disputar o segundo turno terão de fazer novas alianças para conquistar a maioria da Câmara Municipal de São Paulo. O cenário, porém, se mostra mais complicado para Guilherme Boulos (PSOL) do que para Bruno Covas (PSDB).

Nenhuma das coligações atingiu os 28 vereadores necessários para compor a maioria da casa legislativa municipal, que tem um total de 55 cadeiras. A coligação de Covas elegeu 25 vereadores e a de Boulos, apenas seis.

É verdade que Boulos conta com o apoio de primeira hora da bancada do PT, a maior da nova câmara ao lado do PSDB de Covas, e, por isso, pularia em tese para um total de 14 cadeiras.

O próprio partido do candidato da esquerda, o PSOL, foi o grande vencedor na casa triplicando sua presença e ando de dois para seis vereadores.

Por outro lado, o PSDB foi o grande perdedor na casa e enxugou a bancada para oito vereadores, três a menos do que os 11 de 2016, quando foi o partido com mais eleitos.

À época, os tucanos também tiveram que aumentar o leque de alianças com uma câmara inicialmente minoritária para o início do mandato do então prefeito eleito de São Paulo, João Doria (PSDB) — coincidentemente o mesmo número que a coligação de Covas elegeu neste domingo, 25 vereadores.

A vida de Covas certamente seria mais fácil que a de Boulos na relação com o legislativo.

O tucano não deve ter dificuldade de agregar candidatos de partidos externos à coligação e aumentar sua bancada.

O PSD, por exemplo, que não estava na coligação, elegeu três vereadores e já seria suficiente. Apesar das críticas do candidato Andrea Matarazzo (PSD), que terminou com 1,55% dos votos, e é uma dissidência do PSDB, seu partido esteve na base de apoio de Doria em 2018.

Em entrevista hoje ao UOL, Covas declarou que vai manter conversas com os adversários derrotados Márcio França (PSB) e Celso Russomanno (Republicanos) em busca de apoio no segundo turno.

Boulos, por outro lado, precisa praticamente duplicar sua base. Para arregimentar esse apoio fora da coligação de Covas, o psolista tem a improvável missão de agregar quase todas as cadeiras remanescentes, algumas de partidos no distante oposto do espectro político: Novo, PSL (que lançou Joice Hasselmann), Patriota (que lançou Arthur do Val) e Republicanos (de Russomanno).