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

Liverpool

Com time misto e gol de Salah, Liverpool vence, mantém 100% e elimina Milan

Salah comemora gol do Liverpool contra o Milan pela Liga dos Campeões - MIGUEL MEDINA / AFP
Salah comemora gol do Liverpool contra o Milan pela Liga dos Campeões Imagem: MIGUEL MEDINA / AFP

07/12/2021 18h55

O Liverpool mostrou toda sua força na tarde desta terça-feira ao vencer o Milan por 2 a 1, no San Siro, na última rodada da fase de grupos da Liga dos Campeões. Os ingleses entraram em campo já classificados e nem mesmo o time misto atrapalhou o objetivo de conseguir manter os 100% de aproveitamento na competição. Pior para os italianos que com os demais resultados ficaram na lanterna e fora até da Liga Europa. Salah e Origi marcaram para os visitantes e Tomori descontou para os donos da casa.

O "mistão" do Liverpool era daqueles que certamente dariam muito trabalho —basta dizer que Salah e Mané estavam no comando do ataque dos Reds. O Milan, que precisava vencer para manter viva as chances de classificação, portanto, não teria vida fácil. Além do triunfo, os italianos precisavam secar o Porto, na sua frente no grupo B e que recebia o Atlético de Madri —os três tinham chances reais de chegar às oitavas dependendo dos resultados.

O jogo começou muito disputado, embora com pouquíssimas chances claras de gol. O Milan tentava furar a defesa do Liverpool, que respondia nos contra-ataques. Aos 27min, Ibra recebeu dentro da área, demorou a finalizar e ficou com escanteio. Após a cobrança, Alisson fez grande defesa em desvio de Romagnolli, mas Tomori apareceu para completar o rebote e abrir o placar: 1 a 0. Com o Porto empatando com o Atlético, os italianos assumiam momentaneamente a segunda colocação e, consequentemente, conquistavam a sonhada vaga.

Mas a alegria durou pouco tempo. Lembra que o misto do Liverpool veio com os craques do time e com o objetivo de atrapalhar os planos do Milan? Então, Salah mostrou seu faro de artilheiro para deixar tudo igual, aos 35min. Chamberlain chutou para defesa de Maignan, que espalmou nos pés do egípcio: 1 a 1. Mesmo com vários reservas, os visitantes eram mais perigosos e terminaram o primeiro tempo com oito finalizações, contra duas dos donos da casa.

Após o intervalo o jogo seguiu com o mesmo roteiro. Mais perigoso, o Liverpool parecia perto de chegar à virada apesar da frequente presença do Mila no campo de ataque. E foi justamente o que aconteceu. Aos 9min, Mané invadiu a área e chutou para defesa de Maignan, que novamente deu rebote. Origi, esperto, cabeceou e balançou a rede: 2 x 1. Quase no mesmo momento, o Atlético de Madri abriu o placar em Portugal e ou da lanterna do grupo para a segunda posição, o que o deixava com a classificação —ainda fez mais dois gols e garantiu o triunfo.

Em vantagem, o Liverpool conseguiu cozinhar o Milan, que pouco perigo ofereceu no segundo tempo —quando ofereceu parou em Alisson. Festa para os ingleses e uma tragédia completa para os italianos, que acabaram na lanterna do grupo e ainda viram o rival local, Internazionale, avançar para as oitavas da competição. E melhor para o Atlético Madri que fez sua parte ao vencer o Porto por 3 a 1 e se classificou com a segunda posição do grupo —os portugueses ficaram com a vaga na Liga Europa.

Liverpool