Rumo ao Código: Guia Prático para Instalar o Visual Studio
Domine ML.NET: Treine Modelos de Classificação em C#
Machine Learning não é mais exclusividade de Python! Com o ML.NET
🌌 Clustering com ML.NET: Agrupe Dados sem Supervisão!Descubra como aplicar clustering com ML.NET para segmentar dados sem rótulos, com exemplos práticos em C# e estratégias para otimizar resultados., você pode criar modelos de classificação
Como Escolher o Operador Correto em Diferentes Cenários de ConsultaAprenda a selecionar os operadores LINQ ideais para filtrar, projetar, ordenar e agrupar dados, garantindo código claro e aplicação eficiente. diretamente no ecossistema .NET, usando suas habilidades em C#. Neste artigo, vamos treinar um modelo para prever se um e-mail é spam ou não – um problema clássico de classificação
Como Escolher o Operador Correto em Diferentes Cenários de ConsultaAprenda a selecionar os operadores LINQ ideais para filtrar, projetar, ordenar e agrupar dados, garantindo código claro e aplicação eficiente. binária. Você vai aprender:
- Como estruturar dados para
🔄 Loops em C#: Repita Tarefas sem Enlouquecer (Com for e while!)Descubra como automatizar repetições em C# utilizando loops for e while com exemplos práticos que evitam erros e otimizam seu código. Aprenda mais! treinamento - Escolher algoritmos adequados
- Avaliar a eficácia do modelo
🎭 MVVM: Separe Regras de Negócio da Interface Graficamente!Descubra como o padrão MVVM separa a interface e a lógica de negócio, facilitando testes e manutenção, com exemplos e dicas práticas para seu projeto. - Integrar o modelo
🎭 MVVM: Separe Regras de Negócio da Interface Graficamente!Descubra como o padrão MVVM separa a interface e a lógica de negócio, facilitando testes e manutenção, com exemplos e dicas práticas para seu projeto. em aplicações reais
Pronto para
🔄 Loops em C#: Repita Tarefas sem Enlouquecer (Com for e while!)Descubra como automatizar repetições em C# utilizando loops for e while com exemplos práticos que evitam erros e otimizam seu código. Aprenda mais! transformar dados em decisões inteligentes? 🚀
Índice🔗
- O que é Classificação
Como Escolher o Operador Correto em Diferentes Cenários de ConsultaAprenda a selecionar os operadores LINQ ideais para filtrar, projetar, ordenar e agrupar dados, garantindo código claro e aplicação eficiente.? - Configurando o Ambiente
🧠 IA Nativa: Integre OpenAI direto no .NET!Aprenda a integrar o SDK oficial da OpenAI no .NET, configurando ambiente, chamadas de API, chatbots e melhores práticas para aplicações inteligentes. - Preparando os Dados
- Treinando o Modelo
🎭 MVVM: Separe Regras de Negócio da Interface Graficamente!Descubra como o padrão MVVM separa a interface e a lógica de negócio, facilitando testes e manutenção, com exemplos e dicas práticas para seu projeto. - Avaliando o Desempenho
⏱️ Testes de Performance: Garanta Velocidade Além da Funcionalidade!Descubra como medir, diagnosticar e otimizar performance em aplicações .NET com dicas práticas e ferramentas essenciais para devs. - Usando o Modelo
🎭 MVVM: Separe Regras de Negócio da Interface Graficamente!Descubra como o padrão MVVM separa a interface e a lógica de negócio, facilitando testes e manutenção, com exemplos e dicas práticas para seu projeto. em Produção
O que é Classificação?🔗
Classificação
Como Escolher o Operador Correto em Diferentes Cenários de ConsultaAprenda a selecionar os operadores LINQ ideais para filtrar, projetar, ordenar e agrupar dados, garantindo código claro e aplicação eficiente. é um tipo de aprendizado supervisionado onde o modelo
🎭 MVVM: Separe Regras de Negócio da Interface Graficamente!Descubra como o padrão MVVM separa a interface e a lógica de negócio, facilitando testes e manutenção, com exemplos e dicas práticas para seu projeto. aprende a prever categorias (ex: "spam" ou "não spam") com base em dados históricos.
Imagine um filtro
🎲 Desafio: Analise Dados de Vendas com LINQ e Coleções!Aprenda a usar coleções e LINQ em C# para analisar vendas, filtrar dados e extrair insights estratégicos que otimizem decisões e impulsionem seu negócio. de e-mails que analisa:
- Palavras-chave
🗂️ Dicionários: Acesse Dados por Chaves como um Mestre dos HashMaps!Aprenda a usar dicionários em C# de modo prático e eficiente. Nosso tutorial mostra criação, acesso e otimização para manipular dados com segurança. no assunto ("oferta", "grátis") - Remetente desconhecido
- Links suspeitos
O modelo
🎭 MVVM: Separe Regras de Negócio da Interface Graficamente!Descubra como o padrão MVVM separa a interface e a lógica de negócio, facilitando testes e manutenção, com exemplos e dicas práticas para seu projeto. atribui uma probabilidade a cada categoria, ajudando na tomada de decisão.
Configurando o Ambiente🔗
Passo 1: Instale os Pacotes Necessários
Install-Package Microsoft.ML
Passo 2: Estrutura do Projeto
Crie classes
🏗️ Classes vs. Structs: Quando Usar Cada Uma (e Não Quebrar a Cabeça)!Descubra como escolher entre classes e structs em C#. Aprenda sobre alocação de memória, passagem por valor e referência, e performance nesta explicação clara. para representar os dados:
public class EmailData
{
[LoadColumn(0)] public string Texto { get; set; }
[LoadColumn(1)] public bool IsSpam { get; set; }
}
public class EmailPrediction : EmailData
{
[ColumnName("PredictedLabel")] public bool Predicao { get; set; }
public float Probabilidade { get; set; }
}
Preparando os Dados🔗
Carregue o Dataset
var mlContext = new MLContext();
var data = mlContext.Data.LoadFromTextFile<EmailData>("emails.csv", separatorChar: ',');
Exemplo de emails.csv:
Texto,IsSpam
"Ganhe um iPhone grátis!!!",True
"Reunião de equipe amanhã",False
Divida em Treino/Teste
var split = mlContext.Data.TrainTestSplit(data, testFraction: 0.2);
Pré-processamento
Converta texto
📝 Strings em C#: Manipule Textos como um Mestre dos Caracteres!Aprenda a dominar os segredos das strings em C# com técnicas de manipulação, concatenação, interpolação e boas práticas, impulsionando sua performance. em vetores numéricos:
var pipeline = mlContext.Transforms.Text.FeaturizeText("Features", nameof(EmailData.Texto))
.Append(mlContext.Transforms.NormalizeMinMax("Features"))
.AppendCacheCheckpoint(mlContext);
Treinando o Modelo🔗
Escolha um algoritmo (ex: SdcaLogisticRegression) e
📊 Behavior-Driven Development: Testes que Todo Mundo Entende!Descubra como o BDD transforma testes em linguagens acessíveis. Aprenda a usar SpecFlow em C# para criar testes claros, colaborativos e sem ambiguidades. treine:
var trainer = mlContext.BinaryClassification.Trainers.SdcaLogisticRegression();
var trainingPipeline = pipeline.Append(trainer);
var model = trainingPipeline.Fit(split.TrainSet);
Por que o SDCA?
- Eficiente para dados de alta dimensão (como texto
📝 Strings em C#: Manipule Textos como um Mestre dos Caracteres!Aprenda a dominar os segredos das strings em C# com técnicas de manipulação, concatenação, interpolação e boas práticas, impulsionando sua performance.) - Bom para
🔄 Loops em C#: Repita Tarefas sem Enlouquecer (Com for e while!)Descubra como automatizar repetições em C# utilizando loops for e while com exemplos práticos que evitam erros e otimizam seu código. Aprenda mais! datasets médios (até 10GB)
Avaliando o Desempenho🔗
Teste o modelo
🎭 MVVM: Separe Regras de Negócio da Interface Graficamente!Descubra como o padrão MVVM separa a interface e a lógica de negócio, facilitando testes e manutenção, com exemplos e dicas práticas para seu projeto. com dados não vistos:
var predictions = model.Transform(split.TestSet);
var metrics = mlContext.BinaryClassification.Evaluate(predictions);
Console.WriteLine($"Acurácia: {metrics.Accuracy:P2}");
Console.WriteLine($"AUC: {metrics.AreaUnderRocCurve:P2}");
| Métrica | Descrição |
|---|---|
| Acurácia | Porcentagem de acertos totais |
| AUC-ROC | Capacidade de distinguir classes |
| F1-Score | Balanceamento entre precisão e recall |
Usando o Modelo em Produção🔗
Salve o Modelo
mlContext.Model.Save(model, split.TrainSet.Schema, "modelo.zip");
Carregue e Faça Previsões
var loadedModel = mlContext.Model.Load("modelo.zip", out var schema);
var predictionEngine = mlContext.Model.CreatePredictionEngine<EmailData, EmailPrediction>(loadedModel);
var novoEmail = new EmailData { Texto = "Promoção exclusiva para você!" };
var predicao = predictionEngine.Predict(novoEmail);
Console.WriteLine($"É spam? {predicao.Predicao} (Probabilidade: {predicao.Probabilidade:P2})");
Conclusão🔗
Você treinou seu primeiro modelo de classificação
Como Escolher o Operador Correto em Diferentes Cenários de ConsultaAprenda a selecionar os operadores LINQ ideais para filtrar, projetar, ordenar e agrupar dados, garantindo código claro e aplicação eficiente. com ML.NET! Agora, experimente:
- Trocar o algoritmo (
Trainers.LbfgsLogisticRegression()) - Adicionar
📦 List<T>: Dinamismo além dos Arrays!Descubra como utilizar List<T> em C# de forma eficiente. Aprenda a criar, manipular e otimizar listas para diferentes cenários com exemplos práticos. mais features (ex: comprimento do texto) - Testar com datasets reais (ex: Spam Assassin Corpus
O próximo passo? Explore pipelines
Operações de agregação e pipelines: extraindo insights dos dadosAprenda detalhadamente como utilizar operações de agregação no MongoDB com C#. Descubra dicas, estágios e práticas para extrair insights valiosos. de processamento complexos para
🔄 Loops em C#: Repita Tarefas sem Enlouquecer (Com for e while!)Descubra como automatizar repetições em C# utilizando loops for e while com exemplos práticos que evitam erros e otimizam seu código. Aprenda mais! lidar com dados mais desafiadores! 🔍
ML.NET 101: Treine seu Primeiro Modelo de Classificação!🔗
Machine Learning (ML) é uma das áreas mais fascinantes da tecnologia hoje, e o ML.NET traz essa magia para o ecossistema .NET. Se você está começando ou quer migrar para o mundo da IA, este guia prático vai te ajudar a treinar seu primeiro modelo de classificação
Como Escolher o Operador Correto em Diferentes Cenários de ConsultaAprenda a selecionar os operadores LINQ ideais para filtrar, projetar, ordenar e agrupar dados, garantindo código claro e aplicação eficiente. usando ML.NET. Vamos desde a preparação dos dados até a avaliação do modelo, tudo com exemplos reais e direto ao ponto.
Sumário🔗
- O que é ML.NET
🌌 Clustering com ML.NET: Agrupe Dados sem Supervisão!Descubra como aplicar clustering com ML.NET para segmentar dados sem rótulos, com exemplos práticos em C# e estratégias para otimizar resultados.? - Preparando o Ambiente
- Entendendo o Problema de Classificação
Como Escolher o Operador Correto em Diferentes Cenários de ConsultaAprenda a selecionar os operadores LINQ ideais para filtrar, projetar, ordenar e agrupar dados, garantindo código claro e aplicação eficiente. - Preparando os Dados
- Treinando o Modelo
🎭 MVVM: Separe Regras de Negócio da Interface Graficamente!Descubra como o padrão MVVM separa a interface e a lógica de negócio, facilitando testes e manutenção, com exemplos e dicas práticas para seu projeto. - Avaliando o Modelo
🎭 MVVM: Separe Regras de Negócio da Interface Graficamente!Descubra como o padrão MVVM separa a interface e a lógica de negócio, facilitando testes e manutenção, com exemplos e dicas práticas para seu projeto. - Usando o Modelo
🎭 MVVM: Separe Regras de Negócio da Interface Graficamente!Descubra como o padrão MVVM separa a interface e a lógica de negócio, facilitando testes e manutenção, com exemplos e dicas práticas para seu projeto. para Previsões - Conclusão
O que é ML.NET?🔗
ML.NET é um framework de machine learning de código aberto desenvolvido pela Microsoft para desenvolvedores .NET
💰 Salários .NET: Como Negociar seu Valor!Aprenda estratégias comprovadas para negociar salários e valorizar sua carreira como desenvolvedor .NET com dados reais e dicas práticas.. Ele permite que você crie modelos de ML personalizados sem precisar sair do ambiente que já conhece (C# e .NET). Com ele, você pode resolver problemas como:
- Classificação
Como Escolher o Operador Correto em Diferentes Cenários de ConsultaAprenda a selecionar os operadores LINQ ideais para filtrar, projetar, ordenar e agrupar dados, garantindo código claro e aplicação eficiente.: Prever categorias (ex: spam ou não spam). - Regressão
📈 Regression: Previsões Numéricas com Redes Neurais!Descubra como utilizar redes neurais no ML.NET para prever valores, dos imóveis a vendas, com exemplos práticos e técnicas avançadas de regressão.: Prever valores
🏗️ Classes vs. Structs: Quando Usar Cada Uma (e Não Quebrar a Cabeça)!Descubra como escolher entre classes e structs em C#. Aprenda sobre alocação de memória, passagem por valor e referência, e performance nesta explicação clara. numéricos (ex: preço de uma casa). - Clustering
🌌 Clustering com ML.NET: Agrupe Dados sem Supervisão!Descubra como aplicar clustering com ML.NET para segmentar dados sem rótulos, com exemplos práticos em C# e estratégias para otimizar resultados.: Agrupar
🎲 Desafio: Analise Dados de Vendas com LINQ e Coleções!Aprenda a usar coleções e LINQ em C# para analisar vendas, filtrar dados e extrair insights estratégicos que otimizem decisões e impulsionem seu negócio. dados semelhantes. - Recomendação: Sugerir produtos
🎲 Desafio: Analise Dados de Vendas com LINQ e Coleções!Aprenda a usar coleções e LINQ em C# para analisar vendas, filtrar dados e extrair insights estratégicos que otimizem decisões e impulsionem seu negócio. ou conteúdo.
Neste artigo, focaremos em classificação
Como Escolher o Operador Correto em Diferentes Cenários de ConsultaAprenda a selecionar os operadores LINQ ideais para filtrar, projetar, ordenar e agrupar dados, garantindo código claro e aplicação eficiente., um dos problemas mais comuns em ML.
Preparando o Ambiente🔗
Antes de começar, você precisa instalar
Instalando e configurando o MongoDB no Windows e Linux para uso com C#Aprenda a instalar e configurar o MongoDB no Windows e Linux, integrando-o com projetos C# para ambientes de desenvolvimento eficientes. o ML.NET
🌌 Clustering com ML.NET: Agrupe Dados sem Supervisão!Descubra como aplicar clustering com ML.NET para segmentar dados sem rótulos, com exemplos práticos em C# e estratégias para otimizar resultados. no seu projeto. Se estiver usando o Visual Studio
🛠️ Instalação do Visual Studio: Prepare sua Nave para Decolar!Prepare seu ambiente de desenvolvimento com o Visual Studio em uma aventura C#. Este tutorial prático ensina a instalar, configurar e personalizar sua IDE., siga os passos abaixo:
1. Crie um novo projeto
🤝 GitHub Básico: Versionamento para Iniciantes!Descubra como o GitHub facilita colaboração, versionamento e organização de código com este tutorial prático e essencial para desenvolvedores iniciantes. do tipo Console App.
2. Adicione o pacote NuGet
📦 Crie um Pacote NuGet: Compartilhe seu Código!Aprenda a empacotar, configurar e publicar pacotes NuGet em C# passo a passo, com dicas profissionais e práticas recomendadas para seu projeto. do ML.NET:
dotnet add package Microsoft.ML
3. Pronto! Agora você tem tudo o que precisa para
🔄 Loops em C#: Repita Tarefas sem Enlouquecer (Com for e while!)Descubra como automatizar repetições em C# utilizando loops for e while com exemplos práticos que evitam erros e otimizam seu código. Aprenda mais! começar.
Entendendo o Problema de Classificação🔗
Vamos resolver um problema clássico de classificação
Como Escolher o Operador Correto em Diferentes Cenários de ConsultaAprenda a selecionar os operadores LINQ ideais para filtrar, projetar, ordenar e agrupar dados, garantindo código claro e aplicação eficiente.: prever se uma flor é da espécie Iris Setosa, Iris Versicolor ou Iris Virginica com base em suas características (comprimento e largura das pétalas e
📊 Behavior-Driven Development: Testes que Todo Mundo Entende!Descubra como o BDD transforma testes em linguagens acessíveis. Aprenda a usar SpecFlow em C# para criar testes claros, colaborativos e sem ambiguidades. sépalas).
Esse é um exemplo clássico conhecido como Dataset Iris, que é amplamente utilizado para
🔄 Loops em C#: Repita Tarefas sem Enlouquecer (Com for e while!)Descubra como automatizar repetições em C# utilizando loops for e while com exemplos práticos que evitam erros e otimizam seu código. Aprenda mais! testes iniciais em ML.
Preparando os Dados🔗
1. Baixe o Dataset Iris:
- Você pode encontrar o dataset aqui.
- Ou use este exemplo simplificado em CSV:
SepalLength,SepalWidth,PetalLength,PetalWidth,Label
5.1,3.5,1.4,0.2,Iris-setosa
4.9,3.0,1.4,0.2,Iris-setosa
7.0,3.2,4.7,1.4,Iris-versicolor
6.4,3.2,4.5,1.5,Iris-versicolor
6.3,3.3,6.0,2.5,Iris-virginica
5.8,2.7,5.1,1.9,Iris-virginica
2. Crie uma Classe
🏗️ Classes vs. Structs: Quando Usar Cada Uma (e Não Quebrar a Cabeça)!Descubra como escolher entre classes e structs em C#. Aprenda sobre alocação de memória, passagem por valor e referência, e performance nesta explicação clara. para Representar os Dados:
No C#, você precisa definir uma classe
🏗️ Classes vs. Structs: Quando Usar Cada Uma (e Não Quebrar a Cabeça)!Descubra como escolher entre classes e structs em C#. Aprenda sobre alocação de memória, passagem por valor e referência, e performance nesta explicação clara. que represente os dados do dataset.
public class IrisData
{
public float SepalLength { get; set; }
public float SepalWidth { get; set; }
public float PetalLength { get; set; }
public float PetalWidth { get; set; }
public string Label { get; set; }
}
3. Crie uma Classe
🏗️ Classes vs. Structs: Quando Usar Cada Uma (e Não Quebrar a Cabeça)!Descubra como escolher entre classes e structs em C#. Aprenda sobre alocação de memória, passagem por valor e referência, e performance nesta explicação clara. para a Previsão:
Essa classe
🏗️ Classes vs. Structs: Quando Usar Cada Uma (e Não Quebrar a Cabeça)!Descubra como escolher entre classes e structs em C#. Aprenda sobre alocação de memória, passagem por valor e referência, e performance nesta explicação clara. será usada para armazenar o resultado da previsão.
public class IrisPrediction
{
public string PredictedLabel { get; set; }
}
Treinando o Modelo🔗
Agora que os dados estão prontos, vamos treinar o modelo
🎭 MVVM: Separe Regras de Negócio da Interface Graficamente!Descubra como o padrão MVVM separa a interface e a lógica de negócio, facilitando testes e manutenção, com exemplos e dicas práticas para seu projeto..
1. Carregue os Dados:
Use o MLContext para
🔄 Loops em C#: Repita Tarefas sem Enlouquecer (Com for e while!)Descubra como automatizar repetições em C# utilizando loops for e while com exemplos práticos que evitam erros e otimizam seu código. Aprenda mais! carregar os dados do CSV.
var mlContext = new MLContext();
var data = mlContext.Data.LoadFromTextFile<IrisData>(
path: "iris-data.csv",
separatorChar: ',',
hasHeader: true
);
2. Divida os Dados:
Separe os dados em conjuntos de treino e
📊 Behavior-Driven Development: Testes que Todo Mundo Entende!Descubra como o BDD transforma testes em linguagens acessíveis. Aprenda a usar SpecFlow em C# para criar testes claros, colaborativos e sem ambiguidades. teste.
var splitData = mlContext.Data.TrainTestSplit(data, testFraction: 0.2);
O pipeline
Operações de agregação e pipelines: extraindo insights dos dadosAprenda detalhadamente como utilizar operações de agregação no MongoDB com C#. Descubra dicas, estágios e práticas para extrair insights valiosos. é onde você configura o processo de treinamento.
var pipeline = mlContext.Transforms.Conversion.MapValueToKey("Label")
.Append(mlContext.Transforms.Concatenate("Features",
"SepalLength", "SepalWidth", "PetalLength", "PetalWidth"))
.Append(mlContext.MulticlassClassification.Trainers.SdcaMaximumEntropy())
.Append(mlContext.Transforms.Conversion.MapKeyToValue("PredictedLabel"));
Use o pipeline
Operações de agregação e pipelines: extraindo insights dos dadosAprenda detalhadamente como utilizar operações de agregação no MongoDB com C#. Descubra dicas, estágios e práticas para extrair insights valiosos. para treinar o modelo com os dados de treino.
var model = pipeline.Fit(splitData.TrainSet);
Avaliando o Modelo🔗
Depois de treinar, é importante avaliar o desempenho
⏱️ Testes de Performance: Garanta Velocidade Além da Funcionalidade!Descubra como medir, diagnosticar e otimizar performance em aplicações .NET com dicas práticas e ferramentas essenciais para devs. do modelo com os dados de teste.
var predictions = model.Transform(splitData.TestSet);
var metrics = mlContext.MulticlassClassification.Evaluate(predictions);
Console.WriteLine($"Acurácia: {metrics.MacroAccuracy:P2}");
Console.WriteLine($"Log Loss: {metrics.LogLoss}");
- Acurácia: Percentual de previsões corretas.
- Log
Técnicas de Logging e Monitoramento de Consultas em Tempo RealNeste tutorial, aprenda a registrar e monitorar consultas LINQ em C# para identificar gargalos, otimizar desempenho e manter a estabilidade do sistema. Loss: Medida de quão bem o modelo
🎭 MVVM: Separe Regras de Negócio da Interface Graficamente!Descubra como o padrão MVVM separa a interface e a lógica de negócio, facilitando testes e manutenção, com exemplos e dicas práticas para seu projeto. está performando (quanto menor, melhor).
Usando o Modelo para Previsões🔗
Agora que o modelo
🎭 MVVM: Separe Regras de Negócio da Interface Graficamente!Descubra como o padrão MVVM separa a interface e a lógica de negócio, facilitando testes e manutenção, com exemplos e dicas práticas para seu projeto. está treinado e avaliado, você pode usá-lo para fazer previsões.
var predictionEngine = mlContext.Model.CreatePredictionEngine<IrisData, IrisPrediction>(model);
var sample = new IrisData
{
SepalLength = 5.1f,
SepalWidth = 3.5f,
PetalLength = 1.4f,
PetalWidth = 0.2f
};
var prediction = predictionEngine.Predict(sample);
Console.WriteLine($"Predição: {prediction.PredictedLabel}");
Conclusão🔗
E pronto! Você treinou seu primeiro modelo de classificação
Como Escolher o Operador Correto em Diferentes Cenários de ConsultaAprenda a selecionar os operadores LINQ ideais para filtrar, projetar, ordenar e agrupar dados, garantindo código claro e aplicação eficiente. com ML.NET. Esse é só o começo da sua jornada no mundo do machine learning. A partir daqui, você pode explorar outros algoritmos, ajustar parâmetros e até integrar modelos pré-treinados.
Lembre-se: a prática é a chave para dominar ML. Então
📊 Behavior-Driven Development: Testes que Todo Mundo Entende!Descubra como o BDD transforma testes em linguagens acessíveis. Aprenda a usar SpecFlow em C# para criar testes claros, colaborativos e sem ambiguidades., mãos à obra e bons treinos! 🚀
Autor: Marcelo V. Souza - Engenheiro de Sistemas e Entusiasta em IoT e Desenvolvimento de Software, com foco em inovação tecnológica.
Referências🔗
- .NET Documentation: learn.microsoft.com/pt-br/dotnet/
- Awesome .NET: github.com/quozd/awesome-dotnet
- C# Language Specification: learn.microsoft.com/pt-br/dotnet/csharp/language-reference/language-specification/
- GitHub: Microsoft/.NET: github.com/dotnet
- Microsoft Learn: C# e .NET: learn.microsoft.com/pt-br/dotnet/csharp/



há 11 months atrás
há 10 months atrás
há 10 months atrás
há 10 months atrás
há 10 months atrás
há 10 months atrás
há 10 months atrás
há 10 months atrás
há 10 months atrás
há 10 months atrás
há 10 months atrás
há 10 months atrás
há 10 months atrás
há 10 months atrás
há 10 months atrás
há 10 months atrás
há 10 months atrás
há 10 months atrás
há 10 months atrás
há 10 months atrás
há 10 months atrás
há 10 months atrás