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

Esse conteúdo é antigo

Bolsonaristas rezam e assistem à última live sob chuva no Alvorada

A última live de Jair Bolsonaro (PL) como presidente da República foi acompanhada com melancolia por seus apoiadores em frente ao Palácio da Alvorada, em Brasília - Leonardo Martins/UOL
A última live de Jair Bolsonaro (PL) como presidente da República foi acompanhada com melancolia por seus apoiadores em frente ao Palácio da Alvorada, em Brasília Imagem: Leonardo Martins/UOL

Do UOL, em Brasília

30/12/2022 11h57Atualizada em 30/12/2022 13h34

A última live de Jair Bolsonaro (PL) como presidente da República foi acompanhada com melancolia por seus apoiadores em frente ao Palácio da Alvorada, em Brasilia. Foi da residência oficial que Bolsonaro fez a entrada ao vivo hoje pela manhã.

Com bandeiras do Brasil e vestidas de verde e amarelo, cerca de 20 pessoas compareceram à parte da frente do Alvorada para acompanhar o discurso em seus celulares.

Antes do pronunciamento começar, eles se juntaram em uma roda e, de mãos dadas, rezaram a oração do Pai Nosso em voz alta.

Durante a live, o presidente criticou "ato terrorista no aeroporto de Brasília", defendeu seu mandato e, chorando, pediu calma aos apoiadores a partir de 1º de janeiro: "Não tem tudo ou nada".

Assim que Bolsonaro terminou a transmissão, o tempo fechou e uma forte chuva atingiu a região. A grande maioria dos manifestantes foi embora, mas poucos decidiram ficar.

Embaixo da chuva, um homem com capa e uma mulher envolta a uma bandeira do Brasil ficaram olhando estáticos para a residência oficial. Depois, caminharam até uma árvore junto a outros manifestantes que se escondiam da chuva.

casal_chuva - Leonardo Martins/UOL - Leonardo Martins/UOL
Embaixo da chuva, um homem com capa de chuva e uma mulher envolta com a bandeira do Brasil ficaram olhando estáticos para a residência oficial após fala de Bolsonaro
Imagem: Leonardo Martins/UOL

Pouco tempo depois, outro homem, de camisa verde e amarelo, cruzou os braços e abaixou a cabeça em frente à residência oficial, aparentemente resignado. Até pouco antes do meio-dia, cerca de seis apoiadores seguiam em frente ao Alvorada.