diff --git a/.nojekyll b/.nojekyll new file mode 100644 index 0000000..e69de29 diff --git a/404.html b/404.html new file mode 100644 index 0000000..4a77ab8 --- /dev/null +++ b/404.html @@ -0,0 +1,1756 @@ + + + + + + + + + + + + + + + + + + + GEROcuidado + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+ +
+ + + + + + +
+ + + + + + + +
+ +
+ + + + +
+
+ + + +
+
+
+ + + + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ +

404 - Not found

+ +
+
+ + +
+ +
+ + + +
+
+
+
+ + + + + + + + + \ No newline at end of file diff --git "a/Guia de Contribui\303\247\303\243o/US_template/index.html" "b/Guia de Contribui\303\247\303\243o/US_template/index.html" new file mode 100644 index 0000000..dc5fae0 --- /dev/null +++ "b/Guia de Contribui\303\247\303\243o/US_template/index.html" @@ -0,0 +1,1838 @@ + + + + + + + + + + + + + + + + + + + US template - GEROcuidado + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + Ir para o conteúdo + + +
+
+ +
+ + + + + + +
+ + + + + + + +
+ +
+ + + + +
+
+ + + +
+
+
+ + + + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + +

US template

+ +

Descrição

+
    +
  • +

    Eu, como Cuidador, desejo [...]

    +
  • +
  • +

    Nessa tarefa, o cuidador deve [...]

    +
  • +
+ + +

Pré-Requisitos

+ + +

Critérios de Avaliação

+
    +
  • [ ]
  • +
+ + +

Protótipo

+ + +

## Tarefas

+
    +
  • [ ] + +
  • +
+ + + + + + +
+
+ + +
+ +
+ + + +
+
+
+
+ + + + + + + + + \ No newline at end of file diff --git "a/Guia de Contribui\303\247\303\243o/contribui\303\247\303\243o/index.html" "b/Guia de Contribui\303\247\303\243o/contribui\303\247\303\243o/index.html" new file mode 100644 index 0000000..71270cd --- /dev/null +++ "b/Guia de Contribui\303\247\303\243o/contribui\303\247\303\243o/index.html" @@ -0,0 +1,2296 @@ + + + + + + + + + + + + + + + + + + + Guia de Contribuição - GEROcuidado + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + Ir para o conteúdo + + +
+
+ +
+ + + + + + +
+ + + + + + + +
+ +
+ + + + +
+
+ + + +
+
+
+ + + + + + + +
+
+
+ + + + + + + +
+
+ + + + + + + +

Guia de Contribuição

+

Histórico de Versões

+ + + + + + + + + + + + + + + + + + + + + + + +
DataVersãoDescriçãoAutor
12/08/20241.0Criação do documentoGustavo Abrantes
23/08/20242.0Atualização do documentoGabriel Monteiro
+

Issues

+

Ao criar issues, atente-se às seguintes questões:

+
    +
  • Verifique se já existe uma issue referente ao assunto que você pretende abordar: Se sim, trabalhe a partir da issue já criada.
  • +
  • Título: Adicione um título que sintetize bem o problema abordado na issue.
  • +
  • Descrição: Adicione uma descrição adequada, de modo que qualquer membro do repositório consiga compreender qual é o problema.
  • +
  • Assignees: Adicione ao menos um responsável (Assignee).
  • +
  • Labels: Adicione as Labels adequadas.
  • +
  • Milestone: Adicione a milestone referente à sprint em que o problema será trabalhado.
  • +
  • Estimate: Adicione uma estimativa de pontuação, conforme as definições descritas neste documento.
  • +
+

Branches

+

Padronizar evita confusões e facilita a leitura e a procura por artefatos do projeto. Isso também se aplica à nomenclatura de branches. Por padrão, a nomenclatura de branches deve obedecer ao seguinte formato:

+
<type>/<branch-name>
+
+

Type

+

O parâmetro type sinaliza o principal tipo de modificação realizada. Por padrão, utilizamos as seguintes palavras-chave:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
TypeSignificado
featNovas funcionalidades para o usuário
fixCorreções de bugs para o usuário
docsModificações na documentação
styleFormatação, sem alterações no código de produção
refactorRefatoração de código de produção
testAdição e refatoração de testes (sem alterar código de produção)
choreAtualizações genéricas sem alterações de código de produção
+

Branch Name

+

O parâmetro branch-name descreve de forma textual a atividade realizada dentro da branch. Por padrão, o nome da branch é escrito em inglês, substituindo os espaços por hífen ("_"). Por exemplo: Create new tests for user se torna create-new-tests-for-user.

+
+

Atente-se para a criação de um nome coerente para sua branch, a fim de evitar confusões e incoerências.

+
+

Exemplos

+

Uma branch para adição de novos testes para um user:

+
test/create-new-tests-for-user
+
+

Uma branch para correção de um bug na criação de user:

+
fix/remove-bug-from-user-creation
+
+

Criação de Branches

+

A partir do repositório desejado:

+
    +
  1. Atualize seu repositório local buscando por novidades no repositório remoto:
  2. +
+
git fetch
+
+
    +
  1. Mude para a branch principal, seja develop ou main:
  2. +
+
git checkout <branch-principal>
+
+
    +
  1. Sincronize o estado da branch local com o estado da branch remota:
  2. +
+
git reset --hard <branch-principal>
+
+
    +
  1. A partir da branch atual, crie a nova branch obedecendo à convenção de nomes:
  2. +
+
git checkout -b <type>/<branch-name>
+
+

Commits

+

A política de commits deste projeto é baseada no Conventional Commits v1.0.0.

+

O Conventional Commits define um conjunto de regras simples para que as mensagens de commit sejam consistentes no histórico de um repositório. Utilizar uma convenção como essa facilita a leitura do histórico, a identificação das mudanças realizadas por um commit e facilita a adoção de ferramentas de automação para gerar changelogs ou release notes.

+

Por padrão, as mensagens de commits devem seguir o seguinte formato:

+
<type>: <subject>
+
+

Type

+

Assim como para as branches, type descreve o tipo de modificação contemplada pelo commit. Por padrão, utilizamos as seguintes palavras-chave:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
TypeSignificado
featNovas funcionalidades para o usuário
fixCorreções de bugs para o usuário
docsModificações na documentação
styleFormatação, sem alterações no código de produção
refactorRefatoração de código de produção
testAdição e refatoração de testes (sem alterar código de produção)
choreAtualizações genéricas sem alterações de código de produção
+

Subject

+

O parâmetro subject representa a mensagem que descreve o commit, escrita em inglês. Uma boa prática é sempre escrever subjects descritivos, isto é, sempre se preocupando em deixar bem claros os conceitos de what (o que foi feito) e why (por que foi feito).

+

Para clarificar as recomendações aqui mencionadas, confira estes exemplos:

+
+

Modifies user model
+Ao avaliar esta mensagem de commit, o conceito what é superficial, pois não descreve especificamente o que foi alterado no modelo de usuário. O conceito why sequer existe.

+

Modifies user's model name field to make it shorter
+Ao avaliar esta mensagem de commit, quem quer que a leia entenderá o motivo e do que se trata a alteração feita. Tal clareza permite poupar esforço e tempo para entender do que o commit se trata.

+
+

Pull Request

+

O Pull Request (PR) é a maneira de contribuir para projetos de grupo ou de código aberto (open source).

+

Por exemplo, um usuário copia um repositório e faz alterações nesse repositório. Agora, ele pode fazer um Pull Request para o repositório original, mas cabe ao mantenedor aceitá-lo ou recusá-lo. É como dizer: "Você poderia aceitar minhas alterações, por favor?"

+
git remote
+
+

image

+

Depois de identificar o nome do repositório remoto, podemos enviar/fazer um push dessas alterações para o GitHub:

+
git push origin <nome_da_branch>
+
+

Agora, navegue até o repositório no GitHub do projeto, e você verá um botão dizendo Compare & pull request. Clique nele.

+

image

+

Antes de clicar em Create pull request, adicione uma descrição com todos os campos a seguir:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
CampoDescrição
Nomear PR[#NUMERO_ISSUE] Nome do PR
DescriçãoInsira uma descrição geral do que foi alterado neste PR
USCloses #NUMERO_US
IssueCloses #NUMERO_ISSUE
Principais ImplementaçõesSe for código, descreva alterações relevantes
+

Tipos de Mudanças

+
    +
  • [ ] Bug fix: Correção que resolve uma issue sem alterar funcionalidades já existentes.
  • +
  • [ ] Nova feature: Adição de uma funcionalidade sem alterar funcionalidades já existentes.
  • +
  • [ ] Breaking change: Mudança que afeta o funcionamento de partes dependentes do código (quando uma dependência crítica ou método é alterado, por exemplo).
  • +
  • [ ] Refatoração de código: Alteração que visa melhorar a qualidade do código sem modificar funcionalidades.
  • +
  • [ ] Documentação
  • +
  • [ ] Experiência do usuário (UX)
  • +
  • [ ] Melhoria de desempenho
  • +
+

Atenção! Ao fazer um pull request atente-se para:

+
    +
  • Seguir o template configurado.
  • +
  • Linkar o PR a sua Issue correspondente.
  • +
  • Marcar um dos responsáveis para revisão.
  • +
+

Exemplo de Pull Request

+
[#0] Removendo espaços vazios
+
+## Descrição
+
+- Removendo espaços vazios para evitar erros de compilação.
+
+## Issues
+
+- Closes #1
+
+## Principais Implementações
+
+- Ajustes no código para melhor performance.
+
+

Dicas para a criação de um bom PR:

+
    +
  • Divida PRs grandes em PRs menores quando possível.
  • +
  • Faça um bom título e uma boa descrição para o seu PR.
  • +
  • Lembre-se de referenciar as issues e/ou user stories associadas ao PR.
  • +
  • Inclua capturas de tela ou gifs que demonstrem visualmente o que foi feito, se aplicável.
  • +
+

Análise de Pull Request

+

Durante a revisão, alguns pontos de atenção são importantes:

+
    +
  • Nome: Verifique se a nomenclatura do PR e a descrição estão de acordo com o padrão.
  • +
  • Issue: Certifique-se de que a Issue mencionada seja fechada com o PR.
  • +
  • Implementações: Confirme se as principais implementações mencionadas no PR estão coerentes com a solicitação da Issue.
  • +
  • Sugestões: Se necessário, faça sugestões para melhorar o código.
  • +
  • Aprovação: Caso tudo esteja de acordo, aprove o PR.
  • +
+

User Stories (US)

+

As User Stories (US) são uma forma ágil de capturar os requisitos de uma funcionalidade sob a perspectiva do usuário final. Elas descrevem a necessidade do usuário de forma simples e direta, permitindo que o time de desenvolvimento compreenda o objetivo final da funcionalidade.

+

Estrutura da US

+

Cada US deve seguir a estrutura básica:

+
Como <persona>, eu quero <necessidade>, para que <benefício>.
+
+

Exemplo:

+
Como usuário autenticado, eu quero poder redefinir minha senha, para que eu possa acessar minha conta caso eu esqueça a senha atual.
+
+

Criação de User Stories

+

Ao criar uma US, atente-se aos seguintes pontos:

+
    +
  1. Persona: Identifique o tipo de usuário para o qual a funcionalidade está sendo criada.
  2. +
  3. Necessidade: Descreva claramente o que o usuário deseja fazer.
  4. +
  5. Benefício: Explique o motivo ou o valor que essa funcionalidade traz para o usuário.
  6. +
  7. Critérios de Aceitação: Liste os critérios que precisam ser atendidos para que a US seja considerada completa. Eles servem como um guia para a equipe de desenvolvimento e para o time de QA durante o processo de validação.
  8. +
+

Exemplo de User Story Completa

+
**US01 - Redefinir Senha**
+
+Como usuário autenticado, eu quero poder redefinir minha senha, para que eu possa acessar minha conta caso eu esqueça a senha atual.
+
+**Critérios de Aceitação:**
+- O usuário deve poder solicitar a redefinição de senha informando o e-mail cadastrado.
+- Um e-mail com um link para redefinição deve ser enviado para o usuário.
+- O link deve ser válido por 24 horas.
+- O usuário deve poder definir uma nova senha após clicar no link.
+- A nova senha deve atender aos critérios de segurança definidos (mínimo de 8 caracteres, incluindo letras maiúsculas, minúsculas e números).
+
+**Estimate:** 5 pontos
+
+

Estimativa de Pontuação para US

+

Assim como as Issues, as US também devem ter uma estimativa de pontuação com base na complexidade e no esforço necessário para a implementação. A pontuação será decidida em conjunto pelo time, utilizando ferramentas como o Planning Poker no ZenHub.

+

Criação de Pull Requests para US

+

Ao concluir a implementação de uma US, crie um Pull Request (PR) seguindo as orientações descritas na seção de Pull Requests deste guia. Certifique-se de:

+
    +
  • Mencionar a US correspondente no título do PR.
  • +
  • Descrever brevemente as alterações realizadas.
  • +
  • Incluir as referências às Issues que foram resolvidas durante a implementação da US.
  • +
  • Adicionar capturas de tela ou GIFs que demonstrem a funcionalidade implementada, se aplicável.
  • +
+

Revisão de User Stories

+

Durante a revisão de uma US, preste atenção aos seguintes aspectos:

+
    +
  • Clareza da US: A história está clara e compreensível?
  • +
  • Critérios de Aceitação: Todos os critérios foram implementados e validados?
  • +
  • Teste: A funcionalidade foi testada adequadamente?
  • +
  • Documentação: A documentação está atualizada de acordo com a nova funcionalidade?
  • +
+

Padrões de Código

+

Manter a consistência de estilo de código ajuda na legibilidade e manutenção do projeto. Alguns pontos a serem considerados incluem:

+
    +
  • Indentação: Use espaços ou tabulações consistentes (conforme o padrão do projeto).
  • +
  • Nomes de Variáveis: Prefira nomes descritivos e consistentes.
  • +
  • Comentários: Adicione comentários esclarecedores onde necessário.
  • +
  • Linhas em Branco: Utilize espaços para separar conceitos ou blocos de código.
  • +
  • Limpeza: Evite deixar código comentado sem justificativa ou trechos de código obsoletos.
  • +
+

Referências

+

Commits Convencionais

+

Git branch naming conventions

+

Gerenciando seus branches com o Git Flow

+

Políticas do Repositório

+
+ + + + + + +
+
+ + +
+ +
+ + + +
+
+
+
+ + + + + + + + + \ No newline at end of file diff --git "a/Guia de Contribui\303\247\303\243o/issue_template/index.html" "b/Guia de Contribui\303\247\303\243o/issue_template/index.html" new file mode 100644 index 0000000..4e0313c --- /dev/null +++ "b/Guia de Contribui\303\247\303\243o/issue_template/index.html" @@ -0,0 +1,1783 @@ + + + + + + + + + + + + + + + + + + + Descrição - GEROcuidado + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + Ir para o conteúdo + + +
+
+ +
+ + + + + + +
+ + + + + + + +
+ +
+ + + + +
+
+ + + +
+
+
+ + + + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + +

Descrição

+ + +

Tarefas

+ + + + + +

Informações Adicionais

+ + + + + + +
+
+ + +
+ +
+ + + +
+
+
+
+ + + + + + + + + \ No newline at end of file diff --git "a/Guia de Contribui\303\247\303\243o/pull_request_template/index.html" "b/Guia de Contribui\303\247\303\243o/pull_request_template/index.html" new file mode 100644 index 0000000..8fe49d9 --- /dev/null +++ "b/Guia de Contribui\303\247\303\243o/pull_request_template/index.html" @@ -0,0 +1,1843 @@ + + + + + + + + + + + + + + + + + + + Pull request template - GEROcuidado + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + Ir para o conteúdo + + +
+
+ +
+ + + + + + +
+ + + + + + + +
+ +
+ + + + +
+
+ + + +
+
+
+ + + + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + +

Pull request template

+ + + + + +

Descrição

+ + +

US

+ + + +

Issue

+ + + +

Principais Implementações

+ + +

Tipos de Mudanças

+
    +
  • [ ] Bug fix (alteração que corrige uma issue e não altera funcionalidades já existentes);
  • +
  • [ ] Nova feature (alteração que adiciona uma funcionalidade e não altera funcionalidades já existentes);
  • +
  • [ ] Alteração disruptiva (Breaking change) (Correção ou funcionalidade que causa alteração nas funcionalidades existentes);
  • +
  • [ ] Documentação
  • +
  • [ ] Experiência do usuário (UX)
  • +
  • [ ] Melhoria de desempenho
  • +
+ + + + + + +
+
+ + +
+ +
+ + + +
+
+
+
+ + + + + + + + + \ No newline at end of file diff --git a/assets/Canva_MVP.png b/assets/Canva_MVP.png new file mode 100644 index 0000000..eb2da56 Binary files /dev/null and b/assets/Canva_MVP.png differ diff --git a/assets/GEROjornada1.PNG b/assets/GEROjornada1.PNG new file mode 100644 index 0000000..20079f7 Binary files /dev/null and b/assets/GEROjornada1.PNG differ diff --git a/assets/GEROjornada2.PNG b/assets/GEROjornada2.PNG new file mode 100644 index 0000000..c4eb5bb Binary files /dev/null and b/assets/GEROjornada2.PNG differ diff --git a/assets/GEROjornada3.PNG b/assets/GEROjornada3.PNG new file mode 100644 index 0000000..632ebbc Binary files /dev/null and b/assets/GEROjornada3.PNG differ diff --git a/assets/GEROpessoa1.PNG b/assets/GEROpessoa1.PNG new file mode 100644 index 0000000..be4b0fa Binary files /dev/null and b/assets/GEROpessoa1.PNG differ diff --git a/assets/GEROpessoa2.PNG b/assets/GEROpessoa2.PNG new file mode 100644 index 0000000..13c3d49 Binary files /dev/null and b/assets/GEROpessoa2.PNG differ diff --git a/assets/GEROpessoa3.PNG b/assets/GEROpessoa3.PNG new file mode 100644 index 0000000..6703737 Binary files /dev/null and b/assets/GEROpessoa3.PNG differ diff --git "a/assets/GERO\303\251en\303\243o\303\251-fazen\303\243ofaz.png" "b/assets/GERO\303\251en\303\243o\303\251-fazen\303\243ofaz.png" new file mode 100644 index 0000000..455328a Binary files /dev/null and "b/assets/GERO\303\251en\303\243o\303\251-fazen\303\243ofaz.png" differ diff --git "a/assets/Gero_Vis\303\243odoproduto.png" "b/assets/Gero_Vis\303\243odoproduto.png" new file mode 100644 index 0000000..ab5c673 Binary files /dev/null and "b/assets/Gero_Vis\303\243odoproduto.png" differ diff --git a/assets/Inter.png b/assets/Inter.png new file mode 100644 index 0000000..206d03d Binary files /dev/null and b/assets/Inter.png differ diff --git a/assets/Model_Canva-MVP.png b/assets/Model_Canva-MVP.png new file mode 100644 index 0000000..2d9141e Binary files /dev/null and b/assets/Model_Canva-MVP.png differ diff --git a/assets/ObjetivoDoProduto.png b/assets/ObjetivoDoProduto.png new file mode 100644 index 0000000..15942c7 Binary files /dev/null and b/assets/ObjetivoDoProduto.png differ diff --git a/assets/Pareamento.png b/assets/Pareamento.png new file mode 100644 index 0000000..b5268b3 Binary files /dev/null and b/assets/Pareamento.png differ diff --git a/assets/Quadro de Pareamento .png b/assets/Quadro de Pareamento .png new file mode 100644 index 0000000..054b2aa Binary files /dev/null and b/assets/Quadro de Pareamento .png differ diff --git a/assets/QuadroDePareamento.png b/assets/QuadroDePareamento.png new file mode 100644 index 0000000..6f01374 Binary files /dev/null and b/assets/QuadroDePareamento.png differ diff --git a/assets/RevisaoT_1.PNG b/assets/RevisaoT_1.PNG new file mode 100644 index 0000000..a1d0ed5 Binary files /dev/null and b/assets/RevisaoT_1.PNG differ diff --git a/assets/RevisaoT_2.PNG b/assets/RevisaoT_2.PNG new file mode 100644 index 0000000..310753f Binary files /dev/null and b/assets/RevisaoT_2.PNG differ diff --git a/assets/RevisaoT_3.PNG b/assets/RevisaoT_3.PNG new file mode 100644 index 0000000..f188594 Binary files /dev/null and b/assets/RevisaoT_3.PNG differ diff --git a/assets/Roboto.png b/assets/Roboto.png new file mode 100644 index 0000000..8846ed6 Binary files /dev/null and b/assets/Roboto.png differ diff --git a/assets/WorkSans.png b/assets/WorkSans.png new file mode 100644 index 0000000..7d8b266 Binary files /dev/null and b/assets/WorkSans.png differ diff --git a/assets/agenda_lean_inception.jpg b/assets/agenda_lean_inception.jpg new file mode 100644 index 0000000..50be40a Binary files /dev/null and b/assets/agenda_lean_inception.jpg differ diff --git a/assets/brainstorm_funcionalidades.png b/assets/brainstorm_funcionalidades.png new file mode 100644 index 0000000..864cb0a Binary files /dev/null and b/assets/brainstorm_funcionalidades.png differ diff --git a/assets/cronograma_lean_inception.png b/assets/cronograma_lean_inception.png new file mode 100644 index 0000000..baa69ee Binary files /dev/null and b/assets/cronograma_lean_inception.png differ diff --git a/assets/favicon.ico b/assets/favicon.ico new file mode 100644 index 0000000..1358e8e Binary files /dev/null and b/assets/favicon.ico differ diff --git a/assets/gero.png b/assets/gero.png new file mode 100644 index 0000000..387dd00 Binary files /dev/null and b/assets/gero.png differ diff --git a/assets/imagens/Editar Forum3.png b/assets/imagens/Editar Forum3.png new file mode 100644 index 0000000..88bab93 Binary files /dev/null and b/assets/imagens/Editar Forum3.png differ diff --git a/assets/imagens/Editar Rotina.png b/assets/imagens/Editar Rotina.png new file mode 100644 index 0000000..00cb6a1 Binary files /dev/null and b/assets/imagens/Editar Rotina.png differ diff --git a/assets/imagens/Forum.png b/assets/imagens/Forum.png new file mode 100644 index 0000000..f12501c Binary files /dev/null and b/assets/imagens/Forum.png differ diff --git a/assets/imagens/Forum2.png b/assets/imagens/Forum2.png new file mode 100644 index 0000000..317d122 Binary files /dev/null and b/assets/imagens/Forum2.png differ diff --git a/assets/imagens/Forum3.png b/assets/imagens/Forum3.png new file mode 100644 index 0000000..465deed Binary files /dev/null and b/assets/imagens/Forum3.png differ diff --git a/assets/imagens/Forum4.png b/assets/imagens/Forum4.png new file mode 100644 index 0000000..f79d7bd Binary files /dev/null and b/assets/imagens/Forum4.png differ diff --git a/assets/imagens/Indicadores Senha.png b/assets/imagens/Indicadores Senha.png new file mode 100644 index 0000000..ccde397 Binary files /dev/null and b/assets/imagens/Indicadores Senha.png differ diff --git a/assets/imagens/Indicadores Senha2.png b/assets/imagens/Indicadores Senha2.png new file mode 100644 index 0000000..9411ebe Binary files /dev/null and b/assets/imagens/Indicadores Senha2.png differ diff --git a/assets/imagens/Indicadores Senha3.png b/assets/imagens/Indicadores Senha3.png new file mode 100644 index 0000000..17547c3 Binary files /dev/null and b/assets/imagens/Indicadores Senha3.png differ diff --git a/assets/imagens/Login1.png b/assets/imagens/Login1.png new file mode 100644 index 0000000..420983c Binary files /dev/null and b/assets/imagens/Login1.png differ diff --git a/assets/imagens/Metricas.png b/assets/imagens/Metricas.png new file mode 100644 index 0000000..0788741 Binary files /dev/null and b/assets/imagens/Metricas.png differ diff --git a/assets/imagens/Metricas1.png b/assets/imagens/Metricas1.png new file mode 100644 index 0000000..b8b014b Binary files /dev/null and b/assets/imagens/Metricas1.png differ diff --git a/assets/imagens/Metricas2.png b/assets/imagens/Metricas2.png new file mode 100644 index 0000000..54f4a48 Binary files /dev/null and b/assets/imagens/Metricas2.png differ diff --git a/assets/imagens/Metricas3.png b/assets/imagens/Metricas3.png new file mode 100644 index 0000000..fbd6dc0 Binary files /dev/null and b/assets/imagens/Metricas3.png differ diff --git a/assets/imagens/Metricas4.png b/assets/imagens/Metricas4.png new file mode 100644 index 0000000..50ea269 Binary files /dev/null and b/assets/imagens/Metricas4.png differ diff --git a/assets/imagens/Metricas5.png b/assets/imagens/Metricas5.png new file mode 100644 index 0000000..9880a0f Binary files /dev/null and b/assets/imagens/Metricas5.png differ diff --git a/assets/imagens/Metricas6.png b/assets/imagens/Metricas6.png new file mode 100644 index 0000000..4d2a796 Binary files /dev/null and b/assets/imagens/Metricas6.png differ diff --git a/assets/imagens/Moderacao1.png b/assets/imagens/Moderacao1.png new file mode 100644 index 0000000..dae9b21 Binary files /dev/null and b/assets/imagens/Moderacao1.png differ diff --git a/assets/imagens/Moderacao2.png b/assets/imagens/Moderacao2.png new file mode 100644 index 0000000..775790a Binary files /dev/null and b/assets/imagens/Moderacao2.png differ diff --git a/assets/imagens/Notificacoes.png b/assets/imagens/Notificacoes.png new file mode 100644 index 0000000..baa03f7 Binary files /dev/null and b/assets/imagens/Notificacoes.png differ diff --git a/assets/imagens/Perfil.png b/assets/imagens/Perfil.png new file mode 100644 index 0000000..8bba061 Binary files /dev/null and b/assets/imagens/Perfil.png differ diff --git a/assets/imagens/Prototipo/Agenda_Calendario.png b/assets/imagens/Prototipo/Agenda_Calendario.png new file mode 100644 index 0000000..00afd94 Binary files /dev/null and b/assets/imagens/Prototipo/Agenda_Calendario.png differ diff --git a/assets/imagens/Prototipo/Apagar Idosos.png b/assets/imagens/Prototipo/Apagar Idosos.png new file mode 100644 index 0000000..6b9e1de Binary files /dev/null and b/assets/imagens/Prototipo/Apagar Idosos.png differ diff --git a/assets/imagens/Prototipo/Apagar Perfil.png b/assets/imagens/Prototipo/Apagar Perfil.png new file mode 100644 index 0000000..113fef1 Binary files /dev/null and b/assets/imagens/Prototipo/Apagar Perfil.png differ diff --git a/assets/imagens/Prototipo/Apagar Perfil2.png b/assets/imagens/Prototipo/Apagar Perfil2.png new file mode 100644 index 0000000..0d0c369 Binary files /dev/null and b/assets/imagens/Prototipo/Apagar Perfil2.png differ diff --git a/assets/imagens/Prototipo/Cadastrar Idosos.png b/assets/imagens/Prototipo/Cadastrar Idosos.png new file mode 100644 index 0000000..5e903bc Binary files /dev/null and b/assets/imagens/Prototipo/Cadastrar Idosos.png differ diff --git a/assets/imagens/Prototipo/Cadastrar_Idoso (1).png b/assets/imagens/Prototipo/Cadastrar_Idoso (1).png new file mode 100644 index 0000000..7fa23b4 Binary files /dev/null and b/assets/imagens/Prototipo/Cadastrar_Idoso (1).png differ diff --git a/assets/imagens/Prototipo/Cadastrar_Idoso.png b/assets/imagens/Prototipo/Cadastrar_Idoso.png new file mode 100644 index 0000000..7fa23b4 Binary files /dev/null and b/assets/imagens/Prototipo/Cadastrar_Idoso.png differ diff --git a/assets/imagens/Prototipo/Cadastrar_Idoso_Cadastro.png b/assets/imagens/Prototipo/Cadastrar_Idoso_Cadastro.png new file mode 100644 index 0000000..d1baa95 Binary files /dev/null and b/assets/imagens/Prototipo/Cadastrar_Idoso_Cadastro.png differ diff --git "a/assets/imagens/Prototipo/Cadastro Usu\303\241rio.png" "b/assets/imagens/Prototipo/Cadastro Usu\303\241rio.png" new file mode 100644 index 0000000..2b59b90 Binary files /dev/null and "b/assets/imagens/Prototipo/Cadastro Usu\303\241rio.png" differ diff --git a/assets/imagens/Prototipo/Cadastro.png b/assets/imagens/Prototipo/Cadastro.png new file mode 100644 index 0000000..3ecd994 Binary files /dev/null and b/assets/imagens/Prototipo/Cadastro.png differ diff --git a/assets/imagens/Prototipo/Criar Rotina.png b/assets/imagens/Prototipo/Criar Rotina.png new file mode 100644 index 0000000..0a5bb71 Binary files /dev/null and b/assets/imagens/Prototipo/Criar Rotina.png differ diff --git a/assets/imagens/Prototipo/Editar Forum.png b/assets/imagens/Prototipo/Editar Forum.png new file mode 100644 index 0000000..28d1214 Binary files /dev/null and b/assets/imagens/Prototipo/Editar Forum.png differ diff --git a/assets/imagens/Prototipo/Entrar.png b/assets/imagens/Prototipo/Entrar.png new file mode 100644 index 0000000..b8c322b Binary files /dev/null and b/assets/imagens/Prototipo/Entrar.png differ diff --git a/assets/imagens/Prototipo/Forum (1).png b/assets/imagens/Prototipo/Forum (1).png new file mode 100644 index 0000000..37510ac Binary files /dev/null and b/assets/imagens/Prototipo/Forum (1).png differ diff --git a/assets/imagens/Prototipo/Forum (2).png b/assets/imagens/Prototipo/Forum (2).png new file mode 100644 index 0000000..37510ac Binary files /dev/null and b/assets/imagens/Prototipo/Forum (2).png differ diff --git a/assets/imagens/Prototipo/Forum.png b/assets/imagens/Prototipo/Forum.png new file mode 100644 index 0000000..37510ac Binary files /dev/null and b/assets/imagens/Prototipo/Forum.png differ diff --git a/assets/imagens/Prototipo/Forum_Usuario_Anonimo (1).png b/assets/imagens/Prototipo/Forum_Usuario_Anonimo (1).png new file mode 100644 index 0000000..2d90d39 Binary files /dev/null and b/assets/imagens/Prototipo/Forum_Usuario_Anonimo (1).png differ diff --git a/assets/imagens/Prototipo/Forum_Usuario_Anonimo.png b/assets/imagens/Prototipo/Forum_Usuario_Anonimo.png new file mode 100644 index 0000000..2d90d39 Binary files /dev/null and b/assets/imagens/Prototipo/Forum_Usuario_Anonimo.png differ diff --git a/assets/imagens/Prototipo/Incremento_Indicadores_Senha (1).png b/assets/imagens/Prototipo/Incremento_Indicadores_Senha (1).png new file mode 100644 index 0000000..30db5fd Binary files /dev/null and b/assets/imagens/Prototipo/Incremento_Indicadores_Senha (1).png differ diff --git a/assets/imagens/Prototipo/Incremento_Indicadores_Senha (2).png b/assets/imagens/Prototipo/Incremento_Indicadores_Senha (2).png new file mode 100644 index 0000000..30db5fd Binary files /dev/null and b/assets/imagens/Prototipo/Incremento_Indicadores_Senha (2).png differ diff --git a/assets/imagens/Prototipo/Incremento_Indicadores_Senha (3).png b/assets/imagens/Prototipo/Incremento_Indicadores_Senha (3).png new file mode 100644 index 0000000..30db5fd Binary files /dev/null and b/assets/imagens/Prototipo/Incremento_Indicadores_Senha (3).png differ diff --git a/assets/imagens/Prototipo/Incremento_Indicadores_Senha.png b/assets/imagens/Prototipo/Incremento_Indicadores_Senha.png new file mode 100644 index 0000000..30db5fd Binary files /dev/null and b/assets/imagens/Prototipo/Incremento_Indicadores_Senha.png differ diff --git a/assets/imagens/Prototipo/Incremento_Interacao_Forum (1).png b/assets/imagens/Prototipo/Incremento_Interacao_Forum (1).png new file mode 100644 index 0000000..bdc444c Binary files /dev/null and b/assets/imagens/Prototipo/Incremento_Interacao_Forum (1).png differ diff --git a/assets/imagens/Prototipo/Incremento_Interacao_Forum.png b/assets/imagens/Prototipo/Incremento_Interacao_Forum.png new file mode 100644 index 0000000..bdc444c Binary files /dev/null and b/assets/imagens/Prototipo/Incremento_Interacao_Forum.png differ diff --git a/assets/imagens/Prototipo/Incremento_Recuperar_Senha (1).png b/assets/imagens/Prototipo/Incremento_Recuperar_Senha (1).png new file mode 100644 index 0000000..28049cd Binary files /dev/null and b/assets/imagens/Prototipo/Incremento_Recuperar_Senha (1).png differ diff --git a/assets/imagens/Prototipo/Incremento_Recuperar_Senha.png b/assets/imagens/Prototipo/Incremento_Recuperar_Senha.png new file mode 100644 index 0000000..28049cd Binary files /dev/null and b/assets/imagens/Prototipo/Incremento_Recuperar_Senha.png differ diff --git a/assets/imagens/Prototipo/Login.png b/assets/imagens/Prototipo/Login.png new file mode 100644 index 0000000..665a237 Binary files /dev/null and b/assets/imagens/Prototipo/Login.png differ diff --git a/assets/imagens/Prototipo/Metrica_Saude_1 (1).png b/assets/imagens/Prototipo/Metrica_Saude_1 (1).png new file mode 100644 index 0000000..f264d08 Binary files /dev/null and b/assets/imagens/Prototipo/Metrica_Saude_1 (1).png differ diff --git a/assets/imagens/Prototipo/Metrica_Saude_1 (2).png b/assets/imagens/Prototipo/Metrica_Saude_1 (2).png new file mode 100644 index 0000000..f264d08 Binary files /dev/null and b/assets/imagens/Prototipo/Metrica_Saude_1 (2).png differ diff --git a/assets/imagens/Prototipo/Metrica_Saude_1 (3).png b/assets/imagens/Prototipo/Metrica_Saude_1 (3).png new file mode 100644 index 0000000..f264d08 Binary files /dev/null and b/assets/imagens/Prototipo/Metrica_Saude_1 (3).png differ diff --git a/assets/imagens/Prototipo/Metrica_Saude_1.png b/assets/imagens/Prototipo/Metrica_Saude_1.png new file mode 100644 index 0000000..f264d08 Binary files /dev/null and b/assets/imagens/Prototipo/Metrica_Saude_1.png differ diff --git a/assets/imagens/Prototipo/Metrica_Saude_2 (1).png b/assets/imagens/Prototipo/Metrica_Saude_2 (1).png new file mode 100644 index 0000000..0283ed6 Binary files /dev/null and b/assets/imagens/Prototipo/Metrica_Saude_2 (1).png differ diff --git a/assets/imagens/Prototipo/Metrica_Saude_2 (2).png b/assets/imagens/Prototipo/Metrica_Saude_2 (2).png new file mode 100644 index 0000000..0283ed6 Binary files /dev/null and b/assets/imagens/Prototipo/Metrica_Saude_2 (2).png differ diff --git a/assets/imagens/Prototipo/Metrica_Saude_2.png b/assets/imagens/Prototipo/Metrica_Saude_2.png new file mode 100644 index 0000000..0283ed6 Binary files /dev/null and b/assets/imagens/Prototipo/Metrica_Saude_2.png differ diff --git a/assets/imagens/Prototipo/Moderacao (1).png b/assets/imagens/Prototipo/Moderacao (1).png new file mode 100644 index 0000000..f7bdbc2 Binary files /dev/null and b/assets/imagens/Prototipo/Moderacao (1).png differ diff --git a/assets/imagens/Prototipo/Moderacao.png b/assets/imagens/Prototipo/Moderacao.png new file mode 100644 index 0000000..f7bdbc2 Binary files /dev/null and b/assets/imagens/Prototipo/Moderacao.png differ diff --git a/assets/imagens/Prototipo/Notificacao (1).png b/assets/imagens/Prototipo/Notificacao (1).png new file mode 100644 index 0000000..daf0e0d Binary files /dev/null and b/assets/imagens/Prototipo/Notificacao (1).png differ diff --git a/assets/imagens/Prototipo/Notificacao.png b/assets/imagens/Prototipo/Notificacao.png new file mode 100644 index 0000000..daf0e0d Binary files /dev/null and b/assets/imagens/Prototipo/Notificacao.png differ diff --git a/assets/imagens/Prototipo/Perfil.png b/assets/imagens/Prototipo/Perfil.png new file mode 100644 index 0000000..fd509b9 Binary files /dev/null and b/assets/imagens/Prototipo/Perfil.png differ diff --git a/assets/imagens/Prototipo/Rotina (1).png b/assets/imagens/Prototipo/Rotina (1).png new file mode 100644 index 0000000..f9597ab Binary files /dev/null and b/assets/imagens/Prototipo/Rotina (1).png differ diff --git a/assets/imagens/Prototipo/Rotina (2).png b/assets/imagens/Prototipo/Rotina (2).png new file mode 100644 index 0000000..f9597ab Binary files /dev/null and b/assets/imagens/Prototipo/Rotina (2).png differ diff --git a/assets/imagens/Prototipo/Rotina.png b/assets/imagens/Prototipo/Rotina.png new file mode 100644 index 0000000..f9597ab Binary files /dev/null and b/assets/imagens/Prototipo/Rotina.png differ diff --git a/assets/imagens/Prototipo/Tela_Inicial.png b/assets/imagens/Prototipo/Tela_Inicial.png new file mode 100644 index 0000000..0a1cc42 Binary files /dev/null and b/assets/imagens/Prototipo/Tela_Inicial.png differ diff --git a/assets/imagens/Recuperar Senha.png b/assets/imagens/Recuperar Senha.png new file mode 100644 index 0000000..e61d190 Binary files /dev/null and b/assets/imagens/Recuperar Senha.png differ diff --git a/assets/imagens/Redefinir Senha.png b/assets/imagens/Redefinir Senha.png new file mode 100644 index 0000000..d50a485 Binary files /dev/null and b/assets/imagens/Redefinir Senha.png differ diff --git a/assets/imagens/Requisitos Senha.png b/assets/imagens/Requisitos Senha.png new file mode 100644 index 0000000..1db9121 Binary files /dev/null and b/assets/imagens/Requisitos Senha.png differ diff --git a/assets/imagens/Rotinas.png b/assets/imagens/Rotinas.png new file mode 100644 index 0000000..b71339e Binary files /dev/null and b/assets/imagens/Rotinas.png differ diff --git a/assets/imagens/Rotinas2.png b/assets/imagens/Rotinas2.png new file mode 100644 index 0000000..6525301 Binary files /dev/null and b/assets/imagens/Rotinas2.png differ diff --git a/assets/imagens/Sem Conexao.png b/assets/imagens/Sem Conexao.png new file mode 100644 index 0000000..424c658 Binary files /dev/null and b/assets/imagens/Sem Conexao.png differ diff --git a/assets/imagens/SemConexao.png b/assets/imagens/SemConexao.png new file mode 100644 index 0000000..193b905 Binary files /dev/null and b/assets/imagens/SemConexao.png differ diff --git a/assets/imagens/Tela Inicial.png b/assets/imagens/Tela Inicial.png new file mode 100644 index 0000000..1d91029 Binary files /dev/null and b/assets/imagens/Tela Inicial.png differ diff --git a/assets/imagens/Tutorial.png b/assets/imagens/Tutorial.png new file mode 100644 index 0000000..5c9b5bc Binary files /dev/null and b/assets/imagens/Tutorial.png differ diff --git a/assets/imagens/Visualizar Rotina.png b/assets/imagens/Visualizar Rotina.png new file mode 100644 index 0000000..f97246e Binary files /dev/null and b/assets/imagens/Visualizar Rotina.png differ diff --git a/assets/imagens/Visualizar Rotina1.png b/assets/imagens/Visualizar Rotina1.png new file mode 100644 index 0000000..81d8ecd Binary files /dev/null and b/assets/imagens/Visualizar Rotina1.png differ diff --git a/assets/imagens/banco_de_dados/DER.jpeg b/assets/imagens/banco_de_dados/DER.jpeg new file mode 100644 index 0000000..b489b83 Binary files /dev/null and b/assets/imagens/banco_de_dados/DER.jpeg differ diff --git a/assets/imagens/banco_de_dados/DLD.jpeg b/assets/imagens/banco_de_dados/DLD.jpeg new file mode 100644 index 0000000..b2613b3 Binary files /dev/null and b/assets/imagens/banco_de_dados/DLD.jpeg differ diff --git a/assets/imagens/banco_de_dados/MER/DESCRICAO_ENTIDADE.png b/assets/imagens/banco_de_dados/MER/DESCRICAO_ENTIDADE.png new file mode 100644 index 0000000..72d3e61 Binary files /dev/null and b/assets/imagens/banco_de_dados/MER/DESCRICAO_ENTIDADE.png differ diff --git a/assets/imagens/banco_de_dados/MER/MER_ENTIDADES.png b/assets/imagens/banco_de_dados/MER/MER_ENTIDADES.png new file mode 100644 index 0000000..e4c3c47 Binary files /dev/null and b/assets/imagens/banco_de_dados/MER/MER_ENTIDADES.png differ diff --git a/assets/imagens/banco_de_dados/MER/RELACIONAMENTOS1.png b/assets/imagens/banco_de_dados/MER/RELACIONAMENTOS1.png new file mode 100644 index 0000000..b0c7d14 Binary files /dev/null and b/assets/imagens/banco_de_dados/MER/RELACIONAMENTOS1.png differ diff --git a/assets/imagens/banco_de_dados/MER/RELACIONAMENTOS2.png b/assets/imagens/banco_de_dados/MER/RELACIONAMENTOS2.png new file mode 100644 index 0000000..6bcb582 Binary files /dev/null and b/assets/imagens/banco_de_dados/MER/RELACIONAMENTOS2.png differ diff --git a/assets/imagens/banco_de_dados/dicionario_de_dados/COMENTARIO.png b/assets/imagens/banco_de_dados/dicionario_de_dados/COMENTARIO.png new file mode 100644 index 0000000..f7d2544 Binary files /dev/null and b/assets/imagens/banco_de_dados/dicionario_de_dados/COMENTARIO.png differ diff --git a/assets/imagens/banco_de_dados/dicionario_de_dados/LIKE.png b/assets/imagens/banco_de_dados/dicionario_de_dados/LIKE.png new file mode 100644 index 0000000..9a369a4 Binary files /dev/null and b/assets/imagens/banco_de_dados/dicionario_de_dados/LIKE.png differ diff --git a/assets/imagens/banco_de_dados/dicionario_de_dados/METRICA_SAUDE.png b/assets/imagens/banco_de_dados/dicionario_de_dados/METRICA_SAUDE.png new file mode 100644 index 0000000..71aeea6 Binary files /dev/null and b/assets/imagens/banco_de_dados/dicionario_de_dados/METRICA_SAUDE.png differ diff --git a/assets/imagens/banco_de_dados/dicionario_de_dados/PACIENTE.png b/assets/imagens/banco_de_dados/dicionario_de_dados/PACIENTE.png new file mode 100644 index 0000000..f397005 Binary files /dev/null and b/assets/imagens/banco_de_dados/dicionario_de_dados/PACIENTE.png differ diff --git a/assets/imagens/banco_de_dados/dicionario_de_dados/PUBLICACAO.png b/assets/imagens/banco_de_dados/dicionario_de_dados/PUBLICACAO.png new file mode 100644 index 0000000..c0fbd7a Binary files /dev/null and b/assets/imagens/banco_de_dados/dicionario_de_dados/PUBLICACAO.png differ diff --git a/assets/imagens/banco_de_dados/dicionario_de_dados/RELACIONAMENTO_COMENTARIO.png b/assets/imagens/banco_de_dados/dicionario_de_dados/RELACIONAMENTO_COMENTARIO.png new file mode 100644 index 0000000..f9c6c48 Binary files /dev/null and b/assets/imagens/banco_de_dados/dicionario_de_dados/RELACIONAMENTO_COMENTARIO.png differ diff --git a/assets/imagens/banco_de_dados/dicionario_de_dados/RELACIONAMENTO_LIKE.png b/assets/imagens/banco_de_dados/dicionario_de_dados/RELACIONAMENTO_LIKE.png new file mode 100644 index 0000000..3160592 Binary files /dev/null and b/assets/imagens/banco_de_dados/dicionario_de_dados/RELACIONAMENTO_LIKE.png differ diff --git a/assets/imagens/banco_de_dados/dicionario_de_dados/ROTINA.png b/assets/imagens/banco_de_dados/dicionario_de_dados/ROTINA.png new file mode 100644 index 0000000..116510f Binary files /dev/null and b/assets/imagens/banco_de_dados/dicionario_de_dados/ROTINA.png differ diff --git a/assets/imagens/banco_de_dados/dicionario_de_dados/USUARIO.png b/assets/imagens/banco_de_dados/dicionario_de_dados/USUARIO.png new file mode 100644 index 0000000..252d382 Binary files /dev/null and b/assets/imagens/banco_de_dados/dicionario_de_dados/USUARIO.png differ diff --git a/assets/imagens/banco_de_dados/dicionario_de_dados/VALOR_METRICA.png b/assets/imagens/banco_de_dados/dicionario_de_dados/VALOR_METRICA.png new file mode 100644 index 0000000..dc0dc86 Binary files /dev/null and b/assets/imagens/banco_de_dados/dicionario_de_dados/VALOR_METRICA.png differ diff --git a/assets/images/favicon.png b/assets/images/favicon.png new file mode 100644 index 0000000..1cf13b9 Binary files /dev/null and b/assets/images/favicon.png differ diff --git a/assets/javascripts/bundle.dff1b7c8.min.js b/assets/javascripts/bundle.dff1b7c8.min.js new file mode 100644 index 0000000..a89e799 --- /dev/null +++ b/assets/javascripts/bundle.dff1b7c8.min.js @@ -0,0 +1,29 @@ +"use strict";(()=>{var gi=Object.create;var dr=Object.defineProperty;var xi=Object.getOwnPropertyDescriptor;var yi=Object.getOwnPropertyNames,Ht=Object.getOwnPropertySymbols,Ei=Object.getPrototypeOf,hr=Object.prototype.hasOwnProperty,Xr=Object.prototype.propertyIsEnumerable;var Jr=(e,t,r)=>t in e?dr(e,t,{enumerable:!0,configurable:!0,writable:!0,value:r}):e[t]=r,I=(e,t)=>{for(var r in t||(t={}))hr.call(t,r)&&Jr(e,r,t[r]);if(Ht)for(var r of Ht(t))Xr.call(t,r)&&Jr(e,r,t[r]);return e};var Zr=(e,t)=>{var r={};for(var o in e)hr.call(e,o)&&t.indexOf(o)<0&&(r[o]=e[o]);if(e!=null&&Ht)for(var o of Ht(e))t.indexOf(o)<0&&Xr.call(e,o)&&(r[o]=e[o]);return r};var br=(e,t)=>()=>(t||e((t={exports:{}}).exports,t),t.exports);var wi=(e,t,r,o)=>{if(t&&typeof t=="object"||typeof t=="function")for(let n of yi(t))!hr.call(e,n)&&n!==r&&dr(e,n,{get:()=>t[n],enumerable:!(o=xi(t,n))||o.enumerable});return e};var $t=(e,t,r)=>(r=e!=null?gi(Ei(e)):{},wi(t||!e||!e.__esModule?dr(r,"default",{value:e,enumerable:!0}):r,e));var to=br((vr,eo)=>{(function(e,t){typeof vr=="object"&&typeof eo!="undefined"?t():typeof define=="function"&&define.amd?define(t):t()})(vr,function(){"use strict";function e(r){var o=!0,n=!1,i=null,s={text:!0,search:!0,url:!0,tel:!0,email:!0,password:!0,number:!0,date:!0,month:!0,week:!0,time:!0,datetime:!0,"datetime-local":!0};function a(A){return!!(A&&A!==document&&A.nodeName!=="HTML"&&A.nodeName!=="BODY"&&"classList"in A&&"contains"in A.classList)}function c(A){var it=A.type,Ne=A.tagName;return!!(Ne==="INPUT"&&s[it]&&!A.readOnly||Ne==="TEXTAREA"&&!A.readOnly||A.isContentEditable)}function p(A){A.classList.contains("focus-visible")||(A.classList.add("focus-visible"),A.setAttribute("data-focus-visible-added",""))}function m(A){A.hasAttribute("data-focus-visible-added")&&(A.classList.remove("focus-visible"),A.removeAttribute("data-focus-visible-added"))}function f(A){A.metaKey||A.altKey||A.ctrlKey||(a(r.activeElement)&&p(r.activeElement),o=!0)}function u(A){o=!1}function d(A){a(A.target)&&(o||c(A.target))&&p(A.target)}function b(A){a(A.target)&&(A.target.classList.contains("focus-visible")||A.target.hasAttribute("data-focus-visible-added"))&&(n=!0,window.clearTimeout(i),i=window.setTimeout(function(){n=!1},100),m(A.target))}function _(A){document.visibilityState==="hidden"&&(n&&(o=!0),re())}function re(){document.addEventListener("mousemove",Y),document.addEventListener("mousedown",Y),document.addEventListener("mouseup",Y),document.addEventListener("pointermove",Y),document.addEventListener("pointerdown",Y),document.addEventListener("pointerup",Y),document.addEventListener("touchmove",Y),document.addEventListener("touchstart",Y),document.addEventListener("touchend",Y)}function Z(){document.removeEventListener("mousemove",Y),document.removeEventListener("mousedown",Y),document.removeEventListener("mouseup",Y),document.removeEventListener("pointermove",Y),document.removeEventListener("pointerdown",Y),document.removeEventListener("pointerup",Y),document.removeEventListener("touchmove",Y),document.removeEventListener("touchstart",Y),document.removeEventListener("touchend",Y)}function Y(A){A.target.nodeName&&A.target.nodeName.toLowerCase()==="html"||(o=!1,Z())}document.addEventListener("keydown",f,!0),document.addEventListener("mousedown",u,!0),document.addEventListener("pointerdown",u,!0),document.addEventListener("touchstart",u,!0),document.addEventListener("visibilitychange",_,!0),re(),r.addEventListener("focus",d,!0),r.addEventListener("blur",b,!0),r.nodeType===Node.DOCUMENT_FRAGMENT_NODE&&r.host?r.host.setAttribute("data-js-focus-visible",""):r.nodeType===Node.DOCUMENT_NODE&&(document.documentElement.classList.add("js-focus-visible"),document.documentElement.setAttribute("data-js-focus-visible",""))}if(typeof window!="undefined"&&typeof document!="undefined"){window.applyFocusVisiblePolyfill=e;var t;try{t=new CustomEvent("focus-visible-polyfill-ready")}catch(r){t=document.createEvent("CustomEvent"),t.initCustomEvent("focus-visible-polyfill-ready",!1,!1,{})}window.dispatchEvent(t)}typeof document!="undefined"&&e(document)})});var Vr=br((Mt,Dr)=>{/*! + * clipboard.js v2.0.11 + * https://clipboardjs.com/ + * + * Licensed MIT © Zeno Rocha + */(function(t,r){typeof Mt=="object"&&typeof Dr=="object"?Dr.exports=r():typeof define=="function"&&define.amd?define([],r):typeof Mt=="object"?Mt.ClipboardJS=r():t.ClipboardJS=r()})(Mt,function(){return function(){var e={686:function(o,n,i){"use strict";i.d(n,{default:function(){return vi}});var s=i(279),a=i.n(s),c=i(370),p=i.n(c),m=i(817),f=i.n(m);function u(F){try{return document.execCommand(F)}catch(S){return!1}}var d=function(S){var y=f()(S);return u("cut"),y},b=d;function _(F){var S=document.documentElement.getAttribute("dir")==="rtl",y=document.createElement("textarea");y.style.fontSize="12pt",y.style.border="0",y.style.padding="0",y.style.margin="0",y.style.position="absolute",y.style[S?"right":"left"]="-9999px";var R=window.pageYOffset||document.documentElement.scrollTop;return y.style.top="".concat(R,"px"),y.setAttribute("readonly",""),y.value=F,y}var re=function(S,y){var R=_(S);y.container.appendChild(R);var P=f()(R);return u("copy"),R.remove(),P},Z=function(S){var y=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{container:document.body},R="";return typeof S=="string"?R=re(S,y):S instanceof HTMLInputElement&&!["text","search","url","tel","password"].includes(S==null?void 0:S.type)?R=re(S.value,y):(R=f()(S),u("copy")),R},Y=Z;function A(F){"@babel/helpers - typeof";return typeof Symbol=="function"&&typeof Symbol.iterator=="symbol"?A=function(y){return typeof y}:A=function(y){return y&&typeof Symbol=="function"&&y.constructor===Symbol&&y!==Symbol.prototype?"symbol":typeof y},A(F)}var it=function(){var S=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{},y=S.action,R=y===void 0?"copy":y,P=S.container,q=S.target,Me=S.text;if(R!=="copy"&&R!=="cut")throw new Error('Invalid "action" value, use either "copy" or "cut"');if(q!==void 0)if(q&&A(q)==="object"&&q.nodeType===1){if(R==="copy"&&q.hasAttribute("disabled"))throw new Error('Invalid "target" attribute. Please use "readonly" instead of "disabled" attribute');if(R==="cut"&&(q.hasAttribute("readonly")||q.hasAttribute("disabled")))throw new Error(`Invalid "target" attribute. You can't cut text from elements with "readonly" or "disabled" attributes`)}else throw new Error('Invalid "target" value, use a valid Element');if(Me)return Y(Me,{container:P});if(q)return R==="cut"?b(q):Y(q,{container:P})},Ne=it;function Ie(F){"@babel/helpers - typeof";return typeof Symbol=="function"&&typeof Symbol.iterator=="symbol"?Ie=function(y){return typeof y}:Ie=function(y){return y&&typeof Symbol=="function"&&y.constructor===Symbol&&y!==Symbol.prototype?"symbol":typeof y},Ie(F)}function pi(F,S){if(!(F instanceof S))throw new TypeError("Cannot call a class as a function")}function Gr(F,S){for(var y=0;y0&&arguments[0]!==void 0?arguments[0]:{};this.action=typeof P.action=="function"?P.action:this.defaultAction,this.target=typeof P.target=="function"?P.target:this.defaultTarget,this.text=typeof P.text=="function"?P.text:this.defaultText,this.container=Ie(P.container)==="object"?P.container:document.body}},{key:"listenClick",value:function(P){var q=this;this.listener=p()(P,"click",function(Me){return q.onClick(Me)})}},{key:"onClick",value:function(P){var q=P.delegateTarget||P.currentTarget,Me=this.action(q)||"copy",kt=Ne({action:Me,container:this.container,target:this.target(q),text:this.text(q)});this.emit(kt?"success":"error",{action:Me,text:kt,trigger:q,clearSelection:function(){q&&q.focus(),window.getSelection().removeAllRanges()}})}},{key:"defaultAction",value:function(P){return ur("action",P)}},{key:"defaultTarget",value:function(P){var q=ur("target",P);if(q)return document.querySelector(q)}},{key:"defaultText",value:function(P){return ur("text",P)}},{key:"destroy",value:function(){this.listener.destroy()}}],[{key:"copy",value:function(P){var q=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{container:document.body};return Y(P,q)}},{key:"cut",value:function(P){return b(P)}},{key:"isSupported",value:function(){var P=arguments.length>0&&arguments[0]!==void 0?arguments[0]:["copy","cut"],q=typeof P=="string"?[P]:P,Me=!!document.queryCommandSupported;return q.forEach(function(kt){Me=Me&&!!document.queryCommandSupported(kt)}),Me}}]),y}(a()),vi=bi},828:function(o){var n=9;if(typeof Element!="undefined"&&!Element.prototype.matches){var i=Element.prototype;i.matches=i.matchesSelector||i.mozMatchesSelector||i.msMatchesSelector||i.oMatchesSelector||i.webkitMatchesSelector}function s(a,c){for(;a&&a.nodeType!==n;){if(typeof a.matches=="function"&&a.matches(c))return a;a=a.parentNode}}o.exports=s},438:function(o,n,i){var s=i(828);function a(m,f,u,d,b){var _=p.apply(this,arguments);return m.addEventListener(u,_,b),{destroy:function(){m.removeEventListener(u,_,b)}}}function c(m,f,u,d,b){return typeof m.addEventListener=="function"?a.apply(null,arguments):typeof u=="function"?a.bind(null,document).apply(null,arguments):(typeof m=="string"&&(m=document.querySelectorAll(m)),Array.prototype.map.call(m,function(_){return a(_,f,u,d,b)}))}function p(m,f,u,d){return function(b){b.delegateTarget=s(b.target,f),b.delegateTarget&&d.call(m,b)}}o.exports=c},879:function(o,n){n.node=function(i){return i!==void 0&&i instanceof HTMLElement&&i.nodeType===1},n.nodeList=function(i){var s=Object.prototype.toString.call(i);return i!==void 0&&(s==="[object NodeList]"||s==="[object HTMLCollection]")&&"length"in i&&(i.length===0||n.node(i[0]))},n.string=function(i){return typeof i=="string"||i instanceof String},n.fn=function(i){var s=Object.prototype.toString.call(i);return s==="[object Function]"}},370:function(o,n,i){var s=i(879),a=i(438);function c(u,d,b){if(!u&&!d&&!b)throw new Error("Missing required arguments");if(!s.string(d))throw new TypeError("Second argument must be a String");if(!s.fn(b))throw new TypeError("Third argument must be a Function");if(s.node(u))return p(u,d,b);if(s.nodeList(u))return m(u,d,b);if(s.string(u))return f(u,d,b);throw new TypeError("First argument must be a String, HTMLElement, HTMLCollection, or NodeList")}function p(u,d,b){return u.addEventListener(d,b),{destroy:function(){u.removeEventListener(d,b)}}}function m(u,d,b){return Array.prototype.forEach.call(u,function(_){_.addEventListener(d,b)}),{destroy:function(){Array.prototype.forEach.call(u,function(_){_.removeEventListener(d,b)})}}}function f(u,d,b){return a(document.body,u,d,b)}o.exports=c},817:function(o){function n(i){var s;if(i.nodeName==="SELECT")i.focus(),s=i.value;else if(i.nodeName==="INPUT"||i.nodeName==="TEXTAREA"){var a=i.hasAttribute("readonly");a||i.setAttribute("readonly",""),i.select(),i.setSelectionRange(0,i.value.length),a||i.removeAttribute("readonly"),s=i.value}else{i.hasAttribute("contenteditable")&&i.focus();var c=window.getSelection(),p=document.createRange();p.selectNodeContents(i),c.removeAllRanges(),c.addRange(p),s=c.toString()}return s}o.exports=n},279:function(o){function n(){}n.prototype={on:function(i,s,a){var c=this.e||(this.e={});return(c[i]||(c[i]=[])).push({fn:s,ctx:a}),this},once:function(i,s,a){var c=this;function p(){c.off(i,p),s.apply(a,arguments)}return p._=s,this.on(i,p,a)},emit:function(i){var s=[].slice.call(arguments,1),a=((this.e||(this.e={}))[i]||[]).slice(),c=0,p=a.length;for(c;c{"use strict";/*! + * escape-html + * Copyright(c) 2012-2013 TJ Holowaychuk + * Copyright(c) 2015 Andreas Lubbe + * Copyright(c) 2015 Tiancheng "Timothy" Gu + * MIT Licensed + */var _a=/["'&<>]/;Pn.exports=Aa;function Aa(e){var t=""+e,r=_a.exec(t);if(!r)return t;var o,n="",i=0,s=0;for(i=r.index;i0&&i[i.length-1])&&(p[0]===6||p[0]===2)){r=0;continue}if(p[0]===3&&(!i||p[1]>i[0]&&p[1]=e.length&&(e=void 0),{value:e&&e[o++],done:!e}}};throw new TypeError(t?"Object is not iterable.":"Symbol.iterator is not defined.")}function U(e,t){var r=typeof Symbol=="function"&&e[Symbol.iterator];if(!r)return e;var o=r.call(e),n,i=[],s;try{for(;(t===void 0||t-- >0)&&!(n=o.next()).done;)i.push(n.value)}catch(a){s={error:a}}finally{try{n&&!n.done&&(r=o.return)&&r.call(o)}finally{if(s)throw s.error}}return i}function D(e,t,r){if(r||arguments.length===2)for(var o=0,n=t.length,i;o1||a(u,d)})})}function a(u,d){try{c(o[u](d))}catch(b){f(i[0][3],b)}}function c(u){u.value instanceof Ze?Promise.resolve(u.value.v).then(p,m):f(i[0][2],u)}function p(u){a("next",u)}function m(u){a("throw",u)}function f(u,d){u(d),i.shift(),i.length&&a(i[0][0],i[0][1])}}function no(e){if(!Symbol.asyncIterator)throw new TypeError("Symbol.asyncIterator is not defined.");var t=e[Symbol.asyncIterator],r;return t?t.call(e):(e=typeof Ee=="function"?Ee(e):e[Symbol.iterator](),r={},o("next"),o("throw"),o("return"),r[Symbol.asyncIterator]=function(){return this},r);function o(i){r[i]=e[i]&&function(s){return new Promise(function(a,c){s=e[i](s),n(a,c,s.done,s.value)})}}function n(i,s,a,c){Promise.resolve(c).then(function(p){i({value:p,done:a})},s)}}function C(e){return typeof e=="function"}function at(e){var t=function(o){Error.call(o),o.stack=new Error().stack},r=e(t);return r.prototype=Object.create(Error.prototype),r.prototype.constructor=r,r}var It=at(function(e){return function(r){e(this),this.message=r?r.length+` errors occurred during unsubscription: +`+r.map(function(o,n){return n+1+") "+o.toString()}).join(` + `):"",this.name="UnsubscriptionError",this.errors=r}});function De(e,t){if(e){var r=e.indexOf(t);0<=r&&e.splice(r,1)}}var Pe=function(){function e(t){this.initialTeardown=t,this.closed=!1,this._parentage=null,this._finalizers=null}return e.prototype.unsubscribe=function(){var t,r,o,n,i;if(!this.closed){this.closed=!0;var s=this._parentage;if(s)if(this._parentage=null,Array.isArray(s))try{for(var a=Ee(s),c=a.next();!c.done;c=a.next()){var p=c.value;p.remove(this)}}catch(_){t={error:_}}finally{try{c&&!c.done&&(r=a.return)&&r.call(a)}finally{if(t)throw t.error}}else s.remove(this);var m=this.initialTeardown;if(C(m))try{m()}catch(_){i=_ instanceof It?_.errors:[_]}var f=this._finalizers;if(f){this._finalizers=null;try{for(var u=Ee(f),d=u.next();!d.done;d=u.next()){var b=d.value;try{io(b)}catch(_){i=i!=null?i:[],_ instanceof It?i=D(D([],U(i)),U(_.errors)):i.push(_)}}}catch(_){o={error:_}}finally{try{d&&!d.done&&(n=u.return)&&n.call(u)}finally{if(o)throw o.error}}}if(i)throw new It(i)}},e.prototype.add=function(t){var r;if(t&&t!==this)if(this.closed)io(t);else{if(t instanceof e){if(t.closed||t._hasParent(this))return;t._addParent(this)}(this._finalizers=(r=this._finalizers)!==null&&r!==void 0?r:[]).push(t)}},e.prototype._hasParent=function(t){var r=this._parentage;return r===t||Array.isArray(r)&&r.includes(t)},e.prototype._addParent=function(t){var r=this._parentage;this._parentage=Array.isArray(r)?(r.push(t),r):r?[r,t]:t},e.prototype._removeParent=function(t){var r=this._parentage;r===t?this._parentage=null:Array.isArray(r)&&De(r,t)},e.prototype.remove=function(t){var r=this._finalizers;r&&De(r,t),t instanceof e&&t._removeParent(this)},e.EMPTY=function(){var t=new e;return t.closed=!0,t}(),e}();var xr=Pe.EMPTY;function Pt(e){return e instanceof Pe||e&&"closed"in e&&C(e.remove)&&C(e.add)&&C(e.unsubscribe)}function io(e){C(e)?e():e.unsubscribe()}var Le={onUnhandledError:null,onStoppedNotification:null,Promise:void 0,useDeprecatedSynchronousErrorHandling:!1,useDeprecatedNextContext:!1};var st={setTimeout:function(e,t){for(var r=[],o=2;o0},enumerable:!1,configurable:!0}),t.prototype._trySubscribe=function(r){return this._throwIfClosed(),e.prototype._trySubscribe.call(this,r)},t.prototype._subscribe=function(r){return this._throwIfClosed(),this._checkFinalizedStatuses(r),this._innerSubscribe(r)},t.prototype._innerSubscribe=function(r){var o=this,n=this,i=n.hasError,s=n.isStopped,a=n.observers;return i||s?xr:(this.currentObservers=null,a.push(r),new Pe(function(){o.currentObservers=null,De(a,r)}))},t.prototype._checkFinalizedStatuses=function(r){var o=this,n=o.hasError,i=o.thrownError,s=o.isStopped;n?r.error(i):s&&r.complete()},t.prototype.asObservable=function(){var r=new j;return r.source=this,r},t.create=function(r,o){return new uo(r,o)},t}(j);var uo=function(e){ie(t,e);function t(r,o){var n=e.call(this)||this;return n.destination=r,n.source=o,n}return t.prototype.next=function(r){var o,n;(n=(o=this.destination)===null||o===void 0?void 0:o.next)===null||n===void 0||n.call(o,r)},t.prototype.error=function(r){var o,n;(n=(o=this.destination)===null||o===void 0?void 0:o.error)===null||n===void 0||n.call(o,r)},t.prototype.complete=function(){var r,o;(o=(r=this.destination)===null||r===void 0?void 0:r.complete)===null||o===void 0||o.call(r)},t.prototype._subscribe=function(r){var o,n;return(n=(o=this.source)===null||o===void 0?void 0:o.subscribe(r))!==null&&n!==void 0?n:xr},t}(x);var yt={now:function(){return(yt.delegate||Date).now()},delegate:void 0};var Et=function(e){ie(t,e);function t(r,o,n){r===void 0&&(r=1/0),o===void 0&&(o=1/0),n===void 0&&(n=yt);var i=e.call(this)||this;return i._bufferSize=r,i._windowTime=o,i._timestampProvider=n,i._buffer=[],i._infiniteTimeWindow=!0,i._infiniteTimeWindow=o===1/0,i._bufferSize=Math.max(1,r),i._windowTime=Math.max(1,o),i}return t.prototype.next=function(r){var o=this,n=o.isStopped,i=o._buffer,s=o._infiniteTimeWindow,a=o._timestampProvider,c=o._windowTime;n||(i.push(r),!s&&i.push(a.now()+c)),this._trimBuffer(),e.prototype.next.call(this,r)},t.prototype._subscribe=function(r){this._throwIfClosed(),this._trimBuffer();for(var o=this._innerSubscribe(r),n=this,i=n._infiniteTimeWindow,s=n._buffer,a=s.slice(),c=0;c0?e.prototype.requestAsyncId.call(this,r,o,n):(r.actions.push(this),r._scheduled||(r._scheduled=mt.requestAnimationFrame(function(){return r.flush(void 0)})))},t.prototype.recycleAsyncId=function(r,o,n){var i;if(n===void 0&&(n=0),n!=null?n>0:this.delay>0)return e.prototype.recycleAsyncId.call(this,r,o,n);var s=r.actions;o!=null&&((i=s[s.length-1])===null||i===void 0?void 0:i.id)!==o&&(mt.cancelAnimationFrame(o),r._scheduled=void 0)},t}(Wt);var vo=function(e){ie(t,e);function t(){return e!==null&&e.apply(this,arguments)||this}return t.prototype.flush=function(r){this._active=!0;var o=this._scheduled;this._scheduled=void 0;var n=this.actions,i;r=r||n.shift();do if(i=r.execute(r.state,r.delay))break;while((r=n[0])&&r.id===o&&n.shift());if(this._active=!1,i){for(;(r=n[0])&&r.id===o&&n.shift();)r.unsubscribe();throw i}},t}(Ut);var Te=new vo(bo);var T=new j(function(e){return e.complete()});function Nt(e){return e&&C(e.schedule)}function Mr(e){return e[e.length-1]}function Qe(e){return C(Mr(e))?e.pop():void 0}function Oe(e){return Nt(Mr(e))?e.pop():void 0}function Dt(e,t){return typeof Mr(e)=="number"?e.pop():t}var lt=function(e){return e&&typeof e.length=="number"&&typeof e!="function"};function Vt(e){return C(e==null?void 0:e.then)}function zt(e){return C(e[pt])}function qt(e){return Symbol.asyncIterator&&C(e==null?void 0:e[Symbol.asyncIterator])}function Kt(e){return new TypeError("You provided "+(e!==null&&typeof e=="object"?"an invalid object":"'"+e+"'")+" where a stream was expected. You can provide an Observable, Promise, ReadableStream, Array, AsyncIterable, or Iterable.")}function ki(){return typeof Symbol!="function"||!Symbol.iterator?"@@iterator":Symbol.iterator}var Qt=ki();function Yt(e){return C(e==null?void 0:e[Qt])}function Bt(e){return oo(this,arguments,function(){var r,o,n,i;return Rt(this,function(s){switch(s.label){case 0:r=e.getReader(),s.label=1;case 1:s.trys.push([1,,9,10]),s.label=2;case 2:return[4,Ze(r.read())];case 3:return o=s.sent(),n=o.value,i=o.done,i?[4,Ze(void 0)]:[3,5];case 4:return[2,s.sent()];case 5:return[4,Ze(n)];case 6:return[4,s.sent()];case 7:return s.sent(),[3,2];case 8:return[3,10];case 9:return r.releaseLock(),[7];case 10:return[2]}})})}function Gt(e){return C(e==null?void 0:e.getReader)}function W(e){if(e instanceof j)return e;if(e!=null){if(zt(e))return Hi(e);if(lt(e))return $i(e);if(Vt(e))return Ri(e);if(qt(e))return go(e);if(Yt(e))return Ii(e);if(Gt(e))return Pi(e)}throw Kt(e)}function Hi(e){return new j(function(t){var r=e[pt]();if(C(r.subscribe))return r.subscribe(t);throw new TypeError("Provided object does not correctly implement Symbol.observable")})}function $i(e){return new j(function(t){for(var r=0;r=2;return function(o){return o.pipe(e?L(function(n,i){return e(n,i,o)}):de,ge(1),r?He(t):Io(function(){return new Xt}))}}function Po(){for(var e=[],t=0;t=2,!0))}function le(e){e===void 0&&(e={});var t=e.connector,r=t===void 0?function(){return new x}:t,o=e.resetOnError,n=o===void 0?!0:o,i=e.resetOnComplete,s=i===void 0?!0:i,a=e.resetOnRefCountZero,c=a===void 0?!0:a;return function(p){var m,f,u,d=0,b=!1,_=!1,re=function(){f==null||f.unsubscribe(),f=void 0},Z=function(){re(),m=u=void 0,b=_=!1},Y=function(){var A=m;Z(),A==null||A.unsubscribe()};return g(function(A,it){d++,!_&&!b&&re();var Ne=u=u!=null?u:r();it.add(function(){d--,d===0&&!_&&!b&&(f=kr(Y,c))}),Ne.subscribe(it),!m&&d>0&&(m=new tt({next:function(Ie){return Ne.next(Ie)},error:function(Ie){_=!0,re(),f=kr(Z,n,Ie),Ne.error(Ie)},complete:function(){b=!0,re(),f=kr(Z,s),Ne.complete()}}),W(A).subscribe(m))})(p)}}function kr(e,t){for(var r=[],o=2;oe.next(document)),e}function z(e,t=document){return Array.from(t.querySelectorAll(e))}function N(e,t=document){let r=ce(e,t);if(typeof r=="undefined")throw new ReferenceError(`Missing element: expected "${e}" to be present`);return r}function ce(e,t=document){return t.querySelector(e)||void 0}function Re(){return document.activeElement instanceof HTMLElement&&document.activeElement||void 0}var ea=M(h(document.body,"focusin"),h(document.body,"focusout")).pipe(ke(1),V(void 0),l(()=>Re()||document.body),B(1));function er(e){return ea.pipe(l(t=>e.contains(t)),G())}function Je(e){return{x:e.offsetLeft,y:e.offsetTop}}function Uo(e){return M(h(window,"load"),h(window,"resize")).pipe(Ae(0,Te),l(()=>Je(e)),V(Je(e)))}function tr(e){return{x:e.scrollLeft,y:e.scrollTop}}function dt(e){return M(h(e,"scroll"),h(window,"resize")).pipe(Ae(0,Te),l(()=>tr(e)),V(tr(e)))}function No(e,t){if(typeof t=="string"||typeof t=="number")e.innerHTML+=t.toString();else if(t instanceof Node)e.appendChild(t);else if(Array.isArray(t))for(let r of t)No(e,r)}function O(e,t,...r){let o=document.createElement(e);if(t)for(let n of Object.keys(t))typeof t[n]!="undefined"&&(typeof t[n]!="boolean"?o.setAttribute(n,t[n]):o.setAttribute(n,""));for(let n of r)No(o,n);return o}function rr(e){if(e>999){let t=+((e-950)%1e3>99);return`${((e+1e-6)/1e3).toFixed(t)}k`}else return e.toString()}function ht(e){let t=O("script",{src:e});return $(()=>(document.head.appendChild(t),M(h(t,"load"),h(t,"error").pipe(v(()=>St(()=>new ReferenceError(`Invalid script: ${e}`))))).pipe(l(()=>{}),k(()=>document.head.removeChild(t)),ge(1))))}var Do=new x,ta=$(()=>typeof ResizeObserver=="undefined"?ht("https://unpkg.com/resize-observer-polyfill"):H(void 0)).pipe(l(()=>new ResizeObserver(e=>{for(let t of e)Do.next(t)})),v(e=>M(Ve,H(e)).pipe(k(()=>e.disconnect()))),B(1));function he(e){return{width:e.offsetWidth,height:e.offsetHeight}}function xe(e){return ta.pipe(w(t=>t.observe(e)),v(t=>Do.pipe(L(({target:r})=>r===e),k(()=>t.unobserve(e)),l(()=>he(e)))),V(he(e)))}function bt(e){return{width:e.scrollWidth,height:e.scrollHeight}}function or(e){let t=e.parentElement;for(;t&&(e.scrollWidth<=t.scrollWidth&&e.scrollHeight<=t.scrollHeight);)t=(e=t).parentElement;return t?e:void 0}var Vo=new x,ra=$(()=>H(new IntersectionObserver(e=>{for(let t of e)Vo.next(t)},{threshold:0}))).pipe(v(e=>M(Ve,H(e)).pipe(k(()=>e.disconnect()))),B(1));function nr(e){return ra.pipe(w(t=>t.observe(e)),v(t=>Vo.pipe(L(({target:r})=>r===e),k(()=>t.unobserve(e)),l(({isIntersecting:r})=>r))))}function zo(e,t=16){return dt(e).pipe(l(({y:r})=>{let o=he(e),n=bt(e);return r>=n.height-o.height-t}),G())}var ir={drawer:N("[data-md-toggle=drawer]"),search:N("[data-md-toggle=search]")};function qo(e){return ir[e].checked}function Ke(e,t){ir[e].checked!==t&&ir[e].click()}function We(e){let t=ir[e];return h(t,"change").pipe(l(()=>t.checked),V(t.checked))}function oa(e,t){switch(e.constructor){case HTMLInputElement:return e.type==="radio"?/^Arrow/.test(t):!0;case HTMLSelectElement:case HTMLTextAreaElement:return!0;default:return e.isContentEditable}}function na(){return M(h(window,"compositionstart").pipe(l(()=>!0)),h(window,"compositionend").pipe(l(()=>!1))).pipe(V(!1))}function Ko(){let e=h(window,"keydown").pipe(L(t=>!(t.metaKey||t.ctrlKey)),l(t=>({mode:qo("search")?"search":"global",type:t.key,claim(){t.preventDefault(),t.stopPropagation()}})),L(({mode:t,type:r})=>{if(t==="global"){let o=Re();if(typeof o!="undefined")return!oa(o,r)}return!0}),le());return na().pipe(v(t=>t?T:e))}function fe(){return new URL(location.href)}function ot(e){location.href=e.href}function Qo(){return new x}function Yo(){return location.hash.slice(1)}function Pr(e){let t=O("a",{href:e});t.addEventListener("click",r=>r.stopPropagation()),t.click()}function ia(e){return M(h(window,"hashchange"),e).pipe(l(Yo),V(Yo()),L(t=>t.length>0),B(1))}function Bo(e){return ia(e).pipe(l(t=>ce(`[id="${t}"]`)),L(t=>typeof t!="undefined"))}function Fr(e){let t=matchMedia(e);return Zt(r=>t.addListener(()=>r(t.matches))).pipe(V(t.matches))}function Go(){let e=matchMedia("print");return M(h(window,"beforeprint").pipe(l(()=>!0)),h(window,"afterprint").pipe(l(()=>!1))).pipe(V(e.matches))}function jr(e,t){return e.pipe(v(r=>r?t():T))}function ar(e,t={credentials:"same-origin"}){return me(fetch(`${e}`,t)).pipe(pe(()=>T),v(r=>r.status!==200?St(()=>new Error(r.statusText)):H(r)))}function Ue(e,t){return ar(e,t).pipe(v(r=>r.json()),B(1))}function Jo(e,t){let r=new DOMParser;return ar(e,t).pipe(v(o=>o.text()),l(o=>r.parseFromString(o,"text/xml")),B(1))}function Xo(){return{x:Math.max(0,scrollX),y:Math.max(0,scrollY)}}function Zo(){return M(h(window,"scroll",{passive:!0}),h(window,"resize",{passive:!0})).pipe(l(Xo),V(Xo()))}function en(){return{width:innerWidth,height:innerHeight}}function tn(){return h(window,"resize",{passive:!0}).pipe(l(en),V(en()))}function rn(){return Q([Zo(),tn()]).pipe(l(([e,t])=>({offset:e,size:t})),B(1))}function sr(e,{viewport$:t,header$:r}){let o=t.pipe(X("size")),n=Q([o,r]).pipe(l(()=>Je(e)));return Q([r,t,n]).pipe(l(([{height:i},{offset:s,size:a},{x:c,y:p}])=>({offset:{x:s.x-c,y:s.y-p+i},size:a})))}function aa(e){return h(e,"message",t=>t.data)}function sa(e){let t=new x;return t.subscribe(r=>e.postMessage(r)),t}function on(e,t=new Worker(e)){let r=aa(t),o=sa(t),n=new x;n.subscribe(o);let i=o.pipe(J(),ee(!0));return n.pipe(J(),qe(r.pipe(K(i))),le())}var ca=N("#__config"),vt=JSON.parse(ca.textContent);vt.base=`${new URL(vt.base,fe())}`;function ue(){return vt}function te(e){return vt.features.includes(e)}function be(e,t){return typeof t!="undefined"?vt.translations[e].replace("#",t.toString()):vt.translations[e]}function ye(e,t=document){return N(`[data-md-component=${e}]`,t)}function ne(e,t=document){return z(`[data-md-component=${e}]`,t)}function pa(e){let t=N(".md-typeset > :first-child",e);return h(t,"click",{once:!0}).pipe(l(()=>N(".md-typeset",e)),l(r=>({hash:__md_hash(r.innerHTML)})))}function nn(e){if(!te("announce.dismiss")||!e.childElementCount)return T;if(!e.hidden){let t=N(".md-typeset",e);__md_hash(t.innerHTML)===__md_get("__announce")&&(e.hidden=!0)}return $(()=>{let t=new x;return t.subscribe(({hash:r})=>{e.hidden=!0,__md_set("__announce",r)}),pa(e).pipe(w(r=>t.next(r)),k(()=>t.complete()),l(r=>I({ref:e},r)))})}function ma(e,{target$:t}){return t.pipe(l(r=>({hidden:r!==e})))}function an(e,t){let r=new x;return r.subscribe(({hidden:o})=>{e.hidden=o}),ma(e,t).pipe(w(o=>r.next(o)),k(()=>r.complete()),l(o=>I({ref:e},o)))}function la(e,t){let r=$(()=>Q([Uo(e),dt(t)])).pipe(l(([{x:o,y:n},i])=>{let{width:s,height:a}=he(e);return{x:o-i.x+s/2,y:n-i.y+a/2}}));return er(e).pipe(v(o=>r.pipe(l(n=>({active:o,offset:n})),ge(+!o||1/0))))}function sn(e,t,{target$:r}){let[o,n]=Array.from(e.children);return $(()=>{let i=new x,s=i.pipe(J(),ee(!0));return i.subscribe({next({offset:a}){e.style.setProperty("--md-tooltip-x",`${a.x}px`),e.style.setProperty("--md-tooltip-y",`${a.y}px`)},complete(){e.style.removeProperty("--md-tooltip-x"),e.style.removeProperty("--md-tooltip-y")}}),nr(e).pipe(K(s)).subscribe(a=>{e.toggleAttribute("data-md-visible",a)}),M(i.pipe(L(({active:a})=>a)),i.pipe(ke(250),L(({active:a})=>!a))).subscribe({next({active:a}){a?e.prepend(o):o.remove()},complete(){e.prepend(o)}}),i.pipe(Ae(16,Te)).subscribe(({active:a})=>{o.classList.toggle("md-tooltip--active",a)}),i.pipe(Rr(125,Te),L(()=>!!e.offsetParent),l(()=>e.offsetParent.getBoundingClientRect()),l(({x:a})=>a)).subscribe({next(a){a?e.style.setProperty("--md-tooltip-0",`${-a}px`):e.style.removeProperty("--md-tooltip-0")},complete(){e.style.removeProperty("--md-tooltip-0")}}),h(n,"click").pipe(K(s),L(a=>!(a.metaKey||a.ctrlKey))).subscribe(a=>{a.stopPropagation(),a.preventDefault()}),h(n,"mousedown").pipe(K(s),oe(i)).subscribe(([a,{active:c}])=>{var p;if(a.button!==0||a.metaKey||a.ctrlKey)a.preventDefault();else if(c){a.preventDefault();let m=e.parentElement.closest(".md-annotation");m instanceof HTMLElement?m.focus():(p=Re())==null||p.blur()}}),r.pipe(K(s),L(a=>a===o),ze(125)).subscribe(()=>e.focus()),la(e,t).pipe(w(a=>i.next(a)),k(()=>i.complete()),l(a=>I({ref:e},a)))})}function Wr(e){return O("div",{class:"md-tooltip",id:e},O("div",{class:"md-tooltip__inner md-typeset"}))}function cn(e,t){if(t=t?`${t}_annotation_${e}`:void 0,t){let r=t?`#${t}`:void 0;return O("aside",{class:"md-annotation",tabIndex:0},Wr(t),O("a",{href:r,class:"md-annotation__index",tabIndex:-1},O("span",{"data-md-annotation-id":e})))}else return O("aside",{class:"md-annotation",tabIndex:0},Wr(t),O("span",{class:"md-annotation__index",tabIndex:-1},O("span",{"data-md-annotation-id":e})))}function pn(e){return O("button",{class:"md-clipboard md-icon",title:be("clipboard.copy"),"data-clipboard-target":`#${e} > code`})}function Ur(e,t){let r=t&2,o=t&1,n=Object.keys(e.terms).filter(c=>!e.terms[c]).reduce((c,p)=>[...c,O("del",null,p)," "],[]).slice(0,-1),i=ue(),s=new URL(e.location,i.base);te("search.highlight")&&s.searchParams.set("h",Object.entries(e.terms).filter(([,c])=>c).reduce((c,[p])=>`${c} ${p}`.trim(),""));let{tags:a}=ue();return O("a",{href:`${s}`,class:"md-search-result__link",tabIndex:-1},O("article",{class:"md-search-result__article md-typeset","data-md-score":e.score.toFixed(2)},r>0&&O("div",{class:"md-search-result__icon md-icon"}),r>0&&O("h1",null,e.title),r<=0&&O("h2",null,e.title),o>0&&e.text.length>0&&e.text,e.tags&&e.tags.map(c=>{let p=a?c in a?`md-tag-icon md-tag--${a[c]}`:"md-tag-icon":"";return O("span",{class:`md-tag ${p}`},c)}),o>0&&n.length>0&&O("p",{class:"md-search-result__terms"},be("search.result.term.missing"),": ",...n)))}function mn(e){let t=e[0].score,r=[...e],o=ue(),n=r.findIndex(m=>!`${new URL(m.location,o.base)}`.includes("#")),[i]=r.splice(n,1),s=r.findIndex(m=>m.scoreUr(m,1)),...c.length?[O("details",{class:"md-search-result__more"},O("summary",{tabIndex:-1},O("div",null,c.length>0&&c.length===1?be("search.result.more.one"):be("search.result.more.other",c.length))),...c.map(m=>Ur(m,1)))]:[]];return O("li",{class:"md-search-result__item"},p)}function ln(e){return O("ul",{class:"md-source__facts"},Object.entries(e).map(([t,r])=>O("li",{class:`md-source__fact md-source__fact--${t}`},typeof r=="number"?rr(r):r)))}function Nr(e){let t=`tabbed-control tabbed-control--${e}`;return O("div",{class:t,hidden:!0},O("button",{class:"tabbed-button",tabIndex:-1,"aria-hidden":"true"}))}function fn(e){return O("div",{class:"md-typeset__scrollwrap"},O("div",{class:"md-typeset__table"},e))}function fa(e){let t=ue(),r=new URL(`../${e.version}/`,t.base);return O("li",{class:"md-version__item"},O("a",{href:`${r}`,class:"md-version__link"},e.title))}function un(e,t){return O("div",{class:"md-version"},O("button",{class:"md-version__current","aria-label":be("select.version")},t.title),O("ul",{class:"md-version__list"},e.map(fa)))}function ua(e){return e.tagName==="CODE"?z(".c, .c1, .cm",e):[e]}function da(e){let t=[];for(let r of ua(e)){let o=[],n=document.createNodeIterator(r,NodeFilter.SHOW_TEXT);for(let i=n.nextNode();i;i=n.nextNode())o.push(i);for(let i of o){let s;for(;s=/(\(\d+\))(!)?/.exec(i.textContent);){let[,a,c]=s;if(typeof c=="undefined"){let p=i.splitText(s.index);i=p.splitText(a.length),t.push(p)}else{i.textContent=a,t.push(i);break}}}}return t}function dn(e,t){t.append(...Array.from(e.childNodes))}function cr(e,t,{target$:r,print$:o}){let n=t.closest("[id]"),i=n==null?void 0:n.id,s=new Map;for(let a of da(t)){let[,c]=a.textContent.match(/\((\d+)\)/);ce(`:scope > li:nth-child(${c})`,e)&&(s.set(c,cn(c,i)),a.replaceWith(s.get(c)))}return s.size===0?T:$(()=>{let a=new x,c=a.pipe(J(),ee(!0)),p=[];for(let[m,f]of s)p.push([N(".md-typeset",f),N(`:scope > li:nth-child(${m})`,e)]);return o.pipe(K(c)).subscribe(m=>{e.hidden=!m,e.classList.toggle("md-annotation-list",m);for(let[f,u]of p)m?dn(f,u):dn(u,f)}),M(...[...s].map(([,m])=>sn(m,t,{target$:r}))).pipe(k(()=>a.complete()),le())})}function hn(e){if(e.nextElementSibling){let t=e.nextElementSibling;if(t.tagName==="OL")return t;if(t.tagName==="P"&&!t.children.length)return hn(t)}}function bn(e,t){return $(()=>{let r=hn(e);return typeof r!="undefined"?cr(r,e,t):T})}var gn=$t(Vr());var ha=0;function xn(e){if(e.nextElementSibling){let t=e.nextElementSibling;if(t.tagName==="OL")return t;if(t.tagName==="P"&&!t.children.length)return xn(t)}}function vn(e){return xe(e).pipe(l(({width:t})=>({scrollable:bt(e).width>t})),X("scrollable"))}function yn(e,t){let{matches:r}=matchMedia("(hover)"),o=$(()=>{let n=new x;if(n.subscribe(({scrollable:s})=>{s&&r?e.setAttribute("tabindex","0"):e.removeAttribute("tabindex")}),gn.default.isSupported()&&(e.closest(".copy")||te("content.code.copy")&&!e.closest(".no-copy"))){let s=e.closest("pre");s.id=`__code_${ha++}`,s.insertBefore(pn(s.id),e)}let i=e.closest(".highlight");if(i instanceof HTMLElement){let s=xn(i);if(typeof s!="undefined"&&(i.classList.contains("annotate")||te("content.code.annotate"))){let a=cr(s,e,t);return vn(e).pipe(w(c=>n.next(c)),k(()=>n.complete()),l(c=>I({ref:e},c)),qe(xe(i).pipe(l(({width:c,height:p})=>c&&p),G(),v(c=>c?a:T))))}}return vn(e).pipe(w(s=>n.next(s)),k(()=>n.complete()),l(s=>I({ref:e},s)))});return te("content.lazy")?nr(e).pipe(L(n=>n),ge(1),v(()=>o)):o}function ba(e,{target$:t,print$:r}){let o=!0;return M(t.pipe(l(n=>n.closest("details:not([open])")),L(n=>e===n),l(()=>({action:"open",reveal:!0}))),r.pipe(L(n=>n||!o),w(()=>o=e.open),l(n=>({action:n?"open":"close"}))))}function En(e,t){return $(()=>{let r=new x;return r.subscribe(({action:o,reveal:n})=>{e.toggleAttribute("open",o==="open"),n&&e.scrollIntoView()}),ba(e,t).pipe(w(o=>r.next(o)),k(()=>r.complete()),l(o=>I({ref:e},o)))})}var wn=".node circle,.node ellipse,.node path,.node polygon,.node rect{fill:var(--md-mermaid-node-bg-color);stroke:var(--md-mermaid-node-fg-color)}marker{fill:var(--md-mermaid-edge-color)!important}.edgeLabel .label rect{fill:#0000}.label{color:var(--md-mermaid-label-fg-color);font-family:var(--md-mermaid-font-family)}.label foreignObject{line-height:normal;overflow:visible}.label div .edgeLabel{color:var(--md-mermaid-label-fg-color)}.edgeLabel,.edgeLabel rect,.label div .edgeLabel{background-color:var(--md-mermaid-label-bg-color)}.edgeLabel,.edgeLabel rect{fill:var(--md-mermaid-label-bg-color);color:var(--md-mermaid-edge-color)}.edgePath .path,.flowchart-link{stroke:var(--md-mermaid-edge-color);stroke-width:.05rem}.edgePath .arrowheadPath{fill:var(--md-mermaid-edge-color);stroke:none}.cluster rect{fill:var(--md-default-fg-color--lightest);stroke:var(--md-default-fg-color--lighter)}.cluster span{color:var(--md-mermaid-label-fg-color);font-family:var(--md-mermaid-font-family)}g #flowchart-circleEnd,g #flowchart-circleStart,g #flowchart-crossEnd,g #flowchart-crossStart,g #flowchart-pointEnd,g #flowchart-pointStart{stroke:none}g.classGroup line,g.classGroup rect{fill:var(--md-mermaid-node-bg-color);stroke:var(--md-mermaid-node-fg-color)}g.classGroup text{fill:var(--md-mermaid-label-fg-color);font-family:var(--md-mermaid-font-family)}.classLabel .box{fill:var(--md-mermaid-label-bg-color);background-color:var(--md-mermaid-label-bg-color);opacity:1}.classLabel .label{fill:var(--md-mermaid-label-fg-color);font-family:var(--md-mermaid-font-family)}.node .divider{stroke:var(--md-mermaid-node-fg-color)}.relation{stroke:var(--md-mermaid-edge-color)}.cardinality{fill:var(--md-mermaid-label-fg-color);font-family:var(--md-mermaid-font-family)}.cardinality text{fill:inherit!important}defs #classDiagram-compositionEnd,defs #classDiagram-compositionStart,defs #classDiagram-dependencyEnd,defs #classDiagram-dependencyStart,defs #classDiagram-extensionEnd,defs #classDiagram-extensionStart{fill:var(--md-mermaid-edge-color)!important;stroke:var(--md-mermaid-edge-color)!important}defs #classDiagram-aggregationEnd,defs #classDiagram-aggregationStart{fill:var(--md-mermaid-label-bg-color)!important;stroke:var(--md-mermaid-edge-color)!important}g.stateGroup rect{fill:var(--md-mermaid-node-bg-color);stroke:var(--md-mermaid-node-fg-color)}g.stateGroup .state-title{fill:var(--md-mermaid-label-fg-color)!important;font-family:var(--md-mermaid-font-family)}g.stateGroup .composit{fill:var(--md-mermaid-label-bg-color)}.nodeLabel{color:var(--md-mermaid-label-fg-color);font-family:var(--md-mermaid-font-family)}.node circle.state-end,.node circle.state-start,.start-state{fill:var(--md-mermaid-edge-color);stroke:none}.end-state-inner,.end-state-outer{fill:var(--md-mermaid-edge-color)}.end-state-inner,.node circle.state-end{stroke:var(--md-mermaid-label-bg-color)}.transition{stroke:var(--md-mermaid-edge-color)}[id^=state-fork] rect,[id^=state-join] rect{fill:var(--md-mermaid-edge-color)!important;stroke:none!important}.statediagram-cluster.statediagram-cluster .inner{fill:var(--md-default-bg-color)}.statediagram-cluster rect{fill:var(--md-mermaid-node-bg-color);stroke:var(--md-mermaid-node-fg-color)}.statediagram-state rect.divider{fill:var(--md-default-fg-color--lightest);stroke:var(--md-default-fg-color--lighter)}defs #statediagram-barbEnd{stroke:var(--md-mermaid-edge-color)}.attributeBoxEven,.attributeBoxOdd{fill:var(--md-mermaid-node-bg-color);stroke:var(--md-mermaid-node-fg-color)}.entityBox{fill:var(--md-mermaid-label-bg-color);stroke:var(--md-mermaid-node-fg-color)}.entityLabel{fill:var(--md-mermaid-label-fg-color);font-family:var(--md-mermaid-font-family)}.relationshipLabelBox{fill:var(--md-mermaid-label-bg-color);fill-opacity:1;background-color:var(--md-mermaid-label-bg-color);opacity:1}.relationshipLabel{fill:var(--md-mermaid-label-fg-color)}.relationshipLine{stroke:var(--md-mermaid-edge-color)}defs #ONE_OR_MORE_END *,defs #ONE_OR_MORE_START *,defs #ONLY_ONE_END *,defs #ONLY_ONE_START *,defs #ZERO_OR_MORE_END *,defs #ZERO_OR_MORE_START *,defs #ZERO_OR_ONE_END *,defs #ZERO_OR_ONE_START *{stroke:var(--md-mermaid-edge-color)!important}defs #ZERO_OR_MORE_END circle,defs #ZERO_OR_MORE_START circle{fill:var(--md-mermaid-label-bg-color)}.actor{fill:var(--md-mermaid-sequence-actor-bg-color);stroke:var(--md-mermaid-sequence-actor-border-color)}text.actor>tspan{fill:var(--md-mermaid-sequence-actor-fg-color);font-family:var(--md-mermaid-font-family)}line{stroke:var(--md-mermaid-sequence-actor-line-color)}.actor-man circle,.actor-man line{fill:var(--md-mermaid-sequence-actorman-bg-color);stroke:var(--md-mermaid-sequence-actorman-line-color)}.messageLine0,.messageLine1{stroke:var(--md-mermaid-sequence-message-line-color)}.note{fill:var(--md-mermaid-sequence-note-bg-color);stroke:var(--md-mermaid-sequence-note-border-color)}.loopText,.loopText>tspan,.messageText,.noteText>tspan{stroke:none;font-family:var(--md-mermaid-font-family)!important}.messageText{fill:var(--md-mermaid-sequence-message-fg-color)}.loopText,.loopText>tspan{fill:var(--md-mermaid-sequence-loop-fg-color)}.noteText>tspan{fill:var(--md-mermaid-sequence-note-fg-color)}#arrowhead path{fill:var(--md-mermaid-sequence-message-line-color);stroke:none}.loopLine{fill:var(--md-mermaid-sequence-loop-bg-color);stroke:var(--md-mermaid-sequence-loop-border-color)}.labelBox{fill:var(--md-mermaid-sequence-label-bg-color);stroke:none}.labelText,.labelText>span{fill:var(--md-mermaid-sequence-label-fg-color);font-family:var(--md-mermaid-font-family)}.sequenceNumber{fill:var(--md-mermaid-sequence-number-fg-color)}rect.rect{fill:var(--md-mermaid-sequence-box-bg-color);stroke:none}rect.rect+text.text{fill:var(--md-mermaid-sequence-box-fg-color)}defs #sequencenumber{fill:var(--md-mermaid-sequence-number-bg-color)!important}";var zr,ga=0;function xa(){return typeof mermaid=="undefined"||mermaid instanceof Element?ht("https://unpkg.com/mermaid@9.4.3/dist/mermaid.min.js"):H(void 0)}function Sn(e){return e.classList.remove("mermaid"),zr||(zr=xa().pipe(w(()=>mermaid.initialize({startOnLoad:!1,themeCSS:wn,sequence:{actorFontSize:"16px",messageFontSize:"16px",noteFontSize:"16px"}})),l(()=>{}),B(1))),zr.subscribe(()=>{e.classList.add("mermaid");let t=`__mermaid_${ga++}`,r=O("div",{class:"mermaid"}),o=e.textContent;mermaid.mermaidAPI.render(t,o,(n,i)=>{let s=r.attachShadow({mode:"closed"});s.innerHTML=n,e.replaceWith(r),i==null||i(s)})}),zr.pipe(l(()=>({ref:e})))}var Tn=O("table");function On(e){return e.replaceWith(Tn),Tn.replaceWith(fn(e)),H({ref:e})}function ya(e){let t=z(":scope > input",e),r=t.find(o=>o.checked)||t[0];return M(...t.map(o=>h(o,"change").pipe(l(()=>N(`label[for="${o.id}"]`))))).pipe(V(N(`label[for="${r.id}"]`)),l(o=>({active:o})))}function Mn(e,{viewport$:t}){let r=Nr("prev");e.append(r);let o=Nr("next");e.append(o);let n=N(".tabbed-labels",e);return $(()=>{let i=new x,s=i.pipe(J(),ee(!0));return Q([i,xe(e)]).pipe(Ae(1,Te),K(s)).subscribe({next([{active:a},c]){let p=Je(a),{width:m}=he(a);e.style.setProperty("--md-indicator-x",`${p.x}px`),e.style.setProperty("--md-indicator-width",`${m}px`);let f=tr(n);(p.xf.x+c.width)&&n.scrollTo({left:Math.max(0,p.x-16),behavior:"smooth"})},complete(){e.style.removeProperty("--md-indicator-x"),e.style.removeProperty("--md-indicator-width")}}),Q([dt(n),xe(n)]).pipe(K(s)).subscribe(([a,c])=>{let p=bt(n);r.hidden=a.x<16,o.hidden=a.x>p.width-c.width-16}),M(h(r,"click").pipe(l(()=>-1)),h(o,"click").pipe(l(()=>1))).pipe(K(s)).subscribe(a=>{let{width:c}=he(n);n.scrollBy({left:c*a,behavior:"smooth"})}),te("content.tabs.link")&&i.pipe(je(1),oe(t)).subscribe(([{active:a},{offset:c}])=>{let p=a.innerText.trim();if(a.hasAttribute("data-md-switching"))a.removeAttribute("data-md-switching");else{let m=e.offsetTop-c.y;for(let u of z("[data-tabs]"))for(let d of z(":scope > input",u)){let b=N(`label[for="${d.id}"]`);if(b!==a&&b.innerText.trim()===p){b.setAttribute("data-md-switching",""),d.click();break}}window.scrollTo({top:e.offsetTop-m});let f=__md_get("__tabs")||[];__md_set("__tabs",[...new Set([p,...f])])}}),i.pipe(K(s)).subscribe(()=>{for(let a of z("audio, video",e))a.pause()}),ya(e).pipe(w(a=>i.next(a)),k(()=>i.complete()),l(a=>I({ref:e},a)))}).pipe(rt(ae))}function Ln(e,{viewport$:t,target$:r,print$:o}){return M(...z(".annotate:not(.highlight)",e).map(n=>bn(n,{target$:r,print$:o})),...z("pre:not(.mermaid) > code",e).map(n=>yn(n,{target$:r,print$:o})),...z("pre.mermaid",e).map(n=>Sn(n)),...z("table:not([class])",e).map(n=>On(n)),...z("details",e).map(n=>En(n,{target$:r,print$:o})),...z("[data-tabs]",e).map(n=>Mn(n,{viewport$:t})))}function Ea(e,{alert$:t}){return t.pipe(v(r=>M(H(!0),H(!1).pipe(ze(2e3))).pipe(l(o=>({message:r,active:o})))))}function _n(e,t){let r=N(".md-typeset",e);return $(()=>{let o=new x;return o.subscribe(({message:n,active:i})=>{e.classList.toggle("md-dialog--active",i),r.textContent=n}),Ea(e,t).pipe(w(n=>o.next(n)),k(()=>o.complete()),l(n=>I({ref:e},n)))})}function wa({viewport$:e}){if(!te("header.autohide"))return H(!1);let t=e.pipe(l(({offset:{y:n}})=>n),Ce(2,1),l(([n,i])=>[nMath.abs(i-n.y)>100),l(([,[n]])=>n),G()),o=We("search");return Q([e,o]).pipe(l(([{offset:n},i])=>n.y>400&&!i),G(),v(n=>n?r:H(!1)),V(!1))}function An(e,t){return $(()=>Q([xe(e),wa(t)])).pipe(l(([{height:r},o])=>({height:r,hidden:o})),G((r,o)=>r.height===o.height&&r.hidden===o.hidden),B(1))}function Cn(e,{header$:t,main$:r}){return $(()=>{let o=new x,n=o.pipe(J(),ee(!0));return o.pipe(X("active"),Ge(t)).subscribe(([{active:i},{hidden:s}])=>{e.classList.toggle("md-header--shadow",i&&!s),e.hidden=s}),r.subscribe(o),t.pipe(K(n),l(i=>I({ref:e},i)))})}function Sa(e,{viewport$:t,header$:r}){return sr(e,{viewport$:t,header$:r}).pipe(l(({offset:{y:o}})=>{let{height:n}=he(e);return{active:o>=n}}),X("active"))}function kn(e,t){return $(()=>{let r=new x;r.subscribe({next({active:n}){e.classList.toggle("md-header__title--active",n)},complete(){e.classList.remove("md-header__title--active")}});let o=ce(".md-content h1");return typeof o=="undefined"?T:Sa(o,t).pipe(w(n=>r.next(n)),k(()=>r.complete()),l(n=>I({ref:e},n)))})}function Hn(e,{viewport$:t,header$:r}){let o=r.pipe(l(({height:i})=>i),G()),n=o.pipe(v(()=>xe(e).pipe(l(({height:i})=>({top:e.offsetTop,bottom:e.offsetTop+i})),X("bottom"))));return Q([o,n,t]).pipe(l(([i,{top:s,bottom:a},{offset:{y:c},size:{height:p}}])=>(p=Math.max(0,p-Math.max(0,s-c,i)-Math.max(0,p+c-a)),{offset:s-i,height:p,active:s-i<=c})),G((i,s)=>i.offset===s.offset&&i.height===s.height&&i.active===s.active))}function Ta(e){let t=__md_get("__palette")||{index:e.findIndex(r=>matchMedia(r.getAttribute("data-md-color-media")).matches)};return H(...e).pipe(se(r=>h(r,"change").pipe(l(()=>r))),V(e[Math.max(0,t.index)]),l(r=>({index:e.indexOf(r),color:{scheme:r.getAttribute("data-md-color-scheme"),primary:r.getAttribute("data-md-color-primary"),accent:r.getAttribute("data-md-color-accent")}})),B(1))}function $n(e){let t=O("meta",{name:"theme-color"});document.head.appendChild(t);let r=O("meta",{name:"color-scheme"});return document.head.appendChild(r),$(()=>{let o=new x;o.subscribe(i=>{document.body.setAttribute("data-md-color-switching","");for(let[s,a]of Object.entries(i.color))document.body.setAttribute(`data-md-color-${s}`,a);for(let s=0;s{let i=ye("header"),s=window.getComputedStyle(i);return r.content=s.colorScheme,s.backgroundColor.match(/\d+/g).map(a=>(+a).toString(16).padStart(2,"0")).join("")})).subscribe(i=>t.content=`#${i}`),o.pipe(_e(ae)).subscribe(()=>{document.body.removeAttribute("data-md-color-switching")});let n=z("input",e);return Ta(n).pipe(w(i=>o.next(i)),k(()=>o.complete()),l(i=>I({ref:e},i)))})}var qr=$t(Vr());function Oa(e){e.setAttribute("data-md-copying","");let t=e.innerText;return e.removeAttribute("data-md-copying"),t}function Rn({alert$:e}){qr.default.isSupported()&&new j(t=>{new qr.default("[data-clipboard-target], [data-clipboard-text]",{text:r=>r.getAttribute("data-clipboard-text")||Oa(N(r.getAttribute("data-clipboard-target")))}).on("success",r=>t.next(r))}).pipe(w(t=>{t.trigger.focus()}),l(()=>be("clipboard.copied"))).subscribe(e)}function Ma(e){if(e.length<2)return[""];let[t,r]=[...e].sort((n,i)=>n.length-i.length).map(n=>n.replace(/[^/]+$/,"")),o=0;if(t===r)o=t.length;else for(;t.charCodeAt(o)===r.charCodeAt(o);)o++;return e.map(n=>n.replace(t.slice(0,o),""))}function pr(e){let t=__md_get("__sitemap",sessionStorage,e);if(t)return H(t);{let r=ue();return Jo(new URL("sitemap.xml",e||r.base)).pipe(l(o=>Ma(z("loc",o).map(n=>n.textContent))),pe(()=>T),He([]),w(o=>__md_set("__sitemap",o,sessionStorage,e)))}}function In({location$:e,viewport$:t}){let r=ue();if(location.protocol==="file:")return T;let o=pr().pipe(l(p=>p.map(m=>`${new URL(m,r.base)}`))),n=h(document.body,"click").pipe(oe(o),v(([p,m])=>{if(!(p.target instanceof Element))return T;let f=p.target.closest("a");if(f===null)return T;if(f.target||p.metaKey||p.ctrlKey)return T;let u=new URL(f.href);return u.search=u.hash="",m.includes(`${u}`)?(p.preventDefault(),H(new URL(f.href))):T}),le());n.pipe(ge(1)).subscribe(()=>{let p=ce("link[rel=icon]");typeof p!="undefined"&&(p.href=p.href)}),h(window,"beforeunload").subscribe(()=>{history.scrollRestoration="auto"}),n.pipe(oe(t)).subscribe(([p,{offset:m}])=>{history.scrollRestoration="manual",history.replaceState(m,""),history.pushState(null,"",p)}),n.subscribe(e);let i=e.pipe(V(fe()),X("pathname"),je(1),v(p=>ar(p).pipe(pe(()=>(ot(p),T))))),s=new DOMParser,a=i.pipe(v(p=>p.text()),v(p=>{let m=s.parseFromString(p,"text/html");for(let u of["title","link[rel=canonical]","meta[name=author]","meta[name=description]","[data-md-component=announce]","[data-md-component=container]","[data-md-component=header-topic]","[data-md-component=outdated]","[data-md-component=logo]","[data-md-component=skip]",...te("navigation.tabs.sticky")?["[data-md-component=tabs]"]:[]]){let d=ce(u),b=ce(u,m);typeof d!="undefined"&&typeof b!="undefined"&&d.replaceWith(b)}let f=ye("container");return Fe(z("script",f)).pipe(v(u=>{let d=m.createElement("script");if(u.src){for(let b of u.getAttributeNames())d.setAttribute(b,u.getAttribute(b));return u.replaceWith(d),new j(b=>{d.onload=()=>b.complete()})}else return d.textContent=u.textContent,u.replaceWith(d),T}),J(),ee(m))}),le());return h(window,"popstate").pipe(l(fe)).subscribe(e),e.pipe(V(fe()),Ce(2,1),v(([p,m])=>p.pathname===m.pathname&&p.hash!==m.hash?H(m):T)).subscribe(p=>{var m,f;history.state!==null||!p.hash?window.scrollTo(0,(f=(m=history.state)==null?void 0:m.y)!=null?f:0):(history.scrollRestoration="auto",Pr(p.hash),history.scrollRestoration="manual")}),a.pipe(oe(e)).subscribe(([,p])=>{var m,f;history.state!==null||!p.hash?window.scrollTo(0,(f=(m=history.state)==null?void 0:m.y)!=null?f:0):Pr(p.hash)}),a.pipe(v(()=>t),X("offset"),ke(100)).subscribe(({offset:p})=>{history.replaceState(p,"")}),a}var jn=$t(Fn());function Wn(e){let t=e.separator.split("|").map(n=>n.replace(/(\(\?[!=<][^)]+\))/g,"").length===0?"\uFFFD":n).join("|"),r=new RegExp(t,"img"),o=(n,i,s)=>`${i}${s}`;return n=>{n=n.replace(/[\s*+\-:~^]+/g," ").trim();let i=new RegExp(`(^|${e.separator}|)(${n.replace(/[|\\{}()[\]^$+*?.-]/g,"\\$&").replace(r,"|")})`,"img");return s=>(0,jn.default)(s).replace(i,o).replace(/<\/mark>(\s+)]*>/img,"$1")}}function Lt(e){return e.type===1}function mr(e){return e.type===3}function Un(e,t){let r=on(e);return M(H(location.protocol!=="file:"),We("search")).pipe($e(o=>o),v(()=>t)).subscribe(({config:o,docs:n})=>r.next({type:0,data:{config:o,docs:n,options:{suggest:te("search.suggest")}}})),r}function Nn({document$:e}){let t=ue(),r=Ue(new URL("../versions.json",t.base)).pipe(pe(()=>T)),o=r.pipe(l(n=>{let[,i]=t.base.match(/([^/]+)\/?$/);return n.find(({version:s,aliases:a})=>s===i||a.includes(i))||n[0]}));r.pipe(l(n=>new Map(n.map(i=>[`${new URL(`../${i.version}/`,t.base)}`,i]))),v(n=>h(document.body,"click").pipe(L(i=>!i.metaKey&&!i.ctrlKey),oe(o),v(([i,s])=>{if(i.target instanceof Element){let a=i.target.closest("a");if(a&&!a.target&&n.has(a.href)){let c=a.href;return!i.target.closest(".md-version")&&n.get(c)===s?T:(i.preventDefault(),H(c))}}return T}),v(i=>{let{version:s}=n.get(i);return pr(new URL(i)).pipe(l(a=>{let p=fe().href.replace(t.base,"");return a.includes(p.split("#")[0])?new URL(`../${s}/${p}`,t.base):new URL(i)}))})))).subscribe(n=>ot(n)),Q([r,o]).subscribe(([n,i])=>{N(".md-header__topic").appendChild(un(n,i))}),e.pipe(v(()=>o)).subscribe(n=>{var s;let i=__md_get("__outdated",sessionStorage);if(i===null){i=!0;let a=((s=t.version)==null?void 0:s.default)||"latest";Array.isArray(a)||(a=[a]);e:for(let c of a)for(let p of n.aliases)if(new RegExp(c,"i").test(p)){i=!1;break e}__md_set("__outdated",i,sessionStorage)}if(i)for(let a of ne("outdated"))a.hidden=!1})}function ka(e,{worker$:t}){let{searchParams:r}=fe();r.has("q")&&(Ke("search",!0),e.value=r.get("q"),e.focus(),We("search").pipe($e(i=>!i)).subscribe(()=>{let i=new URL(location.href);i.searchParams.delete("q"),history.replaceState({},"",`${i}`)}));let o=er(e),n=M(t.pipe($e(Lt)),h(e,"keyup"),o).pipe(l(()=>e.value),G());return Q([n,o]).pipe(l(([i,s])=>({value:i,focus:s})),B(1))}function Dn(e,{worker$:t}){let r=new x,o=r.pipe(J(),ee(!0));Q([t.pipe($e(Lt)),r],(i,s)=>s).pipe(X("value")).subscribe(({value:i})=>t.next({type:2,data:i})),r.pipe(X("focus")).subscribe(({focus:i})=>{i&&Ke("search",i)}),h(e.form,"reset").pipe(K(o)).subscribe(()=>e.focus());let n=N("header [for=__search]");return h(n,"click").subscribe(()=>e.focus()),ka(e,{worker$:t}).pipe(w(i=>r.next(i)),k(()=>r.complete()),l(i=>I({ref:e},i)),B(1))}function Vn(e,{worker$:t,query$:r}){let o=new x,n=zo(e.parentElement).pipe(L(Boolean)),i=e.parentElement,s=N(":scope > :first-child",e),a=N(":scope > :last-child",e);We("search").subscribe(m=>a.setAttribute("role",m?"list":"presentation")),o.pipe(oe(r),Hr(t.pipe($e(Lt)))).subscribe(([{items:m},{value:f}])=>{switch(m.length){case 0:s.textContent=f.length?be("search.result.none"):be("search.result.placeholder");break;case 1:s.textContent=be("search.result.one");break;default:let u=rr(m.length);s.textContent=be("search.result.other",u)}});let c=o.pipe(w(()=>a.innerHTML=""),v(({items:m})=>M(H(...m.slice(0,10)),H(...m.slice(10)).pipe(Ce(4),Ir(n),v(([f])=>f)))),l(mn),le());return c.subscribe(m=>a.appendChild(m)),c.pipe(se(m=>{let f=ce("details",m);return typeof f=="undefined"?T:h(f,"toggle").pipe(K(o),l(()=>f))})).subscribe(m=>{m.open===!1&&m.offsetTop<=i.scrollTop&&i.scrollTo({top:m.offsetTop})}),t.pipe(L(mr),l(({data:m})=>m)).pipe(w(m=>o.next(m)),k(()=>o.complete()),l(m=>I({ref:e},m)))}function Ha(e,{query$:t}){return t.pipe(l(({value:r})=>{let o=fe();return o.hash="",r=r.replace(/\s+/g,"+").replace(/&/g,"%26").replace(/=/g,"%3D"),o.search=`q=${r}`,{url:o}}))}function zn(e,t){let r=new x,o=r.pipe(J(),ee(!0));return r.subscribe(({url:n})=>{e.setAttribute("data-clipboard-text",e.href),e.href=`${n}`}),h(e,"click").pipe(K(o)).subscribe(n=>n.preventDefault()),Ha(e,t).pipe(w(n=>r.next(n)),k(()=>r.complete()),l(n=>I({ref:e},n)))}function qn(e,{worker$:t,keyboard$:r}){let o=new x,n=ye("search-query"),i=M(h(n,"keydown"),h(n,"focus")).pipe(_e(ae),l(()=>n.value),G());return o.pipe(Ge(i),l(([{suggest:a},c])=>{let p=c.split(/([\s-]+)/);if(a!=null&&a.length&&p[p.length-1]){let m=a[a.length-1];m.startsWith(p[p.length-1])&&(p[p.length-1]=m)}else p.length=0;return p})).subscribe(a=>e.innerHTML=a.join("").replace(/\s/g," ")),r.pipe(L(({mode:a})=>a==="search")).subscribe(a=>{switch(a.type){case"ArrowRight":e.innerText.length&&n.selectionStart===n.value.length&&(n.value=e.innerText);break}}),t.pipe(L(mr),l(({data:a})=>a)).pipe(w(a=>o.next(a)),k(()=>o.complete()),l(()=>({ref:e})))}function Kn(e,{index$:t,keyboard$:r}){let o=ue();try{let n=Un(o.search,t),i=ye("search-query",e),s=ye("search-result",e);h(e,"click").pipe(L(({target:c})=>c instanceof Element&&!!c.closest("a"))).subscribe(()=>Ke("search",!1)),r.pipe(L(({mode:c})=>c==="search")).subscribe(c=>{let p=Re();switch(c.type){case"Enter":if(p===i){let m=new Map;for(let f of z(":first-child [href]",s)){let u=f.firstElementChild;m.set(f,parseFloat(u.getAttribute("data-md-score")))}if(m.size){let[[f]]=[...m].sort(([,u],[,d])=>d-u);f.click()}c.claim()}break;case"Escape":case"Tab":Ke("search",!1),i.blur();break;case"ArrowUp":case"ArrowDown":if(typeof p=="undefined")i.focus();else{let m=[i,...z(":not(details) > [href], summary, details[open] [href]",s)],f=Math.max(0,(Math.max(0,m.indexOf(p))+m.length+(c.type==="ArrowUp"?-1:1))%m.length);m[f].focus()}c.claim();break;default:i!==Re()&&i.focus()}}),r.pipe(L(({mode:c})=>c==="global")).subscribe(c=>{switch(c.type){case"f":case"s":case"/":i.focus(),i.select(),c.claim();break}});let a=Dn(i,{worker$:n});return M(a,Vn(s,{worker$:n,query$:a})).pipe(qe(...ne("search-share",e).map(c=>zn(c,{query$:a})),...ne("search-suggest",e).map(c=>qn(c,{worker$:n,keyboard$:r}))))}catch(n){return e.hidden=!0,Ve}}function Qn(e,{index$:t,location$:r}){return Q([t,r.pipe(V(fe()),L(o=>!!o.searchParams.get("h")))]).pipe(l(([o,n])=>Wn(o.config)(n.searchParams.get("h"))),l(o=>{var s;let n=new Map,i=document.createNodeIterator(e,NodeFilter.SHOW_TEXT);for(let a=i.nextNode();a;a=i.nextNode())if((s=a.parentElement)!=null&&s.offsetHeight){let c=a.textContent,p=o(c);p.length>c.length&&n.set(a,p)}for(let[a,c]of n){let{childNodes:p}=O("span",null,c);a.replaceWith(...Array.from(p))}return{ref:e,nodes:n}}))}function $a(e,{viewport$:t,main$:r}){let o=e.closest(".md-grid"),n=o.offsetTop-o.parentElement.offsetTop;return Q([r,t]).pipe(l(([{offset:i,height:s},{offset:{y:a}}])=>(s=s+Math.min(n,Math.max(0,a-i))-n,{height:s,locked:a>=i+n})),G((i,s)=>i.height===s.height&&i.locked===s.locked))}function Kr(e,o){var n=o,{header$:t}=n,r=Zr(n,["header$"]);let i=N(".md-sidebar__scrollwrap",e),{y:s}=Je(i);return $(()=>{let a=new x,c=a.pipe(J(),ee(!0)),p=a.pipe(Ae(0,Te));return p.pipe(oe(t)).subscribe({next([{height:m},{height:f}]){i.style.height=`${m-2*s}px`,e.style.top=`${f}px`},complete(){i.style.height="",e.style.top=""}}),p.pipe($e()).subscribe(()=>{for(let m of z(".md-nav__link--active[href]",e)){let f=or(m);if(typeof f!="undefined"){let u=m.offsetTop-f.offsetTop,{height:d}=he(f);f.scrollTo({top:u-d/2})}}}),me(z("label[tabindex]",e)).pipe(se(m=>h(m,"click").pipe(l(()=>m),K(c)))).subscribe(m=>{let f=N(`[id="${m.htmlFor}"]`);N(`[aria-labelledby="${m.id}"]`).setAttribute("aria-expanded",`${f.checked}`)}),$a(e,r).pipe(w(m=>a.next(m)),k(()=>a.complete()),l(m=>I({ref:e},m)))})}function Yn(e,t){if(typeof t!="undefined"){let r=`https://api.github.com/repos/${e}/${t}`;return Tt(Ue(`${r}/releases/latest`).pipe(pe(()=>T),l(o=>({version:o.tag_name})),He({})),Ue(r).pipe(pe(()=>T),l(o=>({stars:o.stargazers_count,forks:o.forks_count})),He({}))).pipe(l(([o,n])=>I(I({},o),n)))}else{let r=`https://api.github.com/users/${e}`;return Ue(r).pipe(l(o=>({repositories:o.public_repos})),He({}))}}function Bn(e,t){let r=`https://${e}/api/v4/projects/${encodeURIComponent(t)}`;return Ue(r).pipe(pe(()=>T),l(({star_count:o,forks_count:n})=>({stars:o,forks:n})),He({}))}function Gn(e){let t=e.match(/^.+github\.com\/([^/]+)\/?([^/]+)?/i);if(t){let[,r,o]=t;return Yn(r,o)}if(t=e.match(/^.+?([^/]*gitlab[^/]+)\/(.+?)\/?$/i),t){let[,r,o]=t;return Bn(r,o)}return T}var Ra;function Ia(e){return Ra||(Ra=$(()=>{let t=__md_get("__source",sessionStorage);if(t)return H(t);if(ne("consent").length){let o=__md_get("__consent");if(!(o&&o.github))return T}return Gn(e.href).pipe(w(o=>__md_set("__source",o,sessionStorage)))}).pipe(pe(()=>T),L(t=>Object.keys(t).length>0),l(t=>({facts:t})),B(1)))}function Jn(e){let t=N(":scope > :last-child",e);return $(()=>{let r=new x;return r.subscribe(({facts:o})=>{t.appendChild(ln(o)),t.classList.add("md-source__repository--active")}),Ia(e).pipe(w(o=>r.next(o)),k(()=>r.complete()),l(o=>I({ref:e},o)))})}function Pa(e,{viewport$:t,header$:r}){return xe(document.body).pipe(v(()=>sr(e,{header$:r,viewport$:t})),l(({offset:{y:o}})=>({hidden:o>=10})),X("hidden"))}function Xn(e,t){return $(()=>{let r=new x;return r.subscribe({next({hidden:o}){e.hidden=o},complete(){e.hidden=!1}}),(te("navigation.tabs.sticky")?H({hidden:!1}):Pa(e,t)).pipe(w(o=>r.next(o)),k(()=>r.complete()),l(o=>I({ref:e},o)))})}function Fa(e,{viewport$:t,header$:r}){let o=new Map,n=z("[href^=\\#]",e);for(let a of n){let c=decodeURIComponent(a.hash.substring(1)),p=ce(`[id="${c}"]`);typeof p!="undefined"&&o.set(a,p)}let i=r.pipe(X("height"),l(({height:a})=>{let c=ye("main"),p=N(":scope > :first-child",c);return a+.8*(p.offsetTop-c.offsetTop)}),le());return xe(document.body).pipe(X("height"),v(a=>$(()=>{let c=[];return H([...o].reduce((p,[m,f])=>{for(;c.length&&o.get(c[c.length-1]).tagName>=f.tagName;)c.pop();let u=f.offsetTop;for(;!u&&f.parentElement;)f=f.parentElement,u=f.offsetTop;let d=f.offsetParent;for(;d;d=d.offsetParent)u+=d.offsetTop;return p.set([...c=[...c,m]].reverse(),u)},new Map))}).pipe(l(c=>new Map([...c].sort(([,p],[,m])=>p-m))),Ge(i),v(([c,p])=>t.pipe(Cr(([m,f],{offset:{y:u},size:d})=>{let b=u+d.height>=Math.floor(a.height);for(;f.length;){let[,_]=f[0];if(_-p=u&&!b)f=[m.pop(),...f];else break}return[m,f]},[[],[...c]]),G((m,f)=>m[0]===f[0]&&m[1]===f[1])))))).pipe(l(([a,c])=>({prev:a.map(([p])=>p),next:c.map(([p])=>p)})),V({prev:[],next:[]}),Ce(2,1),l(([a,c])=>a.prev.length{let i=new x,s=i.pipe(J(),ee(!0));if(i.subscribe(({prev:a,next:c})=>{for(let[p]of c)p.classList.remove("md-nav__link--passed"),p.classList.remove("md-nav__link--active");for(let[p,[m]]of a.entries())m.classList.add("md-nav__link--passed"),m.classList.toggle("md-nav__link--active",p===a.length-1)}),te("toc.follow")){let a=M(t.pipe(ke(1),l(()=>{})),t.pipe(ke(250),l(()=>"smooth")));i.pipe(L(({prev:c})=>c.length>0),Ge(o.pipe(_e(ae))),oe(a)).subscribe(([[{prev:c}],p])=>{let[m]=c[c.length-1];if(m.offsetHeight){let f=or(m);if(typeof f!="undefined"){let u=m.offsetTop-f.offsetTop,{height:d}=he(f);f.scrollTo({top:u-d/2,behavior:p})}}})}return te("navigation.tracking")&&t.pipe(K(s),X("offset"),ke(250),je(1),K(n.pipe(je(1))),Ot({delay:250}),oe(i)).subscribe(([,{prev:a}])=>{let c=fe(),p=a[a.length-1];if(p&&p.length){let[m]=p,{hash:f}=new URL(m.href);c.hash!==f&&(c.hash=f,history.replaceState({},"",`${c}`))}else c.hash="",history.replaceState({},"",`${c}`)}),Fa(e,{viewport$:t,header$:r}).pipe(w(a=>i.next(a)),k(()=>i.complete()),l(a=>I({ref:e},a)))})}function ja(e,{viewport$:t,main$:r,target$:o}){let n=t.pipe(l(({offset:{y:s}})=>s),Ce(2,1),l(([s,a])=>s>a&&a>0),G()),i=r.pipe(l(({active:s})=>s));return Q([i,n]).pipe(l(([s,a])=>!(s&&a)),G(),K(o.pipe(je(1))),ee(!0),Ot({delay:250}),l(s=>({hidden:s})))}function ei(e,{viewport$:t,header$:r,main$:o,target$:n}){let i=new x,s=i.pipe(J(),ee(!0));return i.subscribe({next({hidden:a}){e.hidden=a,a?(e.setAttribute("tabindex","-1"),e.blur()):e.removeAttribute("tabindex")},complete(){e.style.top="",e.hidden=!0,e.removeAttribute("tabindex")}}),r.pipe(K(s),X("height")).subscribe(({height:a})=>{e.style.top=`${a+16}px`}),h(e,"click").subscribe(a=>{a.preventDefault(),window.scrollTo({top:0})}),ja(e,{viewport$:t,main$:o,target$:n}).pipe(w(a=>i.next(a)),k(()=>i.complete()),l(a=>I({ref:e},a)))}function ti({document$:e,tablet$:t}){e.pipe(v(()=>z(".md-toggle--indeterminate")),w(r=>{r.indeterminate=!0,r.checked=!1}),se(r=>h(r,"change").pipe($r(()=>r.classList.contains("md-toggle--indeterminate")),l(()=>r))),oe(t)).subscribe(([r,o])=>{r.classList.remove("md-toggle--indeterminate"),o&&(r.checked=!1)})}function Wa(){return/(iPad|iPhone|iPod)/.test(navigator.userAgent)}function ri({document$:e}){e.pipe(v(()=>z("[data-md-scrollfix]")),w(t=>t.removeAttribute("data-md-scrollfix")),L(Wa),se(t=>h(t,"touchstart").pipe(l(()=>t)))).subscribe(t=>{let r=t.scrollTop;r===0?t.scrollTop=1:r+t.offsetHeight===t.scrollHeight&&(t.scrollTop=r-1)})}function oi({viewport$:e,tablet$:t}){Q([We("search"),t]).pipe(l(([r,o])=>r&&!o),v(r=>H(r).pipe(ze(r?400:100))),oe(e)).subscribe(([r,{offset:{y:o}}])=>{if(r)document.body.setAttribute("data-md-scrolllock",""),document.body.style.top=`-${o}px`;else{let n=-1*parseInt(document.body.style.top,10);document.body.removeAttribute("data-md-scrolllock"),document.body.style.top="",n&&window.scrollTo(0,n)}})}Object.entries||(Object.entries=function(e){let t=[];for(let r of Object.keys(e))t.push([r,e[r]]);return t});Object.values||(Object.values=function(e){let t=[];for(let r of Object.keys(e))t.push(e[r]);return t});typeof Element!="undefined"&&(Element.prototype.scrollTo||(Element.prototype.scrollTo=function(e,t){typeof e=="object"?(this.scrollLeft=e.left,this.scrollTop=e.top):(this.scrollLeft=e,this.scrollTop=t)}),Element.prototype.replaceWith||(Element.prototype.replaceWith=function(...e){let t=this.parentNode;if(t){e.length===0&&t.removeChild(this);for(let r=e.length-1;r>=0;r--){let o=e[r];typeof o=="string"?o=document.createTextNode(o):o.parentNode&&o.parentNode.removeChild(o),r?t.insertBefore(this.previousSibling,o):t.replaceChild(o,this)}}}));function Ua(){return location.protocol==="file:"?ht(`${new URL("search/search_index.js",Qr.base)}`).pipe(l(()=>__index),B(1)):Ue(new URL("search/search_index.json",Qr.base))}document.documentElement.classList.remove("no-js");document.documentElement.classList.add("js");var nt=Wo(),At=Qo(),gt=Bo(At),Yr=Ko(),Se=rn(),lr=Fr("(min-width: 960px)"),ii=Fr("(min-width: 1220px)"),ai=Go(),Qr=ue(),si=document.forms.namedItem("search")?Ua():Ve,Br=new x;Rn({alert$:Br});te("navigation.instant")&&In({location$:At,viewport$:Se}).subscribe(nt);var ni;((ni=Qr.version)==null?void 0:ni.provider)==="mike"&&Nn({document$:nt});M(At,gt).pipe(ze(125)).subscribe(()=>{Ke("drawer",!1),Ke("search",!1)});Yr.pipe(L(({mode:e})=>e==="global")).subscribe(e=>{switch(e.type){case"p":case",":let t=ce("link[rel=prev]");typeof t!="undefined"&&ot(t);break;case"n":case".":let r=ce("link[rel=next]");typeof r!="undefined"&&ot(r);break;case"Enter":let o=Re();o instanceof HTMLLabelElement&&o.click()}});ti({document$:nt,tablet$:lr});ri({document$:nt});oi({viewport$:Se,tablet$:lr});var Xe=An(ye("header"),{viewport$:Se}),_t=nt.pipe(l(()=>ye("main")),v(e=>Hn(e,{viewport$:Se,header$:Xe})),B(1)),Na=M(...ne("consent").map(e=>an(e,{target$:gt})),...ne("dialog").map(e=>_n(e,{alert$:Br})),...ne("header").map(e=>Cn(e,{viewport$:Se,header$:Xe,main$:_t})),...ne("palette").map(e=>$n(e)),...ne("search").map(e=>Kn(e,{index$:si,keyboard$:Yr})),...ne("source").map(e=>Jn(e))),Da=$(()=>M(...ne("announce").map(e=>nn(e)),...ne("content").map(e=>Ln(e,{viewport$:Se,target$:gt,print$:ai})),...ne("content").map(e=>te("search.highlight")?Qn(e,{index$:si,location$:At}):T),...ne("header-title").map(e=>kn(e,{viewport$:Se,header$:Xe})),...ne("sidebar").map(e=>e.getAttribute("data-md-type")==="navigation"?jr(ii,()=>Kr(e,{viewport$:Se,header$:Xe,main$:_t})):jr(lr,()=>Kr(e,{viewport$:Se,header$:Xe,main$:_t}))),...ne("tabs").map(e=>Xn(e,{viewport$:Se,header$:Xe})),...ne("toc").map(e=>Zn(e,{viewport$:Se,header$:Xe,main$:_t,target$:gt})),...ne("top").map(e=>ei(e,{viewport$:Se,header$:Xe,main$:_t,target$:gt})))),ci=nt.pipe(v(()=>Da),qe(Na),B(1));ci.subscribe();window.document$=nt;window.location$=At;window.target$=gt;window.keyboard$=Yr;window.viewport$=Se;window.tablet$=lr;window.screen$=ii;window.print$=ai;window.alert$=Br;window.component$=ci;})(); +//# sourceMappingURL=bundle.dff1b7c8.min.js.map + diff --git a/assets/javascripts/bundle.dff1b7c8.min.js.map b/assets/javascripts/bundle.dff1b7c8.min.js.map new file mode 100644 index 0000000..82d9023 --- /dev/null +++ b/assets/javascripts/bundle.dff1b7c8.min.js.map @@ -0,0 +1,8 @@ +{ + "version": 3, + "sources": ["node_modules/focus-visible/dist/focus-visible.js", "node_modules/clipboard/dist/clipboard.js", "node_modules/escape-html/index.js", "src/assets/javascripts/bundle.ts", "node_modules/rxjs/node_modules/tslib/tslib.es6.js", "node_modules/rxjs/src/internal/util/isFunction.ts", "node_modules/rxjs/src/internal/util/createErrorClass.ts", "node_modules/rxjs/src/internal/util/UnsubscriptionError.ts", "node_modules/rxjs/src/internal/util/arrRemove.ts", "node_modules/rxjs/src/internal/Subscription.ts", "node_modules/rxjs/src/internal/config.ts", "node_modules/rxjs/src/internal/scheduler/timeoutProvider.ts", "node_modules/rxjs/src/internal/util/reportUnhandledError.ts", "node_modules/rxjs/src/internal/util/noop.ts", "node_modules/rxjs/src/internal/NotificationFactories.ts", "node_modules/rxjs/src/internal/util/errorContext.ts", "node_modules/rxjs/src/internal/Subscriber.ts", "node_modules/rxjs/src/internal/symbol/observable.ts", "node_modules/rxjs/src/internal/util/identity.ts", "node_modules/rxjs/src/internal/util/pipe.ts", "node_modules/rxjs/src/internal/Observable.ts", "node_modules/rxjs/src/internal/util/lift.ts", "node_modules/rxjs/src/internal/operators/OperatorSubscriber.ts", "node_modules/rxjs/src/internal/scheduler/animationFrameProvider.ts", "node_modules/rxjs/src/internal/util/ObjectUnsubscribedError.ts", "node_modules/rxjs/src/internal/Subject.ts", "node_modules/rxjs/src/internal/scheduler/dateTimestampProvider.ts", "node_modules/rxjs/src/internal/ReplaySubject.ts", "node_modules/rxjs/src/internal/scheduler/Action.ts", "node_modules/rxjs/src/internal/scheduler/intervalProvider.ts", "node_modules/rxjs/src/internal/scheduler/AsyncAction.ts", "node_modules/rxjs/src/internal/Scheduler.ts", "node_modules/rxjs/src/internal/scheduler/AsyncScheduler.ts", "node_modules/rxjs/src/internal/scheduler/async.ts", "node_modules/rxjs/src/internal/scheduler/AnimationFrameAction.ts", "node_modules/rxjs/src/internal/scheduler/AnimationFrameScheduler.ts", "node_modules/rxjs/src/internal/scheduler/animationFrame.ts", "node_modules/rxjs/src/internal/observable/empty.ts", "node_modules/rxjs/src/internal/util/isScheduler.ts", "node_modules/rxjs/src/internal/util/args.ts", "node_modules/rxjs/src/internal/util/isArrayLike.ts", "node_modules/rxjs/src/internal/util/isPromise.ts", "node_modules/rxjs/src/internal/util/isInteropObservable.ts", "node_modules/rxjs/src/internal/util/isAsyncIterable.ts", "node_modules/rxjs/src/internal/util/throwUnobservableError.ts", "node_modules/rxjs/src/internal/symbol/iterator.ts", "node_modules/rxjs/src/internal/util/isIterable.ts", "node_modules/rxjs/src/internal/util/isReadableStreamLike.ts", "node_modules/rxjs/src/internal/observable/innerFrom.ts", "node_modules/rxjs/src/internal/util/executeSchedule.ts", "node_modules/rxjs/src/internal/operators/observeOn.ts", "node_modules/rxjs/src/internal/operators/subscribeOn.ts", "node_modules/rxjs/src/internal/scheduled/scheduleObservable.ts", "node_modules/rxjs/src/internal/scheduled/schedulePromise.ts", "node_modules/rxjs/src/internal/scheduled/scheduleArray.ts", "node_modules/rxjs/src/internal/scheduled/scheduleIterable.ts", "node_modules/rxjs/src/internal/scheduled/scheduleAsyncIterable.ts", "node_modules/rxjs/src/internal/scheduled/scheduleReadableStreamLike.ts", "node_modules/rxjs/src/internal/scheduled/scheduled.ts", "node_modules/rxjs/src/internal/observable/from.ts", "node_modules/rxjs/src/internal/observable/of.ts", "node_modules/rxjs/src/internal/observable/throwError.ts", "node_modules/rxjs/src/internal/util/EmptyError.ts", "node_modules/rxjs/src/internal/util/isDate.ts", "node_modules/rxjs/src/internal/operators/map.ts", "node_modules/rxjs/src/internal/util/mapOneOrManyArgs.ts", "node_modules/rxjs/src/internal/util/argsArgArrayOrObject.ts", "node_modules/rxjs/src/internal/util/createObject.ts", "node_modules/rxjs/src/internal/observable/combineLatest.ts", "node_modules/rxjs/src/internal/operators/mergeInternals.ts", "node_modules/rxjs/src/internal/operators/mergeMap.ts", "node_modules/rxjs/src/internal/operators/mergeAll.ts", "node_modules/rxjs/src/internal/operators/concatAll.ts", "node_modules/rxjs/src/internal/observable/concat.ts", "node_modules/rxjs/src/internal/observable/defer.ts", "node_modules/rxjs/src/internal/observable/fromEvent.ts", "node_modules/rxjs/src/internal/observable/fromEventPattern.ts", "node_modules/rxjs/src/internal/observable/timer.ts", "node_modules/rxjs/src/internal/observable/merge.ts", "node_modules/rxjs/src/internal/observable/never.ts", "node_modules/rxjs/src/internal/util/argsOrArgArray.ts", "node_modules/rxjs/src/internal/operators/filter.ts", "node_modules/rxjs/src/internal/observable/zip.ts", "node_modules/rxjs/src/internal/operators/audit.ts", "node_modules/rxjs/src/internal/operators/auditTime.ts", "node_modules/rxjs/src/internal/operators/bufferCount.ts", "node_modules/rxjs/src/internal/operators/catchError.ts", "node_modules/rxjs/src/internal/operators/scanInternals.ts", "node_modules/rxjs/src/internal/operators/combineLatest.ts", "node_modules/rxjs/src/internal/operators/combineLatestWith.ts", "node_modules/rxjs/src/internal/operators/debounceTime.ts", "node_modules/rxjs/src/internal/operators/defaultIfEmpty.ts", "node_modules/rxjs/src/internal/operators/take.ts", "node_modules/rxjs/src/internal/operators/ignoreElements.ts", "node_modules/rxjs/src/internal/operators/mapTo.ts", "node_modules/rxjs/src/internal/operators/delayWhen.ts", "node_modules/rxjs/src/internal/operators/delay.ts", "node_modules/rxjs/src/internal/operators/distinctUntilChanged.ts", "node_modules/rxjs/src/internal/operators/distinctUntilKeyChanged.ts", "node_modules/rxjs/src/internal/operators/throwIfEmpty.ts", "node_modules/rxjs/src/internal/operators/endWith.ts", "node_modules/rxjs/src/internal/operators/finalize.ts", "node_modules/rxjs/src/internal/operators/first.ts", "node_modules/rxjs/src/internal/operators/merge.ts", "node_modules/rxjs/src/internal/operators/mergeWith.ts", "node_modules/rxjs/src/internal/operators/repeat.ts", "node_modules/rxjs/src/internal/operators/scan.ts", "node_modules/rxjs/src/internal/operators/share.ts", "node_modules/rxjs/src/internal/operators/shareReplay.ts", "node_modules/rxjs/src/internal/operators/skip.ts", "node_modules/rxjs/src/internal/operators/skipUntil.ts", "node_modules/rxjs/src/internal/operators/startWith.ts", "node_modules/rxjs/src/internal/operators/switchMap.ts", "node_modules/rxjs/src/internal/operators/takeUntil.ts", "node_modules/rxjs/src/internal/operators/takeWhile.ts", "node_modules/rxjs/src/internal/operators/tap.ts", "node_modules/rxjs/src/internal/operators/throttle.ts", "node_modules/rxjs/src/internal/operators/throttleTime.ts", "node_modules/rxjs/src/internal/operators/withLatestFrom.ts", "node_modules/rxjs/src/internal/operators/zip.ts", "node_modules/rxjs/src/internal/operators/zipWith.ts", "src/assets/javascripts/browser/document/index.ts", "src/assets/javascripts/browser/element/_/index.ts", "src/assets/javascripts/browser/element/focus/index.ts", "src/assets/javascripts/browser/element/offset/_/index.ts", "src/assets/javascripts/browser/element/offset/content/index.ts", "src/assets/javascripts/utilities/h/index.ts", "src/assets/javascripts/utilities/round/index.ts", "src/assets/javascripts/browser/script/index.ts", "src/assets/javascripts/browser/element/size/_/index.ts", "src/assets/javascripts/browser/element/size/content/index.ts", "src/assets/javascripts/browser/element/visibility/index.ts", "src/assets/javascripts/browser/toggle/index.ts", "src/assets/javascripts/browser/keyboard/index.ts", "src/assets/javascripts/browser/location/_/index.ts", "src/assets/javascripts/browser/location/hash/index.ts", "src/assets/javascripts/browser/media/index.ts", "src/assets/javascripts/browser/request/index.ts", "src/assets/javascripts/browser/viewport/offset/index.ts", "src/assets/javascripts/browser/viewport/size/index.ts", "src/assets/javascripts/browser/viewport/_/index.ts", "src/assets/javascripts/browser/viewport/at/index.ts", "src/assets/javascripts/browser/worker/index.ts", "src/assets/javascripts/_/index.ts", "src/assets/javascripts/components/_/index.ts", "src/assets/javascripts/components/announce/index.ts", "src/assets/javascripts/components/consent/index.ts", "src/assets/javascripts/components/content/annotation/_/index.ts", "src/assets/javascripts/templates/tooltip/index.tsx", "src/assets/javascripts/templates/annotation/index.tsx", "src/assets/javascripts/templates/clipboard/index.tsx", "src/assets/javascripts/templates/search/index.tsx", "src/assets/javascripts/templates/source/index.tsx", "src/assets/javascripts/templates/tabbed/index.tsx", "src/assets/javascripts/templates/table/index.tsx", "src/assets/javascripts/templates/version/index.tsx", "src/assets/javascripts/components/content/annotation/list/index.ts", "src/assets/javascripts/components/content/annotation/block/index.ts", "src/assets/javascripts/components/content/code/_/index.ts", "src/assets/javascripts/components/content/details/index.ts", "src/assets/javascripts/components/content/mermaid/index.css", "src/assets/javascripts/components/content/mermaid/index.ts", "src/assets/javascripts/components/content/table/index.ts", "src/assets/javascripts/components/content/tabs/index.ts", "src/assets/javascripts/components/content/_/index.ts", "src/assets/javascripts/components/dialog/index.ts", "src/assets/javascripts/components/header/_/index.ts", "src/assets/javascripts/components/header/title/index.ts", "src/assets/javascripts/components/main/index.ts", "src/assets/javascripts/components/palette/index.ts", "src/assets/javascripts/integrations/clipboard/index.ts", "src/assets/javascripts/integrations/sitemap/index.ts", "src/assets/javascripts/integrations/instant/index.ts", "src/assets/javascripts/integrations/search/highlighter/index.ts", "src/assets/javascripts/integrations/search/worker/message/index.ts", "src/assets/javascripts/integrations/search/worker/_/index.ts", "src/assets/javascripts/integrations/version/index.ts", "src/assets/javascripts/components/search/query/index.ts", "src/assets/javascripts/components/search/result/index.ts", "src/assets/javascripts/components/search/share/index.ts", "src/assets/javascripts/components/search/suggest/index.ts", "src/assets/javascripts/components/search/_/index.ts", "src/assets/javascripts/components/search/highlight/index.ts", "src/assets/javascripts/components/sidebar/index.ts", "src/assets/javascripts/components/source/facts/github/index.ts", "src/assets/javascripts/components/source/facts/gitlab/index.ts", "src/assets/javascripts/components/source/facts/_/index.ts", "src/assets/javascripts/components/source/_/index.ts", "src/assets/javascripts/components/tabs/index.ts", "src/assets/javascripts/components/toc/index.ts", "src/assets/javascripts/components/top/index.ts", "src/assets/javascripts/patches/indeterminate/index.ts", "src/assets/javascripts/patches/scrollfix/index.ts", "src/assets/javascripts/patches/scrolllock/index.ts", "src/assets/javascripts/polyfills/index.ts"], + "sourceRoot": "../../..", + "sourcesContent": ["(function (global, factory) {\n typeof exports === 'object' && typeof module !== 'undefined' ? factory() :\n typeof define === 'function' && define.amd ? define(factory) :\n (factory());\n}(this, (function () { 'use strict';\n\n /**\n * Applies the :focus-visible polyfill at the given scope.\n * A scope in this case is either the top-level Document or a Shadow Root.\n *\n * @param {(Document|ShadowRoot)} scope\n * @see https://github.com/WICG/focus-visible\n */\n function applyFocusVisiblePolyfill(scope) {\n var hadKeyboardEvent = true;\n var hadFocusVisibleRecently = false;\n var hadFocusVisibleRecentlyTimeout = null;\n\n var inputTypesAllowlist = {\n text: true,\n search: true,\n url: true,\n tel: true,\n email: true,\n password: true,\n number: true,\n date: true,\n month: true,\n week: true,\n time: true,\n datetime: true,\n 'datetime-local': true\n };\n\n /**\n * Helper function for legacy browsers and iframes which sometimes focus\n * elements like document, body, and non-interactive SVG.\n * @param {Element} el\n */\n function isValidFocusTarget(el) {\n if (\n el &&\n el !== document &&\n el.nodeName !== 'HTML' &&\n el.nodeName !== 'BODY' &&\n 'classList' in el &&\n 'contains' in el.classList\n ) {\n return true;\n }\n return false;\n }\n\n /**\n * Computes whether the given element should automatically trigger the\n * `focus-visible` class being added, i.e. whether it should always match\n * `:focus-visible` when focused.\n * @param {Element} el\n * @return {boolean}\n */\n function focusTriggersKeyboardModality(el) {\n var type = el.type;\n var tagName = el.tagName;\n\n if (tagName === 'INPUT' && inputTypesAllowlist[type] && !el.readOnly) {\n return true;\n }\n\n if (tagName === 'TEXTAREA' && !el.readOnly) {\n return true;\n }\n\n if (el.isContentEditable) {\n return true;\n }\n\n return false;\n }\n\n /**\n * Add the `focus-visible` class to the given element if it was not added by\n * the author.\n * @param {Element} el\n */\n function addFocusVisibleClass(el) {\n if (el.classList.contains('focus-visible')) {\n return;\n }\n el.classList.add('focus-visible');\n el.setAttribute('data-focus-visible-added', '');\n }\n\n /**\n * Remove the `focus-visible` class from the given element if it was not\n * originally added by the author.\n * @param {Element} el\n */\n function removeFocusVisibleClass(el) {\n if (!el.hasAttribute('data-focus-visible-added')) {\n return;\n }\n el.classList.remove('focus-visible');\n el.removeAttribute('data-focus-visible-added');\n }\n\n /**\n * If the most recent user interaction was via the keyboard;\n * and the key press did not include a meta, alt/option, or control key;\n * then the modality is keyboard. Otherwise, the modality is not keyboard.\n * Apply `focus-visible` to any current active element and keep track\n * of our keyboard modality state with `hadKeyboardEvent`.\n * @param {KeyboardEvent} e\n */\n function onKeyDown(e) {\n if (e.metaKey || e.altKey || e.ctrlKey) {\n return;\n }\n\n if (isValidFocusTarget(scope.activeElement)) {\n addFocusVisibleClass(scope.activeElement);\n }\n\n hadKeyboardEvent = true;\n }\n\n /**\n * If at any point a user clicks with a pointing device, ensure that we change\n * the modality away from keyboard.\n * This avoids the situation where a user presses a key on an already focused\n * element, and then clicks on a different element, focusing it with a\n * pointing device, while we still think we're in keyboard modality.\n * @param {Event} e\n */\n function onPointerDown(e) {\n hadKeyboardEvent = false;\n }\n\n /**\n * On `focus`, add the `focus-visible` class to the target if:\n * - the target received focus as a result of keyboard navigation, or\n * - the event target is an element that will likely require interaction\n * via the keyboard (e.g. a text box)\n * @param {Event} e\n */\n function onFocus(e) {\n // Prevent IE from focusing the document or HTML element.\n if (!isValidFocusTarget(e.target)) {\n return;\n }\n\n if (hadKeyboardEvent || focusTriggersKeyboardModality(e.target)) {\n addFocusVisibleClass(e.target);\n }\n }\n\n /**\n * On `blur`, remove the `focus-visible` class from the target.\n * @param {Event} e\n */\n function onBlur(e) {\n if (!isValidFocusTarget(e.target)) {\n return;\n }\n\n if (\n e.target.classList.contains('focus-visible') ||\n e.target.hasAttribute('data-focus-visible-added')\n ) {\n // To detect a tab/window switch, we look for a blur event followed\n // rapidly by a visibility change.\n // If we don't see a visibility change within 100ms, it's probably a\n // regular focus change.\n hadFocusVisibleRecently = true;\n window.clearTimeout(hadFocusVisibleRecentlyTimeout);\n hadFocusVisibleRecentlyTimeout = window.setTimeout(function() {\n hadFocusVisibleRecently = false;\n }, 100);\n removeFocusVisibleClass(e.target);\n }\n }\n\n /**\n * If the user changes tabs, keep track of whether or not the previously\n * focused element had .focus-visible.\n * @param {Event} e\n */\n function onVisibilityChange(e) {\n if (document.visibilityState === 'hidden') {\n // If the tab becomes active again, the browser will handle calling focus\n // on the element (Safari actually calls it twice).\n // If this tab change caused a blur on an element with focus-visible,\n // re-apply the class when the user switches back to the tab.\n if (hadFocusVisibleRecently) {\n hadKeyboardEvent = true;\n }\n addInitialPointerMoveListeners();\n }\n }\n\n /**\n * Add a group of listeners to detect usage of any pointing devices.\n * These listeners will be added when the polyfill first loads, and anytime\n * the window is blurred, so that they are active when the window regains\n * focus.\n */\n function addInitialPointerMoveListeners() {\n document.addEventListener('mousemove', onInitialPointerMove);\n document.addEventListener('mousedown', onInitialPointerMove);\n document.addEventListener('mouseup', onInitialPointerMove);\n document.addEventListener('pointermove', onInitialPointerMove);\n document.addEventListener('pointerdown', onInitialPointerMove);\n document.addEventListener('pointerup', onInitialPointerMove);\n document.addEventListener('touchmove', onInitialPointerMove);\n document.addEventListener('touchstart', onInitialPointerMove);\n document.addEventListener('touchend', onInitialPointerMove);\n }\n\n function removeInitialPointerMoveListeners() {\n document.removeEventListener('mousemove', onInitialPointerMove);\n document.removeEventListener('mousedown', onInitialPointerMove);\n document.removeEventListener('mouseup', onInitialPointerMove);\n document.removeEventListener('pointermove', onInitialPointerMove);\n document.removeEventListener('pointerdown', onInitialPointerMove);\n document.removeEventListener('pointerup', onInitialPointerMove);\n document.removeEventListener('touchmove', onInitialPointerMove);\n document.removeEventListener('touchstart', onInitialPointerMove);\n document.removeEventListener('touchend', onInitialPointerMove);\n }\n\n /**\n * When the polfyill first loads, assume the user is in keyboard modality.\n * If any event is received from a pointing device (e.g. mouse, pointer,\n * touch), turn off keyboard modality.\n * This accounts for situations where focus enters the page from the URL bar.\n * @param {Event} e\n */\n function onInitialPointerMove(e) {\n // Work around a Safari quirk that fires a mousemove on whenever the\n // window blurs, even if you're tabbing out of the page. \u00AF\\_(\u30C4)_/\u00AF\n if (e.target.nodeName && e.target.nodeName.toLowerCase() === 'html') {\n return;\n }\n\n hadKeyboardEvent = false;\n removeInitialPointerMoveListeners();\n }\n\n // For some kinds of state, we are interested in changes at the global scope\n // only. For example, global pointer input, global key presses and global\n // visibility change should affect the state at every scope:\n document.addEventListener('keydown', onKeyDown, true);\n document.addEventListener('mousedown', onPointerDown, true);\n document.addEventListener('pointerdown', onPointerDown, true);\n document.addEventListener('touchstart', onPointerDown, true);\n document.addEventListener('visibilitychange', onVisibilityChange, true);\n\n addInitialPointerMoveListeners();\n\n // For focus and blur, we specifically care about state changes in the local\n // scope. This is because focus / blur events that originate from within a\n // shadow root are not re-dispatched from the host element if it was already\n // the active element in its own scope:\n scope.addEventListener('focus', onFocus, true);\n scope.addEventListener('blur', onBlur, true);\n\n // We detect that a node is a ShadowRoot by ensuring that it is a\n // DocumentFragment and also has a host property. This check covers native\n // implementation and polyfill implementation transparently. If we only cared\n // about the native implementation, we could just check if the scope was\n // an instance of a ShadowRoot.\n if (scope.nodeType === Node.DOCUMENT_FRAGMENT_NODE && scope.host) {\n // Since a ShadowRoot is a special kind of DocumentFragment, it does not\n // have a root element to add a class to. So, we add this attribute to the\n // host element instead:\n scope.host.setAttribute('data-js-focus-visible', '');\n } else if (scope.nodeType === Node.DOCUMENT_NODE) {\n document.documentElement.classList.add('js-focus-visible');\n document.documentElement.setAttribute('data-js-focus-visible', '');\n }\n }\n\n // It is important to wrap all references to global window and document in\n // these checks to support server-side rendering use cases\n // @see https://github.com/WICG/focus-visible/issues/199\n if (typeof window !== 'undefined' && typeof document !== 'undefined') {\n // Make the polyfill helper globally available. This can be used as a signal\n // to interested libraries that wish to coordinate with the polyfill for e.g.,\n // applying the polyfill to a shadow root:\n window.applyFocusVisiblePolyfill = applyFocusVisiblePolyfill;\n\n // Notify interested libraries of the polyfill's presence, in case the\n // polyfill was loaded lazily:\n var event;\n\n try {\n event = new CustomEvent('focus-visible-polyfill-ready');\n } catch (error) {\n // IE11 does not support using CustomEvent as a constructor directly:\n event = document.createEvent('CustomEvent');\n event.initCustomEvent('focus-visible-polyfill-ready', false, false, {});\n }\n\n window.dispatchEvent(event);\n }\n\n if (typeof document !== 'undefined') {\n // Apply the polyfill to the global document, so that no JavaScript\n // coordination is required to use the polyfill in the top-level document:\n applyFocusVisiblePolyfill(document);\n }\n\n})));\n", "/*!\n * clipboard.js v2.0.11\n * https://clipboardjs.com/\n *\n * Licensed MIT \u00A9 Zeno Rocha\n */\n(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"ClipboardJS\"] = factory();\n\telse\n\t\troot[\"ClipboardJS\"] = factory();\n})(this, function() {\nreturn /******/ (function() { // webpackBootstrap\n/******/ \tvar __webpack_modules__ = ({\n\n/***/ 686:\n/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n\n// EXPORTS\n__webpack_require__.d(__webpack_exports__, {\n \"default\": function() { return /* binding */ clipboard; }\n});\n\n// EXTERNAL MODULE: ./node_modules/tiny-emitter/index.js\nvar tiny_emitter = __webpack_require__(279);\nvar tiny_emitter_default = /*#__PURE__*/__webpack_require__.n(tiny_emitter);\n// EXTERNAL MODULE: ./node_modules/good-listener/src/listen.js\nvar listen = __webpack_require__(370);\nvar listen_default = /*#__PURE__*/__webpack_require__.n(listen);\n// EXTERNAL MODULE: ./node_modules/select/src/select.js\nvar src_select = __webpack_require__(817);\nvar select_default = /*#__PURE__*/__webpack_require__.n(src_select);\n;// CONCATENATED MODULE: ./src/common/command.js\n/**\n * Executes a given operation type.\n * @param {String} type\n * @return {Boolean}\n */\nfunction command(type) {\n try {\n return document.execCommand(type);\n } catch (err) {\n return false;\n }\n}\n;// CONCATENATED MODULE: ./src/actions/cut.js\n\n\n/**\n * Cut action wrapper.\n * @param {String|HTMLElement} target\n * @return {String}\n */\n\nvar ClipboardActionCut = function ClipboardActionCut(target) {\n var selectedText = select_default()(target);\n command('cut');\n return selectedText;\n};\n\n/* harmony default export */ var actions_cut = (ClipboardActionCut);\n;// CONCATENATED MODULE: ./src/common/create-fake-element.js\n/**\n * Creates a fake textarea element with a value.\n * @param {String} value\n * @return {HTMLElement}\n */\nfunction createFakeElement(value) {\n var isRTL = document.documentElement.getAttribute('dir') === 'rtl';\n var fakeElement = document.createElement('textarea'); // Prevent zooming on iOS\n\n fakeElement.style.fontSize = '12pt'; // Reset box model\n\n fakeElement.style.border = '0';\n fakeElement.style.padding = '0';\n fakeElement.style.margin = '0'; // Move element out of screen horizontally\n\n fakeElement.style.position = 'absolute';\n fakeElement.style[isRTL ? 'right' : 'left'] = '-9999px'; // Move element to the same position vertically\n\n var yPosition = window.pageYOffset || document.documentElement.scrollTop;\n fakeElement.style.top = \"\".concat(yPosition, \"px\");\n fakeElement.setAttribute('readonly', '');\n fakeElement.value = value;\n return fakeElement;\n}\n;// CONCATENATED MODULE: ./src/actions/copy.js\n\n\n\n/**\n * Create fake copy action wrapper using a fake element.\n * @param {String} target\n * @param {Object} options\n * @return {String}\n */\n\nvar fakeCopyAction = function fakeCopyAction(value, options) {\n var fakeElement = createFakeElement(value);\n options.container.appendChild(fakeElement);\n var selectedText = select_default()(fakeElement);\n command('copy');\n fakeElement.remove();\n return selectedText;\n};\n/**\n * Copy action wrapper.\n * @param {String|HTMLElement} target\n * @param {Object} options\n * @return {String}\n */\n\n\nvar ClipboardActionCopy = function ClipboardActionCopy(target) {\n var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {\n container: document.body\n };\n var selectedText = '';\n\n if (typeof target === 'string') {\n selectedText = fakeCopyAction(target, options);\n } else if (target instanceof HTMLInputElement && !['text', 'search', 'url', 'tel', 'password'].includes(target === null || target === void 0 ? void 0 : target.type)) {\n // If input type doesn't support `setSelectionRange`. Simulate it. https://developer.mozilla.org/en-US/docs/Web/API/HTMLInputElement/setSelectionRange\n selectedText = fakeCopyAction(target.value, options);\n } else {\n selectedText = select_default()(target);\n command('copy');\n }\n\n return selectedText;\n};\n\n/* harmony default export */ var actions_copy = (ClipboardActionCopy);\n;// CONCATENATED MODULE: ./src/actions/default.js\nfunction _typeof(obj) { \"@babel/helpers - typeof\"; if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }; } return _typeof(obj); }\n\n\n\n/**\n * Inner function which performs selection from either `text` or `target`\n * properties and then executes copy or cut operations.\n * @param {Object} options\n */\n\nvar ClipboardActionDefault = function ClipboardActionDefault() {\n var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n // Defines base properties passed from constructor.\n var _options$action = options.action,\n action = _options$action === void 0 ? 'copy' : _options$action,\n container = options.container,\n target = options.target,\n text = options.text; // Sets the `action` to be performed which can be either 'copy' or 'cut'.\n\n if (action !== 'copy' && action !== 'cut') {\n throw new Error('Invalid \"action\" value, use either \"copy\" or \"cut\"');\n } // Sets the `target` property using an element that will be have its content copied.\n\n\n if (target !== undefined) {\n if (target && _typeof(target) === 'object' && target.nodeType === 1) {\n if (action === 'copy' && target.hasAttribute('disabled')) {\n throw new Error('Invalid \"target\" attribute. Please use \"readonly\" instead of \"disabled\" attribute');\n }\n\n if (action === 'cut' && (target.hasAttribute('readonly') || target.hasAttribute('disabled'))) {\n throw new Error('Invalid \"target\" attribute. You can\\'t cut text from elements with \"readonly\" or \"disabled\" attributes');\n }\n } else {\n throw new Error('Invalid \"target\" value, use a valid Element');\n }\n } // Define selection strategy based on `text` property.\n\n\n if (text) {\n return actions_copy(text, {\n container: container\n });\n } // Defines which selection strategy based on `target` property.\n\n\n if (target) {\n return action === 'cut' ? actions_cut(target) : actions_copy(target, {\n container: container\n });\n }\n};\n\n/* harmony default export */ var actions_default = (ClipboardActionDefault);\n;// CONCATENATED MODULE: ./src/clipboard.js\nfunction clipboard_typeof(obj) { \"@babel/helpers - typeof\"; if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") { clipboard_typeof = function _typeof(obj) { return typeof obj; }; } else { clipboard_typeof = function _typeof(obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }; } return clipboard_typeof(obj); }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function\"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf(subClass, superClass); }\n\nfunction _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }\n\nfunction _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }\n\nfunction _possibleConstructorReturn(self, call) { if (call && (clipboard_typeof(call) === \"object\" || typeof call === \"function\")) { return call; } return _assertThisInitialized(self); }\n\nfunction _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return self; }\n\nfunction _isNativeReflectConstruct() { if (typeof Reflect === \"undefined\" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === \"function\") return true; try { Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); return true; } catch (e) { return false; } }\n\nfunction _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); }\n\n\n\n\n\n\n/**\n * Helper function to retrieve attribute value.\n * @param {String} suffix\n * @param {Element} element\n */\n\nfunction getAttributeValue(suffix, element) {\n var attribute = \"data-clipboard-\".concat(suffix);\n\n if (!element.hasAttribute(attribute)) {\n return;\n }\n\n return element.getAttribute(attribute);\n}\n/**\n * Base class which takes one or more elements, adds event listeners to them,\n * and instantiates a new `ClipboardAction` on each click.\n */\n\n\nvar Clipboard = /*#__PURE__*/function (_Emitter) {\n _inherits(Clipboard, _Emitter);\n\n var _super = _createSuper(Clipboard);\n\n /**\n * @param {String|HTMLElement|HTMLCollection|NodeList} trigger\n * @param {Object} options\n */\n function Clipboard(trigger, options) {\n var _this;\n\n _classCallCheck(this, Clipboard);\n\n _this = _super.call(this);\n\n _this.resolveOptions(options);\n\n _this.listenClick(trigger);\n\n return _this;\n }\n /**\n * Defines if attributes would be resolved using internal setter functions\n * or custom functions that were passed in the constructor.\n * @param {Object} options\n */\n\n\n _createClass(Clipboard, [{\n key: \"resolveOptions\",\n value: function resolveOptions() {\n var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n this.action = typeof options.action === 'function' ? options.action : this.defaultAction;\n this.target = typeof options.target === 'function' ? options.target : this.defaultTarget;\n this.text = typeof options.text === 'function' ? options.text : this.defaultText;\n this.container = clipboard_typeof(options.container) === 'object' ? options.container : document.body;\n }\n /**\n * Adds a click event listener to the passed trigger.\n * @param {String|HTMLElement|HTMLCollection|NodeList} trigger\n */\n\n }, {\n key: \"listenClick\",\n value: function listenClick(trigger) {\n var _this2 = this;\n\n this.listener = listen_default()(trigger, 'click', function (e) {\n return _this2.onClick(e);\n });\n }\n /**\n * Defines a new `ClipboardAction` on each click event.\n * @param {Event} e\n */\n\n }, {\n key: \"onClick\",\n value: function onClick(e) {\n var trigger = e.delegateTarget || e.currentTarget;\n var action = this.action(trigger) || 'copy';\n var text = actions_default({\n action: action,\n container: this.container,\n target: this.target(trigger),\n text: this.text(trigger)\n }); // Fires an event based on the copy operation result.\n\n this.emit(text ? 'success' : 'error', {\n action: action,\n text: text,\n trigger: trigger,\n clearSelection: function clearSelection() {\n if (trigger) {\n trigger.focus();\n }\n\n window.getSelection().removeAllRanges();\n }\n });\n }\n /**\n * Default `action` lookup function.\n * @param {Element} trigger\n */\n\n }, {\n key: \"defaultAction\",\n value: function defaultAction(trigger) {\n return getAttributeValue('action', trigger);\n }\n /**\n * Default `target` lookup function.\n * @param {Element} trigger\n */\n\n }, {\n key: \"defaultTarget\",\n value: function defaultTarget(trigger) {\n var selector = getAttributeValue('target', trigger);\n\n if (selector) {\n return document.querySelector(selector);\n }\n }\n /**\n * Allow fire programmatically a copy action\n * @param {String|HTMLElement} target\n * @param {Object} options\n * @returns Text copied.\n */\n\n }, {\n key: \"defaultText\",\n\n /**\n * Default `text` lookup function.\n * @param {Element} trigger\n */\n value: function defaultText(trigger) {\n return getAttributeValue('text', trigger);\n }\n /**\n * Destroy lifecycle.\n */\n\n }, {\n key: \"destroy\",\n value: function destroy() {\n this.listener.destroy();\n }\n }], [{\n key: \"copy\",\n value: function copy(target) {\n var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {\n container: document.body\n };\n return actions_copy(target, options);\n }\n /**\n * Allow fire programmatically a cut action\n * @param {String|HTMLElement} target\n * @returns Text cutted.\n */\n\n }, {\n key: \"cut\",\n value: function cut(target) {\n return actions_cut(target);\n }\n /**\n * Returns the support of the given action, or all actions if no action is\n * given.\n * @param {String} [action]\n */\n\n }, {\n key: \"isSupported\",\n value: function isSupported() {\n var action = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : ['copy', 'cut'];\n var actions = typeof action === 'string' ? [action] : action;\n var support = !!document.queryCommandSupported;\n actions.forEach(function (action) {\n support = support && !!document.queryCommandSupported(action);\n });\n return support;\n }\n }]);\n\n return Clipboard;\n}((tiny_emitter_default()));\n\n/* harmony default export */ var clipboard = (Clipboard);\n\n/***/ }),\n\n/***/ 828:\n/***/ (function(module) {\n\nvar DOCUMENT_NODE_TYPE = 9;\n\n/**\n * A polyfill for Element.matches()\n */\nif (typeof Element !== 'undefined' && !Element.prototype.matches) {\n var proto = Element.prototype;\n\n proto.matches = proto.matchesSelector ||\n proto.mozMatchesSelector ||\n proto.msMatchesSelector ||\n proto.oMatchesSelector ||\n proto.webkitMatchesSelector;\n}\n\n/**\n * Finds the closest parent that matches a selector.\n *\n * @param {Element} element\n * @param {String} selector\n * @return {Function}\n */\nfunction closest (element, selector) {\n while (element && element.nodeType !== DOCUMENT_NODE_TYPE) {\n if (typeof element.matches === 'function' &&\n element.matches(selector)) {\n return element;\n }\n element = element.parentNode;\n }\n}\n\nmodule.exports = closest;\n\n\n/***/ }),\n\n/***/ 438:\n/***/ (function(module, __unused_webpack_exports, __webpack_require__) {\n\nvar closest = __webpack_require__(828);\n\n/**\n * Delegates event to a selector.\n *\n * @param {Element} element\n * @param {String} selector\n * @param {String} type\n * @param {Function} callback\n * @param {Boolean} useCapture\n * @return {Object}\n */\nfunction _delegate(element, selector, type, callback, useCapture) {\n var listenerFn = listener.apply(this, arguments);\n\n element.addEventListener(type, listenerFn, useCapture);\n\n return {\n destroy: function() {\n element.removeEventListener(type, listenerFn, useCapture);\n }\n }\n}\n\n/**\n * Delegates event to a selector.\n *\n * @param {Element|String|Array} [elements]\n * @param {String} selector\n * @param {String} type\n * @param {Function} callback\n * @param {Boolean} useCapture\n * @return {Object}\n */\nfunction delegate(elements, selector, type, callback, useCapture) {\n // Handle the regular Element usage\n if (typeof elements.addEventListener === 'function') {\n return _delegate.apply(null, arguments);\n }\n\n // Handle Element-less usage, it defaults to global delegation\n if (typeof type === 'function') {\n // Use `document` as the first parameter, then apply arguments\n // This is a short way to .unshift `arguments` without running into deoptimizations\n return _delegate.bind(null, document).apply(null, arguments);\n }\n\n // Handle Selector-based usage\n if (typeof elements === 'string') {\n elements = document.querySelectorAll(elements);\n }\n\n // Handle Array-like based usage\n return Array.prototype.map.call(elements, function (element) {\n return _delegate(element, selector, type, callback, useCapture);\n });\n}\n\n/**\n * Finds closest match and invokes callback.\n *\n * @param {Element} element\n * @param {String} selector\n * @param {String} type\n * @param {Function} callback\n * @return {Function}\n */\nfunction listener(element, selector, type, callback) {\n return function(e) {\n e.delegateTarget = closest(e.target, selector);\n\n if (e.delegateTarget) {\n callback.call(element, e);\n }\n }\n}\n\nmodule.exports = delegate;\n\n\n/***/ }),\n\n/***/ 879:\n/***/ (function(__unused_webpack_module, exports) {\n\n/**\n * Check if argument is a HTML element.\n *\n * @param {Object} value\n * @return {Boolean}\n */\nexports.node = function(value) {\n return value !== undefined\n && value instanceof HTMLElement\n && value.nodeType === 1;\n};\n\n/**\n * Check if argument is a list of HTML elements.\n *\n * @param {Object} value\n * @return {Boolean}\n */\nexports.nodeList = function(value) {\n var type = Object.prototype.toString.call(value);\n\n return value !== undefined\n && (type === '[object NodeList]' || type === '[object HTMLCollection]')\n && ('length' in value)\n && (value.length === 0 || exports.node(value[0]));\n};\n\n/**\n * Check if argument is a string.\n *\n * @param {Object} value\n * @return {Boolean}\n */\nexports.string = function(value) {\n return typeof value === 'string'\n || value instanceof String;\n};\n\n/**\n * Check if argument is a function.\n *\n * @param {Object} value\n * @return {Boolean}\n */\nexports.fn = function(value) {\n var type = Object.prototype.toString.call(value);\n\n return type === '[object Function]';\n};\n\n\n/***/ }),\n\n/***/ 370:\n/***/ (function(module, __unused_webpack_exports, __webpack_require__) {\n\nvar is = __webpack_require__(879);\nvar delegate = __webpack_require__(438);\n\n/**\n * Validates all params and calls the right\n * listener function based on its target type.\n *\n * @param {String|HTMLElement|HTMLCollection|NodeList} target\n * @param {String} type\n * @param {Function} callback\n * @return {Object}\n */\nfunction listen(target, type, callback) {\n if (!target && !type && !callback) {\n throw new Error('Missing required arguments');\n }\n\n if (!is.string(type)) {\n throw new TypeError('Second argument must be a String');\n }\n\n if (!is.fn(callback)) {\n throw new TypeError('Third argument must be a Function');\n }\n\n if (is.node(target)) {\n return listenNode(target, type, callback);\n }\n else if (is.nodeList(target)) {\n return listenNodeList(target, type, callback);\n }\n else if (is.string(target)) {\n return listenSelector(target, type, callback);\n }\n else {\n throw new TypeError('First argument must be a String, HTMLElement, HTMLCollection, or NodeList');\n }\n}\n\n/**\n * Adds an event listener to a HTML element\n * and returns a remove listener function.\n *\n * @param {HTMLElement} node\n * @param {String} type\n * @param {Function} callback\n * @return {Object}\n */\nfunction listenNode(node, type, callback) {\n node.addEventListener(type, callback);\n\n return {\n destroy: function() {\n node.removeEventListener(type, callback);\n }\n }\n}\n\n/**\n * Add an event listener to a list of HTML elements\n * and returns a remove listener function.\n *\n * @param {NodeList|HTMLCollection} nodeList\n * @param {String} type\n * @param {Function} callback\n * @return {Object}\n */\nfunction listenNodeList(nodeList, type, callback) {\n Array.prototype.forEach.call(nodeList, function(node) {\n node.addEventListener(type, callback);\n });\n\n return {\n destroy: function() {\n Array.prototype.forEach.call(nodeList, function(node) {\n node.removeEventListener(type, callback);\n });\n }\n }\n}\n\n/**\n * Add an event listener to a selector\n * and returns a remove listener function.\n *\n * @param {String} selector\n * @param {String} type\n * @param {Function} callback\n * @return {Object}\n */\nfunction listenSelector(selector, type, callback) {\n return delegate(document.body, selector, type, callback);\n}\n\nmodule.exports = listen;\n\n\n/***/ }),\n\n/***/ 817:\n/***/ (function(module) {\n\nfunction select(element) {\n var selectedText;\n\n if (element.nodeName === 'SELECT') {\n element.focus();\n\n selectedText = element.value;\n }\n else if (element.nodeName === 'INPUT' || element.nodeName === 'TEXTAREA') {\n var isReadOnly = element.hasAttribute('readonly');\n\n if (!isReadOnly) {\n element.setAttribute('readonly', '');\n }\n\n element.select();\n element.setSelectionRange(0, element.value.length);\n\n if (!isReadOnly) {\n element.removeAttribute('readonly');\n }\n\n selectedText = element.value;\n }\n else {\n if (element.hasAttribute('contenteditable')) {\n element.focus();\n }\n\n var selection = window.getSelection();\n var range = document.createRange();\n\n range.selectNodeContents(element);\n selection.removeAllRanges();\n selection.addRange(range);\n\n selectedText = selection.toString();\n }\n\n return selectedText;\n}\n\nmodule.exports = select;\n\n\n/***/ }),\n\n/***/ 279:\n/***/ (function(module) {\n\nfunction E () {\n // Keep this empty so it's easier to inherit from\n // (via https://github.com/lipsmack from https://github.com/scottcorgan/tiny-emitter/issues/3)\n}\n\nE.prototype = {\n on: function (name, callback, ctx) {\n var e = this.e || (this.e = {});\n\n (e[name] || (e[name] = [])).push({\n fn: callback,\n ctx: ctx\n });\n\n return this;\n },\n\n once: function (name, callback, ctx) {\n var self = this;\n function listener () {\n self.off(name, listener);\n callback.apply(ctx, arguments);\n };\n\n listener._ = callback\n return this.on(name, listener, ctx);\n },\n\n emit: function (name) {\n var data = [].slice.call(arguments, 1);\n var evtArr = ((this.e || (this.e = {}))[name] || []).slice();\n var i = 0;\n var len = evtArr.length;\n\n for (i; i < len; i++) {\n evtArr[i].fn.apply(evtArr[i].ctx, data);\n }\n\n return this;\n },\n\n off: function (name, callback) {\n var e = this.e || (this.e = {});\n var evts = e[name];\n var liveEvents = [];\n\n if (evts && callback) {\n for (var i = 0, len = evts.length; i < len; i++) {\n if (evts[i].fn !== callback && evts[i].fn._ !== callback)\n liveEvents.push(evts[i]);\n }\n }\n\n // Remove event from queue to prevent memory leak\n // Suggested by https://github.com/lazd\n // Ref: https://github.com/scottcorgan/tiny-emitter/commit/c6ebfaa9bc973b33d110a84a307742b7cf94c953#commitcomment-5024910\n\n (liveEvents.length)\n ? e[name] = liveEvents\n : delete e[name];\n\n return this;\n }\n};\n\nmodule.exports = E;\nmodule.exports.TinyEmitter = E;\n\n\n/***/ })\n\n/******/ \t});\n/************************************************************************/\n/******/ \t// The module cache\n/******/ \tvar __webpack_module_cache__ = {};\n/******/ \t\n/******/ \t// The require function\n/******/ \tfunction __webpack_require__(moduleId) {\n/******/ \t\t// Check if module is in cache\n/******/ \t\tif(__webpack_module_cache__[moduleId]) {\n/******/ \t\t\treturn __webpack_module_cache__[moduleId].exports;\n/******/ \t\t}\n/******/ \t\t// Create a new module (and put it into the cache)\n/******/ \t\tvar module = __webpack_module_cache__[moduleId] = {\n/******/ \t\t\t// no module.id needed\n/******/ \t\t\t// no module.loaded needed\n/******/ \t\t\texports: {}\n/******/ \t\t};\n/******/ \t\n/******/ \t\t// Execute the module function\n/******/ \t\t__webpack_modules__[moduleId](module, module.exports, __webpack_require__);\n/******/ \t\n/******/ \t\t// Return the exports of the module\n/******/ \t\treturn module.exports;\n/******/ \t}\n/******/ \t\n/************************************************************************/\n/******/ \t/* webpack/runtime/compat get default export */\n/******/ \t!function() {\n/******/ \t\t// getDefaultExport function for compatibility with non-harmony modules\n/******/ \t\t__webpack_require__.n = function(module) {\n/******/ \t\t\tvar getter = module && module.__esModule ?\n/******/ \t\t\t\tfunction() { return module['default']; } :\n/******/ \t\t\t\tfunction() { return module; };\n/******/ \t\t\t__webpack_require__.d(getter, { a: getter });\n/******/ \t\t\treturn getter;\n/******/ \t\t};\n/******/ \t}();\n/******/ \t\n/******/ \t/* webpack/runtime/define property getters */\n/******/ \t!function() {\n/******/ \t\t// define getter functions for harmony exports\n/******/ \t\t__webpack_require__.d = function(exports, definition) {\n/******/ \t\t\tfor(var key in definition) {\n/******/ \t\t\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n/******/ \t\t\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n/******/ \t\t\t\t}\n/******/ \t\t\t}\n/******/ \t\t};\n/******/ \t}();\n/******/ \t\n/******/ \t/* webpack/runtime/hasOwnProperty shorthand */\n/******/ \t!function() {\n/******/ \t\t__webpack_require__.o = function(obj, prop) { return Object.prototype.hasOwnProperty.call(obj, prop); }\n/******/ \t}();\n/******/ \t\n/************************************************************************/\n/******/ \t// module exports must be returned from runtime so entry inlining is disabled\n/******/ \t// startup\n/******/ \t// Load entry module and return exports\n/******/ \treturn __webpack_require__(686);\n/******/ })()\n.default;\n});", "/*!\n * escape-html\n * Copyright(c) 2012-2013 TJ Holowaychuk\n * Copyright(c) 2015 Andreas Lubbe\n * Copyright(c) 2015 Tiancheng \"Timothy\" Gu\n * MIT Licensed\n */\n\n'use strict';\n\n/**\n * Module variables.\n * @private\n */\n\nvar matchHtmlRegExp = /[\"'&<>]/;\n\n/**\n * Module exports.\n * @public\n */\n\nmodule.exports = escapeHtml;\n\n/**\n * Escape special characters in the given string of html.\n *\n * @param {string} string The string to escape for inserting into HTML\n * @return {string}\n * @public\n */\n\nfunction escapeHtml(string) {\n var str = '' + string;\n var match = matchHtmlRegExp.exec(str);\n\n if (!match) {\n return str;\n }\n\n var escape;\n var html = '';\n var index = 0;\n var lastIndex = 0;\n\n for (index = match.index; index < str.length; index++) {\n switch (str.charCodeAt(index)) {\n case 34: // \"\n escape = '"';\n break;\n case 38: // &\n escape = '&';\n break;\n case 39: // '\n escape = ''';\n break;\n case 60: // <\n escape = '<';\n break;\n case 62: // >\n escape = '>';\n break;\n default:\n continue;\n }\n\n if (lastIndex !== index) {\n html += str.substring(lastIndex, index);\n }\n\n lastIndex = index + 1;\n html += escape;\n }\n\n return lastIndex !== index\n ? html + str.substring(lastIndex, index)\n : html;\n}\n", "/*\n * Copyright (c) 2016-2023 Martin Donath \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport \"focus-visible\"\n\nimport {\n EMPTY,\n NEVER,\n Observable,\n Subject,\n defer,\n delay,\n filter,\n map,\n merge,\n mergeWith,\n shareReplay,\n switchMap\n} from \"rxjs\"\n\nimport { configuration, feature } from \"./_\"\nimport {\n at,\n getActiveElement,\n getOptionalElement,\n requestJSON,\n setLocation,\n setToggle,\n watchDocument,\n watchKeyboard,\n watchLocation,\n watchLocationTarget,\n watchMedia,\n watchPrint,\n watchScript,\n watchViewport\n} from \"./browser\"\nimport {\n getComponentElement,\n getComponentElements,\n mountAnnounce,\n mountBackToTop,\n mountConsent,\n mountContent,\n mountDialog,\n mountHeader,\n mountHeaderTitle,\n mountPalette,\n mountSearch,\n mountSearchHiglight,\n mountSidebar,\n mountSource,\n mountTableOfContents,\n mountTabs,\n watchHeader,\n watchMain\n} from \"./components\"\nimport {\n SearchIndex,\n setupClipboardJS,\n setupInstantLoading,\n setupVersionSelector\n} from \"./integrations\"\nimport {\n patchIndeterminate,\n patchScrollfix,\n patchScrolllock\n} from \"./patches\"\nimport \"./polyfills\"\n\n/* ----------------------------------------------------------------------------\n * Functions - @todo refactor\n * ------------------------------------------------------------------------- */\n\n/**\n * Fetch search index\n *\n * @returns Search index observable\n */\nfunction fetchSearchIndex(): Observable {\n if (location.protocol === \"file:\") {\n return watchScript(\n `${new URL(\"search/search_index.js\", config.base)}`\n )\n .pipe(\n // @ts-ignore - @todo fix typings\n map(() => __index),\n shareReplay(1)\n )\n } else {\n return requestJSON(\n new URL(\"search/search_index.json\", config.base)\n )\n }\n}\n\n/* ----------------------------------------------------------------------------\n * Application\n * ------------------------------------------------------------------------- */\n\n/* Yay, JavaScript is available */\ndocument.documentElement.classList.remove(\"no-js\")\ndocument.documentElement.classList.add(\"js\")\n\n/* Set up navigation observables and subjects */\nconst document$ = watchDocument()\nconst location$ = watchLocation()\nconst target$ = watchLocationTarget(location$)\nconst keyboard$ = watchKeyboard()\n\n/* Set up media observables */\nconst viewport$ = watchViewport()\nconst tablet$ = watchMedia(\"(min-width: 960px)\")\nconst screen$ = watchMedia(\"(min-width: 1220px)\")\nconst print$ = watchPrint()\n\n/* Retrieve search index, if search is enabled */\nconst config = configuration()\nconst index$ = document.forms.namedItem(\"search\")\n ? fetchSearchIndex()\n : NEVER\n\n/* Set up Clipboard.js integration */\nconst alert$ = new Subject()\nsetupClipboardJS({ alert$ })\n\n/* Set up instant loading, if enabled */\nif (feature(\"navigation.instant\"))\n setupInstantLoading({ location$, viewport$ })\n .subscribe(document$)\n\n/* Set up version selector */\nif (config.version?.provider === \"mike\")\n setupVersionSelector({ document$ })\n\n/* Always close drawer and search on navigation */\nmerge(location$, target$)\n .pipe(\n delay(125)\n )\n .subscribe(() => {\n setToggle(\"drawer\", false)\n setToggle(\"search\", false)\n })\n\n/* Set up global keyboard handlers */\nkeyboard$\n .pipe(\n filter(({ mode }) => mode === \"global\")\n )\n .subscribe(key => {\n switch (key.type) {\n\n /* Go to previous page */\n case \"p\":\n case \",\":\n const prev = getOptionalElement(\"link[rel=prev]\")\n if (typeof prev !== \"undefined\")\n setLocation(prev)\n break\n\n /* Go to next page */\n case \"n\":\n case \".\":\n const next = getOptionalElement(\"link[rel=next]\")\n if (typeof next !== \"undefined\")\n setLocation(next)\n break\n\n /* Expand navigation, see https://bit.ly/3ZjG5io */\n case \"Enter\":\n const active = getActiveElement()\n if (active instanceof HTMLLabelElement)\n active.click()\n }\n })\n\n/* Set up patches */\npatchIndeterminate({ document$, tablet$ })\npatchScrollfix({ document$ })\npatchScrolllock({ viewport$, tablet$ })\n\n/* Set up header and main area observable */\nconst header$ = watchHeader(getComponentElement(\"header\"), { viewport$ })\nconst main$ = document$\n .pipe(\n map(() => getComponentElement(\"main\")),\n switchMap(el => watchMain(el, { viewport$, header$ })),\n shareReplay(1)\n )\n\n/* Set up control component observables */\nconst control$ = merge(\n\n /* Consent */\n ...getComponentElements(\"consent\")\n .map(el => mountConsent(el, { target$ })),\n\n /* Dialog */\n ...getComponentElements(\"dialog\")\n .map(el => mountDialog(el, { alert$ })),\n\n /* Header */\n ...getComponentElements(\"header\")\n .map(el => mountHeader(el, { viewport$, header$, main$ })),\n\n /* Color palette */\n ...getComponentElements(\"palette\")\n .map(el => mountPalette(el)),\n\n /* Search */\n ...getComponentElements(\"search\")\n .map(el => mountSearch(el, { index$, keyboard$ })),\n\n /* Repository information */\n ...getComponentElements(\"source\")\n .map(el => mountSource(el))\n)\n\n/* Set up content component observables */\nconst content$ = defer(() => merge(\n\n /* Announcement bar */\n ...getComponentElements(\"announce\")\n .map(el => mountAnnounce(el)),\n\n /* Content */\n ...getComponentElements(\"content\")\n .map(el => mountContent(el, { viewport$, target$, print$ })),\n\n /* Search highlighting */\n ...getComponentElements(\"content\")\n .map(el => feature(\"search.highlight\")\n ? mountSearchHiglight(el, { index$, location$ })\n : EMPTY\n ),\n\n /* Header title */\n ...getComponentElements(\"header-title\")\n .map(el => mountHeaderTitle(el, { viewport$, header$ })),\n\n /* Sidebar */\n ...getComponentElements(\"sidebar\")\n .map(el => el.getAttribute(\"data-md-type\") === \"navigation\"\n ? at(screen$, () => mountSidebar(el, { viewport$, header$, main$ }))\n : at(tablet$, () => mountSidebar(el, { viewport$, header$, main$ }))\n ),\n\n /* Navigation tabs */\n ...getComponentElements(\"tabs\")\n .map(el => mountTabs(el, { viewport$, header$ })),\n\n /* Table of contents */\n ...getComponentElements(\"toc\")\n .map(el => mountTableOfContents(el, {\n viewport$, header$, main$, target$\n })),\n\n /* Back-to-top button */\n ...getComponentElements(\"top\")\n .map(el => mountBackToTop(el, { viewport$, header$, main$, target$ }))\n))\n\n/* Set up component observables */\nconst component$ = document$\n .pipe(\n switchMap(() => content$),\n mergeWith(control$),\n shareReplay(1)\n )\n\n/* Subscribe to all components */\ncomponent$.subscribe()\n\n/* ----------------------------------------------------------------------------\n * Exports\n * ------------------------------------------------------------------------- */\n\nwindow.document$ = document$ /* Document observable */\nwindow.location$ = location$ /* Location subject */\nwindow.target$ = target$ /* Location target observable */\nwindow.keyboard$ = keyboard$ /* Keyboard observable */\nwindow.viewport$ = viewport$ /* Viewport observable */\nwindow.tablet$ = tablet$ /* Media tablet observable */\nwindow.screen$ = screen$ /* Media screen observable */\nwindow.print$ = print$ /* Media print observable */\nwindow.alert$ = alert$ /* Alert subject */\nwindow.component$ = component$ /* Component observable */\n", "/*! *****************************************************************************\r\nCopyright (c) Microsoft Corporation.\r\n\r\nPermission to use, copy, modify, and/or distribute this software for any\r\npurpose with or without fee is hereby granted.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\r\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\r\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\r\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\r\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\r\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\r\nPERFORMANCE OF THIS SOFTWARE.\r\n***************************************************************************** */\r\n/* global Reflect, Promise */\r\n\r\nvar extendStatics = function(d, b) {\r\n extendStatics = Object.setPrototypeOf ||\r\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\r\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\r\n return extendStatics(d, b);\r\n};\r\n\r\nexport function __extends(d, b) {\r\n if (typeof b !== \"function\" && b !== null)\r\n throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\r\n extendStatics(d, b);\r\n function __() { this.constructor = d; }\r\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\r\n}\r\n\r\nexport var __assign = function() {\r\n __assign = Object.assign || function __assign(t) {\r\n for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n s = arguments[i];\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\r\n }\r\n return t;\r\n }\r\n return __assign.apply(this, arguments);\r\n}\r\n\r\nexport function __rest(s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n t[p[i]] = s[p[i]];\r\n }\r\n return t;\r\n}\r\n\r\nexport function __decorate(decorators, target, key, desc) {\r\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\r\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\r\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\r\n return c > 3 && r && Object.defineProperty(target, key, r), r;\r\n}\r\n\r\nexport function __param(paramIndex, decorator) {\r\n return function (target, key) { decorator(target, key, paramIndex); }\r\n}\r\n\r\nexport function __metadata(metadataKey, metadataValue) {\r\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\r\n}\r\n\r\nexport function __awaiter(thisArg, _arguments, P, generator) {\r\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\r\n return new (P || (P = Promise))(function (resolve, reject) {\r\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\r\n step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n });\r\n}\r\n\r\nexport function __generator(thisArg, body) {\r\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;\r\n return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\r\n function verb(n) { return function (v) { return step([n, v]); }; }\r\n function step(op) {\r\n if (f) throw new TypeError(\"Generator is already executing.\");\r\n while (_) try {\r\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\r\n if (y = 0, t) op = [op[0] & 2, t.value];\r\n switch (op[0]) {\r\n case 0: case 1: t = op; break;\r\n case 4: _.label++; return { value: op[1], done: false };\r\n case 5: _.label++; y = op[1]; op = [0]; continue;\r\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\r\n default:\r\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\r\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\r\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\r\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\r\n if (t[2]) _.ops.pop();\r\n _.trys.pop(); continue;\r\n }\r\n op = body.call(thisArg, _);\r\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\r\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\r\n }\r\n}\r\n\r\nexport var __createBinding = Object.create ? (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });\r\n}) : (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n o[k2] = m[k];\r\n});\r\n\r\nexport function __exportStar(m, o) {\r\n for (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(o, p)) __createBinding(o, m, p);\r\n}\r\n\r\nexport function __values(o) {\r\n var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\r\n if (m) return m.call(o);\r\n if (o && typeof o.length === \"number\") return {\r\n next: function () {\r\n if (o && i >= o.length) o = void 0;\r\n return { value: o && o[i++], done: !o };\r\n }\r\n };\r\n throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\r\n}\r\n\r\nexport function __read(o, n) {\r\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\r\n if (!m) return o;\r\n var i = m.call(o), r, ar = [], e;\r\n try {\r\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\r\n }\r\n catch (error) { e = { error: error }; }\r\n finally {\r\n try {\r\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\r\n }\r\n finally { if (e) throw e.error; }\r\n }\r\n return ar;\r\n}\r\n\r\n/** @deprecated */\r\nexport function __spread() {\r\n for (var ar = [], i = 0; i < arguments.length; i++)\r\n ar = ar.concat(__read(arguments[i]));\r\n return ar;\r\n}\r\n\r\n/** @deprecated */\r\nexport function __spreadArrays() {\r\n for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\r\n for (var r = Array(s), k = 0, i = 0; i < il; i++)\r\n for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\r\n r[k] = a[j];\r\n return r;\r\n}\r\n\r\nexport function __spreadArray(to, from, pack) {\r\n if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {\r\n if (ar || !(i in from)) {\r\n if (!ar) ar = Array.prototype.slice.call(from, 0, i);\r\n ar[i] = from[i];\r\n }\r\n }\r\n return to.concat(ar || Array.prototype.slice.call(from));\r\n}\r\n\r\nexport function __await(v) {\r\n return this instanceof __await ? (this.v = v, this) : new __await(v);\r\n}\r\n\r\nexport function __asyncGenerator(thisArg, _arguments, generator) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var g = generator.apply(thisArg, _arguments || []), i, q = [];\r\n return i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i;\r\n function verb(n) { if (g[n]) i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; }\r\n function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\r\n function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\r\n function fulfill(value) { resume(\"next\", value); }\r\n function reject(value) { resume(\"throw\", value); }\r\n function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\r\n}\r\n\r\nexport function __asyncDelegator(o) {\r\n var i, p;\r\n return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\r\n function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: n === \"return\" } : f ? f(v) : v; } : f; }\r\n}\r\n\r\nexport function __asyncValues(o) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var m = o[Symbol.asyncIterator], i;\r\n return m ? m.call(o) : (o = typeof __values === \"function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i);\r\n function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\r\n function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\r\n}\r\n\r\nexport function __makeTemplateObject(cooked, raw) {\r\n if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\r\n return cooked;\r\n};\r\n\r\nvar __setModuleDefault = Object.create ? (function(o, v) {\r\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\r\n}) : function(o, v) {\r\n o[\"default\"] = v;\r\n};\r\n\r\nexport function __importStar(mod) {\r\n if (mod && mod.__esModule) return mod;\r\n var result = {};\r\n if (mod != null) for (var k in mod) if (k !== \"default\" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);\r\n __setModuleDefault(result, mod);\r\n return result;\r\n}\r\n\r\nexport function __importDefault(mod) {\r\n return (mod && mod.__esModule) ? mod : { default: mod };\r\n}\r\n\r\nexport function __classPrivateFieldGet(receiver, state, kind, f) {\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a getter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot read private member from an object whose class did not declare it\");\r\n return kind === \"m\" ? f : kind === \"a\" ? f.call(receiver) : f ? f.value : state.get(receiver);\r\n}\r\n\r\nexport function __classPrivateFieldSet(receiver, state, value, kind, f) {\r\n if (kind === \"m\") throw new TypeError(\"Private method is not writable\");\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a setter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot write private member to an object whose class did not declare it\");\r\n return (kind === \"a\" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;\r\n}\r\n", "/**\n * Returns true if the object is a function.\n * @param value The value to check\n */\nexport function isFunction(value: any): value is (...args: any[]) => any {\n return typeof value === 'function';\n}\n", "/**\n * Used to create Error subclasses until the community moves away from ES5.\n *\n * This is because compiling from TypeScript down to ES5 has issues with subclassing Errors\n * as well as other built-in types: https://github.com/Microsoft/TypeScript/issues/12123\n *\n * @param createImpl A factory function to create the actual constructor implementation. The returned\n * function should be a named function that calls `_super` internally.\n */\nexport function createErrorClass(createImpl: (_super: any) => any): T {\n const _super = (instance: any) => {\n Error.call(instance);\n instance.stack = new Error().stack;\n };\n\n const ctorFunc = createImpl(_super);\n ctorFunc.prototype = Object.create(Error.prototype);\n ctorFunc.prototype.constructor = ctorFunc;\n return ctorFunc;\n}\n", "import { createErrorClass } from './createErrorClass';\n\nexport interface UnsubscriptionError extends Error {\n readonly errors: any[];\n}\n\nexport interface UnsubscriptionErrorCtor {\n /**\n * @deprecated Internal implementation detail. Do not construct error instances.\n * Cannot be tagged as internal: https://github.com/ReactiveX/rxjs/issues/6269\n */\n new (errors: any[]): UnsubscriptionError;\n}\n\n/**\n * An error thrown when one or more errors have occurred during the\n * `unsubscribe` of a {@link Subscription}.\n */\nexport const UnsubscriptionError: UnsubscriptionErrorCtor = createErrorClass(\n (_super) =>\n function UnsubscriptionErrorImpl(this: any, errors: (Error | string)[]) {\n _super(this);\n this.message = errors\n ? `${errors.length} errors occurred during unsubscription:\n${errors.map((err, i) => `${i + 1}) ${err.toString()}`).join('\\n ')}`\n : '';\n this.name = 'UnsubscriptionError';\n this.errors = errors;\n }\n);\n", "/**\n * Removes an item from an array, mutating it.\n * @param arr The array to remove the item from\n * @param item The item to remove\n */\nexport function arrRemove(arr: T[] | undefined | null, item: T) {\n if (arr) {\n const index = arr.indexOf(item);\n 0 <= index && arr.splice(index, 1);\n }\n}\n", "import { isFunction } from './util/isFunction';\nimport { UnsubscriptionError } from './util/UnsubscriptionError';\nimport { SubscriptionLike, TeardownLogic, Unsubscribable } from './types';\nimport { arrRemove } from './util/arrRemove';\n\n/**\n * Represents a disposable resource, such as the execution of an Observable. A\n * Subscription has one important method, `unsubscribe`, that takes no argument\n * and just disposes the resource held by the subscription.\n *\n * Additionally, subscriptions may be grouped together through the `add()`\n * method, which will attach a child Subscription to the current Subscription.\n * When a Subscription is unsubscribed, all its children (and its grandchildren)\n * will be unsubscribed as well.\n *\n * @class Subscription\n */\nexport class Subscription implements SubscriptionLike {\n /** @nocollapse */\n public static EMPTY = (() => {\n const empty = new Subscription();\n empty.closed = true;\n return empty;\n })();\n\n /**\n * A flag to indicate whether this Subscription has already been unsubscribed.\n */\n public closed = false;\n\n private _parentage: Subscription[] | Subscription | null = null;\n\n /**\n * The list of registered finalizers to execute upon unsubscription. Adding and removing from this\n * list occurs in the {@link #add} and {@link #remove} methods.\n */\n private _finalizers: Exclude[] | null = null;\n\n /**\n * @param initialTeardown A function executed first as part of the finalization\n * process that is kicked off when {@link #unsubscribe} is called.\n */\n constructor(private initialTeardown?: () => void) {}\n\n /**\n * Disposes the resources held by the subscription. May, for instance, cancel\n * an ongoing Observable execution or cancel any other type of work that\n * started when the Subscription was created.\n * @return {void}\n */\n unsubscribe(): void {\n let errors: any[] | undefined;\n\n if (!this.closed) {\n this.closed = true;\n\n // Remove this from it's parents.\n const { _parentage } = this;\n if (_parentage) {\n this._parentage = null;\n if (Array.isArray(_parentage)) {\n for (const parent of _parentage) {\n parent.remove(this);\n }\n } else {\n _parentage.remove(this);\n }\n }\n\n const { initialTeardown: initialFinalizer } = this;\n if (isFunction(initialFinalizer)) {\n try {\n initialFinalizer();\n } catch (e) {\n errors = e instanceof UnsubscriptionError ? e.errors : [e];\n }\n }\n\n const { _finalizers } = this;\n if (_finalizers) {\n this._finalizers = null;\n for (const finalizer of _finalizers) {\n try {\n execFinalizer(finalizer);\n } catch (err) {\n errors = errors ?? [];\n if (err instanceof UnsubscriptionError) {\n errors = [...errors, ...err.errors];\n } else {\n errors.push(err);\n }\n }\n }\n }\n\n if (errors) {\n throw new UnsubscriptionError(errors);\n }\n }\n }\n\n /**\n * Adds a finalizer to this subscription, so that finalization will be unsubscribed/called\n * when this subscription is unsubscribed. If this subscription is already {@link #closed},\n * because it has already been unsubscribed, then whatever finalizer is passed to it\n * will automatically be executed (unless the finalizer itself is also a closed subscription).\n *\n * Closed Subscriptions cannot be added as finalizers to any subscription. Adding a closed\n * subscription to a any subscription will result in no operation. (A noop).\n *\n * Adding a subscription to itself, or adding `null` or `undefined` will not perform any\n * operation at all. (A noop).\n *\n * `Subscription` instances that are added to this instance will automatically remove themselves\n * if they are unsubscribed. Functions and {@link Unsubscribable} objects that you wish to remove\n * will need to be removed manually with {@link #remove}\n *\n * @param teardown The finalization logic to add to this subscription.\n */\n add(teardown: TeardownLogic): void {\n // Only add the finalizer if it's not undefined\n // and don't add a subscription to itself.\n if (teardown && teardown !== this) {\n if (this.closed) {\n // If this subscription is already closed,\n // execute whatever finalizer is handed to it automatically.\n execFinalizer(teardown);\n } else {\n if (teardown instanceof Subscription) {\n // We don't add closed subscriptions, and we don't add the same subscription\n // twice. Subscription unsubscribe is idempotent.\n if (teardown.closed || teardown._hasParent(this)) {\n return;\n }\n teardown._addParent(this);\n }\n (this._finalizers = this._finalizers ?? []).push(teardown);\n }\n }\n }\n\n /**\n * Checks to see if a this subscription already has a particular parent.\n * This will signal that this subscription has already been added to the parent in question.\n * @param parent the parent to check for\n */\n private _hasParent(parent: Subscription) {\n const { _parentage } = this;\n return _parentage === parent || (Array.isArray(_parentage) && _parentage.includes(parent));\n }\n\n /**\n * Adds a parent to this subscription so it can be removed from the parent if it\n * unsubscribes on it's own.\n *\n * NOTE: THIS ASSUMES THAT {@link _hasParent} HAS ALREADY BEEN CHECKED.\n * @param parent The parent subscription to add\n */\n private _addParent(parent: Subscription) {\n const { _parentage } = this;\n this._parentage = Array.isArray(_parentage) ? (_parentage.push(parent), _parentage) : _parentage ? [_parentage, parent] : parent;\n }\n\n /**\n * Called on a child when it is removed via {@link #remove}.\n * @param parent The parent to remove\n */\n private _removeParent(parent: Subscription) {\n const { _parentage } = this;\n if (_parentage === parent) {\n this._parentage = null;\n } else if (Array.isArray(_parentage)) {\n arrRemove(_parentage, parent);\n }\n }\n\n /**\n * Removes a finalizer from this subscription that was previously added with the {@link #add} method.\n *\n * Note that `Subscription` instances, when unsubscribed, will automatically remove themselves\n * from every other `Subscription` they have been added to. This means that using the `remove` method\n * is not a common thing and should be used thoughtfully.\n *\n * If you add the same finalizer instance of a function or an unsubscribable object to a `Subscription` instance\n * more than once, you will need to call `remove` the same number of times to remove all instances.\n *\n * All finalizer instances are removed to free up memory upon unsubscription.\n *\n * @param teardown The finalizer to remove from this subscription\n */\n remove(teardown: Exclude): void {\n const { _finalizers } = this;\n _finalizers && arrRemove(_finalizers, teardown);\n\n if (teardown instanceof Subscription) {\n teardown._removeParent(this);\n }\n }\n}\n\nexport const EMPTY_SUBSCRIPTION = Subscription.EMPTY;\n\nexport function isSubscription(value: any): value is Subscription {\n return (\n value instanceof Subscription ||\n (value && 'closed' in value && isFunction(value.remove) && isFunction(value.add) && isFunction(value.unsubscribe))\n );\n}\n\nfunction execFinalizer(finalizer: Unsubscribable | (() => void)) {\n if (isFunction(finalizer)) {\n finalizer();\n } else {\n finalizer.unsubscribe();\n }\n}\n", "import { Subscriber } from './Subscriber';\nimport { ObservableNotification } from './types';\n\n/**\n * The {@link GlobalConfig} object for RxJS. It is used to configure things\n * like how to react on unhandled errors.\n */\nexport const config: GlobalConfig = {\n onUnhandledError: null,\n onStoppedNotification: null,\n Promise: undefined,\n useDeprecatedSynchronousErrorHandling: false,\n useDeprecatedNextContext: false,\n};\n\n/**\n * The global configuration object for RxJS, used to configure things\n * like how to react on unhandled errors. Accessible via {@link config}\n * object.\n */\nexport interface GlobalConfig {\n /**\n * A registration point for unhandled errors from RxJS. These are errors that\n * cannot were not handled by consuming code in the usual subscription path. For\n * example, if you have this configured, and you subscribe to an observable without\n * providing an error handler, errors from that subscription will end up here. This\n * will _always_ be called asynchronously on another job in the runtime. This is because\n * we do not want errors thrown in this user-configured handler to interfere with the\n * behavior of the library.\n */\n onUnhandledError: ((err: any) => void) | null;\n\n /**\n * A registration point for notifications that cannot be sent to subscribers because they\n * have completed, errored or have been explicitly unsubscribed. By default, next, complete\n * and error notifications sent to stopped subscribers are noops. However, sometimes callers\n * might want a different behavior. For example, with sources that attempt to report errors\n * to stopped subscribers, a caller can configure RxJS to throw an unhandled error instead.\n * This will _always_ be called asynchronously on another job in the runtime. This is because\n * we do not want errors thrown in this user-configured handler to interfere with the\n * behavior of the library.\n */\n onStoppedNotification: ((notification: ObservableNotification, subscriber: Subscriber) => void) | null;\n\n /**\n * The promise constructor used by default for {@link Observable#toPromise toPromise} and {@link Observable#forEach forEach}\n * methods.\n *\n * @deprecated As of version 8, RxJS will no longer support this sort of injection of a\n * Promise constructor. If you need a Promise implementation other than native promises,\n * please polyfill/patch Promise as you see appropriate. Will be removed in v8.\n */\n Promise?: PromiseConstructorLike;\n\n /**\n * If true, turns on synchronous error rethrowing, which is a deprecated behavior\n * in v6 and higher. This behavior enables bad patterns like wrapping a subscribe\n * call in a try/catch block. It also enables producer interference, a nasty bug\n * where a multicast can be broken for all observers by a downstream consumer with\n * an unhandled error. DO NOT USE THIS FLAG UNLESS IT'S NEEDED TO BUY TIME\n * FOR MIGRATION REASONS.\n *\n * @deprecated As of version 8, RxJS will no longer support synchronous throwing\n * of unhandled errors. All errors will be thrown on a separate call stack to prevent bad\n * behaviors described above. Will be removed in v8.\n */\n useDeprecatedSynchronousErrorHandling: boolean;\n\n /**\n * If true, enables an as-of-yet undocumented feature from v5: The ability to access\n * `unsubscribe()` via `this` context in `next` functions created in observers passed\n * to `subscribe`.\n *\n * This is being removed because the performance was severely problematic, and it could also cause\n * issues when types other than POJOs are passed to subscribe as subscribers, as they will likely have\n * their `this` context overwritten.\n *\n * @deprecated As of version 8, RxJS will no longer support altering the\n * context of next functions provided as part of an observer to Subscribe. Instead,\n * you will have access to a subscription or a signal or token that will allow you to do things like\n * unsubscribe and test closed status. Will be removed in v8.\n */\n useDeprecatedNextContext: boolean;\n}\n", "import type { TimerHandle } from './timerHandle';\ntype SetTimeoutFunction = (handler: () => void, timeout?: number, ...args: any[]) => TimerHandle;\ntype ClearTimeoutFunction = (handle: TimerHandle) => void;\n\ninterface TimeoutProvider {\n setTimeout: SetTimeoutFunction;\n clearTimeout: ClearTimeoutFunction;\n delegate:\n | {\n setTimeout: SetTimeoutFunction;\n clearTimeout: ClearTimeoutFunction;\n }\n | undefined;\n}\n\nexport const timeoutProvider: TimeoutProvider = {\n // When accessing the delegate, use the variable rather than `this` so that\n // the functions can be called without being bound to the provider.\n setTimeout(handler: () => void, timeout?: number, ...args) {\n const { delegate } = timeoutProvider;\n if (delegate?.setTimeout) {\n return delegate.setTimeout(handler, timeout, ...args);\n }\n return setTimeout(handler, timeout, ...args);\n },\n clearTimeout(handle) {\n const { delegate } = timeoutProvider;\n return (delegate?.clearTimeout || clearTimeout)(handle as any);\n },\n delegate: undefined,\n};\n", "import { config } from '../config';\nimport { timeoutProvider } from '../scheduler/timeoutProvider';\n\n/**\n * Handles an error on another job either with the user-configured {@link onUnhandledError},\n * or by throwing it on that new job so it can be picked up by `window.onerror`, `process.on('error')`, etc.\n *\n * This should be called whenever there is an error that is out-of-band with the subscription\n * or when an error hits a terminal boundary of the subscription and no error handler was provided.\n *\n * @param err the error to report\n */\nexport function reportUnhandledError(err: any) {\n timeoutProvider.setTimeout(() => {\n const { onUnhandledError } = config;\n if (onUnhandledError) {\n // Execute the user-configured error handler.\n onUnhandledError(err);\n } else {\n // Throw so it is picked up by the runtime's uncaught error mechanism.\n throw err;\n }\n });\n}\n", "/* tslint:disable:no-empty */\nexport function noop() { }\n", "import { CompleteNotification, NextNotification, ErrorNotification } from './types';\n\n/**\n * A completion object optimized for memory use and created to be the\n * same \"shape\" as other notifications in v8.\n * @internal\n */\nexport const COMPLETE_NOTIFICATION = (() => createNotification('C', undefined, undefined) as CompleteNotification)();\n\n/**\n * Internal use only. Creates an optimized error notification that is the same \"shape\"\n * as other notifications.\n * @internal\n */\nexport function errorNotification(error: any): ErrorNotification {\n return createNotification('E', undefined, error) as any;\n}\n\n/**\n * Internal use only. Creates an optimized next notification that is the same \"shape\"\n * as other notifications.\n * @internal\n */\nexport function nextNotification(value: T) {\n return createNotification('N', value, undefined) as NextNotification;\n}\n\n/**\n * Ensures that all notifications created internally have the same \"shape\" in v8.\n *\n * TODO: This is only exported to support a crazy legacy test in `groupBy`.\n * @internal\n */\nexport function createNotification(kind: 'N' | 'E' | 'C', value: any, error: any) {\n return {\n kind,\n value,\n error,\n };\n}\n", "import { config } from '../config';\n\nlet context: { errorThrown: boolean; error: any } | null = null;\n\n/**\n * Handles dealing with errors for super-gross mode. Creates a context, in which\n * any synchronously thrown errors will be passed to {@link captureError}. Which\n * will record the error such that it will be rethrown after the call back is complete.\n * TODO: Remove in v8\n * @param cb An immediately executed function.\n */\nexport function errorContext(cb: () => void) {\n if (config.useDeprecatedSynchronousErrorHandling) {\n const isRoot = !context;\n if (isRoot) {\n context = { errorThrown: false, error: null };\n }\n cb();\n if (isRoot) {\n const { errorThrown, error } = context!;\n context = null;\n if (errorThrown) {\n throw error;\n }\n }\n } else {\n // This is the general non-deprecated path for everyone that\n // isn't crazy enough to use super-gross mode (useDeprecatedSynchronousErrorHandling)\n cb();\n }\n}\n\n/**\n * Captures errors only in super-gross mode.\n * @param err the error to capture\n */\nexport function captureError(err: any) {\n if (config.useDeprecatedSynchronousErrorHandling && context) {\n context.errorThrown = true;\n context.error = err;\n }\n}\n", "import { isFunction } from './util/isFunction';\nimport { Observer, ObservableNotification } from './types';\nimport { isSubscription, Subscription } from './Subscription';\nimport { config } from './config';\nimport { reportUnhandledError } from './util/reportUnhandledError';\nimport { noop } from './util/noop';\nimport { nextNotification, errorNotification, COMPLETE_NOTIFICATION } from './NotificationFactories';\nimport { timeoutProvider } from './scheduler/timeoutProvider';\nimport { captureError } from './util/errorContext';\n\n/**\n * Implements the {@link Observer} interface and extends the\n * {@link Subscription} class. While the {@link Observer} is the public API for\n * consuming the values of an {@link Observable}, all Observers get converted to\n * a Subscriber, in order to provide Subscription-like capabilities such as\n * `unsubscribe`. Subscriber is a common type in RxJS, and crucial for\n * implementing operators, but it is rarely used as a public API.\n *\n * @class Subscriber\n */\nexport class Subscriber extends Subscription implements Observer {\n /**\n * A static factory for a Subscriber, given a (potentially partial) definition\n * of an Observer.\n * @param next The `next` callback of an Observer.\n * @param error The `error` callback of an\n * Observer.\n * @param complete The `complete` callback of an\n * Observer.\n * @return A Subscriber wrapping the (partially defined)\n * Observer represented by the given arguments.\n * @nocollapse\n * @deprecated Do not use. Will be removed in v8. There is no replacement for this\n * method, and there is no reason to be creating instances of `Subscriber` directly.\n * If you have a specific use case, please file an issue.\n */\n static create(next?: (x?: T) => void, error?: (e?: any) => void, complete?: () => void): Subscriber {\n return new SafeSubscriber(next, error, complete);\n }\n\n /** @deprecated Internal implementation detail, do not use directly. Will be made internal in v8. */\n protected isStopped: boolean = false;\n /** @deprecated Internal implementation detail, do not use directly. Will be made internal in v8. */\n protected destination: Subscriber | Observer; // this `any` is the escape hatch to erase extra type param (e.g. R)\n\n /**\n * @deprecated Internal implementation detail, do not use directly. Will be made internal in v8.\n * There is no reason to directly create an instance of Subscriber. This type is exported for typings reasons.\n */\n constructor(destination?: Subscriber | Observer) {\n super();\n if (destination) {\n this.destination = destination;\n // Automatically chain subscriptions together here.\n // if destination is a Subscription, then it is a Subscriber.\n if (isSubscription(destination)) {\n destination.add(this);\n }\n } else {\n this.destination = EMPTY_OBSERVER;\n }\n }\n\n /**\n * The {@link Observer} callback to receive notifications of type `next` from\n * the Observable, with a value. The Observable may call this method 0 or more\n * times.\n * @param {T} [value] The `next` value.\n * @return {void}\n */\n next(value?: T): void {\n if (this.isStopped) {\n handleStoppedNotification(nextNotification(value), this);\n } else {\n this._next(value!);\n }\n }\n\n /**\n * The {@link Observer} callback to receive notifications of type `error` from\n * the Observable, with an attached `Error`. Notifies the Observer that\n * the Observable has experienced an error condition.\n * @param {any} [err] The `error` exception.\n * @return {void}\n */\n error(err?: any): void {\n if (this.isStopped) {\n handleStoppedNotification(errorNotification(err), this);\n } else {\n this.isStopped = true;\n this._error(err);\n }\n }\n\n /**\n * The {@link Observer} callback to receive a valueless notification of type\n * `complete` from the Observable. Notifies the Observer that the Observable\n * has finished sending push-based notifications.\n * @return {void}\n */\n complete(): void {\n if (this.isStopped) {\n handleStoppedNotification(COMPLETE_NOTIFICATION, this);\n } else {\n this.isStopped = true;\n this._complete();\n }\n }\n\n unsubscribe(): void {\n if (!this.closed) {\n this.isStopped = true;\n super.unsubscribe();\n this.destination = null!;\n }\n }\n\n protected _next(value: T): void {\n this.destination.next(value);\n }\n\n protected _error(err: any): void {\n try {\n this.destination.error(err);\n } finally {\n this.unsubscribe();\n }\n }\n\n protected _complete(): void {\n try {\n this.destination.complete();\n } finally {\n this.unsubscribe();\n }\n }\n}\n\n/**\n * This bind is captured here because we want to be able to have\n * compatibility with monoid libraries that tend to use a method named\n * `bind`. In particular, a library called Monio requires this.\n */\nconst _bind = Function.prototype.bind;\n\nfunction bind any>(fn: Fn, thisArg: any): Fn {\n return _bind.call(fn, thisArg);\n}\n\n/**\n * Internal optimization only, DO NOT EXPOSE.\n * @internal\n */\nclass ConsumerObserver implements Observer {\n constructor(private partialObserver: Partial>) {}\n\n next(value: T): void {\n const { partialObserver } = this;\n if (partialObserver.next) {\n try {\n partialObserver.next(value);\n } catch (error) {\n handleUnhandledError(error);\n }\n }\n }\n\n error(err: any): void {\n const { partialObserver } = this;\n if (partialObserver.error) {\n try {\n partialObserver.error(err);\n } catch (error) {\n handleUnhandledError(error);\n }\n } else {\n handleUnhandledError(err);\n }\n }\n\n complete(): void {\n const { partialObserver } = this;\n if (partialObserver.complete) {\n try {\n partialObserver.complete();\n } catch (error) {\n handleUnhandledError(error);\n }\n }\n }\n}\n\nexport class SafeSubscriber extends Subscriber {\n constructor(\n observerOrNext?: Partial> | ((value: T) => void) | null,\n error?: ((e?: any) => void) | null,\n complete?: (() => void) | null\n ) {\n super();\n\n let partialObserver: Partial>;\n if (isFunction(observerOrNext) || !observerOrNext) {\n // The first argument is a function, not an observer. The next\n // two arguments *could* be observers, or they could be empty.\n partialObserver = {\n next: (observerOrNext ?? undefined) as (((value: T) => void) | undefined),\n error: error ?? undefined,\n complete: complete ?? undefined,\n };\n } else {\n // The first argument is a partial observer.\n let context: any;\n if (this && config.useDeprecatedNextContext) {\n // This is a deprecated path that made `this.unsubscribe()` available in\n // next handler functions passed to subscribe. This only exists behind a flag\n // now, as it is *very* slow.\n context = Object.create(observerOrNext);\n context.unsubscribe = () => this.unsubscribe();\n partialObserver = {\n next: observerOrNext.next && bind(observerOrNext.next, context),\n error: observerOrNext.error && bind(observerOrNext.error, context),\n complete: observerOrNext.complete && bind(observerOrNext.complete, context),\n };\n } else {\n // The \"normal\" path. Just use the partial observer directly.\n partialObserver = observerOrNext;\n }\n }\n\n // Wrap the partial observer to ensure it's a full observer, and\n // make sure proper error handling is accounted for.\n this.destination = new ConsumerObserver(partialObserver);\n }\n}\n\nfunction handleUnhandledError(error: any) {\n if (config.useDeprecatedSynchronousErrorHandling) {\n captureError(error);\n } else {\n // Ideal path, we report this as an unhandled error,\n // which is thrown on a new call stack.\n reportUnhandledError(error);\n }\n}\n\n/**\n * An error handler used when no error handler was supplied\n * to the SafeSubscriber -- meaning no error handler was supplied\n * do the `subscribe` call on our observable.\n * @param err The error to handle\n */\nfunction defaultErrorHandler(err: any) {\n throw err;\n}\n\n/**\n * A handler for notifications that cannot be sent to a stopped subscriber.\n * @param notification The notification being sent\n * @param subscriber The stopped subscriber\n */\nfunction handleStoppedNotification(notification: ObservableNotification, subscriber: Subscriber) {\n const { onStoppedNotification } = config;\n onStoppedNotification && timeoutProvider.setTimeout(() => onStoppedNotification(notification, subscriber));\n}\n\n/**\n * The observer used as a stub for subscriptions where the user did not\n * pass any arguments to `subscribe`. Comes with the default error handling\n * behavior.\n */\nexport const EMPTY_OBSERVER: Readonly> & { closed: true } = {\n closed: true,\n next: noop,\n error: defaultErrorHandler,\n complete: noop,\n};\n", "/**\n * Symbol.observable or a string \"@@observable\". Used for interop\n *\n * @deprecated We will no longer be exporting this symbol in upcoming versions of RxJS.\n * Instead polyfill and use Symbol.observable directly *or* use https://www.npmjs.com/package/symbol-observable\n */\nexport const observable: string | symbol = (() => (typeof Symbol === 'function' && Symbol.observable) || '@@observable')();\n", "/**\n * This function takes one parameter and just returns it. Simply put,\n * this is like `(x: T): T => x`.\n *\n * ## Examples\n *\n * This is useful in some cases when using things like `mergeMap`\n *\n * ```ts\n * import { interval, take, map, range, mergeMap, identity } from 'rxjs';\n *\n * const source$ = interval(1000).pipe(take(5));\n *\n * const result$ = source$.pipe(\n * map(i => range(i)),\n * mergeMap(identity) // same as mergeMap(x => x)\n * );\n *\n * result$.subscribe({\n * next: console.log\n * });\n * ```\n *\n * Or when you want to selectively apply an operator\n *\n * ```ts\n * import { interval, take, identity } from 'rxjs';\n *\n * const shouldLimit = () => Math.random() < 0.5;\n *\n * const source$ = interval(1000);\n *\n * const result$ = source$.pipe(shouldLimit() ? take(5) : identity);\n *\n * result$.subscribe({\n * next: console.log\n * });\n * ```\n *\n * @param x Any value that is returned by this function\n * @returns The value passed as the first parameter to this function\n */\nexport function identity(x: T): T {\n return x;\n}\n", "import { identity } from './identity';\nimport { UnaryFunction } from '../types';\n\nexport function pipe(): typeof identity;\nexport function pipe(fn1: UnaryFunction): UnaryFunction;\nexport function pipe(fn1: UnaryFunction, fn2: UnaryFunction): UnaryFunction;\nexport function pipe(fn1: UnaryFunction, fn2: UnaryFunction, fn3: UnaryFunction): UnaryFunction;\nexport function pipe(\n fn1: UnaryFunction,\n fn2: UnaryFunction,\n fn3: UnaryFunction,\n fn4: UnaryFunction\n): UnaryFunction;\nexport function pipe(\n fn1: UnaryFunction,\n fn2: UnaryFunction,\n fn3: UnaryFunction,\n fn4: UnaryFunction,\n fn5: UnaryFunction\n): UnaryFunction;\nexport function pipe(\n fn1: UnaryFunction,\n fn2: UnaryFunction,\n fn3: UnaryFunction,\n fn4: UnaryFunction,\n fn5: UnaryFunction,\n fn6: UnaryFunction\n): UnaryFunction;\nexport function pipe(\n fn1: UnaryFunction,\n fn2: UnaryFunction,\n fn3: UnaryFunction,\n fn4: UnaryFunction,\n fn5: UnaryFunction,\n fn6: UnaryFunction,\n fn7: UnaryFunction\n): UnaryFunction;\nexport function pipe(\n fn1: UnaryFunction,\n fn2: UnaryFunction,\n fn3: UnaryFunction,\n fn4: UnaryFunction,\n fn5: UnaryFunction,\n fn6: UnaryFunction,\n fn7: UnaryFunction,\n fn8: UnaryFunction\n): UnaryFunction;\nexport function pipe(\n fn1: UnaryFunction,\n fn2: UnaryFunction,\n fn3: UnaryFunction,\n fn4: UnaryFunction,\n fn5: UnaryFunction,\n fn6: UnaryFunction,\n fn7: UnaryFunction,\n fn8: UnaryFunction,\n fn9: UnaryFunction\n): UnaryFunction;\nexport function pipe(\n fn1: UnaryFunction,\n fn2: UnaryFunction,\n fn3: UnaryFunction,\n fn4: UnaryFunction,\n fn5: UnaryFunction,\n fn6: UnaryFunction,\n fn7: UnaryFunction,\n fn8: UnaryFunction,\n fn9: UnaryFunction,\n ...fns: UnaryFunction[]\n): UnaryFunction;\n\n/**\n * pipe() can be called on one or more functions, each of which can take one argument (\"UnaryFunction\")\n * and uses it to return a value.\n * It returns a function that takes one argument, passes it to the first UnaryFunction, and then\n * passes the result to the next one, passes that result to the next one, and so on. \n */\nexport function pipe(...fns: Array>): UnaryFunction {\n return pipeFromArray(fns);\n}\n\n/** @internal */\nexport function pipeFromArray(fns: Array>): UnaryFunction {\n if (fns.length === 0) {\n return identity as UnaryFunction;\n }\n\n if (fns.length === 1) {\n return fns[0];\n }\n\n return function piped(input: T): R {\n return fns.reduce((prev: any, fn: UnaryFunction) => fn(prev), input as any);\n };\n}\n", "import { Operator } from './Operator';\nimport { SafeSubscriber, Subscriber } from './Subscriber';\nimport { isSubscription, Subscription } from './Subscription';\nimport { TeardownLogic, OperatorFunction, Subscribable, Observer } from './types';\nimport { observable as Symbol_observable } from './symbol/observable';\nimport { pipeFromArray } from './util/pipe';\nimport { config } from './config';\nimport { isFunction } from './util/isFunction';\nimport { errorContext } from './util/errorContext';\n\n/**\n * A representation of any set of values over any amount of time. This is the most basic building block\n * of RxJS.\n *\n * @class Observable\n */\nexport class Observable implements Subscribable {\n /**\n * @deprecated Internal implementation detail, do not use directly. Will be made internal in v8.\n */\n source: Observable | undefined;\n\n /**\n * @deprecated Internal implementation detail, do not use directly. Will be made internal in v8.\n */\n operator: Operator | undefined;\n\n /**\n * @constructor\n * @param {Function} subscribe the function that is called when the Observable is\n * initially subscribed to. This function is given a Subscriber, to which new values\n * can be `next`ed, or an `error` method can be called to raise an error, or\n * `complete` can be called to notify of a successful completion.\n */\n constructor(subscribe?: (this: Observable, subscriber: Subscriber) => TeardownLogic) {\n if (subscribe) {\n this._subscribe = subscribe;\n }\n }\n\n // HACK: Since TypeScript inherits static properties too, we have to\n // fight against TypeScript here so Subject can have a different static create signature\n /**\n * Creates a new Observable by calling the Observable constructor\n * @owner Observable\n * @method create\n * @param {Function} subscribe? the subscriber function to be passed to the Observable constructor\n * @return {Observable} a new observable\n * @nocollapse\n * @deprecated Use `new Observable()` instead. Will be removed in v8.\n */\n static create: (...args: any[]) => any = (subscribe?: (subscriber: Subscriber) => TeardownLogic) => {\n return new Observable(subscribe);\n };\n\n /**\n * Creates a new Observable, with this Observable instance as the source, and the passed\n * operator defined as the new observable's operator.\n * @method lift\n * @param operator the operator defining the operation to take on the observable\n * @return a new observable with the Operator applied\n * @deprecated Internal implementation detail, do not use directly. Will be made internal in v8.\n * If you have implemented an operator using `lift`, it is recommended that you create an\n * operator by simply returning `new Observable()` directly. See \"Creating new operators from\n * scratch\" section here: https://rxjs.dev/guide/operators\n */\n lift(operator?: Operator): Observable {\n const observable = new Observable();\n observable.source = this;\n observable.operator = operator;\n return observable;\n }\n\n subscribe(observerOrNext?: Partial> | ((value: T) => void)): Subscription;\n /** @deprecated Instead of passing separate callback arguments, use an observer argument. Signatures taking separate callback arguments will be removed in v8. Details: https://rxjs.dev/deprecations/subscribe-arguments */\n subscribe(next?: ((value: T) => void) | null, error?: ((error: any) => void) | null, complete?: (() => void) | null): Subscription;\n /**\n * Invokes an execution of an Observable and registers Observer handlers for notifications it will emit.\n *\n * Use it when you have all these Observables, but still nothing is happening.\n *\n * `subscribe` is not a regular operator, but a method that calls Observable's internal `subscribe` function. It\n * might be for example a function that you passed to Observable's constructor, but most of the time it is\n * a library implementation, which defines what will be emitted by an Observable, and when it be will emitted. This means\n * that calling `subscribe` is actually the moment when Observable starts its work, not when it is created, as it is often\n * the thought.\n *\n * Apart from starting the execution of an Observable, this method allows you to listen for values\n * that an Observable emits, as well as for when it completes or errors. You can achieve this in two\n * of the following ways.\n *\n * The first way is creating an object that implements {@link Observer} interface. It should have methods\n * defined by that interface, but note that it should be just a regular JavaScript object, which you can create\n * yourself in any way you want (ES6 class, classic function constructor, object literal etc.). In particular, do\n * not attempt to use any RxJS implementation details to create Observers - you don't need them. Remember also\n * that your object does not have to implement all methods. If you find yourself creating a method that doesn't\n * do anything, you can simply omit it. Note however, if the `error` method is not provided and an error happens,\n * it will be thrown asynchronously. Errors thrown asynchronously cannot be caught using `try`/`catch`. Instead,\n * use the {@link onUnhandledError} configuration option or use a runtime handler (like `window.onerror` or\n * `process.on('error)`) to be notified of unhandled errors. Because of this, it's recommended that you provide\n * an `error` method to avoid missing thrown errors.\n *\n * The second way is to give up on Observer object altogether and simply provide callback functions in place of its methods.\n * This means you can provide three functions as arguments to `subscribe`, where the first function is equivalent\n * of a `next` method, the second of an `error` method and the third of a `complete` method. Just as in case of an Observer,\n * if you do not need to listen for something, you can omit a function by passing `undefined` or `null`,\n * since `subscribe` recognizes these functions by where they were placed in function call. When it comes\n * to the `error` function, as with an Observer, if not provided, errors emitted by an Observable will be thrown asynchronously.\n *\n * You can, however, subscribe with no parameters at all. This may be the case where you're not interested in terminal events\n * and you also handled emissions internally by using operators (e.g. using `tap`).\n *\n * Whichever style of calling `subscribe` you use, in both cases it returns a Subscription object.\n * This object allows you to call `unsubscribe` on it, which in turn will stop the work that an Observable does and will clean\n * up all resources that an Observable used. Note that cancelling a subscription will not call `complete` callback\n * provided to `subscribe` function, which is reserved for a regular completion signal that comes from an Observable.\n *\n * Remember that callbacks provided to `subscribe` are not guaranteed to be called asynchronously.\n * It is an Observable itself that decides when these functions will be called. For example {@link of}\n * by default emits all its values synchronously. Always check documentation for how given Observable\n * will behave when subscribed and if its default behavior can be modified with a `scheduler`.\n *\n * #### Examples\n *\n * Subscribe with an {@link guide/observer Observer}\n *\n * ```ts\n * import { of } from 'rxjs';\n *\n * const sumObserver = {\n * sum: 0,\n * next(value) {\n * console.log('Adding: ' + value);\n * this.sum = this.sum + value;\n * },\n * error() {\n * // We actually could just remove this method,\n * // since we do not really care about errors right now.\n * },\n * complete() {\n * console.log('Sum equals: ' + this.sum);\n * }\n * };\n *\n * of(1, 2, 3) // Synchronously emits 1, 2, 3 and then completes.\n * .subscribe(sumObserver);\n *\n * // Logs:\n * // 'Adding: 1'\n * // 'Adding: 2'\n * // 'Adding: 3'\n * // 'Sum equals: 6'\n * ```\n *\n * Subscribe with functions ({@link deprecations/subscribe-arguments deprecated})\n *\n * ```ts\n * import { of } from 'rxjs'\n *\n * let sum = 0;\n *\n * of(1, 2, 3).subscribe(\n * value => {\n * console.log('Adding: ' + value);\n * sum = sum + value;\n * },\n * undefined,\n * () => console.log('Sum equals: ' + sum)\n * );\n *\n * // Logs:\n * // 'Adding: 1'\n * // 'Adding: 2'\n * // 'Adding: 3'\n * // 'Sum equals: 6'\n * ```\n *\n * Cancel a subscription\n *\n * ```ts\n * import { interval } from 'rxjs';\n *\n * const subscription = interval(1000).subscribe({\n * next(num) {\n * console.log(num)\n * },\n * complete() {\n * // Will not be called, even when cancelling subscription.\n * console.log('completed!');\n * }\n * });\n *\n * setTimeout(() => {\n * subscription.unsubscribe();\n * console.log('unsubscribed!');\n * }, 2500);\n *\n * // Logs:\n * // 0 after 1s\n * // 1 after 2s\n * // 'unsubscribed!' after 2.5s\n * ```\n *\n * @param {Observer|Function} observerOrNext (optional) Either an observer with methods to be called,\n * or the first of three possible handlers, which is the handler for each value emitted from the subscribed\n * Observable.\n * @param {Function} error (optional) A handler for a terminal event resulting from an error. If no error handler is provided,\n * the error will be thrown asynchronously as unhandled.\n * @param {Function} complete (optional) A handler for a terminal event resulting from successful completion.\n * @return {Subscription} a subscription reference to the registered handlers\n * @method subscribe\n */\n subscribe(\n observerOrNext?: Partial> | ((value: T) => void) | null,\n error?: ((error: any) => void) | null,\n complete?: (() => void) | null\n ): Subscription {\n const subscriber = isSubscriber(observerOrNext) ? observerOrNext : new SafeSubscriber(observerOrNext, error, complete);\n\n errorContext(() => {\n const { operator, source } = this;\n subscriber.add(\n operator\n ? // We're dealing with a subscription in the\n // operator chain to one of our lifted operators.\n operator.call(subscriber, source)\n : source\n ? // If `source` has a value, but `operator` does not, something that\n // had intimate knowledge of our API, like our `Subject`, must have\n // set it. We're going to just call `_subscribe` directly.\n this._subscribe(subscriber)\n : // In all other cases, we're likely wrapping a user-provided initializer\n // function, so we need to catch errors and handle them appropriately.\n this._trySubscribe(subscriber)\n );\n });\n\n return subscriber;\n }\n\n /** @internal */\n protected _trySubscribe(sink: Subscriber): TeardownLogic {\n try {\n return this._subscribe(sink);\n } catch (err) {\n // We don't need to return anything in this case,\n // because it's just going to try to `add()` to a subscription\n // above.\n sink.error(err);\n }\n }\n\n /**\n * Used as a NON-CANCELLABLE means of subscribing to an observable, for use with\n * APIs that expect promises, like `async/await`. You cannot unsubscribe from this.\n *\n * **WARNING**: Only use this with observables you *know* will complete. If the source\n * observable does not complete, you will end up with a promise that is hung up, and\n * potentially all of the state of an async function hanging out in memory. To avoid\n * this situation, look into adding something like {@link timeout}, {@link take},\n * {@link takeWhile}, or {@link takeUntil} amongst others.\n *\n * #### Example\n *\n * ```ts\n * import { interval, take } from 'rxjs';\n *\n * const source$ = interval(1000).pipe(take(4));\n *\n * async function getTotal() {\n * let total = 0;\n *\n * await source$.forEach(value => {\n * total += value;\n * console.log('observable -> ' + value);\n * });\n *\n * return total;\n * }\n *\n * getTotal().then(\n * total => console.log('Total: ' + total)\n * );\n *\n * // Expected:\n * // 'observable -> 0'\n * // 'observable -> 1'\n * // 'observable -> 2'\n * // 'observable -> 3'\n * // 'Total: 6'\n * ```\n *\n * @param next a handler for each value emitted by the observable\n * @return a promise that either resolves on observable completion or\n * rejects with the handled error\n */\n forEach(next: (value: T) => void): Promise;\n\n /**\n * @param next a handler for each value emitted by the observable\n * @param promiseCtor a constructor function used to instantiate the Promise\n * @return a promise that either resolves on observable completion or\n * rejects with the handled error\n * @deprecated Passing a Promise constructor will no longer be available\n * in upcoming versions of RxJS. This is because it adds weight to the library, for very\n * little benefit. If you need this functionality, it is recommended that you either\n * polyfill Promise, or you create an adapter to convert the returned native promise\n * to whatever promise implementation you wanted. Will be removed in v8.\n */\n forEach(next: (value: T) => void, promiseCtor: PromiseConstructorLike): Promise;\n\n forEach(next: (value: T) => void, promiseCtor?: PromiseConstructorLike): Promise {\n promiseCtor = getPromiseCtor(promiseCtor);\n\n return new promiseCtor((resolve, reject) => {\n const subscriber = new SafeSubscriber({\n next: (value) => {\n try {\n next(value);\n } catch (err) {\n reject(err);\n subscriber.unsubscribe();\n }\n },\n error: reject,\n complete: resolve,\n });\n this.subscribe(subscriber);\n }) as Promise;\n }\n\n /** @internal */\n protected _subscribe(subscriber: Subscriber): TeardownLogic {\n return this.source?.subscribe(subscriber);\n }\n\n /**\n * An interop point defined by the es7-observable spec https://github.com/zenparsing/es-observable\n * @method Symbol.observable\n * @return {Observable} this instance of the observable\n */\n [Symbol_observable]() {\n return this;\n }\n\n /* tslint:disable:max-line-length */\n pipe(): Observable;\n pipe(op1: OperatorFunction): Observable;\n pipe(op1: OperatorFunction, op2: OperatorFunction): Observable;\n pipe(op1: OperatorFunction, op2: OperatorFunction, op3: OperatorFunction): Observable;\n pipe(\n op1: OperatorFunction,\n op2: OperatorFunction,\n op3: OperatorFunction,\n op4: OperatorFunction\n ): Observable;\n pipe(\n op1: OperatorFunction,\n op2: OperatorFunction,\n op3: OperatorFunction,\n op4: OperatorFunction,\n op5: OperatorFunction\n ): Observable;\n pipe(\n op1: OperatorFunction,\n op2: OperatorFunction,\n op3: OperatorFunction,\n op4: OperatorFunction,\n op5: OperatorFunction,\n op6: OperatorFunction\n ): Observable;\n pipe(\n op1: OperatorFunction,\n op2: OperatorFunction,\n op3: OperatorFunction,\n op4: OperatorFunction,\n op5: OperatorFunction,\n op6: OperatorFunction,\n op7: OperatorFunction\n ): Observable;\n pipe(\n op1: OperatorFunction,\n op2: OperatorFunction,\n op3: OperatorFunction,\n op4: OperatorFunction,\n op5: OperatorFunction,\n op6: OperatorFunction,\n op7: OperatorFunction,\n op8: OperatorFunction\n ): Observable;\n pipe(\n op1: OperatorFunction,\n op2: OperatorFunction,\n op3: OperatorFunction,\n op4: OperatorFunction,\n op5: OperatorFunction,\n op6: OperatorFunction,\n op7: OperatorFunction,\n op8: OperatorFunction,\n op9: OperatorFunction\n ): Observable;\n pipe(\n op1: OperatorFunction,\n op2: OperatorFunction,\n op3: OperatorFunction,\n op4: OperatorFunction,\n op5: OperatorFunction,\n op6: OperatorFunction,\n op7: OperatorFunction,\n op8: OperatorFunction,\n op9: OperatorFunction,\n ...operations: OperatorFunction[]\n ): Observable;\n /* tslint:enable:max-line-length */\n\n /**\n * Used to stitch together functional operators into a chain.\n * @method pipe\n * @return {Observable} the Observable result of all of the operators having\n * been called in the order they were passed in.\n *\n * ## Example\n *\n * ```ts\n * import { interval, filter, map, scan } from 'rxjs';\n *\n * interval(1000)\n * .pipe(\n * filter(x => x % 2 === 0),\n * map(x => x + x),\n * scan((acc, x) => acc + x)\n * )\n * .subscribe(x => console.log(x));\n * ```\n */\n pipe(...operations: OperatorFunction[]): Observable {\n return pipeFromArray(operations)(this);\n }\n\n /* tslint:disable:max-line-length */\n /** @deprecated Replaced with {@link firstValueFrom} and {@link lastValueFrom}. Will be removed in v8. Details: https://rxjs.dev/deprecations/to-promise */\n toPromise(): Promise;\n /** @deprecated Replaced with {@link firstValueFrom} and {@link lastValueFrom}. Will be removed in v8. Details: https://rxjs.dev/deprecations/to-promise */\n toPromise(PromiseCtor: typeof Promise): Promise;\n /** @deprecated Replaced with {@link firstValueFrom} and {@link lastValueFrom}. Will be removed in v8. Details: https://rxjs.dev/deprecations/to-promise */\n toPromise(PromiseCtor: PromiseConstructorLike): Promise;\n /* tslint:enable:max-line-length */\n\n /**\n * Subscribe to this Observable and get a Promise resolving on\n * `complete` with the last emission (if any).\n *\n * **WARNING**: Only use this with observables you *know* will complete. If the source\n * observable does not complete, you will end up with a promise that is hung up, and\n * potentially all of the state of an async function hanging out in memory. To avoid\n * this situation, look into adding something like {@link timeout}, {@link take},\n * {@link takeWhile}, or {@link takeUntil} amongst others.\n *\n * @method toPromise\n * @param [promiseCtor] a constructor function used to instantiate\n * the Promise\n * @return A Promise that resolves with the last value emit, or\n * rejects on an error. If there were no emissions, Promise\n * resolves with undefined.\n * @deprecated Replaced with {@link firstValueFrom} and {@link lastValueFrom}. Will be removed in v8. Details: https://rxjs.dev/deprecations/to-promise\n */\n toPromise(promiseCtor?: PromiseConstructorLike): Promise {\n promiseCtor = getPromiseCtor(promiseCtor);\n\n return new promiseCtor((resolve, reject) => {\n let value: T | undefined;\n this.subscribe(\n (x: T) => (value = x),\n (err: any) => reject(err),\n () => resolve(value)\n );\n }) as Promise;\n }\n}\n\n/**\n * Decides between a passed promise constructor from consuming code,\n * A default configured promise constructor, and the native promise\n * constructor and returns it. If nothing can be found, it will throw\n * an error.\n * @param promiseCtor The optional promise constructor to passed by consuming code\n */\nfunction getPromiseCtor(promiseCtor: PromiseConstructorLike | undefined) {\n return promiseCtor ?? config.Promise ?? Promise;\n}\n\nfunction isObserver(value: any): value is Observer {\n return value && isFunction(value.next) && isFunction(value.error) && isFunction(value.complete);\n}\n\nfunction isSubscriber(value: any): value is Subscriber {\n return (value && value instanceof Subscriber) || (isObserver(value) && isSubscription(value));\n}\n", "import { Observable } from '../Observable';\nimport { Subscriber } from '../Subscriber';\nimport { OperatorFunction } from '../types';\nimport { isFunction } from './isFunction';\n\n/**\n * Used to determine if an object is an Observable with a lift function.\n */\nexport function hasLift(source: any): source is { lift: InstanceType['lift'] } {\n return isFunction(source?.lift);\n}\n\n/**\n * Creates an `OperatorFunction`. Used to define operators throughout the library in a concise way.\n * @param init The logic to connect the liftedSource to the subscriber at the moment of subscription.\n */\nexport function operate(\n init: (liftedSource: Observable, subscriber: Subscriber) => (() => void) | void\n): OperatorFunction {\n return (source: Observable) => {\n if (hasLift(source)) {\n return source.lift(function (this: Subscriber, liftedSource: Observable) {\n try {\n return init(liftedSource, this);\n } catch (err) {\n this.error(err);\n }\n });\n }\n throw new TypeError('Unable to lift unknown Observable type');\n };\n}\n", "import { Subscriber } from '../Subscriber';\n\n/**\n * Creates an instance of an `OperatorSubscriber`.\n * @param destination The downstream subscriber.\n * @param onNext Handles next values, only called if this subscriber is not stopped or closed. Any\n * error that occurs in this function is caught and sent to the `error` method of this subscriber.\n * @param onError Handles errors from the subscription, any errors that occur in this handler are caught\n * and send to the `destination` error handler.\n * @param onComplete Handles completion notification from the subscription. Any errors that occur in\n * this handler are sent to the `destination` error handler.\n * @param onFinalize Additional teardown logic here. This will only be called on teardown if the\n * subscriber itself is not already closed. This is called after all other teardown logic is executed.\n */\nexport function createOperatorSubscriber(\n destination: Subscriber,\n onNext?: (value: T) => void,\n onComplete?: () => void,\n onError?: (err: any) => void,\n onFinalize?: () => void\n): Subscriber {\n return new OperatorSubscriber(destination, onNext, onComplete, onError, onFinalize);\n}\n\n/**\n * A generic helper for allowing operators to be created with a Subscriber and\n * use closures to capture necessary state from the operator function itself.\n */\nexport class OperatorSubscriber extends Subscriber {\n /**\n * Creates an instance of an `OperatorSubscriber`.\n * @param destination The downstream subscriber.\n * @param onNext Handles next values, only called if this subscriber is not stopped or closed. Any\n * error that occurs in this function is caught and sent to the `error` method of this subscriber.\n * @param onError Handles errors from the subscription, any errors that occur in this handler are caught\n * and send to the `destination` error handler.\n * @param onComplete Handles completion notification from the subscription. Any errors that occur in\n * this handler are sent to the `destination` error handler.\n * @param onFinalize Additional finalization logic here. This will only be called on finalization if the\n * subscriber itself is not already closed. This is called after all other finalization logic is executed.\n * @param shouldUnsubscribe An optional check to see if an unsubscribe call should truly unsubscribe.\n * NOTE: This currently **ONLY** exists to support the strange behavior of {@link groupBy}, where unsubscription\n * to the resulting observable does not actually disconnect from the source if there are active subscriptions\n * to any grouped observable. (DO NOT EXPOSE OR USE EXTERNALLY!!!)\n */\n constructor(\n destination: Subscriber,\n onNext?: (value: T) => void,\n onComplete?: () => void,\n onError?: (err: any) => void,\n private onFinalize?: () => void,\n private shouldUnsubscribe?: () => boolean\n ) {\n // It's important - for performance reasons - that all of this class's\n // members are initialized and that they are always initialized in the same\n // order. This will ensure that all OperatorSubscriber instances have the\n // same hidden class in V8. This, in turn, will help keep the number of\n // hidden classes involved in property accesses within the base class as\n // low as possible. If the number of hidden classes involved exceeds four,\n // the property accesses will become megamorphic and performance penalties\n // will be incurred - i.e. inline caches won't be used.\n //\n // The reasons for ensuring all instances have the same hidden class are\n // further discussed in this blog post from Benedikt Meurer:\n // https://benediktmeurer.de/2018/03/23/impact-of-polymorphism-on-component-based-frameworks-like-react/\n super(destination);\n this._next = onNext\n ? function (this: OperatorSubscriber, value: T) {\n try {\n onNext(value);\n } catch (err) {\n destination.error(err);\n }\n }\n : super._next;\n this._error = onError\n ? function (this: OperatorSubscriber, err: any) {\n try {\n onError(err);\n } catch (err) {\n // Send any errors that occur down stream.\n destination.error(err);\n } finally {\n // Ensure finalization.\n this.unsubscribe();\n }\n }\n : super._error;\n this._complete = onComplete\n ? function (this: OperatorSubscriber) {\n try {\n onComplete();\n } catch (err) {\n // Send any errors that occur down stream.\n destination.error(err);\n } finally {\n // Ensure finalization.\n this.unsubscribe();\n }\n }\n : super._complete;\n }\n\n unsubscribe() {\n if (!this.shouldUnsubscribe || this.shouldUnsubscribe()) {\n const { closed } = this;\n super.unsubscribe();\n // Execute additional teardown if we have any and we didn't already do so.\n !closed && this.onFinalize?.();\n }\n }\n}\n", "import { Subscription } from '../Subscription';\n\ninterface AnimationFrameProvider {\n schedule(callback: FrameRequestCallback): Subscription;\n requestAnimationFrame: typeof requestAnimationFrame;\n cancelAnimationFrame: typeof cancelAnimationFrame;\n delegate:\n | {\n requestAnimationFrame: typeof requestAnimationFrame;\n cancelAnimationFrame: typeof cancelAnimationFrame;\n }\n | undefined;\n}\n\nexport const animationFrameProvider: AnimationFrameProvider = {\n // When accessing the delegate, use the variable rather than `this` so that\n // the functions can be called without being bound to the provider.\n schedule(callback) {\n let request = requestAnimationFrame;\n let cancel: typeof cancelAnimationFrame | undefined = cancelAnimationFrame;\n const { delegate } = animationFrameProvider;\n if (delegate) {\n request = delegate.requestAnimationFrame;\n cancel = delegate.cancelAnimationFrame;\n }\n const handle = request((timestamp) => {\n // Clear the cancel function. The request has been fulfilled, so\n // attempting to cancel the request upon unsubscription would be\n // pointless.\n cancel = undefined;\n callback(timestamp);\n });\n return new Subscription(() => cancel?.(handle));\n },\n requestAnimationFrame(...args) {\n const { delegate } = animationFrameProvider;\n return (delegate?.requestAnimationFrame || requestAnimationFrame)(...args);\n },\n cancelAnimationFrame(...args) {\n const { delegate } = animationFrameProvider;\n return (delegate?.cancelAnimationFrame || cancelAnimationFrame)(...args);\n },\n delegate: undefined,\n};\n", "import { createErrorClass } from './createErrorClass';\n\nexport interface ObjectUnsubscribedError extends Error {}\n\nexport interface ObjectUnsubscribedErrorCtor {\n /**\n * @deprecated Internal implementation detail. Do not construct error instances.\n * Cannot be tagged as internal: https://github.com/ReactiveX/rxjs/issues/6269\n */\n new (): ObjectUnsubscribedError;\n}\n\n/**\n * An error thrown when an action is invalid because the object has been\n * unsubscribed.\n *\n * @see {@link Subject}\n * @see {@link BehaviorSubject}\n *\n * @class ObjectUnsubscribedError\n */\nexport const ObjectUnsubscribedError: ObjectUnsubscribedErrorCtor = createErrorClass(\n (_super) =>\n function ObjectUnsubscribedErrorImpl(this: any) {\n _super(this);\n this.name = 'ObjectUnsubscribedError';\n this.message = 'object unsubscribed';\n }\n);\n", "import { Operator } from './Operator';\nimport { Observable } from './Observable';\nimport { Subscriber } from './Subscriber';\nimport { Subscription, EMPTY_SUBSCRIPTION } from './Subscription';\nimport { Observer, SubscriptionLike, TeardownLogic } from './types';\nimport { ObjectUnsubscribedError } from './util/ObjectUnsubscribedError';\nimport { arrRemove } from './util/arrRemove';\nimport { errorContext } from './util/errorContext';\n\n/**\n * A Subject is a special type of Observable that allows values to be\n * multicasted to many Observers. Subjects are like EventEmitters.\n *\n * Every Subject is an Observable and an Observer. You can subscribe to a\n * Subject, and you can call next to feed values as well as error and complete.\n */\nexport class Subject extends Observable implements SubscriptionLike {\n closed = false;\n\n private currentObservers: Observer[] | null = null;\n\n /** @deprecated Internal implementation detail, do not use directly. Will be made internal in v8. */\n observers: Observer[] = [];\n /** @deprecated Internal implementation detail, do not use directly. Will be made internal in v8. */\n isStopped = false;\n /** @deprecated Internal implementation detail, do not use directly. Will be made internal in v8. */\n hasError = false;\n /** @deprecated Internal implementation detail, do not use directly. Will be made internal in v8. */\n thrownError: any = null;\n\n /**\n * Creates a \"subject\" by basically gluing an observer to an observable.\n *\n * @nocollapse\n * @deprecated Recommended you do not use. Will be removed at some point in the future. Plans for replacement still under discussion.\n */\n static create: (...args: any[]) => any = (destination: Observer, source: Observable): AnonymousSubject => {\n return new AnonymousSubject(destination, source);\n };\n\n constructor() {\n // NOTE: This must be here to obscure Observable's constructor.\n super();\n }\n\n /** @deprecated Internal implementation detail, do not use directly. Will be made internal in v8. */\n lift(operator: Operator): Observable {\n const subject = new AnonymousSubject(this, this);\n subject.operator = operator as any;\n return subject as any;\n }\n\n /** @internal */\n protected _throwIfClosed() {\n if (this.closed) {\n throw new ObjectUnsubscribedError();\n }\n }\n\n next(value: T) {\n errorContext(() => {\n this._throwIfClosed();\n if (!this.isStopped) {\n if (!this.currentObservers) {\n this.currentObservers = Array.from(this.observers);\n }\n for (const observer of this.currentObservers) {\n observer.next(value);\n }\n }\n });\n }\n\n error(err: any) {\n errorContext(() => {\n this._throwIfClosed();\n if (!this.isStopped) {\n this.hasError = this.isStopped = true;\n this.thrownError = err;\n const { observers } = this;\n while (observers.length) {\n observers.shift()!.error(err);\n }\n }\n });\n }\n\n complete() {\n errorContext(() => {\n this._throwIfClosed();\n if (!this.isStopped) {\n this.isStopped = true;\n const { observers } = this;\n while (observers.length) {\n observers.shift()!.complete();\n }\n }\n });\n }\n\n unsubscribe() {\n this.isStopped = this.closed = true;\n this.observers = this.currentObservers = null!;\n }\n\n get observed() {\n return this.observers?.length > 0;\n }\n\n /** @internal */\n protected _trySubscribe(subscriber: Subscriber): TeardownLogic {\n this._throwIfClosed();\n return super._trySubscribe(subscriber);\n }\n\n /** @internal */\n protected _subscribe(subscriber: Subscriber): Subscription {\n this._throwIfClosed();\n this._checkFinalizedStatuses(subscriber);\n return this._innerSubscribe(subscriber);\n }\n\n /** @internal */\n protected _innerSubscribe(subscriber: Subscriber) {\n const { hasError, isStopped, observers } = this;\n if (hasError || isStopped) {\n return EMPTY_SUBSCRIPTION;\n }\n this.currentObservers = null;\n observers.push(subscriber);\n return new Subscription(() => {\n this.currentObservers = null;\n arrRemove(observers, subscriber);\n });\n }\n\n /** @internal */\n protected _checkFinalizedStatuses(subscriber: Subscriber) {\n const { hasError, thrownError, isStopped } = this;\n if (hasError) {\n subscriber.error(thrownError);\n } else if (isStopped) {\n subscriber.complete();\n }\n }\n\n /**\n * Creates a new Observable with this Subject as the source. You can do this\n * to create custom Observer-side logic of the Subject and conceal it from\n * code that uses the Observable.\n * @return {Observable} Observable that the Subject casts to\n */\n asObservable(): Observable {\n const observable: any = new Observable();\n observable.source = this;\n return observable;\n }\n}\n\n/**\n * @class AnonymousSubject\n */\nexport class AnonymousSubject extends Subject {\n constructor(\n /** @deprecated Internal implementation detail, do not use directly. Will be made internal in v8. */\n public destination?: Observer,\n source?: Observable\n ) {\n super();\n this.source = source;\n }\n\n next(value: T) {\n this.destination?.next?.(value);\n }\n\n error(err: any) {\n this.destination?.error?.(err);\n }\n\n complete() {\n this.destination?.complete?.();\n }\n\n /** @internal */\n protected _subscribe(subscriber: Subscriber): Subscription {\n return this.source?.subscribe(subscriber) ?? EMPTY_SUBSCRIPTION;\n }\n}\n", "import { TimestampProvider } from '../types';\n\ninterface DateTimestampProvider extends TimestampProvider {\n delegate: TimestampProvider | undefined;\n}\n\nexport const dateTimestampProvider: DateTimestampProvider = {\n now() {\n // Use the variable rather than `this` so that the function can be called\n // without being bound to the provider.\n return (dateTimestampProvider.delegate || Date).now();\n },\n delegate: undefined,\n};\n", "import { Subject } from './Subject';\nimport { TimestampProvider } from './types';\nimport { Subscriber } from './Subscriber';\nimport { Subscription } from './Subscription';\nimport { dateTimestampProvider } from './scheduler/dateTimestampProvider';\n\n/**\n * A variant of {@link Subject} that \"replays\" old values to new subscribers by emitting them when they first subscribe.\n *\n * `ReplaySubject` has an internal buffer that will store a specified number of values that it has observed. Like `Subject`,\n * `ReplaySubject` \"observes\" values by having them passed to its `next` method. When it observes a value, it will store that\n * value for a time determined by the configuration of the `ReplaySubject`, as passed to its constructor.\n *\n * When a new subscriber subscribes to the `ReplaySubject` instance, it will synchronously emit all values in its buffer in\n * a First-In-First-Out (FIFO) manner. The `ReplaySubject` will also complete, if it has observed completion; and it will\n * error if it has observed an error.\n *\n * There are two main configuration items to be concerned with:\n *\n * 1. `bufferSize` - This will determine how many items are stored in the buffer, defaults to infinite.\n * 2. `windowTime` - The amount of time to hold a value in the buffer before removing it from the buffer.\n *\n * Both configurations may exist simultaneously. So if you would like to buffer a maximum of 3 values, as long as the values\n * are less than 2 seconds old, you could do so with a `new ReplaySubject(3, 2000)`.\n *\n * ### Differences with BehaviorSubject\n *\n * `BehaviorSubject` is similar to `new ReplaySubject(1)`, with a couple of exceptions:\n *\n * 1. `BehaviorSubject` comes \"primed\" with a single value upon construction.\n * 2. `ReplaySubject` will replay values, even after observing an error, where `BehaviorSubject` will not.\n *\n * @see {@link Subject}\n * @see {@link BehaviorSubject}\n * @see {@link shareReplay}\n */\nexport class ReplaySubject extends Subject {\n private _buffer: (T | number)[] = [];\n private _infiniteTimeWindow = true;\n\n /**\n * @param bufferSize The size of the buffer to replay on subscription\n * @param windowTime The amount of time the buffered items will stay buffered\n * @param timestampProvider An object with a `now()` method that provides the current timestamp. This is used to\n * calculate the amount of time something has been buffered.\n */\n constructor(\n private _bufferSize = Infinity,\n private _windowTime = Infinity,\n private _timestampProvider: TimestampProvider = dateTimestampProvider\n ) {\n super();\n this._infiniteTimeWindow = _windowTime === Infinity;\n this._bufferSize = Math.max(1, _bufferSize);\n this._windowTime = Math.max(1, _windowTime);\n }\n\n next(value: T): void {\n const { isStopped, _buffer, _infiniteTimeWindow, _timestampProvider, _windowTime } = this;\n if (!isStopped) {\n _buffer.push(value);\n !_infiniteTimeWindow && _buffer.push(_timestampProvider.now() + _windowTime);\n }\n this._trimBuffer();\n super.next(value);\n }\n\n /** @internal */\n protected _subscribe(subscriber: Subscriber): Subscription {\n this._throwIfClosed();\n this._trimBuffer();\n\n const subscription = this._innerSubscribe(subscriber);\n\n const { _infiniteTimeWindow, _buffer } = this;\n // We use a copy here, so reentrant code does not mutate our array while we're\n // emitting it to a new subscriber.\n const copy = _buffer.slice();\n for (let i = 0; i < copy.length && !subscriber.closed; i += _infiniteTimeWindow ? 1 : 2) {\n subscriber.next(copy[i] as T);\n }\n\n this._checkFinalizedStatuses(subscriber);\n\n return subscription;\n }\n\n private _trimBuffer() {\n const { _bufferSize, _timestampProvider, _buffer, _infiniteTimeWindow } = this;\n // If we don't have an infinite buffer size, and we're over the length,\n // use splice to truncate the old buffer values off. Note that we have to\n // double the size for instances where we're not using an infinite time window\n // because we're storing the values and the timestamps in the same array.\n const adjustedBufferSize = (_infiniteTimeWindow ? 1 : 2) * _bufferSize;\n _bufferSize < Infinity && adjustedBufferSize < _buffer.length && _buffer.splice(0, _buffer.length - adjustedBufferSize);\n\n // Now, if we're not in an infinite time window, remove all values where the time is\n // older than what is allowed.\n if (!_infiniteTimeWindow) {\n const now = _timestampProvider.now();\n let last = 0;\n // Search the array for the first timestamp that isn't expired and\n // truncate the buffer up to that point.\n for (let i = 1; i < _buffer.length && (_buffer[i] as number) <= now; i += 2) {\n last = i;\n }\n last && _buffer.splice(0, last + 1);\n }\n }\n}\n", "import { Scheduler } from '../Scheduler';\nimport { Subscription } from '../Subscription';\nimport { SchedulerAction } from '../types';\n\n/**\n * A unit of work to be executed in a `scheduler`. An action is typically\n * created from within a {@link SchedulerLike} and an RxJS user does not need to concern\n * themselves about creating and manipulating an Action.\n *\n * ```ts\n * class Action extends Subscription {\n * new (scheduler: Scheduler, work: (state?: T) => void);\n * schedule(state?: T, delay: number = 0): Subscription;\n * }\n * ```\n *\n * @class Action\n */\nexport class Action extends Subscription {\n constructor(scheduler: Scheduler, work: (this: SchedulerAction, state?: T) => void) {\n super();\n }\n /**\n * Schedules this action on its parent {@link SchedulerLike} for execution. May be passed\n * some context object, `state`. May happen at some point in the future,\n * according to the `delay` parameter, if specified.\n * @param {T} [state] Some contextual data that the `work` function uses when\n * called by the Scheduler.\n * @param {number} [delay] Time to wait before executing the work, where the\n * time unit is implicit and defined by the Scheduler.\n * @return {void}\n */\n public schedule(state?: T, delay: number = 0): Subscription {\n return this;\n }\n}\n", "import type { TimerHandle } from './timerHandle';\ntype SetIntervalFunction = (handler: () => void, timeout?: number, ...args: any[]) => TimerHandle;\ntype ClearIntervalFunction = (handle: TimerHandle) => void;\n\ninterface IntervalProvider {\n setInterval: SetIntervalFunction;\n clearInterval: ClearIntervalFunction;\n delegate:\n | {\n setInterval: SetIntervalFunction;\n clearInterval: ClearIntervalFunction;\n }\n | undefined;\n}\n\nexport const intervalProvider: IntervalProvider = {\n // When accessing the delegate, use the variable rather than `this` so that\n // the functions can be called without being bound to the provider.\n setInterval(handler: () => void, timeout?: number, ...args) {\n const { delegate } = intervalProvider;\n if (delegate?.setInterval) {\n return delegate.setInterval(handler, timeout, ...args);\n }\n return setInterval(handler, timeout, ...args);\n },\n clearInterval(handle) {\n const { delegate } = intervalProvider;\n return (delegate?.clearInterval || clearInterval)(handle as any);\n },\n delegate: undefined,\n};\n", "import { Action } from './Action';\nimport { SchedulerAction } from '../types';\nimport { Subscription } from '../Subscription';\nimport { AsyncScheduler } from './AsyncScheduler';\nimport { intervalProvider } from './intervalProvider';\nimport { arrRemove } from '../util/arrRemove';\nimport { TimerHandle } from './timerHandle';\n\nexport class AsyncAction extends Action {\n public id: TimerHandle | undefined;\n public state?: T;\n // @ts-ignore: Property has no initializer and is not definitely assigned\n public delay: number;\n protected pending: boolean = false;\n\n constructor(protected scheduler: AsyncScheduler, protected work: (this: SchedulerAction, state?: T) => void) {\n super(scheduler, work);\n }\n\n public schedule(state?: T, delay: number = 0): Subscription {\n if (this.closed) {\n return this;\n }\n\n // Always replace the current state with the new state.\n this.state = state;\n\n const id = this.id;\n const scheduler = this.scheduler;\n\n //\n // Important implementation note:\n //\n // Actions only execute once by default, unless rescheduled from within the\n // scheduled callback. This allows us to implement single and repeat\n // actions via the same code path, without adding API surface area, as well\n // as mimic traditional recursion but across asynchronous boundaries.\n //\n // However, JS runtimes and timers distinguish between intervals achieved by\n // serial `setTimeout` calls vs. a single `setInterval` call. An interval of\n // serial `setTimeout` calls can be individually delayed, which delays\n // scheduling the next `setTimeout`, and so on. `setInterval` attempts to\n // guarantee the interval callback will be invoked more precisely to the\n // interval period, regardless of load.\n //\n // Therefore, we use `setInterval` to schedule single and repeat actions.\n // If the action reschedules itself with the same delay, the interval is not\n // canceled. If the action doesn't reschedule, or reschedules with a\n // different delay, the interval will be canceled after scheduled callback\n // execution.\n //\n if (id != null) {\n this.id = this.recycleAsyncId(scheduler, id, delay);\n }\n\n // Set the pending flag indicating that this action has been scheduled, or\n // has recursively rescheduled itself.\n this.pending = true;\n\n this.delay = delay;\n // If this action has already an async Id, don't request a new one.\n this.id = this.id ?? this.requestAsyncId(scheduler, this.id, delay);\n\n return this;\n }\n\n protected requestAsyncId(scheduler: AsyncScheduler, _id?: TimerHandle, delay: number = 0): TimerHandle {\n return intervalProvider.setInterval(scheduler.flush.bind(scheduler, this), delay);\n }\n\n protected recycleAsyncId(_scheduler: AsyncScheduler, id?: TimerHandle, delay: number | null = 0): TimerHandle | undefined {\n // If this action is rescheduled with the same delay time, don't clear the interval id.\n if (delay != null && this.delay === delay && this.pending === false) {\n return id;\n }\n // Otherwise, if the action's delay time is different from the current delay,\n // or the action has been rescheduled before it's executed, clear the interval id\n if (id != null) {\n intervalProvider.clearInterval(id);\n }\n\n return undefined;\n }\n\n /**\n * Immediately executes this action and the `work` it contains.\n * @return {any}\n */\n public execute(state: T, delay: number): any {\n if (this.closed) {\n return new Error('executing a cancelled action');\n }\n\n this.pending = false;\n const error = this._execute(state, delay);\n if (error) {\n return error;\n } else if (this.pending === false && this.id != null) {\n // Dequeue if the action didn't reschedule itself. Don't call\n // unsubscribe(), because the action could reschedule later.\n // For example:\n // ```\n // scheduler.schedule(function doWork(counter) {\n // /* ... I'm a busy worker bee ... */\n // var originalAction = this;\n // /* wait 100ms before rescheduling the action */\n // setTimeout(function () {\n // originalAction.schedule(counter + 1);\n // }, 100);\n // }, 1000);\n // ```\n this.id = this.recycleAsyncId(this.scheduler, this.id, null);\n }\n }\n\n protected _execute(state: T, _delay: number): any {\n let errored: boolean = false;\n let errorValue: any;\n try {\n this.work(state);\n } catch (e) {\n errored = true;\n // HACK: Since code elsewhere is relying on the \"truthiness\" of the\n // return here, we can't have it return \"\" or 0 or false.\n // TODO: Clean this up when we refactor schedulers mid-version-8 or so.\n errorValue = e ? e : new Error('Scheduled action threw falsy error');\n }\n if (errored) {\n this.unsubscribe();\n return errorValue;\n }\n }\n\n unsubscribe() {\n if (!this.closed) {\n const { id, scheduler } = this;\n const { actions } = scheduler;\n\n this.work = this.state = this.scheduler = null!;\n this.pending = false;\n\n arrRemove(actions, this);\n if (id != null) {\n this.id = this.recycleAsyncId(scheduler, id, null);\n }\n\n this.delay = null!;\n super.unsubscribe();\n }\n }\n}\n", "import { Action } from './scheduler/Action';\nimport { Subscription } from './Subscription';\nimport { SchedulerLike, SchedulerAction } from './types';\nimport { dateTimestampProvider } from './scheduler/dateTimestampProvider';\n\n/**\n * An execution context and a data structure to order tasks and schedule their\n * execution. Provides a notion of (potentially virtual) time, through the\n * `now()` getter method.\n *\n * Each unit of work in a Scheduler is called an `Action`.\n *\n * ```ts\n * class Scheduler {\n * now(): number;\n * schedule(work, delay?, state?): Subscription;\n * }\n * ```\n *\n * @class Scheduler\n * @deprecated Scheduler is an internal implementation detail of RxJS, and\n * should not be used directly. Rather, create your own class and implement\n * {@link SchedulerLike}. Will be made internal in v8.\n */\nexport class Scheduler implements SchedulerLike {\n public static now: () => number = dateTimestampProvider.now;\n\n constructor(private schedulerActionCtor: typeof Action, now: () => number = Scheduler.now) {\n this.now = now;\n }\n\n /**\n * A getter method that returns a number representing the current time\n * (at the time this function was called) according to the scheduler's own\n * internal clock.\n * @return {number} A number that represents the current time. May or may not\n * have a relation to wall-clock time. May or may not refer to a time unit\n * (e.g. milliseconds).\n */\n public now: () => number;\n\n /**\n * Schedules a function, `work`, for execution. May happen at some point in\n * the future, according to the `delay` parameter, if specified. May be passed\n * some context object, `state`, which will be passed to the `work` function.\n *\n * The given arguments will be processed an stored as an Action object in a\n * queue of actions.\n *\n * @param {function(state: ?T): ?Subscription} work A function representing a\n * task, or some unit of work to be executed by the Scheduler.\n * @param {number} [delay] Time to wait before executing the work, where the\n * time unit is implicit and defined by the Scheduler itself.\n * @param {T} [state] Some contextual data that the `work` function uses when\n * called by the Scheduler.\n * @return {Subscription} A subscription in order to be able to unsubscribe\n * the scheduled work.\n */\n public schedule(work: (this: SchedulerAction, state?: T) => void, delay: number = 0, state?: T): Subscription {\n return new this.schedulerActionCtor(this, work).schedule(state, delay);\n }\n}\n", "import { Scheduler } from '../Scheduler';\nimport { Action } from './Action';\nimport { AsyncAction } from './AsyncAction';\nimport { TimerHandle } from './timerHandle';\n\nexport class AsyncScheduler extends Scheduler {\n public actions: Array> = [];\n /**\n * A flag to indicate whether the Scheduler is currently executing a batch of\n * queued actions.\n * @type {boolean}\n * @internal\n */\n public _active: boolean = false;\n /**\n * An internal ID used to track the latest asynchronous task such as those\n * coming from `setTimeout`, `setInterval`, `requestAnimationFrame`, and\n * others.\n * @type {any}\n * @internal\n */\n public _scheduled: TimerHandle | undefined;\n\n constructor(SchedulerAction: typeof Action, now: () => number = Scheduler.now) {\n super(SchedulerAction, now);\n }\n\n public flush(action: AsyncAction): void {\n const { actions } = this;\n\n if (this._active) {\n actions.push(action);\n return;\n }\n\n let error: any;\n this._active = true;\n\n do {\n if ((error = action.execute(action.state, action.delay))) {\n break;\n }\n } while ((action = actions.shift()!)); // exhaust the scheduler queue\n\n this._active = false;\n\n if (error) {\n while ((action = actions.shift()!)) {\n action.unsubscribe();\n }\n throw error;\n }\n }\n}\n", "import { AsyncAction } from './AsyncAction';\nimport { AsyncScheduler } from './AsyncScheduler';\n\n/**\n *\n * Async Scheduler\n *\n * Schedule task as if you used setTimeout(task, duration)\n *\n * `async` scheduler schedules tasks asynchronously, by putting them on the JavaScript\n * event loop queue. It is best used to delay tasks in time or to schedule tasks repeating\n * in intervals.\n *\n * If you just want to \"defer\" task, that is to perform it right after currently\n * executing synchronous code ends (commonly achieved by `setTimeout(deferredTask, 0)`),\n * better choice will be the {@link asapScheduler} scheduler.\n *\n * ## Examples\n * Use async scheduler to delay task\n * ```ts\n * import { asyncScheduler } from 'rxjs';\n *\n * const task = () => console.log('it works!');\n *\n * asyncScheduler.schedule(task, 2000);\n *\n * // After 2 seconds logs:\n * // \"it works!\"\n * ```\n *\n * Use async scheduler to repeat task in intervals\n * ```ts\n * import { asyncScheduler } from 'rxjs';\n *\n * function task(state) {\n * console.log(state);\n * this.schedule(state + 1, 1000); // `this` references currently executing Action,\n * // which we reschedule with new state and delay\n * }\n *\n * asyncScheduler.schedule(task, 3000, 0);\n *\n * // Logs:\n * // 0 after 3s\n * // 1 after 4s\n * // 2 after 5s\n * // 3 after 6s\n * ```\n */\n\nexport const asyncScheduler = new AsyncScheduler(AsyncAction);\n\n/**\n * @deprecated Renamed to {@link asyncScheduler}. Will be removed in v8.\n */\nexport const async = asyncScheduler;\n", "import { AsyncAction } from './AsyncAction';\nimport { AnimationFrameScheduler } from './AnimationFrameScheduler';\nimport { SchedulerAction } from '../types';\nimport { animationFrameProvider } from './animationFrameProvider';\nimport { TimerHandle } from './timerHandle';\n\nexport class AnimationFrameAction extends AsyncAction {\n constructor(protected scheduler: AnimationFrameScheduler, protected work: (this: SchedulerAction, state?: T) => void) {\n super(scheduler, work);\n }\n\n protected requestAsyncId(scheduler: AnimationFrameScheduler, id?: TimerHandle, delay: number = 0): TimerHandle {\n // If delay is greater than 0, request as an async action.\n if (delay !== null && delay > 0) {\n return super.requestAsyncId(scheduler, id, delay);\n }\n // Push the action to the end of the scheduler queue.\n scheduler.actions.push(this);\n // If an animation frame has already been requested, don't request another\n // one. If an animation frame hasn't been requested yet, request one. Return\n // the current animation frame request id.\n return scheduler._scheduled || (scheduler._scheduled = animationFrameProvider.requestAnimationFrame(() => scheduler.flush(undefined)));\n }\n\n protected recycleAsyncId(scheduler: AnimationFrameScheduler, id?: TimerHandle, delay: number = 0): TimerHandle | undefined {\n // If delay exists and is greater than 0, or if the delay is null (the\n // action wasn't rescheduled) but was originally scheduled as an async\n // action, then recycle as an async action.\n if (delay != null ? delay > 0 : this.delay > 0) {\n return super.recycleAsyncId(scheduler, id, delay);\n }\n // If the scheduler queue has no remaining actions with the same async id,\n // cancel the requested animation frame and set the scheduled flag to\n // undefined so the next AnimationFrameAction will request its own.\n const { actions } = scheduler;\n if (id != null && actions[actions.length - 1]?.id !== id) {\n animationFrameProvider.cancelAnimationFrame(id as number);\n scheduler._scheduled = undefined;\n }\n // Return undefined so the action knows to request a new async id if it's rescheduled.\n return undefined;\n }\n}\n", "import { AsyncAction } from './AsyncAction';\nimport { AsyncScheduler } from './AsyncScheduler';\n\nexport class AnimationFrameScheduler extends AsyncScheduler {\n public flush(action?: AsyncAction): void {\n this._active = true;\n // The async id that effects a call to flush is stored in _scheduled.\n // Before executing an action, it's necessary to check the action's async\n // id to determine whether it's supposed to be executed in the current\n // flush.\n // Previous implementations of this method used a count to determine this,\n // but that was unsound, as actions that are unsubscribed - i.e. cancelled -\n // are removed from the actions array and that can shift actions that are\n // scheduled to be executed in a subsequent flush into positions at which\n // they are executed within the current flush.\n const flushId = this._scheduled;\n this._scheduled = undefined;\n\n const { actions } = this;\n let error: any;\n action = action || actions.shift()!;\n\n do {\n if ((error = action.execute(action.state, action.delay))) {\n break;\n }\n } while ((action = actions[0]) && action.id === flushId && actions.shift());\n\n this._active = false;\n\n if (error) {\n while ((action = actions[0]) && action.id === flushId && actions.shift()) {\n action.unsubscribe();\n }\n throw error;\n }\n }\n}\n", "import { AnimationFrameAction } from './AnimationFrameAction';\nimport { AnimationFrameScheduler } from './AnimationFrameScheduler';\n\n/**\n *\n * Animation Frame Scheduler\n *\n * Perform task when `window.requestAnimationFrame` would fire\n *\n * When `animationFrame` scheduler is used with delay, it will fall back to {@link asyncScheduler} scheduler\n * behaviour.\n *\n * Without delay, `animationFrame` scheduler can be used to create smooth browser animations.\n * It makes sure scheduled task will happen just before next browser content repaint,\n * thus performing animations as efficiently as possible.\n *\n * ## Example\n * Schedule div height animation\n * ```ts\n * // html:
\n * import { animationFrameScheduler } from 'rxjs';\n *\n * const div = document.querySelector('div');\n *\n * animationFrameScheduler.schedule(function(height) {\n * div.style.height = height + \"px\";\n *\n * this.schedule(height + 1); // `this` references currently executing Action,\n * // which we reschedule with new state\n * }, 0, 0);\n *\n * // You will see a div element growing in height\n * ```\n */\n\nexport const animationFrameScheduler = new AnimationFrameScheduler(AnimationFrameAction);\n\n/**\n * @deprecated Renamed to {@link animationFrameScheduler}. Will be removed in v8.\n */\nexport const animationFrame = animationFrameScheduler;\n", "import { Observable } from '../Observable';\nimport { SchedulerLike } from '../types';\n\n/**\n * A simple Observable that emits no items to the Observer and immediately\n * emits a complete notification.\n *\n * Just emits 'complete', and nothing else.\n *\n * ![](empty.png)\n *\n * A simple Observable that only emits the complete notification. It can be used\n * for composing with other Observables, such as in a {@link mergeMap}.\n *\n * ## Examples\n *\n * Log complete notification\n *\n * ```ts\n * import { EMPTY } from 'rxjs';\n *\n * EMPTY.subscribe({\n * next: () => console.log('Next'),\n * complete: () => console.log('Complete!')\n * });\n *\n * // Outputs\n * // Complete!\n * ```\n *\n * Emit the number 7, then complete\n *\n * ```ts\n * import { EMPTY, startWith } from 'rxjs';\n *\n * const result = EMPTY.pipe(startWith(7));\n * result.subscribe(x => console.log(x));\n *\n * // Outputs\n * // 7\n * ```\n *\n * Map and flatten only odd numbers to the sequence `'a'`, `'b'`, `'c'`\n *\n * ```ts\n * import { interval, mergeMap, of, EMPTY } from 'rxjs';\n *\n * const interval$ = interval(1000);\n * const result = interval$.pipe(\n * mergeMap(x => x % 2 === 1 ? of('a', 'b', 'c') : EMPTY),\n * );\n * result.subscribe(x => console.log(x));\n *\n * // Results in the following to the console:\n * // x is equal to the count on the interval, e.g. (0, 1, 2, 3, ...)\n * // x will occur every 1000ms\n * // if x % 2 is equal to 1, print a, b, c (each on its own)\n * // if x % 2 is not equal to 1, nothing will be output\n * ```\n *\n * @see {@link Observable}\n * @see {@link NEVER}\n * @see {@link of}\n * @see {@link throwError}\n */\nexport const EMPTY = new Observable((subscriber) => subscriber.complete());\n\n/**\n * @param scheduler A {@link SchedulerLike} to use for scheduling\n * the emission of the complete notification.\n * @deprecated Replaced with the {@link EMPTY} constant or {@link scheduled} (e.g. `scheduled([], scheduler)`). Will be removed in v8.\n */\nexport function empty(scheduler?: SchedulerLike) {\n return scheduler ? emptyScheduled(scheduler) : EMPTY;\n}\n\nfunction emptyScheduled(scheduler: SchedulerLike) {\n return new Observable((subscriber) => scheduler.schedule(() => subscriber.complete()));\n}\n", "import { SchedulerLike } from '../types';\nimport { isFunction } from './isFunction';\n\nexport function isScheduler(value: any): value is SchedulerLike {\n return value && isFunction(value.schedule);\n}\n", "import { SchedulerLike } from '../types';\nimport { isFunction } from './isFunction';\nimport { isScheduler } from './isScheduler';\n\nfunction last(arr: T[]): T | undefined {\n return arr[arr.length - 1];\n}\n\nexport function popResultSelector(args: any[]): ((...args: unknown[]) => unknown) | undefined {\n return isFunction(last(args)) ? args.pop() : undefined;\n}\n\nexport function popScheduler(args: any[]): SchedulerLike | undefined {\n return isScheduler(last(args)) ? args.pop() : undefined;\n}\n\nexport function popNumber(args: any[], defaultValue: number): number {\n return typeof last(args) === 'number' ? args.pop()! : defaultValue;\n}\n", "export const isArrayLike = ((x: any): x is ArrayLike => x && typeof x.length === 'number' && typeof x !== 'function');", "import { isFunction } from \"./isFunction\";\n\n/**\n * Tests to see if the object is \"thennable\".\n * @param value the object to test\n */\nexport function isPromise(value: any): value is PromiseLike {\n return isFunction(value?.then);\n}\n", "import { InteropObservable } from '../types';\nimport { observable as Symbol_observable } from '../symbol/observable';\nimport { isFunction } from './isFunction';\n\n/** Identifies an input as being Observable (but not necessary an Rx Observable) */\nexport function isInteropObservable(input: any): input is InteropObservable {\n return isFunction(input[Symbol_observable]);\n}\n", "import { isFunction } from './isFunction';\n\nexport function isAsyncIterable(obj: any): obj is AsyncIterable {\n return Symbol.asyncIterator && isFunction(obj?.[Symbol.asyncIterator]);\n}\n", "/**\n * Creates the TypeError to throw if an invalid object is passed to `from` or `scheduled`.\n * @param input The object that was passed.\n */\nexport function createInvalidObservableTypeError(input: any) {\n // TODO: We should create error codes that can be looked up, so this can be less verbose.\n return new TypeError(\n `You provided ${\n input !== null && typeof input === 'object' ? 'an invalid object' : `'${input}'`\n } where a stream was expected. You can provide an Observable, Promise, ReadableStream, Array, AsyncIterable, or Iterable.`\n );\n}\n", "export function getSymbolIterator(): symbol {\n if (typeof Symbol !== 'function' || !Symbol.iterator) {\n return '@@iterator' as any;\n }\n\n return Symbol.iterator;\n}\n\nexport const iterator = getSymbolIterator();\n", "import { iterator as Symbol_iterator } from '../symbol/iterator';\nimport { isFunction } from './isFunction';\n\n/** Identifies an input as being an Iterable */\nexport function isIterable(input: any): input is Iterable {\n return isFunction(input?.[Symbol_iterator]);\n}\n", "import { ReadableStreamLike } from '../types';\nimport { isFunction } from './isFunction';\n\nexport async function* readableStreamLikeToAsyncGenerator(readableStream: ReadableStreamLike): AsyncGenerator {\n const reader = readableStream.getReader();\n try {\n while (true) {\n const { value, done } = await reader.read();\n if (done) {\n return;\n }\n yield value!;\n }\n } finally {\n reader.releaseLock();\n }\n}\n\nexport function isReadableStreamLike(obj: any): obj is ReadableStreamLike {\n // We don't want to use instanceof checks because they would return\n // false for instances from another Realm, like an + +

Qualidade

+

Com o objetivo de manter a qualidade do código do trabalho, foram realizados diversos testes, cada um deles garantindo o correto funcionamento de um componente do trabalho. Foi estabelecido como objetivo (...)

+

Riscos

+

Riscos planejados

+

Externo

+
    +
  • Integrante com problema de saúde
  • +
  • Indisponibilidade do cliente
  • +
  • Falha de equipamento
  • +
+

Gerencial

+
    +
  • Saída de algum integrante do projeto
  • +
  • Falta de participação de algum integrante do projeto
  • +
  • Falta de integração da equipe
  • +
  • Alteração no escopo do projeto
  • +
  • Falta de disponibilização de releases para o cliente testar
  • +
  • Falta de participação durante as reuniões
  • +
  • Sobrecarga de membros da equipe
  • +
+

Organizacional

+
    +
  • Divergência nos horários disponíveis dos integrantes
  • +
  • Dependência entre atividades
  • +
+

Técnico

+
    +
  • Dificuldade com as tecnologias definidas
  • +
  • Problemas com a infraestrutura de rede
  • +
  • Dificuldade na adaptação a novas ferramentas
  • +
+

Riscos Enfrentados

+
    +
  • Dificuldade da equipe com novas tecnologias, resultando em uma participação mais ativa no frontend
  • +
  • Alteração no escopo do projeto
  • +
  • Sobrecarga de membros da equipe
  • +
  • Falta de integração da equipe
  • +
+ + + + + + + + + + + + + + +
+ + +
+
+
+ + + + + + + + + \ No newline at end of file diff --git a/gestaoDoProjeto/arquitetura/index.html b/gestaoDoProjeto/arquitetura/index.html new file mode 100644 index 0000000..70a245e --- /dev/null +++ b/gestaoDoProjeto/arquitetura/index.html @@ -0,0 +1,2064 @@ + + + + + + + + + + + + + + + + + + + + + + + Documento de Arquitetura - GEROcuidado + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + + + + + + +
+ +
+ + + + +
+
+ + + +
+
+
+ + + + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + +

Documento de Arquitetura

+

Histórico de versões

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
VersãoDataDescriçãoAutores
1.015/10/2023Abertura do documentoPedro Cella
1.124/07/2024Adaptação para a nova versão mobileVictor Gonçalves
1.212/09/2024Reestruturação do projeto conforme descoberta de versão mobile já existenteMarcella Anderle
+

Introdução

+

Esse documento tem a finalidade de explicar sobre as decisões arquiteturais do projeto, nesse documento o foco será entender mais sobre como funcionará o sistema como um todo, ou seja, como é feita a interação do usuário com o produto, quais são os microsserviços e de que forma eles foram definidos, entre outras possíveis dúvidas que possam surgir.

+

Escopo

+

O GEROcuidado é um aplicativo projetado para auxiliar seus usuários, que incluem cuidadores formais e informais, idosos autônomos e familiares, na organização e acompanhamento da saúde dos idosos, seja como parte de suas responsabilidades de cuidador ou de sua própria família, como um pai ou uma mãe. No caso dos idosos autônomos, esse acompanhamento é realizado de si mesmo.

+

O MVP acordado com os proprietários do aplicativo (Enactus), foi que neste semestre 2024.1, o GEROcuidado será entregue como um aplicativo mobile nativo (aplicativo baixável). A versão do aplicativo a ser lançada contemplará as seguintes funcionalidades:

+
    +
  • Login de usuário no aplicativo
  • +
  • Recuperação de senha
  • +
  • Cadastro de perfis segregados de idosos
  • +
  • Cadastro de remédios e alimentos consumidos pelo idoso
  • +
  • Cadastro de tarefas da rotina do idoso
  • +
  • Disponibilização do Fórum de forma online no navegador
  • +
  • Tela de visualização de rotina do idoso
  • +
  • Registro de métricas de saúde
  • +
  • Extração de relatórios de métricas de saúde
  • +
  • Visualização inteligente de métricas de saúde (Dashboard)
  • +
  • Edição de post no forum
  • +
  • Sistema de FAQ
  • +
+

Como possíveis incrementos:

+
    +
  • Interagir com posts do fórum através de curtidas e comentários
  • +
  • Opção de visualização semanal das tarefas em caledário
  • +
  • Opção de visualização mensal das tarefas em caledário
  • +
  • Disponibilização do cadastro do idoso para diversas contas
  • +
  • Customização de notificações
  • +
  • Suporte do aplicativo
  • +
  • Sistema de check-in e check-out na casa do idoso
  • +
  • Login por biometria
  • +
  • Acessar aplicativo usando outras plataformas como login (Google, Facebook, etc.)
  • +
+

No entanto, no mês de agosto, foi descoberto que já havia um aplicativo com as funcionalidades prontas, o que mudou a rota do desenvolvimento por completo. Por isso, foi realizado as atualizações abaixo:

+
    +
  • Informações de Idoso, Rotina e Métricas: Estão configuradas para buscar dados a partir de um banco local do celular.
  • +
  • Informações de Usuário: Também buscam no servidor além de apontar pro banco local do celular.
  • +
+

Além disso, as seguintes melhorias foram adicionadas ao aplicativo existente:

+
    +
  • Cadastrar, visualizar, editar e apagar perfis de idosos offline.
  • +
  • Editar informações do perfil de usuário offline.
  • +
  • Cadastrar medicamentos e alimentos no perfil de idoso.
  • +
  • Resolução de bugs de experiência de usuário.
  • +
  • Cadastrar, visualizar, editar e apagar métricas de um idoso.
  • +
  • Cadastrar, visualizar, editar e apagar tarefas da rotina do idoso.
  • +
+

Arquitetura

+

A arquitetura abaixo ilustra a forma como irá funcionar todas as partes, sendo elas o Frontend, onde ocorre o input através da interface de usuário, após esse input, caso o aplicativo esteja conectado à internet é encaminhado para o microsserviço especificado, sendo eles o Microsserviço Usuário atrelado as funcionalidades de CRUD quanto aos usuários e perfis de usuário, Microsserviço Fórum associado a parte do fórum, publicações, like e comentário e finalmente o Microsserviço Saúde, responsável pelas informações de saúde do idoso, como pressão, oxigenação do sangue, entre outros. Além disso temos os bancos de cada microsserviços, responsável por armazenar todas essas informações. Abaixo a arquitetura ilustrando todos esses pedaços:

+ + +

Frontend

+

O front-end do GEROcuidado é uma aplicação nativa android, que poderá ser baixada e instalada diretamente nos smartphones dos usuários. A aplicação é construída de tal forma que poderá ser usada com e sem conexão com a internet. Os serviços descritos abaixo servem como uma nuvem de dados para o que o usuário já consegue realizar no aplicativo.

+

O front-end é desenvolvido em React Native utilizando Javascript como linguagem principal. O banco de dados utilizado é o WatermelonDB, que utiliza como recurso o próprio SQLite disponibilizado no Android.

+

Microsserviço Usuário

+

O microsserviço de Usuário no aplicativo GEROcuidado desempenha um papel essencial na autenticação e gestão de usuários, abrangendo cuidadores formais, idosos autônomos e familiares. Este microsserviço oferece funcionalidades fundamentais relacionadas ao registro e gerenciamento de contas de usuário, permitindo que os usuários acessem as diversas funcionalidades do sistema. Suas principais funcionalidades incluem:

+
    +
  1. CRUD de Usuário (Create, Read, Update, Delete): Os cuidadores formais, idosos autônomos e familiares têm a capacidade de se registrar na plataforma, fornecendo informações pessoais, como nome, endereço de e-mail, senha segura e outros detalhes relevantes. Esse processo de registro é fundamental para criar uma conta no aplicativo, permitindo o acesso às funcionalidades e recursos disponíveis.
  2. +
+

Além disso, o microsserviço de Usuário também se concentra em questões de segurança, implementando políticas de senhas robustas e fornecendo uma funcionalidade de recuperação de senha para garantir a proteção dos dados dos usuários. Isso ajuda a garantir que apenas usuários autorizados tenham acesso ao sistema e que suas informações estejam protegidas.

+

Em resumo, o microsserviço de Usuário é a pedra angular da autenticação e do gerenciamento de contas de usuário no aplicativo GEROcuidado, permitindo que cuidadores, idosos autônomos e familiares acessem e utilizem as funcionalidades do sistema de forma segura e eficiente.

+

Microsserviço Fórum

+

O microsserviço de Fórum no aplicativo GEROcuidado desempenha um papel crucial na interação e comunicação entre os usuários, que incluem cuidadores formais, cuidadores informais, idosos autônomos e familiares. Este microsserviço é projetado para fornecer funcionalidades relacionadas ao compartilhamento de informações, discussões e interações no fórum do aplicativo. Suas principais funcionalidades incluem:

+
    +
  1. +

    CRUD de Publicação no Fórum: Os usuários, que podem ser cuidadores formais, cuidadores informais, idosos autônomos ou familiares, têm a capacidade de criar, ler, atualizar e excluir (CRUD) publicações no fórum. Isso permite que os usuários compartilhem informações, façam perguntas, forneçam dicas ou discutam tópicos relacionados ao cuidado de idosos.

    +
  2. +
  3. +

    Moderação de Publicações: O microsserviço de Fórum também inclui funcionalidades de moderação. Os moderadores, designados para garantir a qualidade e o respeito no fórum, têm a capacidade de revisar e moderar as publicações. Isso inclui a capacidade de aprovar, editar ou excluir publicações para evitar informações imprecisas ou conteúdo inadequado.

    +
  4. +
  5. +

    Interação com Publicações: Além das funcionalidades CRUD, os usuários têm a capacidade de interagir com as publicações no fórum. Eles podem "curtir" publicações (likes) e deixar comentários para criar discussões e promover a interação entre os membros da comunidade.

    +
  6. +
+

Através do microsserviço de Fórum, o aplicativo GEROcuidado promove uma comunidade de usuários onde cuidadores formais, cuidadores informais, idosos autônomos e familiares podem trocar informações, apoio e experiências, promovendo um ambiente de aprendizado e colaboração. O foco na moderação garante que o fórum permaneça informativo e respeitoso.

+

Microsserviço Saúde

+

O microsserviço de Saúde no aplicativo GEROcuidado desempenha um papel fundamental na gestão e acompanhamento da saúde dos idosos, cuidadores formais, cuidadores informais e familiares. Este microsserviço é projetado para fornecer funcionalidades relacionadas ao registro, acompanhamento e gerenciamento de informações de saúde, bem como rotinas de cuidados. Suas principais funcionalidades incluem:

+
    +
  1. +

    CRUD de Informações de Saúde do Idoso: Os cuidadores formais, cuidadores informais, idosos autônomos e familiares têm a capacidade de registrar, atualizar, visualizar e apagar informações de saúde, como métricas vitais (por exemplo, frequência cardíaca, oxigenação do sangue) e outras informações relevantes para o acompanhamento da saúde. Isso permite que os usuários acompanhem de perto a saúde dos idosos sob seus cuidados ou suas próprias métricas de saúde.

    +
  2. +
  3. +

    CRUD de Rotina: Os cuidadores, tanto formais quanto informais, podem cadastrar, visualizar, editar e remover informações sobre a rotina dos idosos que cuidam. Isso inclui informações sobre medicamentos, atividades físicas e alimentação, permitindo o controle dos horários e o cumprimento das necessidades específicas de cada idoso. Além disso, os idosos independentes também têm a opção de gerenciar sua própria rotina, registrando informações sobre medicamentos, atividades físicas e alimentação para serem lembrados dos horários.

    +
  4. +
  5. +

    Criação de Notificações: Os usuários podem receber notificações do aplicativo para lembrá-los de realizar atividades cadastradas, como tomar medicamentos, realizar exercícios ou seguir uma dieta específica. Isso ajuda a garantir que as tarefas de cuidado sejam cumpridas de forma consistente.

    +
  6. +
  7. +

    Adição de Agenda/Calendário: Os cuidadores podem agendar tarefas em um calendário para receber notificações sobre atividades importantes. Isso cria um calendário que permite o agendamento de tarefas e eventos relacionados ao cuidado dos idosos, garantindo que o cuidador seja lembrado das atividades no momento certo.

    +
  8. +
  9. +

    CRUD de Idosos: Os cuidadores formais, cuidadores informais e familiares podem gerenciar o cadastro de idosos no sistema, incluindo informações detalhadas sobre os idosos, como nome, idade, condições de saúde e preferências. Isso facilita o acompanhamento individualizado de cada idoso e o acesso rápido às informações de saúde e rotina específicas de cada um.

    +
  10. +
+

O microsserviço de Saúde é essencial para o acompanhamento eficaz da saúde dos idosos e a gestão de rotinas de cuidado, garantindo que as métricas de saúde sejam registradas e monitoradas, as rotinas sejam cumpridas e as notificações sejam usadas para manter todos os envolvidos informados sobre as atividades necessárias para a saúde e o bem-estar dos idosos.

+ + + + + + +
+
+ + +
+ +
+ + + +
+
+
+
+ + + + + + + + + \ No newline at end of file diff --git a/gestaoDoProjeto/backlog/index.html b/gestaoDoProjeto/backlog/index.html new file mode 100644 index 0000000..a369a12 --- /dev/null +++ b/gestaoDoProjeto/backlog/index.html @@ -0,0 +1,2029 @@ + + + + + + + + + + + + + + + + + + + + + + + Backlog - GEROcuidado + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + + + + + + +
+ +
+ + + + +
+
+ + + +
+
+
+ + + + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + +

Backlog do produto

+

Histórico de versões

+ + + + + + + + + + + + + + + + + +
VersãoDataModificaçãoAutor
1.023/07/2024Criação do documentoAmanda Nobre
+

Descrição

+

O backlog de um produto é uma lista priorizada de todos os requisitos, funcionalidades e melhorias que precisam ser implementados no produto. Essa lista é dinâmica e constantemente atualizada à medida que o projeto avança e novas necessidades surgem. Dentro do backlog, os itens podem ser organizados em épicos e histórias de usuário (US). Épicos são grandes corpos de trabalho que podem ser divididos em tarefas menores e mais gerenciáveis. Eles representam objetivos de alto nível e podem abranger várias sprints. Histórias de usuário, por outro lado, são descrições de funcionalidades do ponto de vista do usuário final. Elas são mais detalhadas e específicas, fornecendo uma visão clara do que precisa ser desenvolvido para atender às necessidades dos usuários. Enquanto os épicos fornecem uma visão macro das necessidades do produto, as histórias de usuário detalham os passos necessários para alcançar esses objetivos maiores.

+

Tabela de Backlog

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ÉpicoIDEu, comoDesejoPara que eu possa
LoginUS01Cuidadorfazer login no appacessar os serviços e funcionalidades no aplicativo
LoginUS02Cuidadorrecuperar senhafazer login na plataforma, caso perca o acesso a senha cadastrada
LoginUS03Cuidadoreditar minhas informações pessoaismanter meu perfil atualizado
Cadastro do perfil do idosoUS04Cuidadorcadastrar perfis de idososcadastrar informações e métricas para para os idosos cuidados
Cadastro do perfil do idosoUS05Cuidadorcadastrar remédios e alimentos no perfil do idosoter essas informações salvas e com fácil acesso
Tarefas/CalendárioUS06Cuidadorcadastrar tarefas da rotina do idosoorganizar a rotina do idoso
Tarefas/CalendárioUS07Cuidadorvisualizar as tarefas da rotina de um idososeguir a rotina que foi cadastrada
Tarefas/CalendárioUS08Cuidadormarcar as tarefas como concluídas ou não concluidassaber quais tarefas foram realizadas
MétricasUS09Cuidadorcadastrar métricas de um idosoguardar informações importantes sobre as métricas do idoso
MétricasUS10Cuidadorvisualizar as métricas cadastradas de forma visual (gráficos, dashboard)interpretar melhor, mais facilmente e com mais rapidez as métricas cadastradas
MétricasUS11Cuidadorgerar um relatório das métricas do idososalvar as métricas de um determinado período e mantê-la de fácil acesso
FórumUS12Cuidadorparticipar de um fórumtirar dúvidas, compartilhar e obter informações
FórumUS13Cuidadoreditar uma postagem após ter postadocorrigir possiveis erros e/ou alterar informações da postagem
SuporteUS14Cuidadorter acesso a um f.a.q (dúvidas frequents) sobre o aplicativoesclarecer dúvidas comuns a respeito do aplicativo
SuporteUS15Cuidadorter um tutorial explicativo das funcionalidades do aplicativo no primeiro acessosaber como usar o aplicativo desde o primeiro acesso
+
    +
  • Esta tabela tem o objetivo apenas de relacionar os Épicos, as histórias de usuário (US) e as personas com seus objetivos.
  • +
+

Roadmap

+

O Roadmap do produto pode ser encontrado no ZenHub do repositório de documentação: Roadmap do produto

+ + + + + + +
+
+ + +
+ +
+ + + +
+
+
+
+ + + + + + + + + \ No newline at end of file diff --git a/gestaoDoProjeto/codigo_de_conduta/index.html b/gestaoDoProjeto/codigo_de_conduta/index.html new file mode 100644 index 0000000..b094170 --- /dev/null +++ b/gestaoDoProjeto/codigo_de_conduta/index.html @@ -0,0 +1,1956 @@ + + + + + + + + + + + + + + + + + + + + + + + Código de Conduta - GEROcuidado + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + + + + + + +
+ +
+ + + + +
+
+ + + +
+
+
+ + + + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + +

Código de Conduta

+

Histórico de versões

+ + + + + + + + + + + + + + + + + +
DataVersãoDescriçãoAutor
19/07/20241.0Criação do documentoNatália Rodrigues
+

Introdução

+

Nosso objetivo é criar um ambiente acolhedor e seguro para todos. Este código de conduta delineia nossas expectativas para todos aqueles que participam de nossa comunidade, bem como as consequências para comportamentos inaceitáveis.

+

Comportamento Esperado

+
    +
  • Seja inclusivo: Fomentar um ambiente onde todas as pessoas se sintam bem-vindas.
  • +
  • Seja respeitoso: Demonstre respeito por diferentes pontos de vista e experiências.
  • +
  • Aceite feedback construtivo: Esteja aberto a críticas e disposto a melhorar.
  • +
  • Seja colaborativo: Contribua de forma positiva para a comunidade e ajude os outros.
  • +
  • Respeite os limites pessoais: Respeite a privacidade e os limites de todos os membros.
  • +
+

Comportamento Inaceitável

+
    +
  • Assédio: Não será tolerado nenhum tipo de assédio, seja ele verbal, físico ou visual.
  • +
  • Discriminação: Discriminação baseada em idade, gênero, raça, orientação sexual, deficiência ou qualquer outra característica não será aceita.
  • +
  • Linguagem inapropriada: Uso de linguagem ofensiva ou depreciativa não será permitido.
  • +
  • Comportamento disruptivo: Atividades que interrompem ou prejudicam o ambiente da comunidade são proibidas.
  • +
+

Aplicação

+
    +
  • Relatar problemas: Qualquer pessoa que sofra ou testemunhe um comportamento inaceitável deve relatar o incidente aos organizadores do projeto.
  • +
  • Consequências: Os organizadores da comunidade tomarão medidas apropriadas para lidar com o comportamento inaceitável, que podem incluir um aviso, suspensão ou expulsão da comunidade.
  • +
  • Confidencialidade: Todas as queixas serão tratadas com discrição e confidencialidade.
  • +
+

Referências

+

Contributor Covenant

+ + + + + + +
+
+ + +
+ +
+ + + +
+
+
+
+ + + + + + + + + \ No newline at end of file diff --git a/gestaoDoProjeto/doc_banco/index.html b/gestaoDoProjeto/doc_banco/index.html new file mode 100644 index 0000000..f0fbfcb --- /dev/null +++ b/gestaoDoProjeto/doc_banco/index.html @@ -0,0 +1,2265 @@ + + + + + + + + + + + + + + + + + + + + + + + Documento de Banco de Dados - GEROcuidado + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + + + + + + +
+ +
+ + + + +
+
+ + + +
+
+
+ + + + + + + +
+
+
+ + + + + + + +
+
+ + + + + + + +

Documento de Banco de Dados

+

Histórico de versões

+ + + + + + + + + + + + + + + + + +
DataVersãoDescriçãoAutor
25/07/20241.0Criação do documentoAmanda Nobre
+

1. Introdução

+

+Este documento tem por objetivo reunir os principais documentos produzidos referentes ao banco de dados da aplicação. O intuito disso é proporcionar transparência e organização quanto ao que acreditamos ser a maneira mais adequada de contextualizar, diagramar e modelar os dados associados à problemática na qual o projeto GEROcuidado, bem como o produto de software a ele vinculado, está inserido. +

+ +

2. Documentos criados

+

2.1 MER

+

O Modelo Entidade-Relacionamento (MER) é uma abordagem conceitual usada no projeto de banco de dados para representar entidades, seus atributos e relacionamentos. Isso permite visualizar como os dados estão organizados e como as entidades se relacionam no sistema de informações. O MER é a base conceitual sobre a qual os Diagramas Entidade-Relacionamento (DER) são criados para representar graficamente essa estrutura.

+ +

2.1.1 Entidades

+

MER_ENTIDADES

+

2.1.2 Descrição das Entidades

+

MER_DESCRICAO_ENTIDADE

+

2.1.3 Relacionamentos

+

RELACIONAMENTOS 1 +RELACIONAMENTOS 2

+

2.2 DER

+

O Diagrama Entidade-Relacionamento (DER) é uma representação gráfica amplamente utilizada no projeto de bancos de dados. Ele descreve as entidades (objetos), seus atributos (características) e os relacionamentos entre as entidades. Os retângulos representam as entidades, as elipses indicam os atributos e as linhas conectam as entidades para mostrar como elas se relacionam. O DER é uma ferramenta fundamental para visualizar e planejar a estrutura de um banco de dados antes da implementação, ajudando a definir como os dados são armazenados e acessados

+ +

DER

+

2.3 DLD

+

+O Diagrama Lógico de Dados (DLD) é uma representação gráfica que ilustra a estrutura lógica de um banco de dados. Nesse diagrama, são exibidas informações cruciais, como os tipos de atributos associados a cada entidade, bem como as chaves estrangeiras e restrições, como a chave única (unique key). Seu propósito fundamental é fornecer uma representação estruturada e específica da maneira como o banco de dados deve ser implementado. Em resumo, o DLD funciona como uma representação visual que orienta a implementação efetiva do banco de dados.

+ +

DLD

+

2.4 Dicionário de Dados

+

+Um Dicionário de Dados é uma referência essencial em gerenciamento de dados. Ele é um documento ou repositório que descreve detalhadamente os elementos de um banco de dados, como tabelas, campos, relacionamentos e regras de negócios associadas. O Dicionário de Dados serve como uma fonte confiável de informações para desenvolvedores, analistas e outros stakeholders, garantindo a compreensão e a consistência dos dados dentro de um sistema. Ele fornece informações cruciais sobre a estrutura e a semântica dos dados, auxiliando na manutenção, integração e uso eficaz das informações em um contexto organizacional. +

+ +

2.4.1 Entidades

+

Usuário

+

USUARIO

+

Idoso

+

Idoso

+

Métricas de saúde

+

METRICA

+

Valor das métricas de saúde

+

VALOR_METRICA

+

Rotina

+

ROTINA

+

Publicação

+

PUBLICACAO

+

Like

+

LIKE

+

Comentário

+

COMENTARIO

+

2.4.2 Relacionamentos

+

Publicação tem comentário

+

PUB_TEM_COMENTARIO

+

Publicação tem like

+

PUB_TEM_LIKE

+

2.5 Documento de Banco de dados

+

O link contendo todos os documentos apresentados pode ser encontrado aqui.

+

Referências

+
    +
  • https://github.com/fga-eps-mds/2023-2-GEROcuidado-Doc/blob/main/docs/produto/banco_de_dados.md
  • +
+ + + + + + +
+
+ + +
+ +
+ + + +
+
+
+
+ + + + + + + + + \ No newline at end of file diff --git a/gestaoDoProjeto/estilo/index.html b/gestaoDoProjeto/estilo/index.html new file mode 100644 index 0000000..7c19936 --- /dev/null +++ b/gestaoDoProjeto/estilo/index.html @@ -0,0 +1,1965 @@ + + + + + + + + + + + + + + + + + + + + + + + Guia de Estilo - GEROcuidado + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + + + + + + +
+ +
+ + + + +
+
+ + + +
+
+
+ + + + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + +

Guia de Estilo

+

Histórico de versões

+ + + + + + + + + + + + + + + + + +
DataVersãoDescriçãoAutor
25/07/20241.0Criação do documentoAmanda Nobre
+

1. Introdução

+

Bem-vindo à Guia de Estilo da nossa aplicação! Este documento desempenha um papel vital na criação de uma experiência de usuário consistente. Aqui, você encontrará alguumas diretrizes de design que moldam a forma como nossa aplicação é apresentada ao mundo.

+

Imagine nossa Guia de Estilo como um mapa que orienta a jornada visual e interativa de nossa aplicação, por meio da definição de alguns dos elementos de design, como cores, tipografia e layout.

+

2. Nome da aplicação

+

O nome "Gero Cuidado" é muito mais do que um mero conjunto de palavras. Ele representa nosso firme compromisso em fornecer assistência e suporte de alta qualidade para os idosos, que merecem atenção e cuidados especiais. A palavra "Gero" é um prefixo derivado de "geriátrico", que está intrinsecamente ligado ao cuidado e à saúde das pessoas mais velhas. Reflete nossa dedicação em criar uma aplicação dedicada a melhorar a qualidade de vida e o bem-estar da população idosa.

+ +

Logo com Nome

+

Logo sem Nome

+

4. Tipografia

+

As fontes utilizadas na aplicação serão:

+
    +
  • Inter
  • +
+

Inter

+
    +
  • Roboto
  • +
+

Roboto

+
    +
  • Work Sans
  • +
+

Work Sans

+

5. Paleta de cores

+

paleta de cores

+

6. Elementos de interação

+

6.1. Estilos de interação

+
    +
  • +

    Navbar: será uma barra horizontal para a navegação do usuário no aplicativo. Cada item da navbar redirecionará a navegação para uma tela específica.

    +
  • +
  • +

    Vertical Scroll Picker: componente de interface do usuário que permite aos usuários fazerem seleções através de uma rolagem vertical. Esse tipo de controle é frequentemente usado para escolher entre diferentes opções, valores ou itens em uma lista, percorrendo-os para cima ou para baixo.

    +
  • +
  • +

    Botão: botões clicáveis com imagens que, ao ser clicado, leva o usuário até o conteúdo requerido

    +
  • +
  • +

    Botões de alternância (toggle): elementos de interface que permitem aos usuários ativar ou desativar uma opção com um simples toque ou clique.

    +
  • +
  • +

    Checkbox: recurso comum às caixas de diálogos usado para ativar ou desativar mais de uma função em um programa. Visualmente é representado por um quadrado branco, que quando selecionado apresenta uma marcação em seu interior.

    +
  • +
  • +

    Carousel: um slideshow para fazer um giro em vários coteúdos, construído com CSS 3D transforms e um pouco de JavaScript. Ele funciona com o uso de imagens, texto ou marcação personalizada. Também possui suporte para controles anterior, próximo e indicadores.

    +
  • +
  • +

    Campo de pesquisa: campo utilizado pelo usuário para fazer pesquisa rápida de algum conteúdo, dentro do aplicativo.

    +
  • +
  • +

    Cards: aqui serão os elementos que possuem geralmente uma imagem, pois podemos adicionar à essa imagem uma descrição. Ele pode ser tanto um link como um card explicativo, que poderá expandir para mostrar um conteúdo maior.

    +
  • +
  • +

    Sliders: é um painel de conteúdos em que o seu conteúdo principal muda em um tempo determinado para dar lugar a outro conteúdo. Isso serve para mostrar conteúdos variados em um mesmo lugar para o usuário. O mesmo poderá navegar entre os conteúdos ou clicar para ser redirecionado à página deste conteúdo.

    +
  • +
  • +

    Formulários: serão utilizados para login, para contato ou para qualquer outra atividade em que é necessário obter uma informação do usuário.

    +
  • +
+

Referências

+
    +
  • https://github.com/fga-eps-mds/2023-2-GEROcuidado-Doc/blob/main/docs/produto/guia_de_estilo.md
  • +
+ + + + + + +
+
+ + +
+ +
+ + + +
+
+
+
+ + + + + + + + + \ No newline at end of file diff --git a/gestaoDoProjeto/ferramentas/index.html b/gestaoDoProjeto/ferramentas/index.html new file mode 100644 index 0000000..07a2ca4 --- /dev/null +++ b/gestaoDoProjeto/ferramentas/index.html @@ -0,0 +1,2461 @@ + + + + + + + + + + + + + + + + + + + + + + + Ferramentas - GEROcuidado + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + + + + + + +
+ +
+ + + + +
+
+ + + +
+
+
+ + + + + + + +
+
+
+ + + + + + + +
+
+ + + + + + + +

Ferramentas

+

Histórico de versões

+ + + + + + + + + + + + + + + + + +
VersãoDataModificaçãoAutor
1.023/07/2024Criação do documentoUgor Brandão
+

Este documento tem como objetivo explicar as tecnologias que serão usadas no projeto GEROcuidado.

+

React Native

+
    +
  • O React Native é um framework desenvolvido pelo Facebook que utiliza de JavaScript e a biblioteca React para desenvolvimento de aplicativos para IOS e Android. Sendo essa sua principal vantagem, executar o mesmo código em diversas plataformas diferentes. Em vez de renderizar elementos na Web o React utiliza componentes nativos o que resulta em um melhor desempenho. O React Native possui uma grande variadade de componentes em sua biblioteca o que simplifica o desenvolvimento de interfaces complexas.
  • +
+
+ React Native Logo +
+ +

Alguns dos principais components do React Native são:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ComponentFunção
<View>É o Bloco de construção fundamental do React, usado para agrupar componentes e estilizá-los
<Text>Usado para exibir texto na interface do usuário
<TextInput>Usado para criar campos de entrada de texto
<ScrollView>É uma barra de rolagem que pode ser adicionado à uma área que contém outros componentes
<Button>Usado para criar botões interativos
<TouchableOpacity>Torna qualquer elemento envolto nele clicável
<FlatList> <SectionList>Usados para renderizar listas
<WebView>Usado para destacar páginas da web dentro do aplicativo
+
    +
  • O framework também inclui as chamadas "Hooks" que são funções que permitem adicionar estado e outras funcionalidades para componentes tornando o desenvolvimento mais simples e reutilizável.
  • +
+

Algumas das principais Hooks disponíveis:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
HookFunção
useStateÉ uma hook para adicionar estado aos componentes, o que permite reagir a mudanças e atualizar a interface do usuário
useEffectUsada para executar efeitos colaterais em componentes, pode ser usado para buscar dados em uma API, por exemplo
useContextPermite acessar o contexto de um componente pai, sem a necessidade de passar props para todos os níveis
useRefPermite adicionar referência que pode ser usado para acessar o DOM ou outros elementos
Custom hooksÉ possível criar suas próprias hooks personalizadas para abstrair lógicas em diferentes componentes
+
+

Documentação Oficial: https://reactnative.dev/docs/getting-started

+
+

Expo

+
    +
  • O expo é uma ferramenta de desenvolvimento de aplicativos usando React Native. Sua principal vantagem é a simplificação no processo de configuração de ambiente. Além disso ele também oferece um conjunto de ferramentas úteis à criação, execução e depuração de aplicativos. O Expo Go é um aplicativo que permite a visualização em tempo real da aplicação em seu Aparelho pessoal, o que é bem mais fácil para testar o apliactivo durante o desenvolvimento.
  • +
+
+ Expo Logo +
+ +
    +
  • Para instalar o Expo basta utilizar o gerenciador de pacotes do NodeJs e executar o comando:
  • +
+
npm install expo
+
+
    +
  • E para iniciar um servidor:
  • +
+
npm expo start
+
+
+

Documentação Oficial: https://docs.expo.dev/more/expo-cli/

+
+

Nest JS

+
    +
  • O NestJS é um framework de desenvolvimento serverside (back-end) baseado em Node.js. O framework utiliza TypeScript (ainda permite que o desenvolvedor programe em JavaScript puro) e combina elementos da OOP (Object Oriented Programming), FP (Functional Programming) e FRP (Functional Reactve Programming). Por baixo dos panos ele também faz uso do Express que é outro framework web. Outra característica interessente que o Nest faz uso são as injeções de dependências para gerenciar a criação e vida de objetos usados no aplicativo.
  • +
+
+ NestJS Logo +
+ +

Modules

+
    +
  • Uma das principais partes do Nest são os módulos, são usadas para organizar e estruturar a aplicação. Eles ajudam as dividir o código em diferentes partes o que ajuda a escalabilidade do projeto. Módulos possuem algumas propriedades, eles são: provedores, controladores, importadoes e exportadores.
  • +
+

Middleware

+
    +
  • As Middlewares são funções intermediárias entre o cliente e o servidor. Representam um papel crítico em requisições HTTP, oferecem controle, flexibilidade e reusabilidade, permitindo executar ações antes ou depois de uma requisição.
  • +
+

Controllers

+
    +
  • Os controladores são responsáveis por lidar com requisições retornar respostas para o cliente. Eles promovem uma organização modular e separação clara de responsabilidades.
  • +
+

Microserviços

+
    +
  • O NestJS tem suporte nativo para a arquitetura de microserviços.
  • +
+

Instalação

+
    +
  • Para instalar o Nest JS você pode criar o scaffold do projeto com o Nest CLI ou clonar um projeto inicial (ambos produzirão o mesmo resultado).
  • +
  • Sendo assim, para estruturar o projeto com o Nest CLI digite os seguintes comandos. Isso criará um novo diretório de projeto e prencherá com os arquivos Nest JS principais iniciais:
  • +
+
$ npm i -g @nestjs/cli
+$ nest new project-name
+
+
    +
  • Alternativamente, para instalar o projeto inicial TypeScript com Git :
  • +
+
$ git clone https://github.com/nestjs/typescript-starter.git project
+$ cd project
+$ npm install
+$ npm run start
+
+
    +
  • Para instalar a versão JavaScript do projeto inicial, use na sequência dos comandos acima :
  • +
+
javascript-starter.git
+
+
+

Documentação Oficial: https://docs.nestjs.com/

+
+

Docker

+
    +
  • Docker é uma plataforma aberta para desenvolvimento, envio e execução de aplicativos. A plataforma oferece a capacidade de empacotar, distribuir e executar aplicativos, de forma consistente, em um ambiente isolado chamado container, que contêm tudo o que é necessário para executar o aplicativo.
  • +
  • Além disso, é possível compartilhar containers e garantir que todas as pessoas com quem você compartilha recebam o mesmo container que funciona da mesma maneira. Assim, o Docker evita inconsistências de ambiente, permite o desenvolvimento de um ambiente padronizado e facilita a colaboração.
  • +
  • Dessa forma, o Docker é uma ferramenta fundamental para melhorar a eficiência no desenvolvimento e na implantação de software.
  • +
+
+ Docker Logo +
+ +

Containers

+
    +
  • Um container é uma instância executável de uma imagem. É uma unidade de software que empacota uma aplicação e todas as suas dependências, incluindo bibliotecas, configurações e arquivos, em um único pacote executável. Esses containers são projetados para serem portáteis e consistentes, permitindo que uma aplicação seja executada de forma confiável e isolada em qualquer ambiente que suporte a tecnologia de containers.
  • +
+

Imagens

+
    +
  • As imagens Docker são usadas como base para criar instâncias de containers em tempo de execução. Elas são uma parte fundamental da tecnologia de containerização e contêm todas as informações necessárias para criar um container, como códigos, dependências, bibliotecas, variáveis ​​de ambiente e configurações. Por isso, desempenham um papel crucial na portabilidade e na consistência dos containers.
  • +
  • Outro ponto importante é sobre a possibilidade de versionamento das imagens Docker, o que permite rastrear e controlar as diferentes versões de um aplicativo.
  • +
+

Vantagens do Docker

+
    +
  • O Docker utiliza containers para isolar aplicativos e suas dependências. Isso garante que cada aplicativo seja executado de forma independente, evitando conflitos de versões e problemas de compatibilidade.
  • +
  • Os containers Docker são leves e empacotam todos os componentes necessários para a execução de um aplicativo, tornando-o portátil.
  • +
  • O Docker agiliza o ciclo de vida de desenvolvimento, permitindo que os desenvolvedores trabalhem em ambientes padronizados.
  • +
  • Os containers Docker podem ser implantados rapidamente, reduzindo o tempo necessário para provisionar e escalar aplicativos. Isso é especialmente útil em ambientes de desenvolvimento ágil e DevOps.
  • +
  • As imagens Docker podem ser versionadas, o que permite o controle preciso das versões de aplicativos e a reversão para versões anteriores, se necessário.
  • +
+

Instalação

+ +

WatermelonDB

+
    +
  • +

    WatermelonDB é um banco de dados para React Native e React, projetado para lidar com grandes conjuntos de dados complexos e fornecer consultas rápidas e eficientes. Ele é especialmente útil para aplicativos móveis que exigem sincronização offline e processamento em lote.

    +
  • +
  • +

    WatermelonDB é uma solução de código aberto e oferece uma série de recursos avançados, incluindo:

    +
  • +
  • Consultas rápidas
  • +
  • Modelo de dados reativo
  • +
  • Suporte a sincronização offline
  • +
  • Controle de transações
  • +
  • Mapeamento de relações
  • +
  • Flexibilidade de extensões
  • +
+
+WatermelonDB Logo +
+ +
    +
  • Além disso, o WatermelonDB permite a personalização por parte do desenvolvedor, incluindo a adição de:
  • +
  • Esquemas personalizados
  • +
  • Modelos de dados
  • +
  • Consultas avançadas
  • +
  • Hooks e middleware
  • +
+

Instalação

+
    +
  • Para instalar o WatermelonDB em um projeto React Native ou React, use o gerenciador de pacotes npm ou yarn. Aqui está um exemplo de como instalar usando npm:
  • +
+
$ npm install @nozbe/watermelondb
+$ npm install @nozbe/watermelondb/adapters/sqlite
+
+
    +
  • Para instalar usando yarn, execute:
  • +
+
$ yarn add @nozbe/watermelondb
+$ yarn add @nozbe/watermelondb/adapters/sqlite
+
+
    +
  • A seguir, configure o ambiente de desenvolvimento, incluindo o plugin Babel necessário e a configuração do SQLite.
  • +
+

Fundamentos da Arquitetura

+
    +
  • +

    WatermelonDB utiliza uma arquitetura baseada em modelos e adaptadores. Aqui estão os componentes principais:

    +
  • +
  • +

    Modelos: Representam as tabelas e registros do banco de dados, definidos usando classes JavaScript.

    +
  • +
  • Adaptadores: Gerenciam a interação com o armazenamento físico, como SQLite.
  • +
  • Consultas: Utilizam uma API reativa para buscar e manipular dados de maneira eficiente.
  • +
  • +

    Sincronização: Suporte para sincronização offline-first, útil para aplicativos móveis com conectividade intermitente.

    +
  • +
  • +

    O modelo de dados reativo permite que as interfaces de usuário sejam atualizadas automaticamente quando os dados no banco de dados mudam, proporcionando uma experiência de usuário mais fluida.

    +
  • +
  • +

    Para mais informações sobre WatermelonDB, consulte a documentação oficial:

    +
  • +
+
+

Documentação Oficial: https://nozbe.github.io/WatermelonDB/

+
+

Referências

+
+

[1] Documentação do Projeto GEROcuidado - Ferramentas

+
+

Histórico de versões

+ + + + + + + + + + + + + + + + + +
VersãoDataDescriçãoAutores
1.025/07/2024Documentação React Native, Expo, NestJS, Docker e WatermelondbUgor Brandão
+ + + + + + +
+
+ + +
+ +
+ + + +
+
+
+
+ + + + + + + + + \ No newline at end of file diff --git a/gestaoDoProjeto/guia_contribuicao/index.html b/gestaoDoProjeto/guia_contribuicao/index.html new file mode 100644 index 0000000..169c235 --- /dev/null +++ b/gestaoDoProjeto/guia_contribuicao/index.html @@ -0,0 +1,2270 @@ + + + + + + + + + + + + + + + + + + + + + + + Guia de Contribuição - GEROcuidado + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + + + + + + +
+ +
+ + + + +
+
+ + + +
+
+
+ + + + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + +

Como contribuir

+

Histórico de versões

+ + + + + + + + + + + + + + + + + +
DataVersãoDescriçãoAutor
05/04/20241.0Criação do documentoAmanda Nobre
+

Issues

+

Ao criar issues atente-se as seguintes questões:

+
    +
  • Já existe issue referente ao assunto que você pretende abordar na sua? Se sim, trabalhe a partir da issue já criada
  • +
  • Adicione um título que sintetize bem o problema abordado na issue
  • +
  • Adicione uma descrição adequada, de modo que qualquer membro do repositório consiga compreender qual é o problema
  • +
  • Adicione ao menos um Assignee
  • +
  • Adicione as Labels adequadas
  • +
  • Adicione a milestone referente a sprint em que o problema será trabalhado
  • +
  • Adicione um Estimate segundo as definições descritas nesse documento
  • +
+

Definição de Estimate

+

Deve-se definir uma estimativa de dificuldade (pontuação) à issue em questão, levando em consideração os seguintes critérios:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
PontuaçãoCritérios
1Tarefa bem simples, é possível ser feita em até 1h
2Tarefa simples que leva algumas horas
3Tarefa que pode levar algumas horas e necessita de alguma pesquisa
5Tarefa não tão simples, precisa de pesquisa e deve levar alguns dias
8Tarefa complexa, pode durar a semana toda
13Tarefa muito complexa, provavelmente levará mais que uma sprint, melhor rever e dividir em mais de uma issue
+

A pontuação da issue deverá ser levada a votação utilizando a ferramenta de planning poker do zenhub.

+

image

+
    +
  • Para issues que envolvem apenas um time, todo o time deverá ser adicionado ao planning poker.
  • +
  • Para issues que envolvam mais de um time, apenas os colaboradores deverão ser adicionados ao planning poker.
  • +
+

Branches

+

Padronizar evita confusões e torna mais fácil a leitura e a procura por artefatos do projeto, e isso também se aplica à nomenclatura de branches. Por padrão, a nomenclatura de branches deve obedecer o seguinte formato:

+

<type>/<branch-name>

+

Type

+

O parâmetro type sinaliza qual o principal tipo de modificação realizada. Por padrão, utilizamos as seguintes palavras chaves:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
TypeSignificado
featNovas funcionalidades para o usuário
fixCorreções de bugs para o usuário
docsModificações na documentação
styleFormatação, sem alterações no código de produção
refactorRefatoração de código de produção
testAdição e refatoração de testes (sem alterar código de produção)
choreAtualizações genéricas sem alterações de código de produção
+

Branch name

+

O parâmetro branch-name descreve de forma textual a atividade realizada dentro da branch. Por padrão, o nome da branch é escrito em inglês substituindo os espaços por hífen "-". Por exemplo: Create new tests for user se torna create-new-tests-for-user.

+
+

Atente-se para a criação de um nome coerente para sua branch, a fim de evitar confusões e incoerências.

+
+

Exemplos

+

Uma branch para adição de novos testes para a um user:

+
+

test/create-new-tests-for-user

+
+

Uma branch para correção de um bug na criação de user:

+
+

fix/remove-bug-from-user-creation

+
+

Criação de Branches

+

A partir do repositório desejado:

+
    +
  1. Atualize seu repositório local buscando por novidades no repositório remoto.
  2. +
+
git fetch
+
+
    +
  1. Mude para a branch principal, seja develop ou main.
  2. +
+
git checkout _branch-principal_
+
+
    +
  1. Sincronize o estado da branch local com o estado da branch remota.
  2. +
+
git reset --hard _branch-principal_
+
+
    +
  1. A partir da branch atual, crie a nova branch obedecendo a convenção de nomes.
  2. +
+
git checkout -b <type>/<branch>
+
+

Commits

+

A política de commits desse projeto é baseada no +Conventional Commits v1.0.0.

+

Conventional Commits define um conjunto de regras simples para que as mensagens +commit sejam consistentes no histórico de um repositório. Utilizar uma convenção +como essa facilita a leitura do histórico, a identificação das mudanças +realizadas por um commit e facilita a adoção de ferramentas de automação para +gerar changelogs ou release notes.

+

Por padrão, as mensagens de commits devem seguir o seguinte formato:

+
<type>: <subject>
+
+

Type

+

Assim como para as branches, type descreve o tipo da modificação contemplada pelo commit. Por padrão, utilizamos as seguintes palavras chaves:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
TypeSignificado
featNovas funcionalidades para o usuário
fixCorreções de bugs para o usuário
docsModificações na documentação
styleFormatação, sem alterações no código de produção
refactorRefatoração de código de produção
testAdição e refatoração de testes (sem alterar código de produção)
choreAtualizações genéricas sem alterações de código de produção
+

Subject

+

O parâmetro subject representa a mensagem que descreve o commit escrita em inglês. Uma boa prática que diz respeito a commits é a de sempre escrever subjects descritivos, isto é, sempre se preocupando em deixar bem claro os conceitos what e why.

+

Para clarificar as recomendações aqui mencionadas, confira estes exemplos:

+
+

Modifies user model
+Ao avaliar esta mensagem de commit, o conceito what é superficial, pois não descreve especificamente o que foi alterado na model user. +Já o conceito why sequer existe.

+

Modifies user's model name field to make it shorter
+Ao avaliar esta mensagem de commit, quem quer que a leia entenderá o motivo, e do que se trata a alteração feita. Tal coisa permite poupar esfoço e tempo para entender do que o commit se trata.

+
+

Pull Request

+

Ao fazer um pull request atente-se para:

+
    +
  • Seguir o template configurado.
  • +
  • Linkar o PR a sua Issue correspondente.
  • +
  • Marcar um dos responsáveis para revisão.
  • +
+

Referências

+

Commits Convencionais

+

Git branch naming conventions

+

Gerenciando seus branches com o Git Flow

+

Políticas do Repositório

+ + + + + + +
+
+ + +
+ +
+ + + +
+
+
+
+ + + + + + + + + \ No newline at end of file diff --git a/index.html b/index.html new file mode 100644 index 0000000..8449536 --- /dev/null +++ b/index.html @@ -0,0 +1,1967 @@ + + + + + + + + + + + + + + + + + + + + + GEROcuidado + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + + + + + + +
+ +
+ + + + +
+
+ + + +
+
+
+ + + + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + +

GEROcuidado

+
+logo
+ +

O GEROcuidado se propõe a ser um +gerenciador de registro da rotina de +cuidados, por meio de orientações de +saúde e rede de apoio entre os cuidadores +de idosos. O Projeto foi criado +a partir do edital Prêmio Inspirando +Cuidado 2022, com o objetivo de +incentivar e prestar auxílio a projetos +trabalhando com a ODS 3 (Saúde e +Bem-estar).

+

Equipe

+

A equipe é composta por 9 membros ao todo, sendo 3 de EPS e 6 de MDS, afim de documentar o projeto, além de resolver bugs e incrementar o projeto com novas funcionalidades.

+

Integrantes de EPS

+
+ +
+
+ +
+ +
+ +
+
+ +
+ +
+ +
+
+ +
+ +
+ +
+ +

Integrantes de MDS

+
+ +
+
+ +
+ +
+ +
+
+ +
+ +
+ +
+
+ +
+ +
+ +
+
+ +
+ +
+ +
+
+ +
+ +
+ +
+
+ +
+ +
+ +
+ + + + + + +
+
+ + +
+ +
+ + + +
+
+
+
+ + + + + + + + + \ No newline at end of file diff --git a/lean_inception/dia_1/index.html b/lean_inception/dia_1/index.html new file mode 100644 index 0000000..d0e67da --- /dev/null +++ b/lean_inception/dia_1/index.html @@ -0,0 +1,2003 @@ + + + + + + + + + + + + + + + + + + + + + + + Dia 1 - GEROcuidado + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + + + + + + +
+ +
+ + + + +
+
+ + + +
+
+
+ + + + + + + +
+
+
+ + + +
+ +
+ + + +
+
+ + + + + + + +

Lean Inception - Dia 1

+

Histórico de versões

+ + + + + + + + + + + + + + + + + +
DataVersãoDescriçãoAutor
19/04/20241.0Criação do documentoJessica Luiza
+

Sobre

+

O primeiro dia da Lean Inception é marcado por três atividades fundamentais que unem técnica e cliente numa visão unificada do produto a ser criado. Essas práticas são cruciais para assegurar uma interpretação consistente e um entendimento comum acerca do propósito central do produto e de suas funcionalidades chave. O alinhamento obtido é crucial para o time de desenvolvimento captar com totalidade o que o produto busca realizar, encaixando-se perfeitamente com as expectativas do cliente.

+

Visão do Produto

+

Na fase inicial da Lean Inception denominada "Visão do Produto", busca-se estabelecer um entendimento comum e preciso acerca do produto em processo de criação. Durante esta fase, o coletivo envolvido no projeto — que engloba profissionais da área técnica, autoridades em negócios e vocais dos clientes ou usuários — se congrega para moldar uma imagem abrangente do produto em idealização.

+

Conceber essa visão consensual é crucial para que todos os membros da equipe estejam sintonizados em relação às metas centrais e à identidade do projeto. Isso estabelece um ponto de partida límpido e compartilhado que facilita o alinhamento de perspectivas e compreensões sobre a obra em andamento. Tal alinhamento é de importância capital em ambientes de desenvolvimento ágeis, nos quais se preza a flexibilidade e adaptação, permitindo que a visão estabelecida do produto atue como um referencial constante para assegurar a conformidade do resultado final aos anseios do negócio e expectativas dos stakeholders.

+

Visão do Produto do GEROcuidado

+

Visão do Prodfuto

+

É/não é - Faz/não faz

+

A atividade de delimitação "É/Não É" e "Faz/Não Faz" consiste na criação de listas que definem claramente o que está incluso no produto e o que está fora do alcance, assim como as funcionalidades que o produto oferece e aquelas que não são oferecidas. As listas "É/Não É" e "Faz/Não Faz" são cruciais para estabelecer limites claros do projeto, o que auxilia na prevenção de confusões e de um escopo de projeto que vá além do previsto.

+

#### - "É/Não É" +Esclarece o que o produto realmente compreende em termos de recursos, capacidades e atributos. Ela assegura que todos os membros da equipe e o cliente tenham um entendimento comum e conciso do que será entregue. Isso é importante para evitar a inclusão de recursos adicionais que não foram originalmente planejados.

+

- "Faz/Não Faz"

+

Detalha as funcionalidades e operações específicas que o produto é capaz de realizar, bem como toda e qualquer operação que ele não irá desempenhar. Isso ajuda a alinhar as expectativas do cliente quanto à performance e comportamento do produto final.

+

Efetivamente, essas listas contribuem para uma melhor comunicação entre a equipe de desenvolvimento e o cliente, garantem que o desenvolvimento seja focado apenas nos requisitos essenciais e previnem o surgimento de mal-entendidos quanto ao que o produto é capaz ou não é capaz de fazer.

+

É/não é - Faz/não faz do GEROcuidado

+

É/nãoé-faz/nãofaz

+

Objetivos do Produto

+

Na etapa designada como "Objetivos do Produto", que ocorre durante o processo de Lean Inception, a meta é a definição precisa e quantificável dos fins aos quais o produto se destina. Este estágio é fundamental, pois norteia o desenvolvimento rumo ao cumprimento das expectativas dos clientes e às demandas do negócio.

+

Durante a definição dos objetivos, procede-se à categorização em "clusters", que servem para agrupar objetivos de natureza similar sob um mesmo rótulo geral, facilitando a organização e o entendimento das metas a serem atingidas pelo produto em desenvolvimento.

+

ObjetivodoProduto

+ + + + + + +
+
+ + +
+ +
+ + + +
+
+
+
+ + + + + + + + + \ No newline at end of file diff --git a/lean_inception/dia_2/index.html b/lean_inception/dia_2/index.html new file mode 100644 index 0000000..b4eef79 --- /dev/null +++ b/lean_inception/dia_2/index.html @@ -0,0 +1,2083 @@ + + + + + + + + + + + + + + + + + + + + + + + Dia 2 - GEROcuidado + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + + + + + + +
+ +
+ + + + +
+
+ + + +
+
+
+ + + + + + + +
+
+
+ + + + + + + +
+
+ + + + + + + +

Lean Inception - Dia 2

+

Histórico de versões

+ + + + + + + + + + + + + + + + + +
DataVersãoDescriçãoAutor
13/04/20241.0Criação do documentoSebastian Zuzunaga
+

Sobre

+

No segundo dia de Lean Inception veremos duas partes cruciais para o desenvolvimento do projeto, a "Descrição das Pessoas" e a "Jornada de Usuário". Definir estes dois itens nos ajudará a entender quem são os usuários do produto e como interagem com este em seu dia a dia.

+

Descrição das Personas

+

Foram criadas descrições detalhadas das pessoas que utilizaram a nossa aplicação, cada uma delas representa um grupo de utilizadores com características específicas. Cada persona recebe um nome, uma foto e uma descrição que inclui informações como idade, gênero, necessidades, desafios, metas e comportamentos típicos. O objetivo é definir as caracteristicas dos diferentes grupos que utilizarão o produto para assim poder visualizar com clareza suas necessidades em relação à aplicação.

+

Personas do GEROcuidado

+

Persona 1 - Cuidadora Formal

+

image

+

Persona 2 - Cuidadora Informal

+

image

+

Persona 3 - Cuidador Formal (homecare)

+

image

+

Jornadas de Usuário

+

A viagem de usuário serve para visualizar como um usuário interage com a aplicação passo a passo, desde a primeira interação até a conclusão de suas tarefas, serve também para ver em que contexto se vai usar, onde e quando. Ajuda-nos a identificar as necessidades do utilizador e possíveis problemas durante a sua utilização. Ajuda a ter uma visão completa da experiência do usuário.

+

Jornadas de Usuário do GEROcuidado

+

Jornada de Usuário 1

+

image

+

Jornada de Usuário 2

+

image

+

Jornada de Usuário 3

+

image

+ + + + + + +
+
+ + +
+ +
+ + + +
+
+
+
+ + + + + + + + + \ No newline at end of file diff --git a/lean_inception/dia_3/index.html b/lean_inception/dia_3/index.html new file mode 100644 index 0000000..3b48348 --- /dev/null +++ b/lean_inception/dia_3/index.html @@ -0,0 +1,1929 @@ + + + + + + + + + + + + + + + + + + + + + + + Dia 3 - GEROcuidado + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + + + + + + +
+ +
+ + + + +
+
+ + + +
+
+
+ + + + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + +

Lean Inception - Dia 3

+

Histórico de versões

+ + + + + + + + + + + + + + + + + + + + + + + +
VersãoDataDescriçãoAutores
1.013/04/2024Abertura do documentoGustavo Abrantes
1.119/04/2024Imagem BrainstormGustavo Abrantes e Yuri Ezequie
+

Sobre

+

O terceiro dia de uma Lean Inception é uma etapa crítica do processo, pois envolve atividades fundamentais para o desenvolvimento do produto. Neste dia (10/04/2024), a equipe responsável pelo desenvolvimento (EPS/MDS) juntamente com os clientes do projeto (Enactus), se concentram em uma tarefa fundamental: o Brainstorm de Funcionalidades.

+

No final dele, a equipe deve ter uma lista refinada de funcionalidades priorizadas e bem fundamentadas para o produto. Isso ajuda a garantir que o desenvolvimento se concentre nas áreas mais importantes e que todos na equipe tenham uma compreensão compartilhada das metas do projeto.

+

Como em reuniões anteriores, as equipes haviam tido um diálogo inicial sobre o possível rumo do produto final (se ele continuaria sendo um produto web, ou se passaria a ser um app nativo), no dia 10/04/2024, não foi possível concluir totalmente o Brainstorm de Funcionalidades, apenas de forma parcial. Desta forma, a equipe de EPS/MDS ficou responsável pelo término da clusterização até dia 11/04 ao 12h e a equipe da Enactus responsável pela validação desta clusterização até o prazo máximo do dia 15/04 ao 12h de forma assíncrona.

+

Brainstorm de Funcionalidades

+

Um brainstorm de funcionalidades é uma atividade em grupo onde as equipes geram ideias e conceitos para as funcionalidades ou recursos em um produto ou projeto, de maneira colaborativa e sem críticas iniciais. objetivo é criar um conjunto inicial de ideias que possam ser posteriormente avaliadas e priorizadas.

+

Brainstorm do GEROcuidado

+

Brainstorm

+ + + + + + +
+
+ + +
+ +
+ + + +
+
+
+
+ + + + + + + + + \ No newline at end of file diff --git a/lean_inception/dia_4/index.html b/lean_inception/dia_4/index.html new file mode 100644 index 0000000..b27741a --- /dev/null +++ b/lean_inception/dia_4/index.html @@ -0,0 +1,2094 @@ + + + + + + + + + + + + + + + + + + + + + + + Dia 4 - GEROcuidado + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + + + + + + +
+ +
+ + + + +
+
+ + + +
+
+
+ + + + + + + +
+
+
+ + + + + + + +
+
+ + + + + + + +

Lean Inception - Dia 4

+

Histórico de versões

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
VersãoDataDescriçãoAutores
1.019/04/2024Abertura do documentoGustavo Abrantes e Yuri Ezequie
1.128/04/2024Texto do sequenciadorSebastian Zuzunaga
1.220/07/2024Adição do Canvas MVPGustavo Abrantes
+

Sobre

+

O quarto dia de uma Lean Inception é um marco importante no processo de desenvolvimento de um novo projeto ou produto. Neste estágio, as ideias e conceitos começam a se materializar de forma mais concreta. Serão 4 elementos-chave desse dia: Revisão Técnica, de Negócios e UX, Sequenciador e o canvas MVP. Esses elementos desempenham um papel fundamental na definição do escopo e na estruturação do projeto. No (19/04/2024), a equipe responsável pelo desenvolvimento (EPS/MDS) juntamente com os clientes do projeto (Enactus), se concentram em uma tarefa fundamental: A Revisão Técnica, de Negócios e UX, que ficou de ser completada de forma assíncrona com a equipe da Enactus até às 9h do dia 20/04. Uma vez concluídas todas estas tarefas, será realizado o Canvas MVP, que cumpre a função de definir quais funções devem ser desenvolvidas no menor tempo possível e quais podem ser relegadas a ser desenvolvidas no futuro.

+ + +

Revisão técnica, de negócio e UX

+

Para estabelecer prioridades em relação às funcionalidades, utilizamos diversas ferramentas, sendo uma delas o "Gráfico de Semáforo". Essa representação visual utiliza cores para indicar o nível de confiança da equipe de desenvolvimento na compreensão e capacidade de implementação de cada funcionalidade. O gráfico utiliza três níveis de confiança:

+
    +
  • +

    Alto (Verde): Isso significa que a funcionalidade é compreensível e a equipe sabe como implementá-la.

    +
  • +
  • +

    Médio (Amarelo): Indica que há alguma incerteza na compreensão ou na capacidade de implementação da funcionalidade. Pode ser que a equipe compreenda, mas não saiba como executar, ou vice-versa.

    +
  • +
  • +

    Baixo (Vermelho): Esse nível de confiança sugere que a funcionalidade não foi bem compreendida pela equipe e não sabem como implementá-la.

    +
  • +
+

A imagem anexada ilustra a atribuição das cores, mas o ponto crucial é entender que as cores verdes representam um alto nível de confiança, enquanto o vermelho indica um nível de confiança mais baixo.

+

Revisão Técnica

+

Além disso, outra ferramenta importante relacionada à priorização de funcionalidades envolve três símbolos:

+
    +
  • +

    E (Esforço): Este símbolo demonstra o esforço que a equipe de desenvolvimento precisará dedicar para implementar a funcionalidade.

    +
  • +
  • +

    $ (Valor): Representa o valor que a funcionalidade agrega ao cliente, Product Owner (PO) ou stakeholders, neste caso, o Enactus. É importante notar que todas as funcionalidades têm importância, mas é crucial estabelecer prioridades com base no valor que cada uma delas oferece.

    +
  • +
  • +

    <3 (UX - Experiência do Usuário): Esse símbolo está relacionado ao conceito de User Experience (Experiência do Usuário) e indica o quanto a funcionalidade é interessante para o usuário.

    +
  • +
+

Ao combinar o Gráfico de Semáforo com esses símbolos, a equipe pode ter uma visão mais clara e completa das funcionalidades do projeto, ajudando na tomada de decisões informadas sobre o que implementar primeiro, considerando tanto a compreensão técnica quanto o valor para o usuário e para o negócio.

+

Revisão técnica, de negócios e UX do GEROcuidado

+

Revisão Técnica 1 +Revisão Técnica 2 +Revisão Técnica 3

+

Sequenciador

+

O sequenciador nos ajudará a determinar quais funcionalidades devem ser priorizadas para o produto. Tomam-se as funções previamente definidas para a aplicação e organizam-se numa sequência lógica, onde se identificam quais devem ser implementadas no menor tempo possível (Produto Mínimo Viável) e quais podem ser relegadas a ser implementadas no futuro, esta lista orientará o desenvolvimento do projecto.

+

A lista previamente mencionada será dividida em ondas, estas vão definir a ordem em que se realizarão as tarefas, para sua criação existem algumas regras que garantem a suficiente criação de valor e limitam a dificuldade de cada onda.

+
    +
  • +

    Regra 1: Uma onda pode conter no máximo três, cartões.

    +
  • +
  • +

    Regra 2: Uma onda não pode conter mais de uma cartão vermelho.

    +
  • +
  • +

    Regra 3: Uma onda não pode conter três cartões somente amarelos ou vermelho.

    +
  • +
  • +

    Regra 4: A soma de esforço dos cartões não pode ultrapassar cinco Es.

    +
  • +
  • +

    Regra 5: A soma de valor dos cartões não pode ser menos de quatro $s e quatro corações.

    +
  • +
  • +

    Regra 6: Se um cartão depende de outro, esse outro deve estar em alguma onda anterior.

    +
  • +
+

Sequenciador do GEROcuidado

+

Sequenciador 1 +Sequenciador 2 +Sequenciador 3 +Sequenciador 4

+

Canvas MVP

+

O Canvas MVP é uma ferramenta visual que ajuda a equipe a definir o que fará parte do Produto Mínimo Viável. Ele geralmente é composto por nove áreas ou blocos, incluindo:

+
    +
  • +

    Objetivo do MVP: Uma declaração clara do que se pretende alcançar com o MVP.

    +
  • +
  • +

    Problema: Uma descrição do problema que o MVP está resolvendo para os usuários.

    +
  • +
  • +

    Solução: Uma visão geral da solução que será implementada.

    +
  • +
  • +

    Usuários: Quem são os usuários-alvo do MVP.

    +
  • +
  • +

    Características Principais: As funcionalidades centrais que serão incluídas no MVP.

    +
  • +
  • +

    Métricas de Sucesso: Como o sucesso do MVP será medido.

    +
  • +
  • +

    Hipóteses: Suposições ou previsões que estão sendo testadas com o MVP.

    +
  • +
  • +

    Restrições: Quaisquer limitações ou restrições que afetam o desenvolvimento do MVP.

    +
  • +
  • +

    Aprendizados: Espaço para registrar o que a equipe aprendeu durante o processo de criação do Canvas MVP.

    +
  • +
+

O Canvas MVP ajuda a equipe a visualizar de forma clara e concisa o escopo do Produto Mínimo Viável, garantindo que todos tenham uma compreensão comum do que será desenvolvido e por quê.

+

Modelo Canvas MVP

+

Canvas MVP do GEROcuidado

+

Canvas MVP

+ + + + + + +
+
+ + +
+ +
+ + + +
+
+
+
+ + + + + + + + + \ No newline at end of file diff --git a/lean_inception/kickoff/index.html b/lean_inception/kickoff/index.html new file mode 100644 index 0000000..7567e42 --- /dev/null +++ b/lean_inception/kickoff/index.html @@ -0,0 +1,1923 @@ + + + + + + + + + + + + + + + + + + + + + + + Kick-off - GEROcuidado + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + + + + + + +
+ +
+ + + + +
+
+ + + +
+
+
+ + + + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + +

Kick-off

+

Histórico de versões

+ + + + + + + + + + + + + + + + + + + + + + + +
DataVersãoDescriçãoAutor
05/04/20241.0Criação do documentoAmanda Nobre
12/04/20241.1Atualização documentoMarcella Anderle e Yuri Ezequiel
+

Sobre

+

O Kickoff é uma reunião crucial que reúne todas as partes interessadas, incluindo membros da equipe de desenvolvimento, stakeholders do projeto, especialistas técnicos e, idealmente, o cliente ou representantes dos usuários finais. Durante essa reunião, várias atividades são realizadas:

+
    +
  • +

    Apresentação do Objetivo: O facilitador do Lean Inception, que é geralmente um especialista experiente na metodologia, apresenta o objetivo geral da Lean Inception e define as expectativas para a semana de trabalho. Ele esclarece que o objetivo é definir e planejar o Minimum Viable Product (MVP) de forma colaborativa e eficiente.

    +
  • +
  • +

    Explicação do Processo: O facilitador explica o processo que será seguido ao longo da semana, destacando as atividades-chave que serão realizadas em cada dia. Isso ajuda a equipe a entender a sequência das atividades e a importância de cada uma delas.

    +
  • +
  • +

    Definição dos Participantes: São apresentados os membros da equipe e os participantes, garantindo que todos saibam quem está envolvido e qual é o seu papel.

    +
  • +
  • +

    Contextualização do Projeto ou Produto: A equipe compartilha informações essenciais sobre o projeto ou produto em questão. Isso inclui detalhes sobre o mercado, o público-alvo, os objetivos e os desafios.

    +
  • +
  • +

    Esclarecimento de Dúvidas: É fornecida a oportunidade para os participantes fazerem perguntas e esclarecerem quaisquer dúvidas sobre o processo ou o projeto.

    +
  • +
  • +

    Definição do cronograma: Geralmente também é estabelecido um cronograma referente às etapa do Lean Inception, ele serve para ilustrar quais etapas serão realizadas em quais dias, e em quais momentos do dia.

    +
  • +
  • +

    Definição dos Resultados Esperados: Por fim, são estabelecidos os resultados esperados ao final da semana, como uma visão clara do produto, personas definidas, funcionalidades priorizadas e um roadmap inicial.

    +
  • +
+

O Kickoff desempenha um papel fundamental ao alinhar todos os participantes em relação aos objetivos e ao processo da Lean Inception. Ele cria um ambiente de colaboração e entusiasmo, motivando a equipe a trabalhar juntos de forma eficiente ao longo da semana para alcançar os resultados desejados. É o ponto de partida para uma jornada produtiva de definição e planejamento ágil do MVP.

+

Cronograma

+

GEROcuidado cronograma

+ + + + + + +
+
+ + +
+ +
+ + + +
+
+
+
+ + + + + + + + + \ No newline at end of file diff --git a/lean_inception/lean_inception/index.html b/lean_inception/lean_inception/index.html new file mode 100644 index 0000000..88b8945 --- /dev/null +++ b/lean_inception/lean_inception/index.html @@ -0,0 +1,2000 @@ + + + + + + + + + + + + + + + + + + + + + + + Lean Inception - GEROcuidado + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + + + + + + +
+ +
+ + + + +
+
+ + + +
+
+
+ + + + + + + +
+
+
+ + + + + + + +
+
+ + + + + + + +

Lean Inception

+

Histórico de versões

+ + + + + + + + + + + + + + + + + +
DataVersãoDescriçãoAutor
05/04/20241.0Criação do documentoAmanda Nobre
+

Sobre

+

A metodologia Lean Inception, concebida por Paulo Caroli, é uma abordagem inovadora que visa alcançar o Minimum Viable Product (MVP), ou Produto Mínimo Viável, de forma colaborativa e eficiente. O próprio nome, "Lean Inception", sugere sua natureza enxuta e ágil, refletindo uma fase inicial em que as partes de negócios e técnicas se unem em um curto período de tempo. Esse período costuma ser limitado a uma semana, idealmente com uma carga horária de 40 horas semanais dedicadas ao processo. Um dos pilares fundamentais desta metodologia é a constante participação do cliente, o que a torna verdadeiramente colaborativa.

+

Atividades do Lean Inception

+

O funcionamento do Lean Inception é baseado em uma série de atividades estruturadas que são conduzidas ao longo da semana. Cada atividade desempenha um papel específico no processo de definição e refinamento do MVP. Vamos explorar algumas dessas atividades-chave:

+
    +
  • +

    Kickoff: A semana Lean Inception começa com uma reunião de início, onde os participantes são introduzidos ao processo e ao objetivo. Isso estabelece o tom e a direção para o trabalho colaborativo que se seguirá, assim como o cronograma das atividades a serem desenvolvidas.

    +
  • +
  • +

    Dia 1: Visão do Produto, É/Não é, Faz/Não faz e Objetivos do Produto: No primeiro dia, o foco está na definição da visão do produto, bem como na criação de listas de elementos "É/Não é" e "Faz/Não faz". Além disso, são estabelecidos os objetivos claros do produto a serem alcançados. No geral o Dia 1 tem como foco o alinhamento da visão sobre o produto da equipe de desenvolvimento e do cliente, para que fique claro qual o produto que se deseja criar.

    +
  • +
  • +

    Dia 2: Descrição das Personas e Jornada de Usuário: O segundo dia concentra-se na criação detalhada das personas, representando os principais usuários do produto, e na mapeação de suas jornadas. Isso ajuda a direcionar o desenvolvimento para atender às necessidades específicas dos usuários.

    +
  • +
  • +

    Dia 3: Brainstorm de Funcionalidades e Revisão Técnica, de Negócio e UX: No terceiro dia, ocorre uma intensa sessão de brainstorming para gerar ideias de funcionalidades. Simultaneamente, são realizadas a etapa de gráfico de semáforo e a revisão técnica, de negócio e ux para estabelecer uma priorização sobre as funcionalidades levantas. Dessa forma são estabelecidas e priorizadas as funcionalidades que irão compor o MVP.

    +
  • +
  • +

    Dia 4: Sequenciador de Funcionalidades e Canvas MVP: Durante o quarto dia, as funcionalidades geradas são priorizadas e organizadas em um sequenciador, esse sequenciador possui algumas regras, essas regras separam as funcionalidades em ondas, indicando o tempo, e nela também são definidos as funcionalidades que irão compor o MVP e o quais seriam incrementos. Além disso, o Canvas MVP é preenchido, delineando o escopo do Produto Mínimo Viável.

    +
  • +
  • +

    Showcase: A semana Lean Inception é concluída com uma apresentação (showcase) das decisões tomadas, incluindo a visão do produto, as personas, as funcionalidades prioritárias e o roadmap para o desenvolvimento do MVP. Isso assegura que todos os envolvidos estejam alinhados e tenham uma compreensão clara do caminho a seguir.

    +
  • +
+

O Lean Inception se destaca por sua abordagem ágil e colaborativa, permitindo que as equipes trabalhem juntas de forma eficiente para definir, priorizar e desenvolver o MVP em um curto espaço de tempo. Essa metodologia ajuda a reduzir o desperdício de recursos e acelerar o tempo de entrega, garantindo que o produto final atenda às necessidades reais dos clientes.

+

Exemplo de cronograma do Lean Inception

+

Cronograma Lean Inception

+

Lean Inception GEROcuidado

+

GEROcuidado - 2023.2

+ + +

GEROcuidado - 2024.1

+ + + + + + + +
+
+ + +
+ +
+ + + +
+
+
+
+ + + + + + + + + \ No newline at end of file diff --git a/planejamento/eap/index.html b/planejamento/eap/index.html new file mode 100644 index 0000000..ea85fa9 --- /dev/null +++ b/planejamento/eap/index.html @@ -0,0 +1,1921 @@ + + + + + + + + + + + + + + + + + + + + + + + EAP - GEROcuidado + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + + + + + + +
+ +
+ + + + +
+
+ + + +
+
+
+ + + + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + +

Estrutura Analítica do Projeto - EAP

+

Histórico de versões

+ + + + + + + + + + + + + + + + + +
VersãoDataModificaçãoAutor
1.019/07/2024Criação do documentoUgor Brandão
+

O que é a EAP?

+

A Estrutura Analítica do Projeto (EAP) é uma ferramenta crucial no gerenciamento de projetos que visa decompor um projeto complexo em partes menores e mais manejáveis. A EAP organiza o projeto de forma hierárquica, facilitando a visualização e o entendimento de suas diferentes componentes. Segundo Ricardo Vargas em seu livro Gerenciamento de Projetos: Estabelecendo Diferenciais Competitivos, a EAP é uma técnica que divide o projeto em elementos mais simples e compreensíveis, com cada nível inferior representando uma subdivisão mais detalhada do projeto. Este processo continua até que cada componente seja reduzido a um nível que seja prático para gestão e controle.

+

Para que serve?

+

A EAP é utilizada para:

+
    +
  1. +

    Estabelecimento de Estrutura e Organização: Fornece uma visão clara e estruturada do projeto, permitindo que todos os envolvidos compreendam melhor suas partes e inter-relações. Isso facilita a comunicação e o entendimento das responsabilidades.

    +
  2. +
  3. +

    Identificação de Entregas e Resultados: Ajuda a identificar e definir todas as entregas e resultados esperados do projeto. Cada nível da EAP representa uma parte específica do trabalho que precisa ser realizado, o que facilita o rastreamento e a verificação das entregas.

    +
  4. +
  5. +

    Planejamento e Monitoramento: Auxilia no planejamento detalhado, permitindo a criação de cronogramas e orçamentos mais precisos. A estrutura hierárquica da EAP também facilita o monitoramento do progresso, pois cada nível pode ser acompanhado individualmente para garantir que o projeto esteja no caminho certo.

    +
  6. +
  7. +

    Definição dos Pacotes de Trabalho: A EAP é fundamental para a definição dos pacotes de trabalho, que são unidades de trabalho menores e específicas dentro do projeto. Isso ajuda a alocar recursos, atribuir responsabilidades e definir prazos de forma mais eficiente.

    +
  8. +
  9. +

    Gerenciamento de Riscos: Permite uma análise mais detalhada dos riscos, uma vez que cada componente do projeto é identificado e avaliado individualmente. Isso facilita a identificação de potenciais problemas e a implementação de estratégias de mitigação adequadas.

    +
  10. +
  11. +

    Facilitação do Controle de Mudanças: Quando mudanças ocorrem no projeto, a EAP permite uma avaliação mais fácil e precisa do impacto dessas mudanças em diferentes partes do projeto, ajudando a gerenciar e controlar as alterações de forma eficaz.

    +
  12. +
+

Ao estruturar o projeto em componentes menores e mais gerenciáveis, a EAP fornece uma base sólida para uma gestão mais eficaz e bem-sucedida.

+

EAP - Projeto GeroCuidado

+ + +

Referências

+
+

[1] LIMA, V. R. O que é a Estrutura Analítica do Projeto (EAP). 2021. Disponível em: https://www.youtube.com/watch?v=TS9eciG-Ddw. Acesso em: 11 maio 2023.

+
+ + + + + + +
+
+ + +
+ +
+ + + +
+
+
+
+ + + + + + + + + \ No newline at end of file diff --git a/planejamento/metodologia/index.html b/planejamento/metodologia/index.html new file mode 100644 index 0000000..88815f7 --- /dev/null +++ b/planejamento/metodologia/index.html @@ -0,0 +1,2201 @@ + + + + + + + + + + + + + + + + + + + + + + + Metodologias - GEROcuidado + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + + + + + + +
+ +
+ + + + +
+
+ + + +
+
+
+ + + + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + +

Metodologias

+

Histórico de versões

+ + + + + + + + + + + + + + + + + +
VersãoDataDescriçãoAutores
1.025/07/2024Abertura do documentoGustavo Abrantes
+

Introdução

+

Este documento descreve o processo completo utilizado no desenvolvimento do projeto GEROcuidado. Para alcançar esse objetivo, adotamos metodologias ágeis de desenvolvimento de software, incluindo Scrum e XP.

+ +

Lean Inception

+

O Lean Inception oferece um processo colaborativo de descoberta e demonstração em que os participantes trabalham juntos por meio de uma série de atividades para entender as oportunidades e elaborar um MVP(mínimo produto viável). O Lean Inception é útil quando a equipe necessita desenvolver um MVP e criar um produto de forma iterativa e incremental (CAROLI, 2017). É justamente a metodologia que possibilita acelerar a entrega de soluções de forma contínua e consistente, sempre contemplando dois eixos essenciais: os objetivos do negócio e as necessidades dos usuários.

+ +

Scrum

+

Scrum é um framework de gerenciamento de projetos ágeis, e embora seja amplamente utilizado na área de desenvolvimento de software, pode ser usado para planejar, gerenciar e desenvolver qualquer produto. É um framework interativo e incremental. Nessa metodologia, os projetos são divididos em ciclos curtos e iterativos (repetitivos). Os ciclos duram de 1 a 2 + semanas e são chamados de sprints (CRUZ, 2013). O scrum prevê alguns ritos (cerimônias) e artefatos. +

+ +

Durante o projeto GEROcuidado, os artefatos usados são: backlog do produto (product backlog) e sprints. Os ritos usados são: planejamento da sprint (planing), daily e review.

+ +

Product Backlog

+

O Product Backlog é uma lista de tarefas priorizadas que incluem todas as atividades necessárias para concluir um projeto, incluindo requisitos funcionais que agregam valor ao negócio (PEREIRA, 2007). Ou seja, é um conjunto de funcionalidades e requisitos que deverão ser entregues.

+ +

Sprints

+

No Scrum a Sprint é uma iteração que dura de duas a quatro semanas, no qual são desenvolvidos incrementos do produto.

+ +

Planning

+

A Sprint Planning é um rito em que a iteração é planejada, em que será definido o que será feito, ou seja, quais itens do backlog serão realizados na sprint .

+ +

Neste projeto a reunião de planejamento ocorre a cada duas semanas.

+ +

Daily Meeting

+

A Daily é uma reunião diária de acompanhamento da equipe com o objetivo de que cada participante relate seu status e possíveis obstáculos para a conclusão do projeto. Neste projeto a reunião dura em média quinze minutos.

+ +

Sprint Review

+

A Sprint Review é uma reunião que ocorre no final da sprint em que é feita uma revisão do que foi feito, tendo uma visão geral de como está o produto

+ +

Sprint Retrospective

+

A Sprint Retrospective é uma reunião realizada no final de uma sprint no contexto da metodologia ágil, como o Scrum. Nesta reunião, a equipe Scrum se reúne para refletir sobre o processo de trabalho durante a sprint recentemente concluída. O principal objetivo da Sprint Retrospective é identificar oportunidades de melhoria, discutir o que funcionou bem e o que pode ser aprimorado no próximo ciclo de desenvolvimento.

+

XP

+

O Extreme Programming (XP) é uma metodologia ágil que nasceu com o intuito de tentar solucionar os problemas que eram causados pelas metodologias tradicionais. O XP tem quatro princípios: Comunicação, Simplicidade, Feedback e Coragem. O XP tem diversos tipos de práticas, totalizando 12 tipos, entre elas a que serão utilizadas no projeto serão: programação em pares, releases curtas, código coletivo e cliente presente. +

+ +

Programação em pares

+

A programação em pares ocorre quando dois programadores escrevem o código juntos em um mesmo computador. +

+ +

Releases curtas

+

São feitas pequenas releases do software, pequenas versões funcionais, para ser entregue ao cliente antes do prazo. +

+ +

Código coletivo

+

Essa característica permite que qualquer programador possa alterar o qualquer código, não precisando de uma autorização de qualquer membro antes disso. +

+ +

Cliente presente

+

O desenvolvimento do software é feito com a presença do cliente, ou seja, ele sempre está em contato com a equipe de desenvolvimento. +

+ +

Kanban

+

O Kanban é um sistema de gestão de trabalho, que possui como objetivo a definição de um fluxo de trabalho. Além disso tem como foco produtividade e organização das entregas. O kanban é mais conhecido devido o uso do quadro kanban, em que o mesmo é dividido, normalmente em cinco colunas: backlog, to do, doing, review e done. Na coluna de backlog fica os cards com as atividades que precisam ser feitas para realização do trabalho completo. Na coluna to do ficam os cards que precisam ser feitos durante a spring, quando começa a atividade o card é movido para coluna de doing, quando terminado vai para coluna de revisão e por último quando tudo finalizado vai para done.

+ +

PMBOK

+

O PMBOK (Project Management Body of Knowledge) é um guia de boas práticas em gerenciamento de projetos, desenvolvido pelo PMI (Project Management Institute). Ele oferece um conjunto abrangente de diretrizes e terminologias para o gerenciamento efetivo de projetos em diferentes setores e indústrias.
+

+A metodologia do PMBOK se baseia em cinco grupos de processos e dez áreas de conhecimento. Os cinco grupos de processos são: +

    +
  1. Iniciação: Envolve a definição e autorização do projeto ou fase.
  2. +
  3. Planejamento: Desenvolve o plano do projeto e define os objetivos e as atividades necessárias.
  4. +
  5. Execução: Concentra-se na coordenação de pessoas e recursos para executar o plano do projeto.
  6. +
  7. Monitoramento e Controle: Acompanha, revisa e regula o progresso e o desempenho do projeto.
  8. +
  9. Encerramento: Formaliza a aceitação do projeto e garante a conclusão adequada de todas as atividades.
  10. +
+As dez áreas de conhecimento do PMBOK incluem integração, escopo, tempo, custo, qualidade, recursos humanos, comunicação, riscos, aquisições e partes interessadas. +

+ +

+ +

Referências

+

CAROLI, Paulo. Lean inception. São Paulo, BR: Caroli. org, 2017.

+

CRUZ, Fábio. Scrum e PMBOK unidos no Gerenciamento de Projetos. Brasport, 2013.

+

FADEL, Aline Cristine; SILVEIRA, Henrique da Mota.Metodologias ágeis no contexto de +desenvolvimento de software: XP, Scrum e Lean.

+

PEREIRA, Paulo; TORREÃO, Paula; MARÇAL, Ana Sofia. Entendendo Scrum para gerenciar projetos de forma ágil. Mundo PM, v. 1, p. 3-11, 2007.

+

SOFIA, Bianca; OLIVEIRA, Lorrany. Metodologias do grupo AMIS. Disponível em: https://github.com/fga-eps-mds/2023.1-Amis-Doc/blob/main/docs/organization/methodology.md. Acesso em 09 jul 2022

+ + + + + + +
+
+ + +
+ +
+ + + +
+
+
+
+ + + + + + + + + \ No newline at end of file diff --git a/planejamento/padroes_da_comunidade/index.html b/planejamento/padroes_da_comunidade/index.html new file mode 100644 index 0000000..83568c9 --- /dev/null +++ b/planejamento/padroes_da_comunidade/index.html @@ -0,0 +1,1822 @@ + + + + + + + + + + + + + + + + + + + + + + + Padrões da Comunidade - GEROcuidado + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + + + + + + +
+ +
+ + + + +
+
+ + + +
+
+
+ + + + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + +

Padrões da comunidade

+

Os padrões da comunidade do github compreende uma lista básica de documentações que auxiliam os contribuidores +a participarem do projeto de forma mais uniforme. Esse projeto utiliza os principais guias listados abaixo:

+
    +
  • Description: Descrição do repositório que auxilia na rápida identificação da função do mesmo.
  • +
  • README: Arquivo resumo que funciona como apresentação e guia dos pontos chave do projeto, como: +"problema/solução" e instruções de execução do projeto. Confira.
  • +
  • Code of Conduct: O código de conduta é um documento que serve como um guia ético de comportamento no projeto por parte dos contribuidores.
  • +
  • Contribuiting: é um guia de contribuição na visão de desenvolvimento.
  • +
  • License: dispõe da licença de réplica e uso do software contido no repositório.
  • +
  • Issue templates: apresenta os padrões de montagem das issues
  • +
  • Pull request template: apresenta o padrão de preenchimento de um pull request ou merge request.
  • +
  • Bug reports: apresenta o padrão de documento de bug report
  • +
  • Labels: As labels são ferramentas de organização e categorização usadas em repositórios para ajudar a gerenciar tarefas, problemas (issues), pull requests (solicitações de pull) e outras atividades relacionadas ao desenvolvimento de software. Elas são pequenos rótulos coloridos que podem ser atribuídos a itens específicos em um repositório para fornecer informações adicionais sobre o status, prioridade, tipo ou qualquer outra característica relevante do item. Além disso elas servem para agrupar essas diferentes tarefas em grupos, o que facilita a pesquisa de alguma tarefa por meio de uma label.
  • +
+ + + + + + + + + + + + + + + + + +
VersãoDataDescriçãoAutores
1.011/09/2024Abertura do documentoGustavo Abrantes
+ + + + + + +
+
+ + +
+ +
+ + + +
+
+
+
+ + + + + + + + + \ No newline at end of file diff --git a/planejamento/planoDeCusto/index.html b/planejamento/planoDeCusto/index.html new file mode 100644 index 0000000..c53e8f9 --- /dev/null +++ b/planejamento/planoDeCusto/index.html @@ -0,0 +1,2042 @@ + + + + + + + + + + + + + + + + + + + + + + + Plano de Gestão de Custos - GEROcuidado + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + + + + + + +
+ +
+ + + + +
+
+ + + +
+
+
+ + + + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + +

Plano de Gestão de Custos

+

Histórico de versões

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
VersãoDataModificaçãoAutor
1.013/07/2024Criação do documentoGustavo Abrantes
1.115/07/2024Adição da planilha e do gráficoGustavo Abrantes
1.217/07/2024Correção de alguns dadosGustavo Abrantes
1.330/07/2024Atualização da planilhaGustavo Abrantes
1.417/08/2024Nova atualização dos dados da planilhaGustavo Abrantes
+

Custos

+

Pessoas

+

De acordo com o Jornal da Unesp, cada aluno de uma universidade federal custa em média R$ 40.900,00 por ano. Como esses dados se referem ao ano de 2015, há a necessidade de corrigir o valor para o ano de 2024 de acordo com a inflação, que neste período, considerando os últimos 12 meses, se encontra em 4,23%. Após aplicar essa correção utilizando a calculadora de inflação do IBGE, o valor passa a ser R$ 61.894,30 por ano, ou R$ 5.157,86 por mês.

+

R$ 61.894,30 ÷ 12 meses ≈ R$ 5.157,86

+

Considerando que o curso de Engenharia de Software da Universidade de Brasília possui 232 créditos, em um periodo de 10 semestres, é possível chegar no resultado de uma média de, aproximadamente, 46 créditos ou 690 horas por ano. Assim, chegamos ao valor de R$ 89,70 por hora para um estudante. Considerando que para cada semana do projeto serão despendidas, aproximadamente, 12,5 horas de foco para a disciplina de EPS/MDS, o valor individual semanal por membro é de R$ 1.121,25. Logo, o valor total por semana de 9 membros é de R$ 10.091,25

+

Internet

+

Segundo os dados disponíveis no site Melhor Escolha, o plano de internet mais popular de 250 Mbps, que é suficiente para as atividades do projeto, custa R$ 99,90 por mês, ou R$ 23,07 por semana.

+

R$ 99,90 ÷ 4,33 semanas ≈ R$ 23,07

+

Como a equipe trabalhará na maior parte do tempo de forma remota e em locais separados, o custo é de R$ 23,07 por semana para cada um dos 9 integrantes. Logo, o custo semanal total é de R$ 207,63.

+

Energia

+

De acordo com dados da CEMIG, um notebook consome em torno de 7,20 kWh por mês caso fique ligado durante 8h por dia. Sabendo que cada integrante trabalhará em um equipamento diferente e que o equipamento não deverá ser usado mais do que 8h por dia, o consumo estimado será de 1,66 kWh por semana.

+

7,20 kWh por mês ÷ 4,33 semanas ≈ 1,66 kWh por semana

+

Segundo dados disponíveis no site da Neoenergia, a tarifa vigente no DF durante o período de desenvolvimento do projeto é de aproximadamente 0,77. Aplicando essa tarifa de energia, o valor é de aproximadamente R$ 1,28 por semana para cada integrante.

+

1,66 kWh por semana × 0,77 ≈ R$ 1,28 por semana

+

Sendo assim, o custo de internet para os 9 membros é de aproximadamente R$ 11,52 por semana.

+

Equipamentos

+

Para o custo dos equipamentos, será considerado um notebook com processador Intel Core i5, 8 GB de memória RAM e 256 GB de armazenamento, que é capaz de executar as tecnologias utilizadas no projeto. Um notebook com estas especificações está custando atualmente aproximadamente cerca de R$ 2.790,00. Sendo um notebook para cada um dos 9 integrantes, o custo total de R$ 25.110,00.

+

Planilha de custos

+

Para melhor detalhado dos custos, foi elaborada uma planilha com os custos totais do MVP e do projeto completo.

+ + +

Gráficos

+

Foi elaborado um gráfico para visualizar a proporção dos custos totais esperados ao final do desenvolvimento do MVP do projeto.

+ + +

Referências

+
+

[1] Jornal da Unesp. Cobrança de mensalidade não é a solução para o financiamento da universidade pública. Disponível em: https://jornal.unesp.br/2022/06/08/cobranca-de-mensalidade-nao-e-a-solucao-para-o-financiamento-da-universidade-publica. Acesso em: 13 jul. 2024.

+

[2] IBGE. O que é inflação. Disponível em: https://www.ibge.gov.br/explica/inflacao.php. Acesso em: 13 jul. 2024.

+

[3] Melhor Escolha. Internet em Brasília. Disponível em: https://melhorescolha.com/internet-banda-larga/brasilia-df. Acesso em: 13 jul. 2024.

+

[4] Showmetech. Gastando muita energia? Descubra 10 eletrônicos vilões da conta de luz. Disponível em: https://www.showmetech.com.br/eletronicos-que-mais-consomem-energia. Acesso em: 13 jul. 2024.

+

[5] Neoenergia. Composição Tarifária. Disponível em: https://www.neoenergia.com/web/brasilia/sua-casa/composicao-tarifaria. Acesso em: 13 jul. 2024.

+
+ + + + + + +
+
+ + +
+ +
+ + + +
+
+
+
+ + + + + + + + + \ No newline at end of file diff --git a/planejamento/plano_de_comunicacao/index.html b/planejamento/plano_de_comunicacao/index.html new file mode 100644 index 0000000..838dbff --- /dev/null +++ b/planejamento/plano_de_comunicacao/index.html @@ -0,0 +1,2071 @@ + + + + + + + + + + + + + + + + + + + + + + + Plano de Comunicação - GEROcuidado + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + + + + + + +
+ +
+ + + + +
+
+ + + +
+
+
+ + + + + + + +
+
+
+ + + +
+
+ +
+
+ + + +
+
+ + + + + + + +

Plano de comunicação

+

Histórico de versões

+ + + + + + + + + + + + + + + + + +
DataVersãoDescriçãoAutor
27/07/20241.0Criação do documentoSebastian Zuzunaga
+

Introdução

+

O plano de comunicação nos ajudará a definir aspectos cruciais sobre como os membros do devem interagir. Usando-o é definido como +as informações acerca do projeto devem ser transmitidas e por onde devem ser transmitidas, além do melhor horario de disponibilidade.

+

Ao longo do semestre, o grupo terá inúmeras reuniões para desenvolver o projeto. Sabendo disso, mapear os melhores horários para as reuniões é crucial. A seguir temos o quadro de disponibilidade que visa o levantamento dos melhores horários para o agendamento de reuniões, levando em consideração o maior número de pessoas livres no horário.

+

Ferramentas

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FerramentaDescrição
DiscordComunicação rápida entre o time e reuniões do time
WhatsAppComunicação rápida entre o time
TeamsReuniões com o cliente
GitHubRepositório central para documentos e código
ZenHubDocumentar a baseline de requisitos, roadmap, servir como quadro Kanban para o time e atribuições de tarefas
+

Reuniões pré agendadas

+
    +
  • Reunião de planejamento: sábado às 10h00
  • +
  • Reunião com o cliente: quarta-feira às 16h00
  • +
+

Quadro de disponibilidade

+

Para o desenvolvimento do Quadro de Disponibilidade, o grupo pegou as informações de disponibilidade de cada integrante e compilou os dados na agenda Geral.

+

Quadro geral

+ + +

Quadro individual

+ + +

Plano de Reuniões

+

Reunião de planejamento

+

A reunião de planejamento é realizada com os integrantes de EPS e MDS, todo sábado às 10h, seguindo a seguinte estrutura:

+
    +
  1. Review
  2. +
  3. Planning
  4. +
  5. Validação das pautas e dúvidas para reunião com PO
  6. +
+

Durante a planning ocorre o plano de ação para as tarefas que foram transbordadas(notada durante a review), apresentação das novas tasks, divisão das atividades e a realização do planning poker para gerar estimativas.

+

Reunião com o cliente

+

A reunião ocorre semanalmente às quartas-feiras com início às 16h e duração média de 1 hora sem intervalos. Participam da reunião: toda a equipe de desenvolvimento, o Prof. Hilmer Neri e os membros do Enactus.

+

A reunião tem como pontapé inicial as pautas feitas pelo PO, mais para frente a definição das pautas será gerido pelos membros de EPS que deverão encaminhar a pauta da reunião indicando os assuntos e o membro ou membros responsáveis pela apresentação da pauta.

+ + + + + + +
+
+ + +
+ +
+ + + +
+
+
+
+ + + + + + + + + \ No newline at end of file diff --git a/planejamento/plano_de_ger_riscos/index.html b/planejamento/plano_de_ger_riscos/index.html new file mode 100644 index 0000000..727f384 --- /dev/null +++ b/planejamento/plano_de_ger_riscos/index.html @@ -0,0 +1,2500 @@ + + + + + + + + + + + + + + + + + + + + + + + Plano de Gestão de Riscos - GEROcuidado + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + + + + + + +
+ +
+ + + + +
+
+ + + +
+
+
+ + + + + + + +
+
+
+ + + + + + + +
+
+ + + + + + + +

Plano de Gestão de Riscos

+

Histórico de versões

+ + + + + + + + + + + + + + + + + + + + + + + +
VersãoDataModificaçãoAutor
1.027/07/2024Criação do documentoNatália Rodrigues
1.124/08/2024Criação da tabela de riscosNatália Rodrigues
+

Introdução

+

A gestão de riscos é um componente essencial no desenvolvimento de software, garantindo que os projetos alcancem seus objetivos com sucesso e dentro do prazo previsto. Este plano de gestão de riscos tem como objetivo identificar, analisar, priorizar e mitigar os riscos potenciais que podem surgir ao longo do ciclo de vida do desenvolvimento de software. Este documento fornece uma visão geral das estratégias e processos que serão implementados para assegurar que os riscos sejam gerenciados de maneira eficaz, minimizando impactos negativos e promovendo a entrega de um produto de qualidade.

+

Tipos de risco

+

Os riscos foram divididos nessas seguintes categorias:

+
    +
  • Externo
  • +
  • Gerencial
  • +
  • Organizacional
  • +
  • Técnico
  • +
+

## Definições

+

Probabilidade e impacto dos riscos

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NívelProbabilidadePorcentagem de certeza
1Muito baixa0% - 19%
2Baixa20% - 39%
3Média40% - 59%
4Alta60% - 79%
5Muito alta80% - 100%
+

Impacto

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NívelImpacto
1Muito baixo
2Baixo
3Médio
4Alto
5Muito alto
+

Matriz de probablidade X impacto

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Probabilidade / ImpactoMuito baixoBaixoMédioAltoMuito alto
Muito baixa12345
Baixa246810
Média3691215
Alta48121620
Muito alta510152025
+

Graus de risco

+ + + + + + + + + + + + + + + + + + + + + +
GrauRisco
1 - 5Baixo
6 - 12Médio
15 - 25Elevado
+

Levantamento de riscos

+

Tabela de Riscos

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
RiscoDescriçãoCategoria
R01Dificuldade com as tecnologias definidasTécnico
R02Saída de algum integrante do projetoGerencial
R03Falta de participação de algum integrante do projetoGerencial
R04Falta de integração da equipeGerencial
R05Divergência nos horários disponíveis dos integrantesOrganizacional
R06Alteração no escopo do projetoGerencial
R07Integrante com problema de saúdeExterno
R08Indisponibilidade do clienteExterno
R09Falta de disponibilização de releases para o cliente testarGerencial
R10Falta de participação durante as reuniõesGerencial
R11Sobrecarga de membros da equipeGerencial
R12Falha de equipamentoExterno
R13Dependência entre atividadesOrganizacional
R14Problemas com a infraestrutura de redeTécnico
R15Dificuldade na adaptação a novas ferramentasTécnico
+

Causa e Consequência dos Riscos

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
RiscoCausaConsequência
R01Complexidade ou falta de familiaridade com a tecnologiaAtraso no cronograma
R02Motivos pessoais, profissionais ou insatisfaçãoRedistribuição de tarefas, sobrecarga dos membros restantes
R03Falta de compromisso, desmotivaçãoRedução na produtividade, atraso nas entregas
R04Comunicação inadequadaConflitos internos, redução na qualidade do trabalho
R05Compromissos pessoais e acadêmicosDificuldade de coordenação, atraso nas entregas
R06Mudanças nos requisitos do clienteAumento de escopo e atraso
R07Doença ou problemas de saúde inesperadosAtraso nas atividades, provável sobrecarga para outro membro da equipe
R08Agenda ocupada ou falta de interesseAtraso nas aprovações e feedback, impacto no cronograma
R09Falta de planejamento, problemas técnicosDificuldade para identificar e corrigir erros, insatisfação do cliente
R10Desinteresse, conflitos de horáriosFalta de alinhamento, decisões mal informadas
R11Distribuição inadequada de tarefas, falta de recursosBurnout, redução na qualidade do trabalho
R12Equipamentos antigos ou mal mantidosInterrupção do trabalho, necessidade de reparos ou substituição
R13Interdependência de tarefas, má gestão de projetoAtrasos em cascata, complicações na gestão do cronograma
R14Rede instável ou inadequadaInterrupção do trabalho, perda de dados
R15Novas ferramentas complexas, falta de experiênciaQueda na produtividade, erros no trabalho
+

Prevenção e Solução dos Riscos

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
RiscoPrevençãoSolução
R01Escolha de tecnologias familiares e mais fáceisOferecer materiais de estudo e suporte, se possível
R02Manter uma boa comunicação e motivaçãoRedistribuição eficiente de tarefas
R03Incentivar o comprometimento, definir responsabilidades clarasReavaliar carga de trabalho, conversa com o integrante
R04Estabelecer canais de comunicação claros, promover a integraçãoMediação de conflitos
R05Planejar cronograma flexível, considerar compromissos individuaisAjustar prazos conforme necessário, redistribuir tarefas temporariamente
R06Manter documentação clara e requisitos bem definidos desde o inícioReavaliar o escopo, renegociar prazos e orçamento
R07Incentivar hábitos saudáveis, monitorar a saúde da equipeRedistribuir tarefas
R08Agendar reuniões com antecedência, manter cliente engajadoReagendar reuniões, buscar alternativas de comunicação
R09Planejamento adequado, definição de um cronograma realistaRevisão e correção de problemas identificados, comunicação com o cliente
R10Encorajar participação, tornar reuniões mais eficientesRealinhar equipe, reforçar a importância das reuniões
R11Planejamento de recursos adequado, monitoramento constanteRedistribuição de tarefas, contratar ajuda temporária se necessário
R12Manutenção regular, atualização de equipamentosReparos rápidos ou avaliar redistribuição da tarefa
R13Planejamento detalhado, gerenciamento de dependênciasReplanejamento e ajustes, priorização de atividades críticas
R14Monitoramento constanteUso de redes alternativas, backup de dados regular
R15Estudo de novas ferramentasSuporte, se possível, e estudo individual
+

Monitoramento dos Riscos

+ + +

https://unbbr-my.sharepoint.com/:x:/g/personal/221037975_aluno_unb_br/ETrNtLioVAFPqvQIMZY4MXkBTPtbgWebHl4-DM3eDuUHKQ?e=DXB03V

+

Conclusão

+

A gestão de riscos é essencial no desenvolvimento de software para garantir que possíveis problemas sejam identificados e tratados antes de impactarem significativamente o projeto. Este Plano de Gestão de Riscos fornece uma abordagem sistemática para identificar, analisar e mitigar riscos, minimizando incertezas e maximizando as chances de sucesso. Com a categorização detalhada dos riscos, suas causas e consequências, e a elaboração de estratégias de prevenção e solução, o plano assegura que a equipe esteja preparada para enfrentar desafios e realizar entregas com qualidade e dentro do prazo. A revisão contínua e a participação ativa da equipe são fundamentais para adaptar-se a novos riscos e ajustar estratégias conforme necessário, garantindo uma trajetória segura e eficiente rumo à entrega de um produto final de alta qualidade.

+

Referências

+

Gestão de Riscos em Projetos de Software

+ + + + + + +
+
+ + +
+ +
+ + + +
+
+
+
+ + + + + + + + + \ No newline at end of file diff --git a/planejamento/plano_de_qualidade/index.html b/planejamento/plano_de_qualidade/index.html new file mode 100644 index 0000000..c230d62 --- /dev/null +++ b/planejamento/plano_de_qualidade/index.html @@ -0,0 +1,2092 @@ + + + + + + + + + + + + + + + + + + + + + + + Plano de Qualidade - GEROcuidado + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + + + + + + +
+ +
+ + + + +
+
+ + + +
+
+
+ + + + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + +

Plano de qualidade

+

Histórico de versões

+ + + + + + + + + + + + + + + + + +
DataVersãoDescriçãoAutor
25/07/20241.0Criação do documentoAmanda Nobre
+

Introdução

+

A qualidade é uma pedra angular em qualquer projeto de software. Para garantir que o nosso projeto atenda aos mais altos padrões de qualidade, estabelecemos um plano que utiliza tecnologias e práticas eficazes para aprimorar a qualidade do código, a robustez da aplicação e a confiabilidade do software. Neste plano de qualidade, detalharemos como planejamos as métricas e tecnologias de suporte para garantia de qualidade.

+

Ferramentas

+ + + + + + + + + + + + + + + + + +
FerramentaDescrição
Sonar CloudFerramenta de análise de código
JestFramework de teste JavaScript
+

Sonnar Cloud

+

O SonarCloud é uma ferramenta de análise de código estática que fornece insights detalhados sobre a qualidade do código, destacando problemas, vulnerabilidades e áreas de melhoria. Para garantir a qualidade do nosso projeto, planejamos integrar o SonarCloud ao processo de desenvolvimento de software.

+

Detalhes do uso do SonarCloud:

+
    +
  • +

    Análise de Código Contínua: A integração contínua com o SonarCloud permite que a cada commit, pull request ou build, que ative o trigger definido no repositório, uma análise de código estática seja executada automaticamente.

    +
  • +
  • +

    Avaliação de Vulnerabilidades e Bugs: Identifica vulnerabilidades de segurança, bugs e problemas de qualidade no código.

    +
  • +
  • +

    Acompanhamento de Métricas de Código: Acompanhamento de métricas essenciais, como a cobertura de código, a complexidade e a duplicação de código, para manter o código limpo e eficiente.

    +
  • +
  • +

    Integração com Fluxo de Trabalho de Desenvolvimento: Integraremos o SonarCloud com nossos fluxos de trabalho de desenvolvimento, permitindo a revisão e correção de problemas de qualidade durante o ciclo de desenvolvimento.

    +
  • +
+

Jest

+

O Jest é um framework de teste JavaScript amplamente utilizado para testar aplicações front-end e back-end. Planejamos utilizar o Jest para garantir a funcionalidade correta e a integridade do nosso software.

+

Detalhes do uso do Jest:

+
    +
  • +

    Testes Unitários e de Integração: Criaremos testes unitários e de integração utilizando o Jest para avaliar a funcionalidade dos componentes do React no front-end e dos controladores, serviços e módulos no back-end Nest.

    +
  • +
  • +

    Testes Automatizados: Configuraremos uma suíte de testes automatizados que será executada em um ambiente de integração contínua sempre que houver alterações no código.

    +
  • +
  • +

    Cobertura de Testes: Monitoraremos a cobertura de testes para garantir que a maioria do código seja testada, identificando áreas não testadas que requerem atenção.

    +
  • +
  • +

    Testes de Desempenho: Implementaremos testes de desempenho para garantir que o software seja responsivo e eficiente, especialmente em cenários de carga elevada.

    +
  • +
+

Testes Unitarios

+

Os testes unitários são realizados para avaliar o comportamento das menores unidades em uma aplicação. Isso implica, tecnicamente, examinar o desempenho de entidades individuais, que podem ser representadas por classes em linguagens orientadas a objetos, ou até mesmo métodos de classe, no contexto de linguagens orientadas a objetos. Em linguagens de programação processuais e funcionais, as menores unidades podem se referir a procedimentos ou funções independentes.

+

Testes De Integração

+

Os testes de integração são uma parte essencial do processo de garantia de qualidade de software. Eles têm como objetivo avaliar como diferentes componentes de um sistema interagem entre si. Em contraste com os testes unitários, que se concentram na avaliação do comportamento de unidades individuais de código, os testes de integração abordam a funcionalidade do sistema como um todo. Eles são projetados para identificar problemas que podem surgir quando módulos ou componentes independentes são combinados e operam juntos. Os testes de integração ajudam a verificar se as partes do sistema se comunicam e colaboram corretamente, garantindo que a aplicação funcione de maneira harmoniosa e cumpra os requisitos de negócios. Eles desempenham um papel fundamental na identificação de possíveis falhas, inconsistências ou incompatibilidades que podem surgir nas interfaces entre os componentes, proporcionando uma visão abrangente da robustez e da integridade do software.

+

Testes E2E

+

Além dos testes unitários e de integração, incorporaremos testes E2E (End to end) em Node.js, os testes E2E s para garantir que todo o fluxo de aplicação, desde a interface do usuário até o banco de dados, funcione de maneira integrada e sem problemas. Usaremos bibliotecas e ferramentas disponíveis junto ao node para realizar testes E2E. O objetivo dessa ferramenta de teste é validar a experiência do usuário final e identificar problemas em cenários do mundo real.

+

Referências

+
+

SONNAR CLOUD, https://www.sonarsource.com/products/sonarcloud/.

+

JEST, https://jestjs.io/pt-BR/

+

GeroCuidado 2023.2 https://fga-eps-mds.github.io/2023-2-GEROcuidado-Doc/planejamento/plano_de_qualidade/

+
+ + + + + + +
+
+ + +
+ +
+ + + +
+
+
+
+ + + + + + + + + \ No newline at end of file diff --git a/planejamento/quadro_de_conhecimentos/index.html b/planejamento/quadro_de_conhecimentos/index.html new file mode 100644 index 0000000..2ea105c --- /dev/null +++ b/planejamento/quadro_de_conhecimentos/index.html @@ -0,0 +1,2134 @@ + + + + + + + + + + + + + + + + + + + + + + + Quadro de Conhecimento - GEROcuidado + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + + + + + + +
+ +
+ + + + +
+
+ + + +
+
+
+ + + + + + + +
+
+
+ + + + + + + +
+
+ + + + + + + +

Quadro de Disponibilidade

+

Histórico de versões

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
DataVersãoDescriçãoAutor
06/04/20241.0Criação do documentoSebastian Zuzunaga
07/04/20241.1Tabela de conhecimentoGustavo Abrantes
27/07/20241.2Tabela de conhecimentoMarcella Anderle
27/07/20241.3Tabela de conhecimentoJessica Luiza
+

O quadro de conhecimento tem a função de monitorar a evolução do conhecimento dos integrantes de MDS e MPS com respeito às tecnologias utilizadas no projeto, sua implementação começa na semana 2 e é atualizado cada Sprint.

+

O quadro da semana 2 servirá para ver com que tecnologias já estão familiarizados os membros do grupo, enquanto os quadros atualizados servirá para ver quanto cada membro aprendeu com o trabalho realizado durante o Sprint anterior, os quadros serão atualizados no início de um novo Sprint.

+

Quadro de conhecimento geral

+

Quadro de conhecimento do GEROcuidado

+

Quadro de Conhecimento da Semana 1:

+ + +

Quadro de Conhecimento da Semana 2:

+ + +

Quadro de Conhecimento da Semana 3:

+ + +

Quadro de Conhecimento da Semana 4:

+ + +

Quadro de Conhecimento da Semana 5:

+ + +

Quadro de Conhecimento da Semana 6:

+ + +

Quadro de Conhecimento da Sprint 1:

+ + +

Quadro de Conhecimento da Sprint 2:

+ + +

Quadro de Conhecimento da Sprint 3:

+ + +

Quadro de Conhecimento da Sprint 4:

+ + +

Quadro de Conhecimento da Sprint 5:

+ + +

Quadro de Conhecimento da Sprint 6:

+ + +

Quadro de Conhecimento da Sprint 7:

+ + +

Quadro de Conhecimento da Sprint 8:

+ + + + + + + +
+
+ + +
+ +
+ + + +
+
+
+
+ + + + + + + + + \ No newline at end of file diff --git a/planejamento/quadro_de_disponibilidade/index.html b/planejamento/quadro_de_disponibilidade/index.html new file mode 100644 index 0000000..048779b --- /dev/null +++ b/planejamento/quadro_de_disponibilidade/index.html @@ -0,0 +1,1896 @@ + + + + + + + + + + + + + + + + + + + + + + + Quadro de Disponibilidade - GEROcuidado + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + + + + + + +
+ +
+ + + + +
+
+ + + +
+
+
+ + + + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + +

Quadro de Disponibilidade

+

Histórico de versões

+ + + + + + + + + + + + + + + + + +
DataVersãoDescriçãoAutor
01/04/20241.0Criação do documentoAmanda Nobre
+

Introdução

+

O quadro de disponibilidade é uma ferramenta amplamente utilizada que permite visualizar a disponibilidade dos membros de equipe em um determinado projeto. Aqui inserimos o dia e horário disponível de cada membro e posteriormente elaboramos um mapa de calor.

+

Heatmap

+

O heatmap consiste em uma técnica através da qual se torna possível a visualização e análise da magnitude de um fenômeno por meio de cores atribuídas aos dados coletados.

+

Para o contexto do projeto, esta técnica foi utilizada com o intuito de atuar como um suporte para uma análise inicial mais eficiente no que diz respeito às viabilidades de horários concernentes à rotina dos membros.

+

O Heatmap da equipe foi feito através da média das disponibilidades de todos os integrantes:

+ + + + + + + +
+
+ + +
+ +
+ + + +
+
+
+
+ + + + + + + + + \ No newline at end of file diff --git a/planejamento/quadro_de_pareamento/index.html b/planejamento/quadro_de_pareamento/index.html new file mode 100644 index 0000000..a2d4c4e --- /dev/null +++ b/planejamento/quadro_de_pareamento/index.html @@ -0,0 +1,1953 @@ + + + + + + + + + + + + + + + + + + + + + + + Quadro de Pareamento - GEROcuidado + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + + + + + + +
+ +
+ + + + +
+
+ + + +
+
+
+ + + + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + +

Quadro de pareamento

+

Histórico de versões

+ + + + + + + + + + + + + + + + + + + + + + + +
VersãoDataDescriçãoAutores
1.026/07/2024Abertura do documentoJessica Luiza Silva de Oliveira
2.008/09/2024Atualização do DocumentoGabriel Santos Monteiro
+

Introdução

+

O quadro de pareamento é uma técnica de colaboração no desenvolvimento de software que envolve dois ou mais desenvolvedores trabalhando juntos. Seguindo os padrões da matéria e pela escolha do time, foi realizado a escolha dos pareamentos da seguinte forma:

+

Sprint 1:

+
    +
  • 1 EPS e 3 MDS;
  • +
  • 1 EPS e 3 MDS;
  • +
  • 1 EPS;
  • +
+ +

Sprint 2 até o 8:

+
    +
  • 3 EPS;
  • +
  • 6 MDS;
  • +
  • 1 EPS e 6 MDS;
  • +
+ +

Quadro de Pareamento

+

Quadro_Pareamento

+ + + + + + +
+
+ + +
+ +
+ + + +
+
+
+
+ + + + + + + + + \ No newline at end of file diff --git a/produto/prototipo/prototipo/index.html b/produto/prototipo/prototipo/index.html new file mode 100644 index 0000000..0967ea3 --- /dev/null +++ b/produto/prototipo/prototipo/index.html @@ -0,0 +1,2179 @@ + + + + + + + + + + + + + + + + + + + + + + + Protótipo - GEROcuidado + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + + + + + + +
+ +
+ + + + +
+
+ + + +
+
+
+ + + + + + + +
+
+
+ + + + + + + +
+
+ + + + + + + +

Protótipo

+

Histórico de versões

+ + + + + + + + + + + + + + + + + +
DataVersãoDescriçãoAutor
27/07/20241.0Criação do documentoGabriel Monteiro
+

Introdução

+

Na área de desenvolvimento de software, a criação de protótipos desempenha um papel fundamental na concepção e no aprimoramento de sistemas e aplicações. Um protótipo é uma representação inicial de um software que permite aos desenvolvedores, designers e partes interessadas visualizarem e interagirem com as funcionalidades e a aparência do sistema antes da implementação final. Os protótipos são uma ferramenta valiosa para validar conceitos, coletar feedback, identificar requisitos e economizar tempo e recursos no ciclo de desenvolvimento.

+

No entanto, os protótipos podem ser classificados em duas categorias distintas: protótipos de baixa fidelidade e protótipos de alta fidelidade. A diferença entre esses dois tipos de protótipos reside na profundidade do detalhe e na precisão com que representam o sistema final. Protótipos de baixa fidelidade geralmente são simplificados e rápidos de criar, enquanto protótipos de alta fidelidade se assemelham mais de perto ao produto final em termos de funcionalidade e aparência.

+

Protótipos do GEROcuidado

+

A prototipação que ocorreu no projeto GEROcuidado, foi um pocuo diferente, de certa forma um caso atípico, o que ocorreu foi que o cliente, no caso os membros do Enactus, já tinham um protótipo de alta fidelidade desenvolvido, dessa forma muitas das funcionalidades abordadas por eles durante a criação da visão do produto já estavam evidenciados no protótipo. Entrentanto, apesar do protótipo trazer essas diferças funcionalidades, ele ainda precisava ser complementado, visto que o mesmo não abordava todas as telas necessárias para ser ter cada um dos fluxos propostos, dessa forma o time de desenvolvimento, realizou mudanças para que o protótipo atendesse ao fluxo funcional das funcionalidades. tendo então o resultado abaixo:

+

Protótipo Funcional

+

Ao serem criados as telas foi pensado no esquema de prototipar para utilização, logo foi gerado o seguinte resultado

+ + +

Telas de Protótipo

+

Tutorial

+

Tela de Tutorial

+

Tela Inicial

+

Tela de Entrar

+

Login

+

Tela de Login +Tela de Login +Tela de Login +Tela de Login

+

Cadastrar Perfil de Usuário

+

Tela de Cadastro +Tela de cadastro do idoso

+

Perfil de Usuário

+

Tela de Perfil +Tela de Perfil

+

Cadastrar Idoso

+

Tela de cadastrar idoso +Tela de Visualizar idoso

+

Fórum

+

Tela de Forum +Tela de Forum +Tela de Forum +Tela de Forum

+

Editar Publicação

+

Tela de Forum

+

Moderação

+

Tela de Moderação +Tela de Moderação

+

Cadastrar Rotina

+

Tela de Rotinas +Tela de Rotinas

+

Notificações

+

Tela de Notificação

+

Visualizar Rotina

+

Tela de Agenda/Calendário

+

Métricas de sáude

+

Tela de Métricas 1 +Tela de Métricas 2 +Tela de Métricas 3 +Tela de Métricas 4 +Tela de Métricas 5 +Tela de Métricas 6

+

Sem Conexão

+

Tela Sem Conexão

+ + + + + + +
+
+ + +
+ +
+ + + +
+
+
+
+ + + + + + + + + \ No newline at end of file diff --git a/search/search_index.json b/search/search_index.json new file mode 100644 index 0000000..f735cb3 --- /dev/null +++ b/search/search_index.json @@ -0,0 +1 @@ +{"config":{"lang":["pt"],"separator":"[\\s\\-]+","pipeline":["stopWordFilter"]},"docs":[{"location":"","title":"GEROcuidado","text":"

O GEROcuidado se prop\u00f5e a ser um gerenciador de registro da rotina de cuidados, por meio de orienta\u00e7\u00f5es de sa\u00fade e rede de apoio entre os cuidadores de idosos. O Projeto foi criado a partir do edital Pr\u00eamio Inspirando Cuidado 2022, com o objetivo de incentivar e prestar aux\u00edlio a projetos trabalhando com a ODS 3 (Sa\u00fade e Bem-estar).

"},{"location":"#equipe","title":"Equipe","text":"

A equipe \u00e9 composta por 9 membros ao todo, sendo 3 de EPS e 6 de MDS, afim de documentar o projeto, al\u00e9m de resolver bugs e incrementar o projeto com novas funcionalidades.

"},{"location":"#integrantes-de-eps","title":"Integrantes de EPS","text":"Amanda Nobre Ugor Brand\u00e3o Victor Gon\u00e7alves"},{"location":"#integrantes-de-mds","title":"Integrantes de MDS","text":"Gabriel Monteiro Gustavo Abrantes Jessica Luiza Marcella Anderle Natalia Rodrigues Sebasti\u00e1n H\u00e9ctor"},{"location":"Guia%20de%20Contribui%C3%A7%C3%A3o/US_template/","title":"US template","text":""},{"location":"Guia%20de%20Contribui%C3%A7%C3%A3o/US_template/#descricao","title":"Descri\u00e7\u00e3o","text":"
  • Eu, como Cuidador, desejo [...]

  • Nessa tarefa, o cuidador deve [...]

"},{"location":"Guia%20de%20Contribui%C3%A7%C3%A3o/US_template/#pre-requisitos","title":"Pr\u00e9-Requisitos","text":""},{"location":"Guia%20de%20Contribui%C3%A7%C3%A3o/US_template/#criterios-de-avaliacao","title":"Crit\u00e9rios de Avalia\u00e7\u00e3o","text":"
  • [ ]
"},{"location":"Guia%20de%20Contribui%C3%A7%C3%A3o/US_template/#prototipo","title":"Prot\u00f3tipo","text":"

## Tarefas

  • [ ]
"},{"location":"Guia%20de%20Contribui%C3%A7%C3%A3o/contribui%C3%A7%C3%A3o/","title":"Guia de Contribui\u00e7\u00e3o","text":""},{"location":"Guia%20de%20Contribui%C3%A7%C3%A3o/contribui%C3%A7%C3%A3o/#historico-de-versoes","title":"Hist\u00f3rico de Vers\u00f5es","text":"Data Vers\u00e3o Descri\u00e7\u00e3o Autor 12/08/2024 1.0 Cria\u00e7\u00e3o do documento Gustavo Abrantes 23/08/2024 2.0 Atualiza\u00e7\u00e3o do documento Gabriel Monteiro"},{"location":"Guia%20de%20Contribui%C3%A7%C3%A3o/contribui%C3%A7%C3%A3o/#issues","title":"Issues","text":"

Ao criar issues, atente-se \u00e0s seguintes quest\u00f5es:

  • Verifique se j\u00e1 existe uma issue referente ao assunto que voc\u00ea pretende abordar: Se sim, trabalhe a partir da issue j\u00e1 criada.
  • T\u00edtulo: Adicione um t\u00edtulo que sintetize bem o problema abordado na issue.
  • Descri\u00e7\u00e3o: Adicione uma descri\u00e7\u00e3o adequada, de modo que qualquer membro do reposit\u00f3rio consiga compreender qual \u00e9 o problema.
  • Assignees: Adicione ao menos um respons\u00e1vel (Assignee).
  • Labels: Adicione as Labels adequadas.
  • Milestone: Adicione a milestone referente \u00e0 sprint em que o problema ser\u00e1 trabalhado.
  • Estimate: Adicione uma estimativa de pontua\u00e7\u00e3o, conforme as defini\u00e7\u00f5es descritas neste documento.
"},{"location":"Guia%20de%20Contribui%C3%A7%C3%A3o/contribui%C3%A7%C3%A3o/#branches","title":"Branches","text":"

Padronizar evita confus\u00f5es e facilita a leitura e a procura por artefatos do projeto. Isso tamb\u00e9m se aplica \u00e0 nomenclatura de branches. Por padr\u00e3o, a nomenclatura de branches deve obedecer ao seguinte formato:

<type>/<branch-name>\n
"},{"location":"Guia%20de%20Contribui%C3%A7%C3%A3o/contribui%C3%A7%C3%A3o/#type","title":"Type","text":"

O par\u00e2metro type sinaliza o principal tipo de modifica\u00e7\u00e3o realizada. Por padr\u00e3o, utilizamos as seguintes palavras-chave:

Type Significado feat Novas funcionalidades para o usu\u00e1rio fix Corre\u00e7\u00f5es de bugs para o usu\u00e1rio docs Modifica\u00e7\u00f5es na documenta\u00e7\u00e3o style Formata\u00e7\u00e3o, sem altera\u00e7\u00f5es no c\u00f3digo de produ\u00e7\u00e3o refactor Refatora\u00e7\u00e3o de c\u00f3digo de produ\u00e7\u00e3o test Adi\u00e7\u00e3o e refatora\u00e7\u00e3o de testes (sem alterar c\u00f3digo de produ\u00e7\u00e3o) chore Atualiza\u00e7\u00f5es gen\u00e9ricas sem altera\u00e7\u00f5es de c\u00f3digo de produ\u00e7\u00e3o"},{"location":"Guia%20de%20Contribui%C3%A7%C3%A3o/contribui%C3%A7%C3%A3o/#branch-name","title":"Branch Name","text":"

O par\u00e2metro branch-name descreve de forma textual a atividade realizada dentro da branch. Por padr\u00e3o, o nome da branch \u00e9 escrito em ingl\u00eas, substituindo os espa\u00e7os por h\u00edfen (\"_\"). Por exemplo: Create new tests for user se torna create-new-tests-for-user.

Atente-se para a cria\u00e7\u00e3o de um nome coerente para sua branch, a fim de evitar confus\u00f5es e incoer\u00eancias.

"},{"location":"Guia%20de%20Contribui%C3%A7%C3%A3o/contribui%C3%A7%C3%A3o/#exemplos","title":"Exemplos","text":"

Uma branch para adi\u00e7\u00e3o de novos testes para um user:

test/create-new-tests-for-user\n

Uma branch para corre\u00e7\u00e3o de um bug na cria\u00e7\u00e3o de user:

fix/remove-bug-from-user-creation\n
"},{"location":"Guia%20de%20Contribui%C3%A7%C3%A3o/contribui%C3%A7%C3%A3o/#criacao-de-branches","title":"Cria\u00e7\u00e3o de Branches","text":"

A partir do reposit\u00f3rio desejado:

  1. Atualize seu reposit\u00f3rio local buscando por novidades no reposit\u00f3rio remoto:
git fetch\n
  1. Mude para a branch principal, seja develop ou main:
git checkout <branch-principal>\n
  1. Sincronize o estado da branch local com o estado da branch remota:
git reset --hard <branch-principal>\n
  1. A partir da branch atual, crie a nova branch obedecendo \u00e0 conven\u00e7\u00e3o de nomes:
git checkout -b <type>/<branch-name>\n
"},{"location":"Guia%20de%20Contribui%C3%A7%C3%A3o/contribui%C3%A7%C3%A3o/#commits","title":"Commits","text":"

A pol\u00edtica de commits deste projeto \u00e9 baseada no Conventional Commits v1.0.0.

O Conventional Commits define um conjunto de regras simples para que as mensagens de commit sejam consistentes no hist\u00f3rico de um reposit\u00f3rio. Utilizar uma conven\u00e7\u00e3o como essa facilita a leitura do hist\u00f3rico, a identifica\u00e7\u00e3o das mudan\u00e7as realizadas por um commit e facilita a ado\u00e7\u00e3o de ferramentas de automa\u00e7\u00e3o para gerar changelogs ou release notes.

Por padr\u00e3o, as mensagens de commits devem seguir o seguinte formato:

<type>: <subject>\n
"},{"location":"Guia%20de%20Contribui%C3%A7%C3%A3o/contribui%C3%A7%C3%A3o/#type_1","title":"Type","text":"

Assim como para as branches, type descreve o tipo de modifica\u00e7\u00e3o contemplada pelo commit. Por padr\u00e3o, utilizamos as seguintes palavras-chave:

Type Significado feat Novas funcionalidades para o usu\u00e1rio fix Corre\u00e7\u00f5es de bugs para o usu\u00e1rio docs Modifica\u00e7\u00f5es na documenta\u00e7\u00e3o style Formata\u00e7\u00e3o, sem altera\u00e7\u00f5es no c\u00f3digo de produ\u00e7\u00e3o refactor Refatora\u00e7\u00e3o de c\u00f3digo de produ\u00e7\u00e3o test Adi\u00e7\u00e3o e refatora\u00e7\u00e3o de testes (sem alterar c\u00f3digo de produ\u00e7\u00e3o) chore Atualiza\u00e7\u00f5es gen\u00e9ricas sem altera\u00e7\u00f5es de c\u00f3digo de produ\u00e7\u00e3o"},{"location":"Guia%20de%20Contribui%C3%A7%C3%A3o/contribui%C3%A7%C3%A3o/#subject","title":"Subject","text":"

O par\u00e2metro subject representa a mensagem que descreve o commit, escrita em ingl\u00eas. Uma boa pr\u00e1tica \u00e9 sempre escrever subjects descritivos, isto \u00e9, sempre se preocupando em deixar bem claros os conceitos de what (o que foi feito) e why (por que foi feito).

Para clarificar as recomenda\u00e7\u00f5es aqui mencionadas, confira estes exemplos:

Modifies user model Ao avaliar esta mensagem de commit, o conceito what \u00e9 superficial, pois n\u00e3o descreve especificamente o que foi alterado no modelo de usu\u00e1rio. O conceito why sequer existe.

Modifies user's model name field to make it shorter Ao avaliar esta mensagem de commit, quem quer que a leia entender\u00e1 o motivo e do que se trata a altera\u00e7\u00e3o feita. Tal clareza permite poupar esfor\u00e7o e tempo para entender do que o commit se trata.

"},{"location":"Guia%20de%20Contribui%C3%A7%C3%A3o/contribui%C3%A7%C3%A3o/#pull-request","title":"Pull Request","text":"

O Pull Request (PR) \u00e9 a maneira de contribuir para projetos de grupo ou de c\u00f3digo aberto (open source).

Por exemplo, um usu\u00e1rio copia um reposit\u00f3rio e faz altera\u00e7\u00f5es nesse reposit\u00f3rio. Agora, ele pode fazer um Pull Request para o reposit\u00f3rio original, mas cabe ao mantenedor aceit\u00e1-lo ou recus\u00e1-lo. \u00c9 como dizer: \"Voc\u00ea poderia aceitar minhas altera\u00e7\u00f5es, por favor?\"

git remote\n

Depois de identificar o nome do reposit\u00f3rio remoto, podemos enviar/fazer um push dessas altera\u00e7\u00f5es para o GitHub:

git push origin <nome_da_branch>\n

Agora, navegue at\u00e9 o reposit\u00f3rio no GitHub do projeto, e voc\u00ea ver\u00e1 um bot\u00e3o dizendo Compare & pull request. Clique nele.

Antes de clicar em Create pull request, adicione uma descri\u00e7\u00e3o com todos os campos a seguir:

Campo Descri\u00e7\u00e3o Nomear PR [#NUMERO_ISSUE] Nome do PR Descri\u00e7\u00e3o Insira uma descri\u00e7\u00e3o geral do que foi alterado neste PR US Closes #NUMERO_US Issue Closes #NUMERO_ISSUE Principais Implementa\u00e7\u00f5es Se for c\u00f3digo, descreva altera\u00e7\u00f5es relevantes"},{"location":"Guia%20de%20Contribui%C3%A7%C3%A3o/contribui%C3%A7%C3%A3o/#tipos-de-mudancas","title":"Tipos de Mudan\u00e7as","text":"
  • [ ] Bug fix: Corre\u00e7\u00e3o que resolve uma issue sem alterar funcionalidades j\u00e1 existentes.
  • [ ] Nova feature: Adi\u00e7\u00e3o de uma funcionalidade sem alterar funcionalidades j\u00e1 existentes.
  • [ ] Breaking change: Mudan\u00e7a que afeta o funcionamento de partes dependentes do c\u00f3digo (quando uma depend\u00eancia cr\u00edtica ou m\u00e9todo \u00e9 alterado, por exemplo).
  • [ ] Refatora\u00e7\u00e3o de c\u00f3digo: Altera\u00e7\u00e3o que visa melhorar a qualidade do c\u00f3digo sem modificar funcionalidades.
  • [ ] Documenta\u00e7\u00e3o
  • [ ] Experi\u00eancia do usu\u00e1rio (UX)
  • [ ] Melhoria de desempenho

Aten\u00e7\u00e3o! Ao fazer um pull request atente-se para:

  • Seguir o template configurado.
  • Linkar o PR a sua Issue correspondente.
  • Marcar um dos respons\u00e1veis para revis\u00e3o.
"},{"location":"Guia%20de%20Contribui%C3%A7%C3%A3o/contribui%C3%A7%C3%A3o/#exemplo-de-pull-request","title":"Exemplo de Pull Request","text":"
[#0] Removendo espa\u00e7os vazios\n\n## Descri\u00e7\u00e3o\n\n- Removendo espa\u00e7os vazios para evitar erros de compila\u00e7\u00e3o.\n\n## Issues\n\n- Closes #1\n\n## Principais Implementa\u00e7\u00f5es\n\n- Ajustes no c\u00f3digo para melhor performance.\n
"},{"location":"Guia%20de%20Contribui%C3%A7%C3%A3o/contribui%C3%A7%C3%A3o/#dicas-para-a-criacao-de-um-bom-pr","title":"Dicas para a cria\u00e7\u00e3o de um bom PR:","text":"
  • Divida PRs grandes em PRs menores quando poss\u00edvel.
  • Fa\u00e7a um bom t\u00edtulo e uma boa descri\u00e7\u00e3o para o seu PR.
  • Lembre-se de referenciar as issues e/ou user stories associadas ao PR.
  • Inclua capturas de tela ou gifs que demonstrem visualmente o que foi feito, se aplic\u00e1vel.
"},{"location":"Guia%20de%20Contribui%C3%A7%C3%A3o/contribui%C3%A7%C3%A3o/#analise-de-pull-request","title":"An\u00e1lise de Pull Request","text":"

Durante a revis\u00e3o, alguns pontos de aten\u00e7\u00e3o s\u00e3o importantes:

  • Nome: Verifique se a nomenclatura do PR e a descri\u00e7\u00e3o est\u00e3o de acordo com o padr\u00e3o.
  • Issue: Certifique-se de que a Issue mencionada seja fechada com o PR.
  • Implementa\u00e7\u00f5es: Confirme se as principais implementa\u00e7\u00f5es mencionadas no PR est\u00e3o coerentes com a solicita\u00e7\u00e3o da Issue.
  • Sugest\u00f5es: Se necess\u00e1rio, fa\u00e7a sugest\u00f5es para melhorar o c\u00f3digo.
  • Aprova\u00e7\u00e3o: Caso tudo esteja de acordo, aprove o PR.
"},{"location":"Guia%20de%20Contribui%C3%A7%C3%A3o/contribui%C3%A7%C3%A3o/#user-stories-us","title":"User Stories (US)","text":"

As User Stories (US) s\u00e3o uma forma \u00e1gil de capturar os requisitos de uma funcionalidade sob a perspectiva do usu\u00e1rio final. Elas descrevem a necessidade do usu\u00e1rio de forma simples e direta, permitindo que o time de desenvolvimento compreenda o objetivo final da funcionalidade.

"},{"location":"Guia%20de%20Contribui%C3%A7%C3%A3o/contribui%C3%A7%C3%A3o/#estrutura-da-us","title":"Estrutura da US","text":"

Cada US deve seguir a estrutura b\u00e1sica:

Como <persona>, eu quero <necessidade>, para que <benef\u00edcio>.\n

Exemplo:

Como usu\u00e1rio autenticado, eu quero poder redefinir minha senha, para que eu possa acessar minha conta caso eu esque\u00e7a a senha atual.\n
"},{"location":"Guia%20de%20Contribui%C3%A7%C3%A3o/contribui%C3%A7%C3%A3o/#criacao-de-user-stories","title":"Cria\u00e7\u00e3o de User Stories","text":"

Ao criar uma US, atente-se aos seguintes pontos:

  1. Persona: Identifique o tipo de usu\u00e1rio para o qual a funcionalidade est\u00e1 sendo criada.
  2. Necessidade: Descreva claramente o que o usu\u00e1rio deseja fazer.
  3. Benef\u00edcio: Explique o motivo ou o valor que essa funcionalidade traz para o usu\u00e1rio.
  4. Crit\u00e9rios de Aceita\u00e7\u00e3o: Liste os crit\u00e9rios que precisam ser atendidos para que a US seja considerada completa. Eles servem como um guia para a equipe de desenvolvimento e para o time de QA durante o processo de valida\u00e7\u00e3o.
"},{"location":"Guia%20de%20Contribui%C3%A7%C3%A3o/contribui%C3%A7%C3%A3o/#exemplo-de-user-story-completa","title":"Exemplo de User Story Completa","text":"
**US01 - Redefinir Senha**\n\nComo usu\u00e1rio autenticado, eu quero poder redefinir minha senha, para que eu possa acessar minha conta caso eu esque\u00e7a a senha atual.\n\n**Crit\u00e9rios de Aceita\u00e7\u00e3o:**\n- O usu\u00e1rio deve poder solicitar a redefini\u00e7\u00e3o de senha informando o e-mail cadastrado.\n- Um e-mail com um link para redefini\u00e7\u00e3o deve ser enviado para o usu\u00e1rio.\n- O link deve ser v\u00e1lido por 24 horas.\n- O usu\u00e1rio deve poder definir uma nova senha ap\u00f3s clicar no link.\n- A nova senha deve atender aos crit\u00e9rios de seguran\u00e7a definidos (m\u00ednimo de 8 caracteres, incluindo letras mai\u00fasculas, min\u00fasculas e n\u00fameros).\n\n**Estimate:** 5 pontos\n
"},{"location":"Guia%20de%20Contribui%C3%A7%C3%A3o/contribui%C3%A7%C3%A3o/#estimativa-de-pontuacao-para-us","title":"Estimativa de Pontua\u00e7\u00e3o para US","text":"

Assim como as Issues, as US tamb\u00e9m devem ter uma estimativa de pontua\u00e7\u00e3o com base na complexidade e no esfor\u00e7o necess\u00e1rio para a implementa\u00e7\u00e3o. A pontua\u00e7\u00e3o ser\u00e1 decidida em conjunto pelo time, utilizando ferramentas como o Planning Poker no ZenHub.

"},{"location":"Guia%20de%20Contribui%C3%A7%C3%A3o/contribui%C3%A7%C3%A3o/#criacao-de-pull-requests-para-us","title":"Cria\u00e7\u00e3o de Pull Requests para US","text":"

Ao concluir a implementa\u00e7\u00e3o de uma US, crie um Pull Request (PR) seguindo as orienta\u00e7\u00f5es descritas na se\u00e7\u00e3o de Pull Requests deste guia. Certifique-se de:

  • Mencionar a US correspondente no t\u00edtulo do PR.
  • Descrever brevemente as altera\u00e7\u00f5es realizadas.
  • Incluir as refer\u00eancias \u00e0s Issues que foram resolvidas durante a implementa\u00e7\u00e3o da US.
  • Adicionar capturas de tela ou GIFs que demonstrem a funcionalidade implementada, se aplic\u00e1vel.
"},{"location":"Guia%20de%20Contribui%C3%A7%C3%A3o/contribui%C3%A7%C3%A3o/#revisao-de-user-stories","title":"Revis\u00e3o de User Stories","text":"

Durante a revis\u00e3o de uma US, preste aten\u00e7\u00e3o aos seguintes aspectos:

  • Clareza da US: A hist\u00f3ria est\u00e1 clara e compreens\u00edvel?
  • Crit\u00e9rios de Aceita\u00e7\u00e3o: Todos os crit\u00e9rios foram implementados e validados?
  • Teste: A funcionalidade foi testada adequadamente?
  • Documenta\u00e7\u00e3o: A documenta\u00e7\u00e3o est\u00e1 atualizada de acordo com a nova funcionalidade?
"},{"location":"Guia%20de%20Contribui%C3%A7%C3%A3o/contribui%C3%A7%C3%A3o/#padroes-de-codigo","title":"Padr\u00f5es de C\u00f3digo","text":"

Manter a consist\u00eancia de estilo de c\u00f3digo ajuda na legibilidade e manuten\u00e7\u00e3o do projeto. Alguns pontos a serem considerados incluem:

  • Indenta\u00e7\u00e3o: Use espa\u00e7os ou tabula\u00e7\u00f5es consistentes (conforme o padr\u00e3o do projeto).
  • Nomes de Vari\u00e1veis: Prefira nomes descritivos e consistentes.
  • Coment\u00e1rios: Adicione coment\u00e1rios esclarecedores onde necess\u00e1rio.
  • Linhas em Branco: Utilize espa\u00e7os para separar conceitos ou blocos de c\u00f3digo.
  • Limpeza: Evite deixar c\u00f3digo comentado sem justificativa ou trechos de c\u00f3digo obsoletos.
"},{"location":"Guia%20de%20Contribui%C3%A7%C3%A3o/contribui%C3%A7%C3%A3o/#referencias","title":"Refer\u00eancias","text":"

Commits Convencionais

Git branch naming conventions

Gerenciando seus branches com o Git Flow

Pol\u00edticas do Reposit\u00f3rio

"},{"location":"Guia%20de%20Contribui%C3%A7%C3%A3o/issue_template/","title":"Descri\u00e7\u00e3o","text":""},{"location":"Guia%20de%20Contribui%C3%A7%C3%A3o/issue_template/#tarefas","title":"Tarefas","text":""},{"location":"Guia%20de%20Contribui%C3%A7%C3%A3o/issue_template/#informacoes-adicionais","title":"Informa\u00e7\u00f5es Adicionais","text":""},{"location":"Guia%20de%20Contribui%C3%A7%C3%A3o/pull_request_template/","title":"Pull request template","text":""},{"location":"Guia%20de%20Contribui%C3%A7%C3%A3o/pull_request_template/#descricao","title":"Descri\u00e7\u00e3o","text":""},{"location":"Guia%20de%20Contribui%C3%A7%C3%A3o/pull_request_template/#us","title":"US","text":""},{"location":"Guia%20de%20Contribui%C3%A7%C3%A3o/pull_request_template/#issue","title":"Issue","text":""},{"location":"Guia%20de%20Contribui%C3%A7%C3%A3o/pull_request_template/#principais-implementacoes","title":"Principais Implementa\u00e7\u00f5es","text":""},{"location":"Guia%20de%20Contribui%C3%A7%C3%A3o/pull_request_template/#tipos-de-mudancas","title":"Tipos de Mudan\u00e7as","text":"
  • [ ] Bug fix (altera\u00e7\u00e3o que corrige uma issue e n\u00e3o altera funcionalidades j\u00e1 existentes);
  • [ ] Nova feature (altera\u00e7\u00e3o que adiciona uma funcionalidade e n\u00e3o altera funcionalidades j\u00e1 existentes);
  • [ ] Altera\u00e7\u00e3o disruptiva (Breaking change) (Corre\u00e7\u00e3o ou funcionalidade que causa altera\u00e7\u00e3o nas funcionalidades existentes);
  • [ ] Documenta\u00e7\u00e3o
  • [ ] Experi\u00eancia do usu\u00e1rio (UX)
  • [ ] Melhoria de desempenho
"},{"location":"dojos/git/","title":"Doj\u00f4 Git / GitHub","text":""},{"location":"dojos/git/#introducao","title":"Introdu\u00e7\u00e3o","text":""},{"location":"dojos/git/#git","title":"Git","text":"

Git \u00e9 um sistema de controle de vers\u00e3o distribu\u00eddo usado para rastrear altera\u00e7\u00f5es no c\u00f3digo fonte durante o desenvolvimento de software. - Permite que v\u00e1rios desenvolvedores trabalhem simultaneamente no mesmo projeto - Audita as altera\u00e7\u00f5es feitas em arquivos espec\u00edficos ao longo do tempo. - Permite que os desenvolvedores revertam para vers\u00f5es anteriores, criem novas funcionalidades em paralelo e colaborem de maneira eficaz.

"},{"location":"dojos/git/#github","title":"GitHub:","text":"

GitHub \u00e9 uma plataforma de hospedagem baseada na web para projetos Git, fornecendo uma interface visual para o controle de vers\u00e3o e colabora\u00e7\u00e3o em equipe.

Ele permite que os desenvolvedores hospedem seus reposit\u00f3rios Git remotamente na nuvem e fornece recursos adicionais, como rastreamento de problemas, controle de acesso, integra\u00e7\u00e3o cont\u00ednua e muito mais.

"},{"location":"dojos/git/#conceitos-chave","title":"Conceitos chave","text":""},{"location":"dojos/git/#commit","title":"Commit:","text":"

Um commit no Git \u00e9 uma opera\u00e7\u00e3o na qual as altera\u00e7\u00f5es feitas em arquivos espec\u00edficos s\u00e3o salvas no reposit\u00f3rio local Git. - Cada commit \u00e9 acompanhado de uma mensagem que descreve as altera\u00e7\u00f5es feitas, fornecendo contexto sobre o que foi modificado. - Commits ajudam a rastrear e documentar o progresso do desenvolvimento ao longo do tempo.

"},{"location":"dojos/git/#branch","title":"Branch:","text":"

Uma branch no Git \u00e9 uma ramifica\u00e7\u00e3o independente do c\u00f3digo fonte principal (geralmente chamado de branch \"master\" ou \"main\").

As branches permitem que os desenvolvedores trabalhem em novas funcionalidades ou corre\u00e7\u00f5es de bugs sem interferir no c\u00f3digo principal.

Depois que as altera\u00e7\u00f5es em uma branch s\u00e3o conclu\u00eddas e testadas, elas podem ser mescladas de volta a branch principal por meio de um processo chamado de \"merge\".

"},{"location":"dojos/git/#merge","title":"Merge:","text":"

Merge \u00e9 o processo de combinar as altera\u00e7\u00f5es de uma branch em outra.

Por exemplo, voc\u00ea pode ter uma branch de desenvolvimento onde as novas funcionalidades s\u00e3o adicionadas e, quando estiverem prontas, voc\u00ea pode mescl\u00e1-las de volta para a branch principal (master ou main).

"},{"location":"dojos/git/#pull-request-pedido-de-pull","title":"Pull Request (Pedido de Pull):","text":"

Um pull request \u00e9 uma solicita\u00e7\u00e3o feita por um colaborador de um reposit\u00f3rio Git para incorporar suas altera\u00e7\u00f5es em uma branch espec\u00edfica desse reposit\u00f3rio.

Geralmente, os pull requests s\u00e3o usados em projetos colaborativos para revis\u00e3o de c\u00f3digo e integra\u00e7\u00e3o de novas funcionalidades ou corre\u00e7\u00f5es de bugs. Os mantenedores do projeto podem revisar as altera\u00e7\u00f5es propostas, fazer coment\u00e1rios e, eventualmente, mesclar o pull request se estiverem satisfeitos com as altera\u00e7\u00f5es.

"},{"location":"dojos/git/#como-funciona-o-github","title":"Como funciona o GitHub:","text":"

O GitHub funciona como um reposit\u00f3rio remoto para projetos Git. Os desenvolvedores podem enviar (\"push\") seus commits para o GitHub e colaborar com outros desenvolvedores em um projeto espec\u00edfico. Eles podem criar branches, abrir pull requests, revisar c\u00f3digo, discutir altera\u00e7\u00f5es e mesclar altera\u00e7\u00f5es no c\u00f3digo principal.

"},{"location":"dojos/git/#comandos-basicos","title":"Comandos b\u00e1sicos","text":""},{"location":"dojos/git/#configuracao-inicial","title":"Configura\u00e7\u00e3o Inicial","text":"

Antes de come\u00e7ar, \u00e9 importante configurar o Git com suas informa\u00e7\u00f5es pessoais

git config --global user.name \"Seu Nome\"\ngit config --global user.email \"seuemail@example.com\"\n

Essas configura\u00e7\u00f5es ser\u00e3o usadas para identificar os autores dos commits que voc\u00ea criar.

"},{"location":"dojos/git/#inicializando-um-repositorio","title":"Inicializando um Reposit\u00f3rio","text":"

Para come\u00e7ar a usar o Git em um projeto, \u00e9 necess\u00e1rio inicializar um reposit\u00f3rio.

git init\n

Esse comando cria um novo reposit\u00f3rio Git no diret\u00f3rio atual.

"},{"location":"dojos/git/#clonando-um-repositorio","title":"Clonando um Reposit\u00f3rio","text":"

\u00c9 poss\u00edvel usar um reposit\u00f3rio j\u00e1 criado no github e copi\u00e1-lo para sua m\u00e1quina:

git clone _url-do-repositorio.git_\n
"},{"location":"dojos/git/#adicionando-arquivos","title":"Adicionando Arquivos","text":"

Ap\u00f3s inicializar ou clonar um reposit\u00f3rio, voc\u00ea pode adicionar e modificar arquivos para serem rastreados pelo Git.

git add nome_do_arquivo\n

Esse comando adiciona um arquivo espec\u00edfico ao pr\u00f3ximo commit. Voc\u00ea tamb\u00e9m pode usar git add . para adicionar todos os arquivos modificados.

"},{"location":"dojos/git/#fazendo-um-commit","title":"Fazendo um Commit","text":"

Quando voc\u00ea tiver arquivos prontos para serem registrados no hist\u00f3rico do Git, voc\u00ea pode fazer um commit.

git commit -m \"Mensagem do commit\"\n

Esse comando cria um novo commit com as altera\u00e7\u00f5es adicionadas anteriormente. A mensagem do commit deve descrever as altera\u00e7\u00f5es realizadas.

"},{"location":"dojos/git/#enviando-commits-para-um-repositorio-remoto","title":"Enviando commits para um reposit\u00f3rio remoto","text":"
git push nome_remoto nome_branch\n

Esse comando envia seus commits locais para um reposit\u00f3rio remoto espec\u00edfico.

"},{"location":"dojos/git/#obtendo-alteracoes-de-um-repositorio-remoto","title":"Obtendo altera\u00e7\u00f5es de um reposit\u00f3rio remoto","text":"
git pull nome_remoto nome_branch\n

Esse comando obt\u00e9m as altera\u00e7\u00f5es mais recentes de um reposit\u00f3rio remoto e as mescla em sua branch local.

"},{"location":"dojos/git/#verificando-o-status","title":"Verificando o Status","text":"

A qualquer momento, voc\u00ea pode verificar o status atual do seu reposit\u00f3rio.

git status\n

Esse comando mostra o status atual do reposit\u00f3rio, incluindo arquivos modificados, arquivos adicionados e branch atual.

"},{"location":"dojos/git/#visualizando-o-historico-de-commits","title":"Visualizando o Hist\u00f3rico de Commits","text":"

Voc\u00ea pode visualizar o hist\u00f3rico de commits no reposit\u00f3rio.

git log\n

Esse comando mostra uma lista de commits no reposit\u00f3rio, exibindo informa\u00e7\u00f5es como autor, data, hora e mensagem do commit.

"},{"location":"dojos/git/#atualizando-a-branch-atual","title":"Atualizando a branch atual","text":"
git fetch\n

Esse comando \u00e9 usado para buscar todas as altera\u00e7\u00f5es feitas em um reposit\u00f3rio remoto para o seu reposit\u00f3rio local. Diferentemente do comando git pull, o git fetch apenas baixa as altera\u00e7\u00f5es para o seu reposit\u00f3rio local, mas n\u00e3o as mescla automaticamente.

"},{"location":"dojos/git/#listando-todas-as-branches","title":"Listando todas as branches","text":"
git branch\n

Esse comando lista todas as branches existentes no reposit\u00f3rio. A branch atual \u00e9 destacada com um asterisco.

"},{"location":"dojos/git/#criando-uma-nova-branch","title":"Criando uma nova branch","text":"
git branch nome_da_branch\n

Esse comando cria uma nova branch com o nome especificado, mas n\u00e3o muda para essa branch.

"},{"location":"dojos/git/#mudando-para-uma-branch","title":"Mudando para uma branch","text":"
git checkout nome_da_branch\n

Esse comando altera a branch atual para a branch especificada.

"},{"location":"dojos/git/#criando-e-mudando-para-uma-nova-branch","title":"Criando e mudando para uma nova branch","text":"
git checkout -b nome_da_branch\n

Esse comando cria uma nova branch com o nome especificado e imediatamente muda para essa branch.

"},{"location":"dojos/git/#excluindo-uma-branch","title":"Excluindo uma branch","text":"
git branch -d nome_da_branch\n

Esse comando exclui a branch especificada. Certifique-se de estar em outro branch antes de exclu\u00ed-la.

"},{"location":"dojos/git/#gerenciando-conflitos-de-merge","title":"Gerenciando Conflitos de Merge","text":"

Ao mesclar branches ou obter altera\u00e7\u00f5es de um reposit\u00f3rio remoto, podem ocorrer conflitos. Veja como lidar com eles:

"},{"location":"dojos/git/#resolvendo-conflitos-de-merge","title":"Resolvendo conflitos de merge","text":"

Abra os arquivos com conflitos e edite-os manualmente para resolver as diferen\u00e7as.

Ap\u00f3s resolver os conflitos, adicione os arquivos modificados usando git add nome_do_arquivo.

Fa\u00e7a um novo commit para finalizar o processo de merge.

"},{"location":"dojos/git/#rebase-interativo","title":"Rebase interativo","text":"
git rebase -i commit_referencia\n

Esse comando permite reorganizar, editar ou combinar commits antes deles serem adicionados ao hist\u00f3rico principal.

"},{"location":"dojos/git/#cherry-pick","title":"Cherry-pick","text":"
git cherry-pick commit_referencia\n

Esse comando permite aplicar um commit espec\u00edfico a um branch diferente.

"},{"location":"dojos/git/#vamos-partir-para-a-pratica","title":"Vamos partir para a pr\u00e1tica!","text":"

Agora a ideia \u00e9 partir para a pr\u00e1tica e usar os comandos aprendidos para fazer commits e pull requests!

  • Criar um reposit\u00f3rio novo

  • Adicionar os participantes

Todos devem fazer

  • Clonar o reposit\u00f3rio

  • Criar um arquivo nome-sobrenome.md com sua matr\u00edcula dentro.

  • Verificar as mudan\u00e7as

  • Adicionar a mudan\u00e7a ao commit

  • Commitar na branch

  • Conferir as mudan\u00e7as no reposit\u00f3rio local

  • Puxar as mudan\u00e7as feitas pelos colegas do reposit\u00f3rio remoto para o local

  • Criar uma branch nome-sobrenome

  • Alterar o arquivo com seu nome

  • Verificar a mudan\u00e7a

  • Adicionar a mudan\u00e7a

  • Commitar na sua branch

  • Conferir que sua branch apareceu no reposit\u00f3rio remoto e aparece a op\u00e7\u00e3o para criar um PR

  • Criar o PR com um t\u00edtulo, descri\u00e7\u00e3o e adicionando algu\u00e9m para revisar

Extra

  • Criar um conflito e mostrar a resolu\u00e7\u00e3o
"},{"location":"dojos/guia_instalacao_wsl2/","title":"Guia de instala\u00e7\u00e3o WSL2","text":""},{"location":"dojos/guia_instalacao_wsl2/#historico-de-versoes","title":"Hist\u00f3rico de vers\u00f5es","text":"Data Vers\u00e3o Descri\u00e7\u00e3o Autor 05/04/2024 1.0 Cria\u00e7\u00e3o do documento Amanda Nobre"},{"location":"dojos/guia_instalacao_wsl2/#habilitando-wsl","title":"Habilitando WSL","text":"

Utilizaremos o Windows Subsystem for Linux (vers\u00e3o 2) como nosso ambiente de desenvolvimento. O primeiro passo \u00e9 habilitar o WSL no seu computador. Para isso, abra uma janela do PowerShell com permiss\u00f5es de administrador e execute esse comando:

Aten\u00e7\u00e3o: Ao executar o comando abaixo, se o processador for AMD, o seguinte erro pode acontecer Please enable the Virtual Machine Platform Windows feature and ensure virtualization is enabled in the BIOS. Para solucionar basta acessar a BIOS e ativar o SVM Mode.

dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart\n
"},{"location":"dojos/guia_instalacao_wsl2/#habilitando-recurso-de-maquina-virtual","title":"Habilitando recurso de M\u00e1quina Virtual","text":"

Agora, precisamos habilitar o recurso de m\u00e1quina virtual no Windows. Para isso, execute o comando abaixo:

dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart\n

Pronto! J\u00e1 habilitamos o WSL e o recurso de m\u00e1quina virtual. \u00c9 necess\u00e1rio reiniciar o computador nesse momento para continuar com a instala\u00e7\u00e3o.

"},{"location":"dojos/guia_instalacao_wsl2/#atualizando-kernel-do-linux-para-podermos-utilizar-o-wsl-2","title":"Atualizando kernel do linux para podermos utilizar o WSL 2","text":"

Agora, vamos precisar atualizar o kernel do Linux para podermos utilizar a vers\u00e3o 2 do WSL. Para isso, \u00e9 necess\u00e1rio que o seu Windows 10 esteja na vers\u00e3o 1903 ou maior. Para verificar qual a vers\u00e3o instalada na sua m\u00e1quina, basta abrir uma janela do Prompt de Comando(CMD) e executar o comando ver. Aparecer\u00e1 a vers\u00e3o instalada na sua m\u00e1quina.

Ex: Microsoft Windows [vers\u00e3o 10.0.19042.746] (N\u00famero que est\u00e1 em negrito corresponde a vers\u00e3o do Windows 10).

Cumprindo o requisito de vers\u00e3o acima, basta agora baixar o arquivo de atualiza\u00e7\u00e3o clicando no link abaixo e instalar o mesmo:

Atualiza\u00e7\u00e3o WSL2

"},{"location":"dojos/guia_instalacao_wsl2/#definindo-wsl-2-como-versao-padrao","title":"Definindo WSL 2 como vers\u00e3o padr\u00e3o","text":"

Abra uma janela do PowerShell com permiss\u00f5es de administrador e execute o seguinte comando para definir o WSL2 como padr\u00e3o para instala\u00e7\u00f5es de distribui\u00e7\u00f5es do Linux.

wsl --set-default-version 2\n
"},{"location":"dojos/guia_instalacao_wsl2/#instalar-ubuntu-no-wsl","title":"Instalar Ubuntu no WSL","text":"

Abra a loja de aplicativos do Windows 10 (Microsoft Store) e procure por Ubuntu:

Agora, Instale essa aplica\u00e7\u00e3o chamada de Ubuntu.

Ap\u00f3s instalar, execute o Ubuntu instalado. Ir\u00e1 abrir uma janela pedindo para voc\u00ea criar uma conta de usu\u00e1rio padr\u00e3o o Ubuntu. Insira seu nome de usu\u00e1rio e depois a senha que deseja. Feito isso, J\u00e1 temos o WSL2 configurado e com o Ubuntu instalado!

"},{"location":"dojos/metodologias_ageis/","title":"Doj\u00f4 Metodologias \u00c1geis","text":""},{"location":"dojos/metodologias_ageis/#material-de-explicacao-simulacao-de-ciclo-de-trabalho","title":"Material de Explica\u00e7\u00e3o: Simula\u00e7\u00e3o de Ciclo de Trabalho","text":""},{"location":"dojos/metodologias_ageis/#introducao","title":"Introdu\u00e7\u00e3o:","text":"

Ol\u00e1, participantes do Dojo de Metodologia de Trabalho! Nesta parte do nosso evento, iremos realizar uma simula\u00e7\u00e3o pr\u00e1tica de ciclo de trabalho para explorar as metodologias \u00e1geis SCRUM, Kanban e XP. Esta atividade nos permitir\u00e1 vivenciar os rituais e pr\u00e1ticas dessas metodologias em um ambiente controlado, proporcionando uma experi\u00eancia valiosa para aplica\u00e7\u00e3o em nossos projetos reais.

Link do material de apoio e realiza\u00e7\u00e3o da atividade aqui.

"},{"location":"dojos/metodologias_ageis/#objetivo","title":"Objetivo:","text":"
  • Entender os principais rituais e pr\u00e1ticas do SCRUM, Kanban e XP.
  • Vivenciar na pr\u00e1tica o ciclo de trabalho de cada metodologia.
  • Identificar as diferen\u00e7as e semelhan\u00e7as entre as abordagens \u00e1geis.
"},{"location":"dojos/metodologias_ageis/#procedimento","title":"Procedimento:","text":""},{"location":"dojos/metodologias_ageis/#1-divisao-em-grupos","title":"1. Divis\u00e3o em Grupos:","text":"
  • Os participantes ser\u00e3o divididos em equipes de acordo com as metodologias escolhidas: SCRUM, Kanban e XP.
  • Cada equipe ter\u00e1 a oportunidade de experimentar uma das metodologias durante a simula\u00e7\u00e3o.
"},{"location":"dojos/metodologias_ageis/#2-explicacao-das-metodologias","title":"2. Explica\u00e7\u00e3o das Metodologias:","text":"
  • Breve explica\u00e7\u00e3o dos princ\u00edpios e rituais de cada metodologia:

    • SCRUM: Planejamento da Sprint, Reuni\u00f5es Di\u00e1rias, Revis\u00e3o da Sprint, Retrospectiva da Sprint.
    • Kanban: Quadro Kanban, Limites de WIP, Fluxo Cont\u00ednuo.
    • XP: Desenvolvimento Orientado a Testes (TDD), Programa\u00e7\u00e3o em Pares, Integra\u00e7\u00e3o Cont\u00ednua.
"},{"location":"dojos/metodologias_ageis/#3-simulacao-de-ciclo-de-trabalho","title":"3. Simula\u00e7\u00e3o de Ciclo de Trabalho:","text":"
  • Cada equipe realizar\u00e1 uma simula\u00e7\u00e3o de ciclo de trabalho de acordo com a metodologia atribu\u00edda.
  • Durante a simula\u00e7\u00e3o, os participantes devem seguir os rituais e pr\u00e1ticas da metodologia escolhida, trabalhando juntos para completar as tarefas atribu\u00eddas.
"},{"location":"dojos/metodologias_ageis/#4-feedback-e-discussao","title":"4. Feedback e Discuss\u00e3o:","text":"
  • Ap\u00f3s a simula\u00e7\u00e3o, cada equipe compartilhar\u00e1 suas experi\u00eancias, desafios enfrentados e li\u00e7\u00f5es aprendidas.
  • Todos os participantes ser\u00e3o encorajados a participar de uma discuss\u00e3o aberta para comparar as diferentes abordagens e identificar insights \u00fateis.
"},{"location":"dojos/metodologias_ageis/#5-reflexao-individual","title":"5. Reflex\u00e3o Individual:","text":"
  • Os participantes s\u00e3o convidados a refletir sobre como as metodologias \u00e1geis podem ser aplicadas em seus projetos reais, levando em considera\u00e7\u00e3o as experi\u00eancias da simula\u00e7\u00e3o.
"},{"location":"dojos/metodologias_ageis/#conclusao","title":"Conclus\u00e3o:","text":"

A simula\u00e7\u00e3o de ciclo de trabalho \u00e9 uma parte essencial do nosso Dojo de Metodologia de Trabalho, pois nos permite mergulhar na pr\u00e1tica das metodologias \u00e1geis e desenvolver uma compreens\u00e3o mais profunda de como aplic\u00e1-las em nossos pr\u00f3prios contextos de trabalho. Vamos agora come\u00e7ar a simula\u00e7\u00e3o e aproveitar ao m\u00e1ximo essa experi\u00eancia!

"},{"location":"encerramento/relatorio/","title":"Relat\u00f3rio de Encerramento","text":""},{"location":"encerramento/relatorio/#historico-de-versoes","title":"Hist\u00f3rico de vers\u00f5es","text":"Vers\u00e3o Data Descri\u00e7\u00e3o Autores 1.0 11/09/2024 Abertura do documento Sebasti\u00e1n Zuzunaga"},{"location":"encerramento/relatorio/#introducao","title":"Introdu\u00e7\u00e3o","text":"

Neste documento de encerramento ser\u00e1 feita uma an\u00e1lise do que planejou a equipe e o que foi realizado durante o desenvolvimento do projeto. Alguns aspectos que ser\u00e3o vistos s\u00e3o: backlog, custo, qualidade e riscos. Esta an\u00e1lise servir\u00e1 para ilustrar a perspectiva inicial da equipe e o que foi efetivamente conclu\u00eddo ao longo da execu\u00e7\u00e3o do projeto e guia para futuros desenvolvedores do projeto fornecendo insights sobre o planejamento e execu\u00e7\u00e3o da solu\u00e7\u00e3o apresentada.

"},{"location":"encerramento/relatorio/#backlog","title":"Backlog","text":""},{"location":"encerramento/relatorio/#planejado","title":"Planejado","text":""},{"location":"encerramento/relatorio/#mvp","title":"MVP","text":"
  • [US01] Criar perfil de usu\u00e1rio
  • [US02] Editar informa\u00e7\u00f5es pessoais
  • [US03] Cadastrar, visualizar, editar e apagar perfis de idosos
  • [US04] Cadastrar medicamentos e alimentos no perfil do idoso
  • [US05] Cadastrar, visualizar, editar e apagar tarefas da rotina do idoso
  • [US06] Cadastrar, visualizar, editar e apagar m\u00e9tricas de um idoso
"},{"location":"encerramento/relatorio/#incremento","title":"Incremento","text":"
  • [US07] Criar, visualizar, editar e apagar postagens no f\u00f3rum
  • [US08] Tutorial explicativo das funcionalidades do aplicativo
  • [US09] Moder\u00e7\u00e3o das publica\u00e7\u00f5es do f\u00f3rum
"},{"location":"encerramento/relatorio/#executadas-e-aceitas-pelo-cliente","title":"Executadas e Aceitas pelo Cliente","text":""},{"location":"encerramento/relatorio/#custo","title":"Custo","text":""},{"location":"encerramento/relatorio/#qualidade","title":"Qualidade","text":"

Com o objetivo de manter a qualidade do c\u00f3digo do trabalho, foram realizados diversos testes, cada um deles garantindo o correto funcionamento de um componente do trabalho. Foi estabelecido como objetivo (...)

"},{"location":"encerramento/relatorio/#riscos","title":"Riscos","text":""},{"location":"encerramento/relatorio/#riscos-planejados","title":"Riscos planejados","text":""},{"location":"encerramento/relatorio/#externo","title":"Externo","text":"
  • Integrante com problema de sa\u00fade
  • Indisponibilidade do cliente
  • Falha de equipamento
"},{"location":"encerramento/relatorio/#gerencial","title":"Gerencial","text":"
  • Sa\u00edda de algum integrante do projeto
  • Falta de participa\u00e7\u00e3o de algum integrante do projeto
  • Falta de integra\u00e7\u00e3o da equipe
  • Altera\u00e7\u00e3o no escopo do projeto
  • Falta de disponibiliza\u00e7\u00e3o de releases para o cliente testar
  • Falta de participa\u00e7\u00e3o durante as reuni\u00f5es
  • Sobrecarga de membros da equipe
"},{"location":"encerramento/relatorio/#organizacional","title":"Organizacional","text":"
  • Diverg\u00eancia nos hor\u00e1rios dispon\u00edveis dos integrantes
  • Depend\u00eancia entre atividades
"},{"location":"encerramento/relatorio/#tecnico","title":"T\u00e9cnico","text":"
  • Dificuldade com as tecnologias definidas
  • Problemas com a infraestrutura de rede
  • Dificuldade na adapta\u00e7\u00e3o a novas ferramentas
"},{"location":"encerramento/relatorio/#riscos-enfrentados","title":"Riscos Enfrentados","text":"
  • Dificuldade da equipe com novas tecnologias, resultando em uma participa\u00e7\u00e3o mais ativa no frontend
  • Altera\u00e7\u00e3o no escopo do projeto
  • Sobrecarga de membros da equipe
  • Falta de integra\u00e7\u00e3o da equipe
"},{"location":"gestaoDoProjeto/arquitetura/","title":"Documento de Arquitetura","text":""},{"location":"gestaoDoProjeto/arquitetura/#historico-de-versoes","title":"Hist\u00f3rico de vers\u00f5es","text":"Vers\u00e3o Data Descri\u00e7\u00e3o Autores 1.0 15/10/2023 Abertura do documento Pedro Cella 1.1 24/07/2024 Adapta\u00e7\u00e3o para a nova vers\u00e3o mobile Victor Gon\u00e7alves 1.2 12/09/2024 Reestrutura\u00e7\u00e3o do projeto conforme descoberta de vers\u00e3o mobile j\u00e1 existente Marcella Anderle"},{"location":"gestaoDoProjeto/arquitetura/#introducao","title":"Introdu\u00e7\u00e3o","text":"

Esse documento tem a finalidade de explicar sobre as decis\u00f5es arquiteturais do projeto, nesse documento o foco ser\u00e1 entender mais sobre como funcionar\u00e1 o sistema como um todo, ou seja, como \u00e9 feita a intera\u00e7\u00e3o do usu\u00e1rio com o produto, quais s\u00e3o os microsservi\u00e7os e de que forma eles foram definidos, entre outras poss\u00edveis d\u00favidas que possam surgir.

"},{"location":"gestaoDoProjeto/arquitetura/#escopo","title":"Escopo","text":"

O GEROcuidado \u00e9 um aplicativo projetado para auxiliar seus usu\u00e1rios, que incluem cuidadores formais e informais, idosos aut\u00f4nomos e familiares, na organiza\u00e7\u00e3o e acompanhamento da sa\u00fade dos idosos, seja como parte de suas responsabilidades de cuidador ou de sua pr\u00f3pria fam\u00edlia, como um pai ou uma m\u00e3e. No caso dos idosos aut\u00f4nomos, esse acompanhamento \u00e9 realizado de si mesmo.

O MVP acordado com os propriet\u00e1rios do aplicativo (Enactus), foi que neste semestre 2024.1, o GEROcuidado ser\u00e1 entregue como um aplicativo mobile nativo (aplicativo baix\u00e1vel). A vers\u00e3o do aplicativo a ser lan\u00e7ada contemplar\u00e1 as seguintes funcionalidades:

  • Login de usu\u00e1rio no aplicativo
  • Recupera\u00e7\u00e3o de senha
  • Cadastro de perfis segregados de idosos
  • Cadastro de rem\u00e9dios e alimentos consumidos pelo idoso
  • Cadastro de tarefas da rotina do idoso
  • Disponibiliza\u00e7\u00e3o do F\u00f3rum de forma online no navegador
  • Tela de visualiza\u00e7\u00e3o de rotina do idoso
  • Registro de m\u00e9tricas de sa\u00fade
  • Extra\u00e7\u00e3o de relat\u00f3rios de m\u00e9tricas de sa\u00fade
  • Visualiza\u00e7\u00e3o inteligente de m\u00e9tricas de sa\u00fade (Dashboard)
  • Edi\u00e7\u00e3o de post no forum
  • Sistema de FAQ

Como poss\u00edveis incrementos:

  • Interagir com posts do f\u00f3rum atrav\u00e9s de curtidas e coment\u00e1rios
  • Op\u00e7\u00e3o de visualiza\u00e7\u00e3o semanal das tarefas em caled\u00e1rio
  • Op\u00e7\u00e3o de visualiza\u00e7\u00e3o mensal das tarefas em caled\u00e1rio
  • Disponibiliza\u00e7\u00e3o do cadastro do idoso para diversas contas
  • Customiza\u00e7\u00e3o de notifica\u00e7\u00f5es
  • Suporte do aplicativo
  • Sistema de check-in e check-out na casa do idoso
  • Login por biometria
  • Acessar aplicativo usando outras plataformas como login (Google, Facebook, etc.)

No entanto, no m\u00eas de agosto, foi descoberto que j\u00e1 havia um aplicativo com as funcionalidades prontas, o que mudou a rota do desenvolvimento por completo. Por isso, foi realizado as atualiza\u00e7\u00f5es abaixo:

  • Informa\u00e7\u00f5es de Idoso, Rotina e M\u00e9tricas: Est\u00e3o configuradas para buscar dados a partir de um banco local do celular.
  • Informa\u00e7\u00f5es de Usu\u00e1rio: Tamb\u00e9m buscam no servidor al\u00e9m de apontar pro banco local do celular.

Al\u00e9m disso, as seguintes melhorias foram adicionadas ao aplicativo existente:

  • Cadastrar, visualizar, editar e apagar perfis de idosos offline.
  • Editar informa\u00e7\u00f5es do perfil de usu\u00e1rio offline.
  • Cadastrar medicamentos e alimentos no perfil de idoso.
  • Resolu\u00e7\u00e3o de bugs de experi\u00eancia de usu\u00e1rio.
  • Cadastrar, visualizar, editar e apagar m\u00e9tricas de um idoso.
  • Cadastrar, visualizar, editar e apagar tarefas da rotina do idoso.
"},{"location":"gestaoDoProjeto/arquitetura/#arquitetura","title":"Arquitetura","text":"

A arquitetura abaixo ilustra a forma como ir\u00e1 funcionar todas as partes, sendo elas o Frontend, onde ocorre o input atrav\u00e9s da interface de usu\u00e1rio, ap\u00f3s esse input, caso o aplicativo esteja conectado \u00e0 internet \u00e9 encaminhado para o microsservi\u00e7o especificado, sendo eles o Microsservi\u00e7o Usu\u00e1rio atrelado as funcionalidades de CRUD quanto aos usu\u00e1rios e perfis de usu\u00e1rio, Microsservi\u00e7o F\u00f3rum associado a parte do f\u00f3rum, publica\u00e7\u00f5es, like e coment\u00e1rio e finalmente o Microsservi\u00e7o Sa\u00fade, respons\u00e1vel pelas informa\u00e7\u00f5es de sa\u00fade do idoso, como press\u00e3o, oxigena\u00e7\u00e3o do sangue, entre outros. Al\u00e9m disso temos os bancos de cada microsservi\u00e7os, respons\u00e1vel por armazenar todas essas informa\u00e7\u00f5es. Abaixo a arquitetura ilustrando todos esses peda\u00e7os:

"},{"location":"gestaoDoProjeto/arquitetura/#frontend","title":"Frontend","text":"

O front-end do GEROcuidado \u00e9 uma aplica\u00e7\u00e3o nativa android, que poder\u00e1 ser baixada e instalada diretamente nos smartphones dos usu\u00e1rios. A aplica\u00e7\u00e3o \u00e9 constru\u00edda de tal forma que poder\u00e1 ser usada com e sem conex\u00e3o com a internet. Os servi\u00e7os descritos abaixo servem como uma nuvem de dados para o que o usu\u00e1rio j\u00e1 consegue realizar no aplicativo.

O front-end \u00e9 desenvolvido em React Native utilizando Javascript como linguagem principal. O banco de dados utilizado \u00e9 o WatermelonDB, que utiliza como recurso o pr\u00f3prio SQLite disponibilizado no Android.

"},{"location":"gestaoDoProjeto/arquitetura/#microsservico-usuario","title":"Microsservi\u00e7o Usu\u00e1rio","text":"

O microsservi\u00e7o de Usu\u00e1rio no aplicativo GEROcuidado desempenha um papel essencial na autentica\u00e7\u00e3o e gest\u00e3o de usu\u00e1rios, abrangendo cuidadores formais, idosos aut\u00f4nomos e familiares. Este microsservi\u00e7o oferece funcionalidades fundamentais relacionadas ao registro e gerenciamento de contas de usu\u00e1rio, permitindo que os usu\u00e1rios acessem as diversas funcionalidades do sistema. Suas principais funcionalidades incluem:

  1. CRUD de Usu\u00e1rio (Create, Read, Update, Delete): Os cuidadores formais, idosos aut\u00f4nomos e familiares t\u00eam a capacidade de se registrar na plataforma, fornecendo informa\u00e7\u00f5es pessoais, como nome, endere\u00e7o de e-mail, senha segura e outros detalhes relevantes. Esse processo de registro \u00e9 fundamental para criar uma conta no aplicativo, permitindo o acesso \u00e0s funcionalidades e recursos dispon\u00edveis.

Al\u00e9m disso, o microsservi\u00e7o de Usu\u00e1rio tamb\u00e9m se concentra em quest\u00f5es de seguran\u00e7a, implementando pol\u00edticas de senhas robustas e fornecendo uma funcionalidade de recupera\u00e7\u00e3o de senha para garantir a prote\u00e7\u00e3o dos dados dos usu\u00e1rios. Isso ajuda a garantir que apenas usu\u00e1rios autorizados tenham acesso ao sistema e que suas informa\u00e7\u00f5es estejam protegidas.

Em resumo, o microsservi\u00e7o de Usu\u00e1rio \u00e9 a pedra angular da autentica\u00e7\u00e3o e do gerenciamento de contas de usu\u00e1rio no aplicativo GEROcuidado, permitindo que cuidadores, idosos aut\u00f4nomos e familiares acessem e utilizem as funcionalidades do sistema de forma segura e eficiente.

"},{"location":"gestaoDoProjeto/arquitetura/#microsservico-forum","title":"Microsservi\u00e7o F\u00f3rum","text":"

O microsservi\u00e7o de F\u00f3rum no aplicativo GEROcuidado desempenha um papel crucial na intera\u00e7\u00e3o e comunica\u00e7\u00e3o entre os usu\u00e1rios, que incluem cuidadores formais, cuidadores informais, idosos aut\u00f4nomos e familiares. Este microsservi\u00e7o \u00e9 projetado para fornecer funcionalidades relacionadas ao compartilhamento de informa\u00e7\u00f5es, discuss\u00f5es e intera\u00e7\u00f5es no f\u00f3rum do aplicativo. Suas principais funcionalidades incluem:

  1. CRUD de Publica\u00e7\u00e3o no F\u00f3rum: Os usu\u00e1rios, que podem ser cuidadores formais, cuidadores informais, idosos aut\u00f4nomos ou familiares, t\u00eam a capacidade de criar, ler, atualizar e excluir (CRUD) publica\u00e7\u00f5es no f\u00f3rum. Isso permite que os usu\u00e1rios compartilhem informa\u00e7\u00f5es, fa\u00e7am perguntas, forne\u00e7am dicas ou discutam t\u00f3picos relacionados ao cuidado de idosos.

  2. Modera\u00e7\u00e3o de Publica\u00e7\u00f5es: O microsservi\u00e7o de F\u00f3rum tamb\u00e9m inclui funcionalidades de modera\u00e7\u00e3o. Os moderadores, designados para garantir a qualidade e o respeito no f\u00f3rum, t\u00eam a capacidade de revisar e moderar as publica\u00e7\u00f5es. Isso inclui a capacidade de aprovar, editar ou excluir publica\u00e7\u00f5es para evitar informa\u00e7\u00f5es imprecisas ou conte\u00fado inadequado.

  3. Intera\u00e7\u00e3o com Publica\u00e7\u00f5es: Al\u00e9m das funcionalidades CRUD, os usu\u00e1rios t\u00eam a capacidade de interagir com as publica\u00e7\u00f5es no f\u00f3rum. Eles podem \"curtir\" publica\u00e7\u00f5es (likes) e deixar coment\u00e1rios para criar discuss\u00f5es e promover a intera\u00e7\u00e3o entre os membros da comunidade.

Atrav\u00e9s do microsservi\u00e7o de F\u00f3rum, o aplicativo GEROcuidado promove uma comunidade de usu\u00e1rios onde cuidadores formais, cuidadores informais, idosos aut\u00f4nomos e familiares podem trocar informa\u00e7\u00f5es, apoio e experi\u00eancias, promovendo um ambiente de aprendizado e colabora\u00e7\u00e3o. O foco na modera\u00e7\u00e3o garante que o f\u00f3rum permane\u00e7a informativo e respeitoso.

"},{"location":"gestaoDoProjeto/arquitetura/#microsservico-saude","title":"Microsservi\u00e7o Sa\u00fade","text":"

O microsservi\u00e7o de Sa\u00fade no aplicativo GEROcuidado desempenha um papel fundamental na gest\u00e3o e acompanhamento da sa\u00fade dos idosos, cuidadores formais, cuidadores informais e familiares. Este microsservi\u00e7o \u00e9 projetado para fornecer funcionalidades relacionadas ao registro, acompanhamento e gerenciamento de informa\u00e7\u00f5es de sa\u00fade, bem como rotinas de cuidados. Suas principais funcionalidades incluem:

  1. CRUD de Informa\u00e7\u00f5es de Sa\u00fade do Idoso: Os cuidadores formais, cuidadores informais, idosos aut\u00f4nomos e familiares t\u00eam a capacidade de registrar, atualizar, visualizar e apagar informa\u00e7\u00f5es de sa\u00fade, como m\u00e9tricas vitais (por exemplo, frequ\u00eancia card\u00edaca, oxigena\u00e7\u00e3o do sangue) e outras informa\u00e7\u00f5es relevantes para o acompanhamento da sa\u00fade. Isso permite que os usu\u00e1rios acompanhem de perto a sa\u00fade dos idosos sob seus cuidados ou suas pr\u00f3prias m\u00e9tricas de sa\u00fade.

  2. CRUD de Rotina: Os cuidadores, tanto formais quanto informais, podem cadastrar, visualizar, editar e remover informa\u00e7\u00f5es sobre a rotina dos idosos que cuidam. Isso inclui informa\u00e7\u00f5es sobre medicamentos, atividades f\u00edsicas e alimenta\u00e7\u00e3o, permitindo o controle dos hor\u00e1rios e o cumprimento das necessidades espec\u00edficas de cada idoso. Al\u00e9m disso, os idosos independentes tamb\u00e9m t\u00eam a op\u00e7\u00e3o de gerenciar sua pr\u00f3pria rotina, registrando informa\u00e7\u00f5es sobre medicamentos, atividades f\u00edsicas e alimenta\u00e7\u00e3o para serem lembrados dos hor\u00e1rios.

  3. Cria\u00e7\u00e3o de Notifica\u00e7\u00f5es: Os usu\u00e1rios podem receber notifica\u00e7\u00f5es do aplicativo para lembr\u00e1-los de realizar atividades cadastradas, como tomar medicamentos, realizar exerc\u00edcios ou seguir uma dieta espec\u00edfica. Isso ajuda a garantir que as tarefas de cuidado sejam cumpridas de forma consistente.

  4. Adi\u00e7\u00e3o de Agenda/Calend\u00e1rio: Os cuidadores podem agendar tarefas em um calend\u00e1rio para receber notifica\u00e7\u00f5es sobre atividades importantes. Isso cria um calend\u00e1rio que permite o agendamento de tarefas e eventos relacionados ao cuidado dos idosos, garantindo que o cuidador seja lembrado das atividades no momento certo.

  5. CRUD de Idosos: Os cuidadores formais, cuidadores informais e familiares podem gerenciar o cadastro de idosos no sistema, incluindo informa\u00e7\u00f5es detalhadas sobre os idosos, como nome, idade, condi\u00e7\u00f5es de sa\u00fade e prefer\u00eancias. Isso facilita o acompanhamento individualizado de cada idoso e o acesso r\u00e1pido \u00e0s informa\u00e7\u00f5es de sa\u00fade e rotina espec\u00edficas de cada um.

O microsservi\u00e7o de Sa\u00fade \u00e9 essencial para o acompanhamento eficaz da sa\u00fade dos idosos e a gest\u00e3o de rotinas de cuidado, garantindo que as m\u00e9tricas de sa\u00fade sejam registradas e monitoradas, as rotinas sejam cumpridas e as notifica\u00e7\u00f5es sejam usadas para manter todos os envolvidos informados sobre as atividades necess\u00e1rias para a sa\u00fade e o bem-estar dos idosos.

"},{"location":"gestaoDoProjeto/backlog/","title":"Backlog do produto","text":""},{"location":"gestaoDoProjeto/backlog/#historico-de-versoes","title":"Hist\u00f3rico de vers\u00f5es","text":"Vers\u00e3o Data Modifica\u00e7\u00e3o Autor 1.0 23/07/2024 Cria\u00e7\u00e3o do documento Amanda Nobre"},{"location":"gestaoDoProjeto/backlog/#descricao","title":"Descri\u00e7\u00e3o","text":"

O backlog de um produto \u00e9 uma lista priorizada de todos os requisitos, funcionalidades e melhorias que precisam ser implementados no produto. Essa lista \u00e9 din\u00e2mica e constantemente atualizada \u00e0 medida que o projeto avan\u00e7a e novas necessidades surgem. Dentro do backlog, os itens podem ser organizados em \u00e9picos e hist\u00f3rias de usu\u00e1rio (US). \u00c9picos s\u00e3o grandes corpos de trabalho que podem ser divididos em tarefas menores e mais gerenci\u00e1veis. Eles representam objetivos de alto n\u00edvel e podem abranger v\u00e1rias sprints. Hist\u00f3rias de usu\u00e1rio, por outro lado, s\u00e3o descri\u00e7\u00f5es de funcionalidades do ponto de vista do usu\u00e1rio final. Elas s\u00e3o mais detalhadas e espec\u00edficas, fornecendo uma vis\u00e3o clara do que precisa ser desenvolvido para atender \u00e0s necessidades dos usu\u00e1rios. Enquanto os \u00e9picos fornecem uma vis\u00e3o macro das necessidades do produto, as hist\u00f3rias de usu\u00e1rio detalham os passos necess\u00e1rios para alcan\u00e7ar esses objetivos maiores.

"},{"location":"gestaoDoProjeto/backlog/#tabela-de-backlog","title":"Tabela de Backlog","text":"\u00c9pico ID Eu, como Desejo Para que eu possa Login US01 Cuidador fazer login no app acessar os servi\u00e7os e funcionalidades no aplicativo Login US02 Cuidador recuperar senha fazer login na plataforma, caso perca o acesso a senha cadastrada Login US03 Cuidador editar minhas informa\u00e7\u00f5es pessoais manter meu perfil atualizado Cadastro do perfil do idoso US04 Cuidador cadastrar perfis de idosos cadastrar informa\u00e7\u00f5es e m\u00e9tricas para para os idosos cuidados Cadastro do perfil do idoso US05 Cuidador cadastrar rem\u00e9dios e alimentos no perfil do idoso ter essas informa\u00e7\u00f5es salvas e com f\u00e1cil acesso Tarefas/Calend\u00e1rio US06 Cuidador cadastrar tarefas da rotina do idoso organizar a rotina do idoso Tarefas/Calend\u00e1rio US07 Cuidador visualizar as tarefas da rotina de um idoso seguir a rotina que foi cadastrada Tarefas/Calend\u00e1rio US08 Cuidador marcar as tarefas como conclu\u00eddas ou n\u00e3o concluidas saber quais tarefas foram realizadas M\u00e9tricas US09 Cuidador cadastrar m\u00e9tricas de um idoso guardar informa\u00e7\u00f5es importantes sobre as m\u00e9tricas do idoso M\u00e9tricas US10 Cuidador visualizar as m\u00e9tricas cadastradas de forma visual (gr\u00e1ficos, dashboard) interpretar melhor, mais facilmente e com mais rapidez as m\u00e9tricas cadastradas M\u00e9tricas US11 Cuidador gerar um relat\u00f3rio das m\u00e9tricas do idoso salvar as m\u00e9tricas de um determinado per\u00edodo e mant\u00ea-la de f\u00e1cil acesso F\u00f3rum US12 Cuidador participar de um f\u00f3rum tirar d\u00favidas, compartilhar e obter informa\u00e7\u00f5es F\u00f3rum US13 Cuidador editar uma postagem ap\u00f3s ter postado corrigir possiveis erros e/ou alterar informa\u00e7\u00f5es da postagem Suporte US14 Cuidador ter acesso a um f.a.q (d\u00favidas frequents) sobre o aplicativo esclarecer d\u00favidas comuns a respeito do aplicativo Suporte US15 Cuidador ter um tutorial explicativo das funcionalidades do aplicativo no primeiro acesso saber como usar o aplicativo desde o primeiro acesso
  • Esta tabela tem o objetivo apenas de relacionar os \u00c9picos, as hist\u00f3rias de usu\u00e1rio (US) e as personas com seus objetivos.
"},{"location":"gestaoDoProjeto/backlog/#roadmap","title":"Roadmap","text":"

O Roadmap do produto pode ser encontrado no ZenHub do reposit\u00f3rio de documenta\u00e7\u00e3o: Roadmap do produto

"},{"location":"gestaoDoProjeto/codigo_de_conduta/","title":"C\u00f3digo de Conduta","text":""},{"location":"gestaoDoProjeto/codigo_de_conduta/#historico-de-versoes","title":"Hist\u00f3rico de vers\u00f5es","text":"Data Vers\u00e3o Descri\u00e7\u00e3o Autor 19/07/2024 1.0 Cria\u00e7\u00e3o do documento Nat\u00e1lia Rodrigues"},{"location":"gestaoDoProjeto/codigo_de_conduta/#introducao","title":"Introdu\u00e7\u00e3o","text":"

Nosso objetivo \u00e9 criar um ambiente acolhedor e seguro para todos. Este c\u00f3digo de conduta delineia nossas expectativas para todos aqueles que participam de nossa comunidade, bem como as consequ\u00eancias para comportamentos inaceit\u00e1veis.

"},{"location":"gestaoDoProjeto/codigo_de_conduta/#comportamento-esperado","title":"Comportamento Esperado","text":"
  • Seja inclusivo: Fomentar um ambiente onde todas as pessoas se sintam bem-vindas.
  • Seja respeitoso: Demonstre respeito por diferentes pontos de vista e experi\u00eancias.
  • Aceite feedback construtivo: Esteja aberto a cr\u00edticas e disposto a melhorar.
  • Seja colaborativo: Contribua de forma positiva para a comunidade e ajude os outros.
  • Respeite os limites pessoais: Respeite a privacidade e os limites de todos os membros.
"},{"location":"gestaoDoProjeto/codigo_de_conduta/#comportamento-inaceitavel","title":"Comportamento Inaceit\u00e1vel","text":"
  • Ass\u00e9dio: N\u00e3o ser\u00e1 tolerado nenhum tipo de ass\u00e9dio, seja ele verbal, f\u00edsico ou visual.
  • Discrimina\u00e7\u00e3o: Discrimina\u00e7\u00e3o baseada em idade, g\u00eanero, ra\u00e7a, orienta\u00e7\u00e3o sexual, defici\u00eancia ou qualquer outra caracter\u00edstica n\u00e3o ser\u00e1 aceita.
  • Linguagem inapropriada: Uso de linguagem ofensiva ou depreciativa n\u00e3o ser\u00e1 permitido.
  • Comportamento disruptivo: Atividades que interrompem ou prejudicam o ambiente da comunidade s\u00e3o proibidas.
"},{"location":"gestaoDoProjeto/codigo_de_conduta/#aplicacao","title":"Aplica\u00e7\u00e3o","text":"
  • Relatar problemas: Qualquer pessoa que sofra ou testemunhe um comportamento inaceit\u00e1vel deve relatar o incidente aos organizadores do projeto.
  • Consequ\u00eancias: Os organizadores da comunidade tomar\u00e3o medidas apropriadas para lidar com o comportamento inaceit\u00e1vel, que podem incluir um aviso, suspens\u00e3o ou expuls\u00e3o da comunidade.
  • Confidencialidade: Todas as queixas ser\u00e3o tratadas com discri\u00e7\u00e3o e confidencialidade.
"},{"location":"gestaoDoProjeto/codigo_de_conduta/#referencias","title":"Refer\u00eancias","text":"

Contributor Covenant

"},{"location":"gestaoDoProjeto/doc_banco/","title":"Documento de Banco de Dados","text":""},{"location":"gestaoDoProjeto/doc_banco/#historico-de-versoes","title":"Hist\u00f3rico de vers\u00f5es","text":"Data Vers\u00e3o Descri\u00e7\u00e3o Autor 25/07/2024 1.0 Cria\u00e7\u00e3o do documento Amanda Nobre"},{"location":"gestaoDoProjeto/doc_banco/#1-introducao","title":"1. Introdu\u00e7\u00e3o","text":"

Este documento tem por objetivo reunir os principais documentos produzidos referentes ao banco de dados da aplica\u00e7\u00e3o. O intuito disso \u00e9 proporcionar transpar\u00eancia e organiza\u00e7\u00e3o quanto ao que acreditamos ser a maneira mais adequada de contextualizar, diagramar e modelar os dados associados \u00e0 problem\u00e1tica na qual o projeto GEROcuidado, bem como o produto de software a ele vinculado, est\u00e1 inserido.

"},{"location":"gestaoDoProjeto/doc_banco/#2-documentos-criados","title":"2. Documentos criados","text":""},{"location":"gestaoDoProjeto/doc_banco/#21-mer","title":"2.1 MER","text":"

O Modelo Entidade-Relacionamento (MER) \u00e9 uma abordagem conceitual usada no projeto de banco de dados para representar entidades, seus atributos e relacionamentos. Isso permite visualizar como os dados est\u00e3o organizados e como as entidades se relacionam no sistema de informa\u00e7\u00f5es. O MER \u00e9 a base conceitual sobre a qual os Diagramas Entidade-Relacionamento (DER) s\u00e3o criados para representar graficamente essa estrutura.

"},{"location":"gestaoDoProjeto/doc_banco/#211-entidades","title":"2.1.1 Entidades","text":""},{"location":"gestaoDoProjeto/doc_banco/#212-descricao-das-entidades","title":"2.1.2 Descri\u00e7\u00e3o das Entidades","text":""},{"location":"gestaoDoProjeto/doc_banco/#213-relacionamentos","title":"2.1.3 Relacionamentos","text":""},{"location":"gestaoDoProjeto/doc_banco/#22-der","title":"2.2 DER","text":"

O Diagrama Entidade-Relacionamento (DER) \u00e9 uma representa\u00e7\u00e3o gr\u00e1fica amplamente utilizada no projeto de bancos de dados. Ele descreve as entidades (objetos), seus atributos (caracter\u00edsticas) e os relacionamentos entre as entidades. Os ret\u00e2ngulos representam as entidades, as elipses indicam os atributos e as linhas conectam as entidades para mostrar como elas se relacionam. O DER \u00e9 uma ferramenta fundamental para visualizar e planejar a estrutura de um banco de dados antes da implementa\u00e7\u00e3o, ajudando a definir como os dados s\u00e3o armazenados e acessados

"},{"location":"gestaoDoProjeto/doc_banco/#23-dld","title":"2.3 DLD","text":"

O Diagrama L\u00f3gico de Dados (DLD) \u00e9 uma representa\u00e7\u00e3o gr\u00e1fica que ilustra a estrutura l\u00f3gica de um banco de dados. Nesse diagrama, s\u00e3o exibidas informa\u00e7\u00f5es cruciais, como os tipos de atributos associados a cada entidade, bem como as chaves estrangeiras e restri\u00e7\u00f5es, como a chave \u00fanica (unique key). Seu prop\u00f3sito fundamental \u00e9 fornecer uma representa\u00e7\u00e3o estruturada e espec\u00edfica da maneira como o banco de dados deve ser implementado. Em resumo, o DLD funciona como uma representa\u00e7\u00e3o visual que orienta a implementa\u00e7\u00e3o efetiva do banco de dados.

"},{"location":"gestaoDoProjeto/doc_banco/#24-dicionario-de-dados","title":"2.4 Dicion\u00e1rio de Dados","text":"

Um Dicion\u00e1rio de Dados \u00e9 uma refer\u00eancia essencial em gerenciamento de dados. Ele \u00e9 um documento ou reposit\u00f3rio que descreve detalhadamente os elementos de um banco de dados, como tabelas, campos, relacionamentos e regras de neg\u00f3cios associadas. O Dicion\u00e1rio de Dados serve como uma fonte confi\u00e1vel de informa\u00e7\u00f5es para desenvolvedores, analistas e outros stakeholders, garantindo a compreens\u00e3o e a consist\u00eancia dos dados dentro de um sistema. Ele fornece informa\u00e7\u00f5es cruciais sobre a estrutura e a sem\u00e2ntica dos dados, auxiliando na manuten\u00e7\u00e3o, integra\u00e7\u00e3o e uso eficaz das informa\u00e7\u00f5es em um contexto organizacional.

"},{"location":"gestaoDoProjeto/doc_banco/#241-entidades","title":"2.4.1 Entidades","text":""},{"location":"gestaoDoProjeto/doc_banco/#usuario","title":"Usu\u00e1rio","text":""},{"location":"gestaoDoProjeto/doc_banco/#idoso","title":"Idoso","text":""},{"location":"gestaoDoProjeto/doc_banco/#metricas-de-saude","title":"M\u00e9tricas de sa\u00fade","text":""},{"location":"gestaoDoProjeto/doc_banco/#valor-das-metricas-de-saude","title":"Valor das m\u00e9tricas de sa\u00fade","text":""},{"location":"gestaoDoProjeto/doc_banco/#rotina","title":"Rotina","text":""},{"location":"gestaoDoProjeto/doc_banco/#publicacao","title":"Publica\u00e7\u00e3o","text":""},{"location":"gestaoDoProjeto/doc_banco/#like","title":"Like","text":""},{"location":"gestaoDoProjeto/doc_banco/#comentario","title":"Coment\u00e1rio","text":""},{"location":"gestaoDoProjeto/doc_banco/#242-relacionamentos","title":"2.4.2 Relacionamentos","text":""},{"location":"gestaoDoProjeto/doc_banco/#publicacao-tem-comentario","title":"Publica\u00e7\u00e3o tem coment\u00e1rio","text":""},{"location":"gestaoDoProjeto/doc_banco/#publicacao-tem-like","title":"Publica\u00e7\u00e3o tem like","text":""},{"location":"gestaoDoProjeto/doc_banco/#25-documento-de-banco-de-dados","title":"2.5 Documento de Banco de dados","text":"

O link contendo todos os documentos apresentados pode ser encontrado aqui.

"},{"location":"gestaoDoProjeto/doc_banco/#referencias","title":"Refer\u00eancias","text":"
  • https://github.com/fga-eps-mds/2023-2-GEROcuidado-Doc/blob/main/docs/produto/banco_de_dados.md
"},{"location":"gestaoDoProjeto/estilo/","title":"Guia de Estilo","text":""},{"location":"gestaoDoProjeto/estilo/#historico-de-versoes","title":"Hist\u00f3rico de vers\u00f5es","text":"Data Vers\u00e3o Descri\u00e7\u00e3o Autor 25/07/2024 1.0 Cria\u00e7\u00e3o do documento Amanda Nobre"},{"location":"gestaoDoProjeto/estilo/#1-introducao","title":"1. Introdu\u00e7\u00e3o","text":"

Bem-vindo \u00e0 Guia de Estilo da nossa aplica\u00e7\u00e3o! Este documento desempenha um papel vital na cria\u00e7\u00e3o de uma experi\u00eancia de usu\u00e1rio consistente. Aqui, voc\u00ea encontrar\u00e1 alguumas diretrizes de design que moldam a forma como nossa aplica\u00e7\u00e3o \u00e9 apresentada ao mundo.

Imagine nossa Guia de Estilo como um mapa que orienta a jornada visual e interativa de nossa aplica\u00e7\u00e3o, por meio da defini\u00e7\u00e3o de alguns dos elementos de design, como cores, tipografia e layout.

"},{"location":"gestaoDoProjeto/estilo/#2-nome-da-aplicacao","title":"2. Nome da aplica\u00e7\u00e3o","text":"

O nome \"Gero Cuidado\" \u00e9 muito mais do que um mero conjunto de palavras. Ele representa nosso firme compromisso em fornecer assist\u00eancia e suporte de alta qualidade para os idosos, que merecem aten\u00e7\u00e3o e cuidados especiais. A palavra \"Gero\" \u00e9 um prefixo derivado de \"geri\u00e1trico\", que est\u00e1 intrinsecamente ligado ao cuidado e \u00e0 sa\u00fade das pessoas mais velhas. Reflete nossa dedica\u00e7\u00e3o em criar uma aplica\u00e7\u00e3o dedicada a melhorar a qualidade de vida e o bem-estar da popula\u00e7\u00e3o idosa.

"},{"location":"gestaoDoProjeto/estilo/#3-logo","title":"3. Logo","text":""},{"location":"gestaoDoProjeto/estilo/#4-tipografia","title":"4. Tipografia","text":"

As fontes utilizadas na aplica\u00e7\u00e3o ser\u00e3o:

  • Inter

  • Roboto

  • Work Sans

"},{"location":"gestaoDoProjeto/estilo/#5-paleta-de-cores","title":"5. Paleta de cores","text":""},{"location":"gestaoDoProjeto/estilo/#6-elementos-de-interacao","title":"6. Elementos de intera\u00e7\u00e3o","text":""},{"location":"gestaoDoProjeto/estilo/#61-estilos-de-interacao","title":"6.1. Estilos de intera\u00e7\u00e3o","text":"
  • Navbar: ser\u00e1 uma barra horizontal para a navega\u00e7\u00e3o do usu\u00e1rio no aplicativo. Cada item da navbar redirecionar\u00e1 a navega\u00e7\u00e3o para uma tela espec\u00edfica.

  • Vertical Scroll Picker: componente de interface do usu\u00e1rio que permite aos usu\u00e1rios fazerem sele\u00e7\u00f5es atrav\u00e9s de uma rolagem vertical. Esse tipo de controle \u00e9 frequentemente usado para escolher entre diferentes op\u00e7\u00f5es, valores ou itens em uma lista, percorrendo-os para cima ou para baixo.

  • Bot\u00e3o: bot\u00f5es clic\u00e1veis com imagens que, ao ser clicado, leva o usu\u00e1rio at\u00e9 o conte\u00fado requerido

  • Bot\u00f5es de altern\u00e2ncia (toggle): elementos de interface que permitem aos usu\u00e1rios ativar ou desativar uma op\u00e7\u00e3o com um simples toque ou clique.

  • Checkbox: recurso comum \u00e0s caixas de di\u00e1logos usado para ativar ou desativar mais de uma fun\u00e7\u00e3o em um programa. Visualmente \u00e9 representado por um quadrado branco, que quando selecionado apresenta uma marca\u00e7\u00e3o em seu interior.

  • Carousel: um slideshow para fazer um giro em v\u00e1rios cote\u00fados, constru\u00eddo com CSS 3D transforms e um pouco de JavaScript. Ele funciona com o uso de imagens, texto ou marca\u00e7\u00e3o personalizada. Tamb\u00e9m possui suporte para controles anterior, pr\u00f3ximo e indicadores.

  • Campo de pesquisa: campo utilizado pelo usu\u00e1rio para fazer pesquisa r\u00e1pida de algum conte\u00fado, dentro do aplicativo.

  • Cards: aqui ser\u00e3o os elementos que possuem geralmente uma imagem, pois podemos adicionar \u00e0 essa imagem uma descri\u00e7\u00e3o. Ele pode ser tanto um link como um card explicativo, que poder\u00e1 expandir para mostrar um conte\u00fado maior.

  • Sliders: \u00e9 um painel de conte\u00fados em que o seu conte\u00fado principal muda em um tempo determinado para dar lugar a outro conte\u00fado. Isso serve para mostrar conte\u00fados variados em um mesmo lugar para o usu\u00e1rio. O mesmo poder\u00e1 navegar entre os conte\u00fados ou clicar para ser redirecionado \u00e0 p\u00e1gina deste conte\u00fado.

  • Formul\u00e1rios: ser\u00e3o utilizados para login, para contato ou para qualquer outra atividade em que \u00e9 necess\u00e1rio obter uma informa\u00e7\u00e3o do usu\u00e1rio.

"},{"location":"gestaoDoProjeto/estilo/#referencias","title":"Refer\u00eancias","text":"
  • https://github.com/fga-eps-mds/2023-2-GEROcuidado-Doc/blob/main/docs/produto/guia_de_estilo.md
"},{"location":"gestaoDoProjeto/ferramentas/","title":"Ferramentas","text":""},{"location":"gestaoDoProjeto/ferramentas/#historico-de-versoes","title":"Hist\u00f3rico de vers\u00f5es","text":"Vers\u00e3o Data Modifica\u00e7\u00e3o Autor 1.0 23/07/2024 Cria\u00e7\u00e3o do documento Ugor Brand\u00e3o

Este documento tem como objetivo explicar as tecnologias que ser\u00e3o usadas no projeto GEROcuidado.

"},{"location":"gestaoDoProjeto/ferramentas/#react-native","title":"React Native","text":"
  • O React Native \u00e9 um framework desenvolvido pelo Facebook que utiliza de JavaScript e a biblioteca React para desenvolvimento de aplicativos para IOS e Android. Sendo essa sua principal vantagem, executar o mesmo c\u00f3digo em diversas plataformas diferentes. Em vez de renderizar elementos na Web o React utiliza componentes nativos o que resulta em um melhor desempenho. O React Native possui uma grande variadade de componentes em sua biblioteca o que simplifica o desenvolvimento de interfaces complexas.
"},{"location":"gestaoDoProjeto/ferramentas/#alguns-dos-principais-components-do-react-native-sao","title":"Alguns dos principais components do React Native s\u00e3o:","text":"Component Fun\u00e7\u00e3o <View> \u00c9 o Bloco de constru\u00e7\u00e3o fundamental do React, usado para agrupar componentes e estiliz\u00e1-los <Text> Usado para exibir texto na interface do usu\u00e1rio <TextInput> Usado para criar campos de entrada de texto <ScrollView> \u00c9 uma barra de rolagem que pode ser adicionado \u00e0 uma \u00e1rea que cont\u00e9m outros componentes <Button> Usado para criar bot\u00f5es interativos <TouchableOpacity> Torna qualquer elemento envolto nele clic\u00e1vel <FlatList> <SectionList> Usados para renderizar listas <WebView> Usado para destacar p\u00e1ginas da web dentro do aplicativo
  • O framework tamb\u00e9m inclui as chamadas \"Hooks\" que s\u00e3o fun\u00e7\u00f5es que permitem adicionar estado e outras funcionalidades para componentes tornando o desenvolvimento mais simples e reutiliz\u00e1vel.
"},{"location":"gestaoDoProjeto/ferramentas/#algumas-das-principais-hooks-disponiveis","title":"Algumas das principais Hooks dispon\u00edveis:","text":"Hook Fun\u00e7\u00e3o useState \u00c9 uma hook para adicionar estado aos componentes, o que permite reagir a mudan\u00e7as e atualizar a interface do usu\u00e1rio useEffect Usada para executar efeitos colaterais em componentes, pode ser usado para buscar dados em uma API, por exemplo useContext Permite acessar o contexto de um componente pai, sem a necessidade de passar props para todos os n\u00edveis useRef Permite adicionar refer\u00eancia que pode ser usado para acessar o DOM ou outros elementos Custom hooks \u00c9 poss\u00edvel criar suas pr\u00f3prias hooks personalizadas para abstrair l\u00f3gicas em diferentes componentes

Documenta\u00e7\u00e3o Oficial: https://reactnative.dev/docs/getting-started

"},{"location":"gestaoDoProjeto/ferramentas/#expo","title":"Expo","text":"
  • O expo \u00e9 uma ferramenta de desenvolvimento de aplicativos usando React Native. Sua principal vantagem \u00e9 a simplifica\u00e7\u00e3o no processo de configura\u00e7\u00e3o de ambiente. Al\u00e9m disso ele tamb\u00e9m oferece um conjunto de ferramentas \u00fateis \u00e0 cria\u00e7\u00e3o, execu\u00e7\u00e3o e depura\u00e7\u00e3o de aplicativos. O Expo Go \u00e9 um aplicativo que permite a visualiza\u00e7\u00e3o em tempo real da aplica\u00e7\u00e3o em seu Aparelho pessoal, o que \u00e9 bem mais f\u00e1cil para testar o apliactivo durante o desenvolvimento.
  • Para instalar o Expo basta utilizar o gerenciador de pacotes do NodeJs e executar o comando:
npm install expo\n
  • E para iniciar um servidor:
npm expo start\n

Documenta\u00e7\u00e3o Oficial: https://docs.expo.dev/more/expo-cli/

"},{"location":"gestaoDoProjeto/ferramentas/#nest-js","title":"Nest JS","text":"
  • O NestJS \u00e9 um framework de desenvolvimento serverside (back-end) baseado em Node.js. O framework utiliza TypeScript (ainda permite que o desenvolvedor programe em JavaScript puro) e combina elementos da OOP (Object Oriented Programming), FP (Functional Programming) e FRP (Functional Reactve Programming). Por baixo dos panos ele tamb\u00e9m faz uso do Express que \u00e9 outro framework web. Outra caracter\u00edstica interessente que o Nest faz uso s\u00e3o as inje\u00e7\u00f5es de depend\u00eancias para gerenciar a cria\u00e7\u00e3o e vida de objetos usados no aplicativo.
"},{"location":"gestaoDoProjeto/ferramentas/#modules","title":"Modules","text":"
  • Uma das principais partes do Nest s\u00e3o os m\u00f3dulos, s\u00e3o usadas para organizar e estruturar a aplica\u00e7\u00e3o. Eles ajudam as dividir o c\u00f3digo em diferentes partes o que ajuda a escalabilidade do projeto. M\u00f3dulos possuem algumas propriedades, eles s\u00e3o: provedores, controladores, importadoes e exportadores.
"},{"location":"gestaoDoProjeto/ferramentas/#middleware","title":"Middleware","text":"
  • As Middlewares s\u00e3o fun\u00e7\u00f5es intermedi\u00e1rias entre o cliente e o servidor. Representam um papel cr\u00edtico em requisi\u00e7\u00f5es HTTP, oferecem controle, flexibilidade e reusabilidade, permitindo executar a\u00e7\u00f5es antes ou depois de uma requisi\u00e7\u00e3o.
"},{"location":"gestaoDoProjeto/ferramentas/#controllers","title":"Controllers","text":"
  • Os controladores s\u00e3o respons\u00e1veis por lidar com requisi\u00e7\u00f5es retornar respostas para o cliente. Eles promovem uma organiza\u00e7\u00e3o modular e separa\u00e7\u00e3o clara de responsabilidades.
"},{"location":"gestaoDoProjeto/ferramentas/#microservicos","title":"Microservi\u00e7os","text":"
  • O NestJS tem suporte nativo para a arquitetura de microservi\u00e7os.
"},{"location":"gestaoDoProjeto/ferramentas/#instalacao","title":"Instala\u00e7\u00e3o","text":"
  • Para instalar o Nest JS voc\u00ea pode criar o scaffold do projeto com o Nest CLI ou clonar um projeto inicial (ambos produzir\u00e3o o mesmo resultado).
  • Sendo assim, para estruturar o projeto com o Nest CLI digite os seguintes comandos. Isso criar\u00e1 um novo diret\u00f3rio de projeto e prencher\u00e1 com os arquivos Nest JS principais iniciais:
$ npm i -g @nestjs/cli\n$ nest new project-name\n
  • Alternativamente, para instalar o projeto inicial TypeScript com Git :
$ git clone https://github.com/nestjs/typescript-starter.git project\n$ cd project\n$ npm install\n$ npm run start\n
  • Para instalar a vers\u00e3o JavaScript do projeto inicial, use na sequ\u00eancia dos comandos acima :
javascript-starter.git\n

Documenta\u00e7\u00e3o Oficial: https://docs.nestjs.com/

"},{"location":"gestaoDoProjeto/ferramentas/#docker","title":"Docker","text":"
  • Docker \u00e9 uma plataforma aberta para desenvolvimento, envio e execu\u00e7\u00e3o de aplicativos. A plataforma oferece a capacidade de empacotar, distribuir e executar aplicativos, de forma consistente, em um ambiente isolado chamado container, que cont\u00eam tudo o que \u00e9 necess\u00e1rio para executar o aplicativo.
  • Al\u00e9m disso, \u00e9 poss\u00edvel compartilhar containers e garantir que todas as pessoas com quem voc\u00ea compartilha recebam o mesmo container que funciona da mesma maneira. Assim, o Docker evita inconsist\u00eancias de ambiente, permite o desenvolvimento de um ambiente padronizado e facilita a colabora\u00e7\u00e3o.
  • Dessa forma, o Docker \u00e9 uma ferramenta fundamental para melhorar a efici\u00eancia no desenvolvimento e na implanta\u00e7\u00e3o de software.
"},{"location":"gestaoDoProjeto/ferramentas/#containers","title":"Containers","text":"
  • Um container \u00e9 uma inst\u00e2ncia execut\u00e1vel de uma imagem. \u00c9 uma unidade de software que empacota uma aplica\u00e7\u00e3o e todas as suas depend\u00eancias, incluindo bibliotecas, configura\u00e7\u00f5es e arquivos, em um \u00fanico pacote execut\u00e1vel. Esses containers s\u00e3o projetados para serem port\u00e1teis e consistentes, permitindo que uma aplica\u00e7\u00e3o seja executada de forma confi\u00e1vel e isolada em qualquer ambiente que suporte a tecnologia de containers.
"},{"location":"gestaoDoProjeto/ferramentas/#imagens","title":"Imagens","text":"
  • As imagens Docker s\u00e3o usadas como base para criar inst\u00e2ncias de containers em tempo de execu\u00e7\u00e3o. Elas s\u00e3o uma parte fundamental da tecnologia de containeriza\u00e7\u00e3o e cont\u00eam todas as informa\u00e7\u00f5es necess\u00e1rias para criar um container, como c\u00f3digos, depend\u00eancias, bibliotecas, vari\u00e1veis \u200b\u200bde ambiente e configura\u00e7\u00f5es. Por isso, desempenham um papel crucial na portabilidade e na consist\u00eancia dos containers.
  • Outro ponto importante \u00e9 sobre a possibilidade de versionamento das imagens Docker, o que permite rastrear e controlar as diferentes vers\u00f5es de um aplicativo.
"},{"location":"gestaoDoProjeto/ferramentas/#vantagens-do-docker","title":"Vantagens do Docker","text":"
  • O Docker utiliza containers para isolar aplicativos e suas depend\u00eancias. Isso garante que cada aplicativo seja executado de forma independente, evitando conflitos de vers\u00f5es e problemas de compatibilidade.
  • Os containers Docker s\u00e3o leves e empacotam todos os componentes necess\u00e1rios para a execu\u00e7\u00e3o de um aplicativo, tornando-o port\u00e1til.
  • O Docker agiliza o ciclo de vida de desenvolvimento, permitindo que os desenvolvedores trabalhem em ambientes padronizados.
  • Os containers Docker podem ser implantados rapidamente, reduzindo o tempo necess\u00e1rio para provisionar e escalar aplicativos. Isso \u00e9 especialmente \u00fatil em ambientes de desenvolvimento \u00e1gil e DevOps.
  • As imagens Docker podem ser versionadas, o que permite o controle preciso das vers\u00f5es de aplicativos e a revers\u00e3o para vers\u00f5es anteriores, se necess\u00e1rio.
"},{"location":"gestaoDoProjeto/ferramentas/#instalacao_1","title":"Instala\u00e7\u00e3o","text":"
  • Para instalar o Docker no Linux, acesse:

    https://docs.docker.com/desktop/install/linux-install/

  • Para instalar o Docker no Windows, acesse:

    https://docs.docker.com/desktop/install/windows-install/

  • Para instalar o Docker no MacOS, acesse:

    https://docs.docker.com/desktop/install/mac-install/

  • Para mais informa\u00e7\u00f5es consulte:

    Documenta\u00e7\u00e3o Oficial: https://docs.docker.com/

"},{"location":"gestaoDoProjeto/ferramentas/#watermelondb","title":"WatermelonDB","text":"
  • WatermelonDB \u00e9 um banco de dados para React Native e React, projetado para lidar com grandes conjuntos de dados complexos e fornecer consultas r\u00e1pidas e eficientes. Ele \u00e9 especialmente \u00fatil para aplicativos m\u00f3veis que exigem sincroniza\u00e7\u00e3o offline e processamento em lote.

  • WatermelonDB \u00e9 uma solu\u00e7\u00e3o de c\u00f3digo aberto e oferece uma s\u00e9rie de recursos avan\u00e7ados, incluindo:

  • Consultas r\u00e1pidas
  • Modelo de dados reativo
  • Suporte a sincroniza\u00e7\u00e3o offline
  • Controle de transa\u00e7\u00f5es
  • Mapeamento de rela\u00e7\u00f5es
  • Flexibilidade de extens\u00f5es
  • Al\u00e9m disso, o WatermelonDB permite a personaliza\u00e7\u00e3o por parte do desenvolvedor, incluindo a adi\u00e7\u00e3o de:
  • Esquemas personalizados
  • Modelos de dados
  • Consultas avan\u00e7adas
  • Hooks e middleware
"},{"location":"gestaoDoProjeto/ferramentas/#instalacao_2","title":"Instala\u00e7\u00e3o","text":"
  • Para instalar o WatermelonDB em um projeto React Native ou React, use o gerenciador de pacotes npm ou yarn. Aqui est\u00e1 um exemplo de como instalar usando npm:
$ npm install @nozbe/watermelondb\n$ npm install @nozbe/watermelondb/adapters/sqlite\n
  • Para instalar usando yarn, execute:
$ yarn add @nozbe/watermelondb\n$ yarn add @nozbe/watermelondb/adapters/sqlite\n
  • A seguir, configure o ambiente de desenvolvimento, incluindo o plugin Babel necess\u00e1rio e a configura\u00e7\u00e3o do SQLite.
"},{"location":"gestaoDoProjeto/ferramentas/#fundamentos-da-arquitetura","title":"Fundamentos da Arquitetura","text":"
  • WatermelonDB utiliza uma arquitetura baseada em modelos e adaptadores. Aqui est\u00e3o os componentes principais:

  • Modelos: Representam as tabelas e registros do banco de dados, definidos usando classes JavaScript.

  • Adaptadores: Gerenciam a intera\u00e7\u00e3o com o armazenamento f\u00edsico, como SQLite.
  • Consultas: Utilizam uma API reativa para buscar e manipular dados de maneira eficiente.
  • Sincroniza\u00e7\u00e3o: Suporte para sincroniza\u00e7\u00e3o offline-first, \u00fatil para aplicativos m\u00f3veis com conectividade intermitente.

  • O modelo de dados reativo permite que as interfaces de usu\u00e1rio sejam atualizadas automaticamente quando os dados no banco de dados mudam, proporcionando uma experi\u00eancia de usu\u00e1rio mais fluida.

  • Para mais informa\u00e7\u00f5es sobre WatermelonDB, consulte a documenta\u00e7\u00e3o oficial:

Documenta\u00e7\u00e3o Oficial: https://nozbe.github.io/WatermelonDB/

"},{"location":"gestaoDoProjeto/ferramentas/#referencias","title":"Refer\u00eancias","text":"

[1] Documenta\u00e7\u00e3o do Projeto GEROcuidado - Ferramentas

"},{"location":"gestaoDoProjeto/ferramentas/#historico-de-versoes_1","title":"Hist\u00f3rico de vers\u00f5es","text":"Vers\u00e3o Data Descri\u00e7\u00e3o Autores 1.0 25/07/2024 Documenta\u00e7\u00e3o React Native, Expo, NestJS, Docker e Watermelondb Ugor Brand\u00e3o"},{"location":"gestaoDoProjeto/guia_contribuicao/","title":"Como contribuir","text":""},{"location":"gestaoDoProjeto/guia_contribuicao/#historico-de-versoes","title":"Hist\u00f3rico de vers\u00f5es","text":"Data Vers\u00e3o Descri\u00e7\u00e3o Autor 05/04/2024 1.0 Cria\u00e7\u00e3o do documento Amanda Nobre"},{"location":"gestaoDoProjeto/guia_contribuicao/#issues","title":"Issues","text":"

Ao criar issues atente-se as seguintes quest\u00f5es:

  • J\u00e1 existe issue referente ao assunto que voc\u00ea pretende abordar na sua? Se sim, trabalhe a partir da issue j\u00e1 criada
  • Adicione um t\u00edtulo que sintetize bem o problema abordado na issue
  • Adicione uma descri\u00e7\u00e3o adequada, de modo que qualquer membro do reposit\u00f3rio consiga compreender qual \u00e9 o problema
  • Adicione ao menos um Assignee
  • Adicione as Labels adequadas
  • Adicione a milestone referente a sprint em que o problema ser\u00e1 trabalhado
  • Adicione um Estimate segundo as defini\u00e7\u00f5es descritas nesse documento
"},{"location":"gestaoDoProjeto/guia_contribuicao/#definicao-de-estimate","title":"Defini\u00e7\u00e3o de Estimate","text":"

Deve-se definir uma estimativa de dificuldade (pontua\u00e7\u00e3o) \u00e0 issue em quest\u00e3o, levando em considera\u00e7\u00e3o os seguintes crit\u00e9rios:

Pontua\u00e7\u00e3o Crit\u00e9rios 1 Tarefa bem simples, \u00e9 poss\u00edvel ser feita em at\u00e9 1h 2 Tarefa simples que leva algumas horas 3 Tarefa que pode levar algumas horas e necessita de alguma pesquisa 5 Tarefa n\u00e3o t\u00e3o simples, precisa de pesquisa e deve levar alguns dias 8 Tarefa complexa, pode durar a semana toda 13 Tarefa muito complexa, provavelmente levar\u00e1 mais que uma sprint, melhor rever e dividir em mais de uma issue

A pontua\u00e7\u00e3o da issue dever\u00e1 ser levada a vota\u00e7\u00e3o utilizando a ferramenta de planning poker do zenhub.

  • Para issues que envolvem apenas um time, todo o time dever\u00e1 ser adicionado ao planning poker.
  • Para issues que envolvam mais de um time, apenas os colaboradores dever\u00e3o ser adicionados ao planning poker.
"},{"location":"gestaoDoProjeto/guia_contribuicao/#branches","title":"Branches","text":"

Padronizar evita confus\u00f5es e torna mais f\u00e1cil a leitura e a procura por artefatos do projeto, e isso tamb\u00e9m se aplica \u00e0 nomenclatura de branches. Por padr\u00e3o, a nomenclatura de branches deve obedecer o seguinte formato:

<type>/<branch-name>

"},{"location":"gestaoDoProjeto/guia_contribuicao/#type","title":"Type","text":"

O par\u00e2metro type sinaliza qual o principal tipo de modifica\u00e7\u00e3o realizada. Por padr\u00e3o, utilizamos as seguintes palavras chaves:

Type Significado feat Novas funcionalidades para o usu\u00e1rio fix Corre\u00e7\u00f5es de bugs para o usu\u00e1rio docs Modifica\u00e7\u00f5es na documenta\u00e7\u00e3o style Formata\u00e7\u00e3o, sem altera\u00e7\u00f5es no c\u00f3digo de produ\u00e7\u00e3o refactor Refatora\u00e7\u00e3o de c\u00f3digo de produ\u00e7\u00e3o test Adi\u00e7\u00e3o e refatora\u00e7\u00e3o de testes (sem alterar c\u00f3digo de produ\u00e7\u00e3o) chore Atualiza\u00e7\u00f5es gen\u00e9ricas sem altera\u00e7\u00f5es de c\u00f3digo de produ\u00e7\u00e3o"},{"location":"gestaoDoProjeto/guia_contribuicao/#branch-name","title":"Branch name","text":"

O par\u00e2metro branch-name descreve de forma textual a atividade realizada dentro da branch. Por padr\u00e3o, o nome da branch \u00e9 escrito em ingl\u00eas substituindo os espa\u00e7os por h\u00edfen \"-\". Por exemplo: Create new tests for user se torna create-new-tests-for-user.

Atente-se para a cria\u00e7\u00e3o de um nome coerente para sua branch, a fim de evitar confus\u00f5es e incoer\u00eancias.

"},{"location":"gestaoDoProjeto/guia_contribuicao/#exemplos","title":"Exemplos","text":"

Uma branch para adi\u00e7\u00e3o de novos testes para a um user:

test/create-new-tests-for-user

Uma branch para corre\u00e7\u00e3o de um bug na cria\u00e7\u00e3o de user:

fix/remove-bug-from-user-creation

"},{"location":"gestaoDoProjeto/guia_contribuicao/#criacao-de-branches","title":"Cria\u00e7\u00e3o de Branches","text":"

A partir do reposit\u00f3rio desejado:

  1. Atualize seu reposit\u00f3rio local buscando por novidades no reposit\u00f3rio remoto.
git fetch\n
  1. Mude para a branch principal, seja develop ou main.
git checkout _branch-principal_\n
  1. Sincronize o estado da branch local com o estado da branch remota.
git reset --hard _branch-principal_\n
  1. A partir da branch atual, crie a nova branch obedecendo a conven\u00e7\u00e3o de nomes.
git checkout -b <type>/<branch>\n
"},{"location":"gestaoDoProjeto/guia_contribuicao/#commits","title":"Commits","text":"

A pol\u00edtica de commits desse projeto \u00e9 baseada no Conventional Commits v1.0.0.

Conventional Commits define um conjunto de regras simples para que as mensagens commit sejam consistentes no hist\u00f3rico de um reposit\u00f3rio. Utilizar uma conven\u00e7\u00e3o como essa facilita a leitura do hist\u00f3rico, a identifica\u00e7\u00e3o das mudan\u00e7as realizadas por um commit e facilita a ado\u00e7\u00e3o de ferramentas de automa\u00e7\u00e3o para gerar changelogs ou release notes.

Por padr\u00e3o, as mensagens de commits devem seguir o seguinte formato:

<type>: <subject>\n
"},{"location":"gestaoDoProjeto/guia_contribuicao/#type_1","title":"Type","text":"

Assim como para as branches, type descreve o tipo da modifica\u00e7\u00e3o contemplada pelo commit. Por padr\u00e3o, utilizamos as seguintes palavras chaves:

Type Significado feat Novas funcionalidades para o usu\u00e1rio fix Corre\u00e7\u00f5es de bugs para o usu\u00e1rio docs Modifica\u00e7\u00f5es na documenta\u00e7\u00e3o style Formata\u00e7\u00e3o, sem altera\u00e7\u00f5es no c\u00f3digo de produ\u00e7\u00e3o refactor Refatora\u00e7\u00e3o de c\u00f3digo de produ\u00e7\u00e3o test Adi\u00e7\u00e3o e refatora\u00e7\u00e3o de testes (sem alterar c\u00f3digo de produ\u00e7\u00e3o) chore Atualiza\u00e7\u00f5es gen\u00e9ricas sem altera\u00e7\u00f5es de c\u00f3digo de produ\u00e7\u00e3o"},{"location":"gestaoDoProjeto/guia_contribuicao/#subject","title":"Subject","text":"

O par\u00e2metro subject representa a mensagem que descreve o commit escrita em ingl\u00eas. Uma boa pr\u00e1tica que diz respeito a commits \u00e9 a de sempre escrever subjects descritivos, isto \u00e9, sempre se preocupando em deixar bem claro os conceitos what e why.

Para clarificar as recomenda\u00e7\u00f5es aqui mencionadas, confira estes exemplos:

Modifies user model Ao avaliar esta mensagem de commit, o conceito what \u00e9 superficial, pois n\u00e3o descreve especificamente o que foi alterado na model user. J\u00e1 o conceito why sequer existe.

Modifies user's model name field to make it shorter Ao avaliar esta mensagem de commit, quem quer que a leia entender\u00e1 o motivo, e do que se trata a altera\u00e7\u00e3o feita. Tal coisa permite poupar esfo\u00e7o e tempo para entender do que o commit se trata.

"},{"location":"gestaoDoProjeto/guia_contribuicao/#pull-request","title":"Pull Request","text":"

Ao fazer um pull request atente-se para:

  • Seguir o template configurado.
  • Linkar o PR a sua Issue correspondente.
  • Marcar um dos respons\u00e1veis para revis\u00e3o.
"},{"location":"gestaoDoProjeto/guia_contribuicao/#referencias","title":"Refer\u00eancias","text":"

Commits Convencionais

Git branch naming conventions

Gerenciando seus branches com o Git Flow

Pol\u00edticas do Reposit\u00f3rio

"},{"location":"lean_inception/dia_1/","title":"Lean Inception - Dia 1","text":""},{"location":"lean_inception/dia_1/#historico-de-versoes","title":"Hist\u00f3rico de vers\u00f5es","text":"Data Vers\u00e3o Descri\u00e7\u00e3o Autor 19/04/2024 1.0 Cria\u00e7\u00e3o do documento Jessica Luiza"},{"location":"lean_inception/dia_1/#sobre","title":"Sobre","text":"

O primeiro dia da Lean Inception \u00e9 marcado por tr\u00eas atividades fundamentais que unem t\u00e9cnica e cliente numa vis\u00e3o unificada do produto a ser criado. Essas pr\u00e1ticas s\u00e3o cruciais para assegurar uma interpreta\u00e7\u00e3o consistente e um entendimento comum acerca do prop\u00f3sito central do produto e de suas funcionalidades chave. O alinhamento obtido \u00e9 crucial para o time de desenvolvimento captar com totalidade o que o produto busca realizar, encaixando-se perfeitamente com as expectativas do cliente.

"},{"location":"lean_inception/dia_1/#visao-do-produto","title":"Vis\u00e3o do Produto","text":"

Na fase inicial da Lean Inception denominada \"Vis\u00e3o do Produto\", busca-se estabelecer um entendimento comum e preciso acerca do produto em processo de cria\u00e7\u00e3o. Durante esta fase, o coletivo envolvido no projeto \u2014 que engloba profissionais da \u00e1rea t\u00e9cnica, autoridades em neg\u00f3cios e vocais dos clientes ou usu\u00e1rios \u2014 se congrega para moldar uma imagem abrangente do produto em idealiza\u00e7\u00e3o.

Conceber essa vis\u00e3o consensual \u00e9 crucial para que todos os membros da equipe estejam sintonizados em rela\u00e7\u00e3o \u00e0s metas centrais e \u00e0 identidade do projeto. Isso estabelece um ponto de partida l\u00edmpido e compartilhado que facilita o alinhamento de perspectivas e compreens\u00f5es sobre a obra em andamento. Tal alinhamento \u00e9 de import\u00e2ncia capital em ambientes de desenvolvimento \u00e1geis, nos quais se preza a flexibilidade e adapta\u00e7\u00e3o, permitindo que a vis\u00e3o estabelecida do produto atue como um referencial constante para assegurar a conformidade do resultado final aos anseios do neg\u00f3cio e expectativas dos stakeholders.

"},{"location":"lean_inception/dia_1/#visao-do-produto-do-gerocuidado","title":"Vis\u00e3o do Produto do GEROcuidado","text":""},{"location":"lean_inception/dia_1/#enao-e-faznao-faz","title":"\u00c9/n\u00e3o \u00e9 - Faz/n\u00e3o faz","text":"

A atividade de delimita\u00e7\u00e3o \"\u00c9/N\u00e3o \u00c9\" e \"Faz/N\u00e3o Faz\" consiste na cria\u00e7\u00e3o de listas que definem claramente o que est\u00e1 incluso no produto e o que est\u00e1 fora do alcance, assim como as funcionalidades que o produto oferece e aquelas que n\u00e3o s\u00e3o oferecidas. As listas \"\u00c9/N\u00e3o \u00c9\" e \"Faz/N\u00e3o Faz\" s\u00e3o cruciais para estabelecer limites claros do projeto, o que auxilia na preven\u00e7\u00e3o de confus\u00f5es e de um escopo de projeto que v\u00e1 al\u00e9m do previsto.

#### - \"\u00c9/N\u00e3o \u00c9\" Esclarece o que o produto realmente compreende em termos de recursos, capacidades e atributos. Ela assegura que todos os membros da equipe e o cliente tenham um entendimento comum e conciso do que ser\u00e1 entregue. Isso \u00e9 importante para evitar a inclus\u00e3o de recursos adicionais que n\u00e3o foram originalmente planejados.

"},{"location":"lean_inception/dia_1/#-faznao-faz","title":"- \"Faz/N\u00e3o Faz\"","text":"

Detalha as funcionalidades e opera\u00e7\u00f5es espec\u00edficas que o produto \u00e9 capaz de realizar, bem como toda e qualquer opera\u00e7\u00e3o que ele n\u00e3o ir\u00e1 desempenhar. Isso ajuda a alinhar as expectativas do cliente quanto \u00e0 performance e comportamento do produto final.

Efetivamente, essas listas contribuem para uma melhor comunica\u00e7\u00e3o entre a equipe de desenvolvimento e o cliente, garantem que o desenvolvimento seja focado apenas nos requisitos essenciais e previnem o surgimento de mal-entendidos quanto ao que o produto \u00e9 capaz ou n\u00e3o \u00e9 capaz de fazer.

"},{"location":"lean_inception/dia_1/#enao-e-faznao-faz-do-gerocuidado","title":"\u00c9/n\u00e3o \u00e9 - Faz/n\u00e3o faz do GEROcuidado","text":""},{"location":"lean_inception/dia_1/#objetivos-do-produto","title":"Objetivos do Produto","text":"

Na etapa designada como \"Objetivos do Produto\", que ocorre durante o processo de Lean Inception, a meta \u00e9 a defini\u00e7\u00e3o precisa e quantific\u00e1vel dos fins aos quais o produto se destina. Este est\u00e1gio \u00e9 fundamental, pois norteia o desenvolvimento rumo ao cumprimento das expectativas dos clientes e \u00e0s demandas do neg\u00f3cio.

Durante a defini\u00e7\u00e3o dos objetivos, procede-se \u00e0 categoriza\u00e7\u00e3o em \"clusters\", que servem para agrupar objetivos de natureza similar sob um mesmo r\u00f3tulo geral, facilitando a organiza\u00e7\u00e3o e o entendimento das metas a serem atingidas pelo produto em desenvolvimento.

"},{"location":"lean_inception/dia_2/","title":"Lean Inception - Dia 2","text":""},{"location":"lean_inception/dia_2/#historico-de-versoes","title":"Hist\u00f3rico de vers\u00f5es","text":"Data Vers\u00e3o Descri\u00e7\u00e3o Autor 13/04/2024 1.0 Cria\u00e7\u00e3o do documento Sebastian Zuzunaga"},{"location":"lean_inception/dia_2/#sobre","title":"Sobre","text":"

No segundo dia de Lean Inception veremos duas partes cruciais para o desenvolvimento do projeto, a \"Descri\u00e7\u00e3o das Pessoas\" e a \"Jornada de Usu\u00e1rio\". Definir estes dois itens nos ajudar\u00e1 a entender quem s\u00e3o os usu\u00e1rios do produto e como interagem com este em seu dia a dia.

"},{"location":"lean_inception/dia_2/#descricao-das-personas","title":"Descri\u00e7\u00e3o das Personas","text":"

Foram criadas descri\u00e7\u00f5es detalhadas das pessoas que utilizaram a nossa aplica\u00e7\u00e3o, cada uma delas representa um grupo de utilizadores com caracter\u00edsticas espec\u00edficas. Cada persona recebe um nome, uma foto e uma descri\u00e7\u00e3o que inclui informa\u00e7\u00f5es como idade, g\u00eanero, necessidades, desafios, metas e comportamentos t\u00edpicos. O objetivo \u00e9 definir as caracteristicas dos diferentes grupos que utilizar\u00e3o o produto para assim poder visualizar com clareza suas necessidades em rela\u00e7\u00e3o \u00e0 aplica\u00e7\u00e3o.

"},{"location":"lean_inception/dia_2/#personas-do-gerocuidado","title":"Personas do GEROcuidado","text":""},{"location":"lean_inception/dia_2/#persona-1-cuidadora-formal","title":"Persona 1 - Cuidadora Formal","text":""},{"location":"lean_inception/dia_2/#persona-2-cuidadora-informal","title":"Persona 2 - Cuidadora Informal","text":""},{"location":"lean_inception/dia_2/#persona-3-cuidador-formal-homecare","title":"Persona 3 - Cuidador Formal (homecare)","text":""},{"location":"lean_inception/dia_2/#jornadas-de-usuario","title":"Jornadas de Usu\u00e1rio","text":"

A viagem de usu\u00e1rio serve para visualizar como um usu\u00e1rio interage com a aplica\u00e7\u00e3o passo a passo, desde a primeira intera\u00e7\u00e3o at\u00e9 a conclus\u00e3o de suas tarefas, serve tamb\u00e9m para ver em que contexto se vai usar, onde e quando. Ajuda-nos a identificar as necessidades do utilizador e poss\u00edveis problemas durante a sua utiliza\u00e7\u00e3o. Ajuda a ter uma vis\u00e3o completa da experi\u00eancia do usu\u00e1rio.

"},{"location":"lean_inception/dia_2/#jornadas-de-usuario-do-gerocuidado","title":"Jornadas de Usu\u00e1rio do GEROcuidado","text":""},{"location":"lean_inception/dia_2/#jornada-de-usuario-1","title":"Jornada de Usu\u00e1rio 1","text":""},{"location":"lean_inception/dia_2/#jornada-de-usuario-2","title":"Jornada de Usu\u00e1rio 2","text":""},{"location":"lean_inception/dia_2/#jornada-de-usuario-3","title":"Jornada de Usu\u00e1rio 3","text":""},{"location":"lean_inception/dia_3/","title":"Lean Inception - Dia 3","text":""},{"location":"lean_inception/dia_3/#historico-de-versoes","title":"Hist\u00f3rico de vers\u00f5es","text":"Vers\u00e3o Data Descri\u00e7\u00e3o Autores 1.0 13/04/2024 Abertura do documento Gustavo Abrantes 1.1 19/04/2024 Imagem Brainstorm Gustavo Abrantes e Yuri Ezequie"},{"location":"lean_inception/dia_3/#sobre","title":"Sobre","text":"

O terceiro dia de uma Lean Inception \u00e9 uma etapa cr\u00edtica do processo, pois envolve atividades fundamentais para o desenvolvimento do produto. Neste dia (10/04/2024), a equipe respons\u00e1vel pelo desenvolvimento (EPS/MDS) juntamente com os clientes do projeto (Enactus), se concentram em uma tarefa fundamental: o Brainstorm de Funcionalidades.

No final dele, a equipe deve ter uma lista refinada de funcionalidades priorizadas e bem fundamentadas para o produto. Isso ajuda a garantir que o desenvolvimento se concentre nas \u00e1reas mais importantes e que todos na equipe tenham uma compreens\u00e3o compartilhada das metas do projeto.

Como em reuni\u00f5es anteriores, as equipes haviam tido um di\u00e1logo inicial sobre o poss\u00edvel rumo do produto final (se ele continuaria sendo um produto web, ou se passaria a ser um app nativo), no dia 10/04/2024, n\u00e3o foi poss\u00edvel concluir totalmente o Brainstorm de Funcionalidades, apenas de forma parcial. Desta forma, a equipe de EPS/MDS ficou respons\u00e1vel pelo t\u00e9rmino da clusteriza\u00e7\u00e3o at\u00e9 dia 11/04 ao 12h e a equipe da Enactus respons\u00e1vel pela valida\u00e7\u00e3o desta clusteriza\u00e7\u00e3o at\u00e9 o prazo m\u00e1ximo do dia 15/04 ao 12h de forma ass\u00edncrona.

"},{"location":"lean_inception/dia_3/#brainstorm-de-funcionalidades","title":"Brainstorm de Funcionalidades","text":"

Um brainstorm de funcionalidades \u00e9 uma atividade em grupo onde as equipes geram ideias e conceitos para as funcionalidades ou recursos em um produto ou projeto, de maneira colaborativa e sem cr\u00edticas iniciais. objetivo \u00e9 criar um conjunto inicial de ideias que possam ser posteriormente avaliadas e priorizadas.

"},{"location":"lean_inception/dia_3/#brainstorm-do-gerocuidado","title":"Brainstorm do GEROcuidado","text":""},{"location":"lean_inception/dia_4/","title":"Lean Inception - Dia 4","text":""},{"location":"lean_inception/dia_4/#historico-de-versoes","title":"Hist\u00f3rico de vers\u00f5es","text":"Vers\u00e3o Data Descri\u00e7\u00e3o Autores 1.0 19/04/2024 Abertura do documento Gustavo Abrantes e Yuri Ezequie 1.1 28/04/2024 Texto do sequenciador Sebastian Zuzunaga 1.2 20/07/2024 Adi\u00e7\u00e3o do Canvas MVP Gustavo Abrantes"},{"location":"lean_inception/dia_4/#sobre","title":"Sobre","text":"

O quarto dia de uma Lean Inception \u00e9 um marco importante no processo de desenvolvimento de um novo projeto ou produto. Neste est\u00e1gio, as ideias e conceitos come\u00e7am a se materializar de forma mais concreta. Ser\u00e3o 4 elementos-chave desse dia: Revis\u00e3o T\u00e9cnica, de Neg\u00f3cios e UX, Sequenciador e o canvas MVP. Esses elementos desempenham um papel fundamental na defini\u00e7\u00e3o do escopo e na estrutura\u00e7\u00e3o do projeto. No (19/04/2024), a equipe respons\u00e1vel pelo desenvolvimento (EPS/MDS) juntamente com os clientes do projeto (Enactus), se concentram em uma tarefa fundamental: A Revis\u00e3o T\u00e9cnica, de Neg\u00f3cios e UX, que ficou de ser completada de forma ass\u00edncrona com a equipe da Enactus at\u00e9 \u00e0s 9h do dia 20/04. Uma vez conclu\u00eddas todas estas tarefas, ser\u00e1 realizado o Canvas MVP, que cumpre a fun\u00e7\u00e3o de definir quais fun\u00e7\u00f5es devem ser desenvolvidas no menor tempo poss\u00edvel e quais podem ser relegadas a ser desenvolvidas no futuro.

"},{"location":"lean_inception/dia_4/#revisao-tecnica-de-negocio-e-ux","title":"Revis\u00e3o t\u00e9cnica, de neg\u00f3cio e UX","text":"

Para estabelecer prioridades em rela\u00e7\u00e3o \u00e0s funcionalidades, utilizamos diversas ferramentas, sendo uma delas o \"Gr\u00e1fico de Sem\u00e1foro\". Essa representa\u00e7\u00e3o visual utiliza cores para indicar o n\u00edvel de confian\u00e7a da equipe de desenvolvimento na compreens\u00e3o e capacidade de implementa\u00e7\u00e3o de cada funcionalidade. O gr\u00e1fico utiliza tr\u00eas n\u00edveis de confian\u00e7a:

  • Alto (Verde): Isso significa que a funcionalidade \u00e9 compreens\u00edvel e a equipe sabe como implement\u00e1-la.

  • M\u00e9dio (Amarelo): Indica que h\u00e1 alguma incerteza na compreens\u00e3o ou na capacidade de implementa\u00e7\u00e3o da funcionalidade. Pode ser que a equipe compreenda, mas n\u00e3o saiba como executar, ou vice-versa.

  • Baixo (Vermelho): Esse n\u00edvel de confian\u00e7a sugere que a funcionalidade n\u00e3o foi bem compreendida pela equipe e n\u00e3o sabem como implement\u00e1-la.

A imagem anexada ilustra a atribui\u00e7\u00e3o das cores, mas o ponto crucial \u00e9 entender que as cores verdes representam um alto n\u00edvel de confian\u00e7a, enquanto o vermelho indica um n\u00edvel de confian\u00e7a mais baixo.

Al\u00e9m disso, outra ferramenta importante relacionada \u00e0 prioriza\u00e7\u00e3o de funcionalidades envolve tr\u00eas s\u00edmbolos:

  • E (Esfor\u00e7o): Este s\u00edmbolo demonstra o esfor\u00e7o que a equipe de desenvolvimento precisar\u00e1 dedicar para implementar a funcionalidade.

  • $ (Valor): Representa o valor que a funcionalidade agrega ao cliente, Product Owner (PO) ou stakeholders, neste caso, o Enactus. \u00c9 importante notar que todas as funcionalidades t\u00eam import\u00e2ncia, mas \u00e9 crucial estabelecer prioridades com base no valor que cada uma delas oferece.

  • <3 (UX - Experi\u00eancia do Usu\u00e1rio): Esse s\u00edmbolo est\u00e1 relacionado ao conceito de User Experience (Experi\u00eancia do Usu\u00e1rio) e indica o quanto a funcionalidade \u00e9 interessante para o usu\u00e1rio.

Ao combinar o Gr\u00e1fico de Sem\u00e1foro com esses s\u00edmbolos, a equipe pode ter uma vis\u00e3o mais clara e completa das funcionalidades do projeto, ajudando na tomada de decis\u00f5es informadas sobre o que implementar primeiro, considerando tanto a compreens\u00e3o t\u00e9cnica quanto o valor para o usu\u00e1rio e para o neg\u00f3cio.

"},{"location":"lean_inception/dia_4/#revisao-tecnica-de-negocios-e-ux-do-gerocuidado","title":"Revis\u00e3o t\u00e9cnica, de neg\u00f3cios e UX do GEROcuidado","text":""},{"location":"lean_inception/dia_4/#sequenciador","title":"Sequenciador","text":"

O sequenciador nos ajudar\u00e1 a determinar quais funcionalidades devem ser priorizadas para o produto. Tomam-se as fun\u00e7\u00f5es previamente definidas para a aplica\u00e7\u00e3o e organizam-se numa sequ\u00eancia l\u00f3gica, onde se identificam quais devem ser implementadas no menor tempo poss\u00edvel (Produto M\u00ednimo Vi\u00e1vel) e quais podem ser relegadas a ser implementadas no futuro, esta lista orientar\u00e1 o desenvolvimento do projecto.

A lista previamente mencionada ser\u00e1 dividida em ondas, estas v\u00e3o definir a ordem em que se realizar\u00e3o as tarefas, para sua cria\u00e7\u00e3o existem algumas regras que garantem a suficiente cria\u00e7\u00e3o de valor e limitam a dificuldade de cada onda.

  • Regra 1: Uma onda pode conter no m\u00e1ximo tr\u00eas, cart\u00f5es.

  • Regra 2: Uma onda n\u00e3o pode conter mais de uma cart\u00e3o vermelho.

  • Regra 3: Uma onda n\u00e3o pode conter tr\u00eas cart\u00f5es somente amarelos ou vermelho.

  • Regra 4: A soma de esfor\u00e7o dos cart\u00f5es n\u00e3o pode ultrapassar cinco Es.

  • Regra 5: A soma de valor dos cart\u00f5es n\u00e3o pode ser menos de quatro $s e quatro cora\u00e7\u00f5es.

  • Regra 6: Se um cart\u00e3o depende de outro, esse outro deve estar em alguma onda anterior.

"},{"location":"lean_inception/dia_4/#sequenciador-do-gerocuidado","title":"Sequenciador do GEROcuidado","text":""},{"location":"lean_inception/dia_4/#canvas-mvp","title":"Canvas MVP","text":"

O Canvas MVP \u00e9 uma ferramenta visual que ajuda a equipe a definir o que far\u00e1 parte do Produto M\u00ednimo Vi\u00e1vel. Ele geralmente \u00e9 composto por nove \u00e1reas ou blocos, incluindo:

  • Objetivo do MVP: Uma declara\u00e7\u00e3o clara do que se pretende alcan\u00e7ar com o MVP.

  • Problema: Uma descri\u00e7\u00e3o do problema que o MVP est\u00e1 resolvendo para os usu\u00e1rios.

  • Solu\u00e7\u00e3o: Uma vis\u00e3o geral da solu\u00e7\u00e3o que ser\u00e1 implementada.

  • Usu\u00e1rios: Quem s\u00e3o os usu\u00e1rios-alvo do MVP.

  • Caracter\u00edsticas Principais: As funcionalidades centrais que ser\u00e3o inclu\u00eddas no MVP.

  • M\u00e9tricas de Sucesso: Como o sucesso do MVP ser\u00e1 medido.

  • Hip\u00f3teses: Suposi\u00e7\u00f5es ou previs\u00f5es que est\u00e3o sendo testadas com o MVP.

  • Restri\u00e7\u00f5es: Quaisquer limita\u00e7\u00f5es ou restri\u00e7\u00f5es que afetam o desenvolvimento do MVP.

  • Aprendizados: Espa\u00e7o para registrar o que a equipe aprendeu durante o processo de cria\u00e7\u00e3o do Canvas MVP.

O Canvas MVP ajuda a equipe a visualizar de forma clara e concisa o escopo do Produto M\u00ednimo Vi\u00e1vel, garantindo que todos tenham uma compreens\u00e3o comum do que ser\u00e1 desenvolvido e por qu\u00ea.

"},{"location":"lean_inception/dia_4/#canvas-mvp-do-gerocuidado","title":"Canvas MVP do GEROcuidado","text":""},{"location":"lean_inception/kickoff/","title":"Kick-off","text":""},{"location":"lean_inception/kickoff/#historico-de-versoes","title":"Hist\u00f3rico de vers\u00f5es","text":"Data Vers\u00e3o Descri\u00e7\u00e3o Autor 05/04/2024 1.0 Cria\u00e7\u00e3o do documento Amanda Nobre 12/04/2024 1.1 Atualiza\u00e7\u00e3o documento Marcella Anderle e Yuri Ezequiel"},{"location":"lean_inception/kickoff/#sobre","title":"Sobre","text":"

O Kickoff \u00e9 uma reuni\u00e3o crucial que re\u00fane todas as partes interessadas, incluindo membros da equipe de desenvolvimento, stakeholders do projeto, especialistas t\u00e9cnicos e, idealmente, o cliente ou representantes dos usu\u00e1rios finais. Durante essa reuni\u00e3o, v\u00e1rias atividades s\u00e3o realizadas:

  • Apresenta\u00e7\u00e3o do Objetivo: O facilitador do Lean Inception, que \u00e9 geralmente um especialista experiente na metodologia, apresenta o objetivo geral da Lean Inception e define as expectativas para a semana de trabalho. Ele esclarece que o objetivo \u00e9 definir e planejar o Minimum Viable Product (MVP) de forma colaborativa e eficiente.

  • Explica\u00e7\u00e3o do Processo: O facilitador explica o processo que ser\u00e1 seguido ao longo da semana, destacando as atividades-chave que ser\u00e3o realizadas em cada dia. Isso ajuda a equipe a entender a sequ\u00eancia das atividades e a import\u00e2ncia de cada uma delas.

  • Defini\u00e7\u00e3o dos Participantes: S\u00e3o apresentados os membros da equipe e os participantes, garantindo que todos saibam quem est\u00e1 envolvido e qual \u00e9 o seu papel.

  • Contextualiza\u00e7\u00e3o do Projeto ou Produto: A equipe compartilha informa\u00e7\u00f5es essenciais sobre o projeto ou produto em quest\u00e3o. Isso inclui detalhes sobre o mercado, o p\u00fablico-alvo, os objetivos e os desafios.

  • Esclarecimento de D\u00favidas: \u00c9 fornecida a oportunidade para os participantes fazerem perguntas e esclarecerem quaisquer d\u00favidas sobre o processo ou o projeto.

  • Defini\u00e7\u00e3o do cronograma: Geralmente tamb\u00e9m \u00e9 estabelecido um cronograma referente \u00e0s etapa do Lean Inception, ele serve para ilustrar quais etapas ser\u00e3o realizadas em quais dias, e em quais momentos do dia.

  • Defini\u00e7\u00e3o dos Resultados Esperados: Por fim, s\u00e3o estabelecidos os resultados esperados ao final da semana, como uma vis\u00e3o clara do produto, personas definidas, funcionalidades priorizadas e um roadmap inicial.

O Kickoff desempenha um papel fundamental ao alinhar todos os participantes em rela\u00e7\u00e3o aos objetivos e ao processo da Lean Inception. Ele cria um ambiente de colabora\u00e7\u00e3o e entusiasmo, motivando a equipe a trabalhar juntos de forma eficiente ao longo da semana para alcan\u00e7ar os resultados desejados. \u00c9 o ponto de partida para uma jornada produtiva de defini\u00e7\u00e3o e planejamento \u00e1gil do MVP.

"},{"location":"lean_inception/kickoff/#cronograma","title":"Cronograma","text":""},{"location":"lean_inception/lean_inception/","title":"Lean Inception","text":""},{"location":"lean_inception/lean_inception/#historico-de-versoes","title":"Hist\u00f3rico de vers\u00f5es","text":"Data Vers\u00e3o Descri\u00e7\u00e3o Autor 05/04/2024 1.0 Cria\u00e7\u00e3o do documento Amanda Nobre"},{"location":"lean_inception/lean_inception/#sobre","title":"Sobre","text":"

A metodologia Lean Inception, concebida por Paulo Caroli, \u00e9 uma abordagem inovadora que visa alcan\u00e7ar o Minimum Viable Product (MVP), ou Produto M\u00ednimo Vi\u00e1vel, de forma colaborativa e eficiente. O pr\u00f3prio nome, \"Lean Inception\", sugere sua natureza enxuta e \u00e1gil, refletindo uma fase inicial em que as partes de neg\u00f3cios e t\u00e9cnicas se unem em um curto per\u00edodo de tempo. Esse per\u00edodo costuma ser limitado a uma semana, idealmente com uma carga hor\u00e1ria de 40 horas semanais dedicadas ao processo. Um dos pilares fundamentais desta metodologia \u00e9 a constante participa\u00e7\u00e3o do cliente, o que a torna verdadeiramente colaborativa.

"},{"location":"lean_inception/lean_inception/#atividades-do-lean-inception","title":"Atividades do Lean Inception","text":"

O funcionamento do Lean Inception \u00e9 baseado em uma s\u00e9rie de atividades estruturadas que s\u00e3o conduzidas ao longo da semana. Cada atividade desempenha um papel espec\u00edfico no processo de defini\u00e7\u00e3o e refinamento do MVP. Vamos explorar algumas dessas atividades-chave:

  • Kickoff: A semana Lean Inception come\u00e7a com uma reuni\u00e3o de in\u00edcio, onde os participantes s\u00e3o introduzidos ao processo e ao objetivo. Isso estabelece o tom e a dire\u00e7\u00e3o para o trabalho colaborativo que se seguir\u00e1, assim como o cronograma das atividades a serem desenvolvidas.

  • Dia 1: Vis\u00e3o do Produto, \u00c9/N\u00e3o \u00e9, Faz/N\u00e3o faz e Objetivos do Produto: No primeiro dia, o foco est\u00e1 na defini\u00e7\u00e3o da vis\u00e3o do produto, bem como na cria\u00e7\u00e3o de listas de elementos \"\u00c9/N\u00e3o \u00e9\" e \"Faz/N\u00e3o faz\". Al\u00e9m disso, s\u00e3o estabelecidos os objetivos claros do produto a serem alcan\u00e7ados. No geral o Dia 1 tem como foco o alinhamento da vis\u00e3o sobre o produto da equipe de desenvolvimento e do cliente, para que fique claro qual o produto que se deseja criar.

  • Dia 2: Descri\u00e7\u00e3o das Personas e Jornada de Usu\u00e1rio: O segundo dia concentra-se na cria\u00e7\u00e3o detalhada das personas, representando os principais usu\u00e1rios do produto, e na mapea\u00e7\u00e3o de suas jornadas. Isso ajuda a direcionar o desenvolvimento para atender \u00e0s necessidades espec\u00edficas dos usu\u00e1rios.

  • Dia 3: Brainstorm de Funcionalidades e Revis\u00e3o T\u00e9cnica, de Neg\u00f3cio e UX: No terceiro dia, ocorre uma intensa sess\u00e3o de brainstorming para gerar ideias de funcionalidades. Simultaneamente, s\u00e3o realizadas a etapa de gr\u00e1fico de sem\u00e1foro e a revis\u00e3o t\u00e9cnica, de neg\u00f3cio e ux para estabelecer uma prioriza\u00e7\u00e3o sobre as funcionalidades levantas. Dessa forma s\u00e3o estabelecidas e priorizadas as funcionalidades que ir\u00e3o compor o MVP.

  • Dia 4: Sequenciador de Funcionalidades e Canvas MVP: Durante o quarto dia, as funcionalidades geradas s\u00e3o priorizadas e organizadas em um sequenciador, esse sequenciador possui algumas regras, essas regras separam as funcionalidades em ondas, indicando o tempo, e nela tamb\u00e9m s\u00e3o definidos as funcionalidades que ir\u00e3o compor o MVP e o quais seriam incrementos. Al\u00e9m disso, o Canvas MVP \u00e9 preenchido, delineando o escopo do Produto M\u00ednimo Vi\u00e1vel.

  • Showcase: A semana Lean Inception \u00e9 conclu\u00edda com uma apresenta\u00e7\u00e3o (showcase) das decis\u00f5es tomadas, incluindo a vis\u00e3o do produto, as personas, as funcionalidades priorit\u00e1rias e o roadmap para o desenvolvimento do MVP. Isso assegura que todos os envolvidos estejam alinhados e tenham uma compreens\u00e3o clara do caminho a seguir.

O Lean Inception se destaca por sua abordagem \u00e1gil e colaborativa, permitindo que as equipes trabalhem juntas de forma eficiente para definir, priorizar e desenvolver o MVP em um curto espa\u00e7o de tempo. Essa metodologia ajuda a reduzir o desperd\u00edcio de recursos e acelerar o tempo de entrega, garantindo que o produto final atenda \u00e0s necessidades reais dos clientes.

"},{"location":"lean_inception/lean_inception/#exemplo-de-cronograma-do-lean-inception","title":"Exemplo de cronograma do Lean Inception","text":""},{"location":"lean_inception/lean_inception/#lean-inception-gerocuidado","title":"Lean Inception GEROcuidado","text":""},{"location":"lean_inception/lean_inception/#gerocuidado-20232","title":"GEROcuidado - 2023.2","text":""},{"location":"lean_inception/lean_inception/#gerocuidado-20241","title":"GEROcuidado - 2024.1","text":""},{"location":"planejamento/eap/","title":"Estrutura Anal\u00edtica do Projeto - EAP","text":""},{"location":"planejamento/eap/#historico-de-versoes","title":"Hist\u00f3rico de vers\u00f5es","text":"Vers\u00e3o Data Modifica\u00e7\u00e3o Autor 1.0 19/07/2024 Cria\u00e7\u00e3o do documento Ugor Brand\u00e3o

O que \u00e9 a EAP?

A Estrutura Anal\u00edtica do Projeto (EAP) \u00e9 uma ferramenta crucial no gerenciamento de projetos que visa decompor um projeto complexo em partes menores e mais manej\u00e1veis. A EAP organiza o projeto de forma hier\u00e1rquica, facilitando a visualiza\u00e7\u00e3o e o entendimento de suas diferentes componentes. Segundo Ricardo Vargas em seu livro Gerenciamento de Projetos: Estabelecendo Diferenciais Competitivos, a EAP \u00e9 uma t\u00e9cnica que divide o projeto em elementos mais simples e compreens\u00edveis, com cada n\u00edvel inferior representando uma subdivis\u00e3o mais detalhada do projeto. Este processo continua at\u00e9 que cada componente seja reduzido a um n\u00edvel que seja pr\u00e1tico para gest\u00e3o e controle.

Para que serve?

A EAP \u00e9 utilizada para:

  1. Estabelecimento de Estrutura e Organiza\u00e7\u00e3o: Fornece uma vis\u00e3o clara e estruturada do projeto, permitindo que todos os envolvidos compreendam melhor suas partes e inter-rela\u00e7\u00f5es. Isso facilita a comunica\u00e7\u00e3o e o entendimento das responsabilidades.

  2. Identifica\u00e7\u00e3o de Entregas e Resultados: Ajuda a identificar e definir todas as entregas e resultados esperados do projeto. Cada n\u00edvel da EAP representa uma parte espec\u00edfica do trabalho que precisa ser realizado, o que facilita o rastreamento e a verifica\u00e7\u00e3o das entregas.

  3. Planejamento e Monitoramento: Auxilia no planejamento detalhado, permitindo a cria\u00e7\u00e3o de cronogramas e or\u00e7amentos mais precisos. A estrutura hier\u00e1rquica da EAP tamb\u00e9m facilita o monitoramento do progresso, pois cada n\u00edvel pode ser acompanhado individualmente para garantir que o projeto esteja no caminho certo.

  4. Defini\u00e7\u00e3o dos Pacotes de Trabalho: A EAP \u00e9 fundamental para a defini\u00e7\u00e3o dos pacotes de trabalho, que s\u00e3o unidades de trabalho menores e espec\u00edficas dentro do projeto. Isso ajuda a alocar recursos, atribuir responsabilidades e definir prazos de forma mais eficiente.

  5. Gerenciamento de Riscos: Permite uma an\u00e1lise mais detalhada dos riscos, uma vez que cada componente do projeto \u00e9 identificado e avaliado individualmente. Isso facilita a identifica\u00e7\u00e3o de potenciais problemas e a implementa\u00e7\u00e3o de estrat\u00e9gias de mitiga\u00e7\u00e3o adequadas.

  6. Facilita\u00e7\u00e3o do Controle de Mudan\u00e7as: Quando mudan\u00e7as ocorrem no projeto, a EAP permite uma avalia\u00e7\u00e3o mais f\u00e1cil e precisa do impacto dessas mudan\u00e7as em diferentes partes do projeto, ajudando a gerenciar e controlar as altera\u00e7\u00f5es de forma eficaz.

Ao estruturar o projeto em componentes menores e mais gerenci\u00e1veis, a EAP fornece uma base s\u00f3lida para uma gest\u00e3o mais eficaz e bem-sucedida.

"},{"location":"planejamento/eap/#eap-projeto-gerocuidado","title":"EAP - Projeto GeroCuidado","text":""},{"location":"planejamento/eap/#referencias","title":"Refer\u00eancias","text":"

[1] LIMA, V. R. O que \u00e9 a Estrutura Anal\u00edtica do Projeto (EAP). 2021. Dispon\u00edvel em: https://www.youtube.com/watch?v=TS9eciG-Ddw. Acesso em: 11 maio 2023.

"},{"location":"planejamento/metodologia/","title":"Metodologias","text":""},{"location":"planejamento/metodologia/#historico-de-versoes","title":"Hist\u00f3rico de vers\u00f5es","text":"Vers\u00e3o Data Descri\u00e7\u00e3o Autores 1.0 25/07/2024 Abertura do documento Gustavo Abrantes"},{"location":"planejamento/metodologia/#introducao","title":"Introdu\u00e7\u00e3o","text":"

Este documento descreve o processo completo utilizado no desenvolvimento do projeto GEROcuidado. Para alcan\u00e7ar esse objetivo, adotamos metodologias \u00e1geis de desenvolvimento de software, incluindo Scrum e XP.

"},{"location":"planejamento/metodologia/#lean-inception","title":"Lean Inception","text":"

O Lean Inception oferece um processo colaborativo de descoberta e demonstra\u00e7\u00e3o em que os participantes trabalham juntos por meio de uma s\u00e9rie de atividades para entender as oportunidades e elaborar um MVP(m\u00ednimo produto vi\u00e1vel). O Lean Inception \u00e9 \u00fatil quando a equipe necessita desenvolver um MVP e criar um produto de forma iterativa e incremental (CAROLI, 2017). \u00c9 justamente a metodologia que possibilita acelerar a entrega de solu\u00e7\u00f5es de forma cont\u00ednua e consistente, sempre contemplando dois eixos essenciais: os objetivos do neg\u00f3cio e as necessidades dos usu\u00e1rios.

"},{"location":"planejamento/metodologia/#scrum","title":"Scrum","text":"

Scrum \u00e9 um framework de gerenciamento de projetos \u00e1geis, e embora seja amplamente utilizado na \u00e1rea de desenvolvimento de software, pode ser usado para planejar, gerenciar e desenvolver qualquer produto. \u00c9 um framework interativo e incremental. Nessa metodologia, os projetos s\u00e3o divididos em ciclos curtos e iterativos (repetitivos). Os ciclos duram de 1 a 2 semanas e s\u00e3o chamados de sprints (CRUZ, 2013). O scrum prev\u00ea alguns ritos (cerim\u00f4nias) e artefatos.

Durante o projeto GEROcuidado, os artefatos usados s\u00e3o: backlog do produto (product backlog) e sprints. Os ritos usados s\u00e3o: planejamento da sprint (planing), daily e review.

"},{"location":"planejamento/metodologia/#product-backlog","title":"Product Backlog","text":"

O Product Backlog \u00e9 uma lista de tarefas priorizadas que incluem todas as atividades necess\u00e1rias para concluir um projeto, incluindo requisitos funcionais que agregam valor ao neg\u00f3cio (PEREIRA, 2007). Ou seja, \u00e9 um conjunto de funcionalidades e requisitos que dever\u00e3o ser entregues.

"},{"location":"planejamento/metodologia/#sprints","title":"Sprints","text":"

No Scrum a Sprint \u00e9 uma itera\u00e7\u00e3o que dura de duas a quatro semanas, no qual s\u00e3o desenvolvidos incrementos do produto.

"},{"location":"planejamento/metodologia/#planning","title":"Planning","text":"

A Sprint Planning \u00e9 um rito em que a itera\u00e7\u00e3o \u00e9 planejada, em que ser\u00e1 definido o que ser\u00e1 feito, ou seja, quais itens do backlog ser\u00e3o realizados na sprint .

Neste projeto a reuni\u00e3o de planejamento ocorre a cada duas semanas.

"},{"location":"planejamento/metodologia/#daily-meeting","title":"Daily Meeting","text":"

A Daily \u00e9 uma reuni\u00e3o di\u00e1ria de acompanhamento da equipe com o objetivo de que cada participante relate seu status e poss\u00edveis obst\u00e1culos para a conclus\u00e3o do projeto. Neste projeto a reuni\u00e3o dura em m\u00e9dia quinze minutos.

"},{"location":"planejamento/metodologia/#sprint-review","title":"Sprint Review","text":"

A Sprint Review \u00e9 uma reuni\u00e3o que ocorre no final da sprint em que \u00e9 feita uma revis\u00e3o do que foi feito, tendo uma vis\u00e3o geral de como est\u00e1 o produto

"},{"location":"planejamento/metodologia/#sprint-retrospective","title":"Sprint Retrospective","text":"

A Sprint Retrospective \u00e9 uma reuni\u00e3o realizada no final de uma sprint no contexto da metodologia \u00e1gil, como o Scrum. Nesta reuni\u00e3o, a equipe Scrum se re\u00fane para refletir sobre o processo de trabalho durante a sprint recentemente conclu\u00edda. O principal objetivo da Sprint Retrospective \u00e9 identificar oportunidades de melhoria, discutir o que funcionou bem e o que pode ser aprimorado no pr\u00f3ximo ciclo de desenvolvimento.

"},{"location":"planejamento/metodologia/#xp","title":"XP","text":"

O Extreme Programming (XP) \u00e9 uma metodologia \u00e1gil que nasceu com o intuito de tentar solucionar os problemas que eram causados pelas metodologias tradicionais. O XP tem quatro princ\u00edpios: Comunica\u00e7\u00e3o, Simplicidade, Feedback e Coragem. O XP tem diversos tipos de pr\u00e1ticas, totalizando 12 tipos, entre elas a que ser\u00e3o utilizadas no projeto ser\u00e3o: programa\u00e7\u00e3o em pares, releases curtas, c\u00f3digo coletivo e cliente presente.

"},{"location":"planejamento/metodologia/#programacao-em-pares","title":"Programa\u00e7\u00e3o em pares","text":"

A programa\u00e7\u00e3o em pares ocorre quando dois programadores escrevem o c\u00f3digo juntos em um mesmo computador.

"},{"location":"planejamento/metodologia/#releases-curtas","title":"Releases curtas","text":"

S\u00e3o feitas pequenas releases do software, pequenas vers\u00f5es funcionais, para ser entregue ao cliente antes do prazo.

"},{"location":"planejamento/metodologia/#codigo-coletivo","title":"C\u00f3digo coletivo","text":"

Essa caracter\u00edstica permite que qualquer programador possa alterar o qualquer c\u00f3digo, n\u00e3o precisando de uma autoriza\u00e7\u00e3o de qualquer membro antes disso.

"},{"location":"planejamento/metodologia/#cliente-presente","title":"Cliente presente","text":"

O desenvolvimento do software \u00e9 feito com a presen\u00e7a do cliente, ou seja, ele sempre est\u00e1 em contato com a equipe de desenvolvimento.

"},{"location":"planejamento/metodologia/#kanban","title":"Kanban","text":"

O Kanban \u00e9 um sistema de gest\u00e3o de trabalho, que possui como objetivo a defini\u00e7\u00e3o de um fluxo de trabalho. Al\u00e9m disso tem como foco produtividade e organiza\u00e7\u00e3o das entregas. O kanban \u00e9 mais conhecido devido o uso do quadro kanban, em que o mesmo \u00e9 dividido, normalmente em cinco colunas: backlog, to do, doing, review e done. Na coluna de backlog fica os cards com as atividades que precisam ser feitas para realiza\u00e7\u00e3o do trabalho completo. Na coluna to do ficam os cards que precisam ser feitos durante a spring, quando come\u00e7a a atividade o card \u00e9 movido para coluna de doing, quando terminado vai para coluna de revis\u00e3o e por \u00faltimo quando tudo finalizado vai para done.

"},{"location":"planejamento/metodologia/#pmbok","title":"PMBOK","text":"

O PMBOK (Project Management Body of Knowledge) \u00e9 um guia de boas pr\u00e1ticas em gerenciamento de projetos, desenvolvido pelo PMI (Project Management Institute). Ele oferece um conjunto abrangente de diretrizes e terminologias para o gerenciamento efetivo de projetos em diferentes setores e ind\u00fastrias.

A metodologia do PMBOK se baseia em cinco grupos de processos e dez \u00e1reas de conhecimento. Os cinco grupos de processos s\u00e3o:

  1. Inicia\u00e7\u00e3o: Envolve a defini\u00e7\u00e3o e autoriza\u00e7\u00e3o do projeto ou fase.
  2. Planejamento: Desenvolve o plano do projeto e define os objetivos e as atividades necess\u00e1rias.
  3. Execu\u00e7\u00e3o: Concentra-se na coordena\u00e7\u00e3o de pessoas e recursos para executar o plano do projeto.
  4. Monitoramento e Controle: Acompanha, revisa e regula o progresso e o desempenho do projeto.
  5. Encerramento: Formaliza a aceita\u00e7\u00e3o do projeto e garante a conclus\u00e3o adequada de todas as atividades.
As dez \u00e1reas de conhecimento do PMBOK incluem integra\u00e7\u00e3o, escopo, tempo, custo, qualidade, recursos humanos, comunica\u00e7\u00e3o, riscos, aquisi\u00e7\u00f5es e partes interessadas.

"},{"location":"planejamento/metodologia/#referencias","title":"Refer\u00eancias","text":"

CAROLI, Paulo. Lean inception. S\u00e3o Paulo, BR: Caroli. org, 2017.

CRUZ, F\u00e1bio. Scrum e PMBOK unidos no Gerenciamento de Projetos. Brasport, 2013.

FADEL, Aline Cristine; SILVEIRA, Henrique da Mota.Metodologias \u00e1geis no contexto de desenvolvimento de software: XP, Scrum e Lean.

PEREIRA, Paulo; TORRE\u00c3O, Paula; MAR\u00c7AL, Ana Sofia. Entendendo Scrum para gerenciar projetos de forma \u00e1gil. Mundo PM, v. 1, p. 3-11, 2007.

SOFIA, Bianca; OLIVEIRA, Lorrany. Metodologias do grupo AMIS. Dispon\u00edvel em: https://github.com/fga-eps-mds/2023.1-Amis-Doc/blob/main/docs/organization/methodology.md. Acesso em 09 jul 2022

"},{"location":"planejamento/padroes_da_comunidade/","title":"Padr\u00f5es da comunidade","text":"

Os padr\u00f5es da comunidade do github compreende uma lista b\u00e1sica de documenta\u00e7\u00f5es que auxiliam os contribuidores a participarem do projeto de forma mais uniforme. Esse projeto utiliza os principais guias listados abaixo:

  • Description: Descri\u00e7\u00e3o do reposit\u00f3rio que auxilia na r\u00e1pida identifica\u00e7\u00e3o da fun\u00e7\u00e3o do mesmo.
  • README: Arquivo resumo que funciona como apresenta\u00e7\u00e3o e guia dos pontos chave do projeto, como: \"problema/solu\u00e7\u00e3o\" e instru\u00e7\u00f5es de execu\u00e7\u00e3o do projeto. Confira.
  • Code of Conduct: O c\u00f3digo de conduta \u00e9 um documento que serve como um guia \u00e9tico de comportamento no projeto por parte dos contribuidores.
  • Contribuiting: \u00e9 um guia de contribui\u00e7\u00e3o na vis\u00e3o de desenvolvimento.
  • License: disp\u00f5e da licen\u00e7a de r\u00e9plica e uso do software contido no reposit\u00f3rio.
  • Issue templates: apresenta os padr\u00f5es de montagem das issues
  • Pull request template: apresenta o padr\u00e3o de preenchimento de um pull request ou merge request.
  • Bug reports: apresenta o padr\u00e3o de documento de bug report
  • Labels: As labels s\u00e3o ferramentas de organiza\u00e7\u00e3o e categoriza\u00e7\u00e3o usadas em reposit\u00f3rios para ajudar a gerenciar tarefas, problemas (issues), pull requests (solicita\u00e7\u00f5es de pull) e outras atividades relacionadas ao desenvolvimento de software. Elas s\u00e3o pequenos r\u00f3tulos coloridos que podem ser atribu\u00eddos a itens espec\u00edficos em um reposit\u00f3rio para fornecer informa\u00e7\u00f5es adicionais sobre o status, prioridade, tipo ou qualquer outra caracter\u00edstica relevante do item. Al\u00e9m disso elas servem para agrupar essas diferentes tarefas em grupos, o que facilita a pesquisa de alguma tarefa por meio de uma label.
Vers\u00e3o Data Descri\u00e7\u00e3o Autores 1.0 11/09/2024 Abertura do documento Gustavo Abrantes"},{"location":"planejamento/planoDeCusto/","title":"Plano de Gest\u00e3o de Custos","text":""},{"location":"planejamento/planoDeCusto/#historico-de-versoes","title":"Hist\u00f3rico de vers\u00f5es","text":"Vers\u00e3o Data Modifica\u00e7\u00e3o Autor 1.0 13/07/2024 Cria\u00e7\u00e3o do documento Gustavo Abrantes 1.1 15/07/2024 Adi\u00e7\u00e3o da planilha e do gr\u00e1fico Gustavo Abrantes 1.2 17/07/2024 Corre\u00e7\u00e3o de alguns dados Gustavo Abrantes 1.3 30/07/2024 Atualiza\u00e7\u00e3o da planilha Gustavo Abrantes 1.4 17/08/2024 Nova atualiza\u00e7\u00e3o dos dados da planilha Gustavo Abrantes"},{"location":"planejamento/planoDeCusto/#custos","title":"Custos","text":""},{"location":"planejamento/planoDeCusto/#pessoas","title":"Pessoas","text":"

De acordo com o Jornal da Unesp, cada aluno de uma universidade federal custa em m\u00e9dia R$ 40.900,00 por ano. Como esses dados se referem ao ano de 2015, h\u00e1 a necessidade de corrigir o valor para o ano de 2024 de acordo com a infla\u00e7\u00e3o, que neste per\u00edodo, considerando os \u00faltimos 12 meses, se encontra em 4,23%. Ap\u00f3s aplicar essa corre\u00e7\u00e3o utilizando a calculadora de infla\u00e7\u00e3o do IBGE, o valor passa a ser R$ 61.894,30 por ano, ou R$ 5.157,86 por m\u00eas.

R$ 61.894,30 \u00f7 12 meses \u2248 R$ 5.157,86

Considerando que o curso de Engenharia de Software da Universidade de Bras\u00edlia possui 232 cr\u00e9ditos, em um periodo de 10 semestres, \u00e9 poss\u00edvel chegar no resultado de uma m\u00e9dia de, aproximadamente, 46 cr\u00e9ditos ou 690 horas por ano. Assim, chegamos ao valor de R$ 89,70 por hora para um estudante. Considerando que para cada semana do projeto ser\u00e3o despendidas, aproximadamente, 12,5 horas de foco para a disciplina de EPS/MDS, o valor individual semanal por membro \u00e9 de R$ 1.121,25. Logo, o valor total por semana de 9 membros \u00e9 de R$ 10.091,25

"},{"location":"planejamento/planoDeCusto/#internet","title":"Internet","text":"

Segundo os dados dispon\u00edveis no site Melhor Escolha, o plano de internet mais popular de 250 Mbps, que \u00e9 suficiente para as atividades do projeto, custa R$ 99,90 por m\u00eas, ou R$ 23,07 por semana.

R$ 99,90 \u00f7 4,33 semanas \u2248 R$ 23,07

Como a equipe trabalhar\u00e1 na maior parte do tempo de forma remota e em locais separados, o custo \u00e9 de R$ 23,07 por semana para cada um dos 9 integrantes. Logo, o custo semanal total \u00e9 de R$ 207,63.

"},{"location":"planejamento/planoDeCusto/#energia","title":"Energia","text":"

De acordo com dados da CEMIG, um notebook consome em torno de 7,20 kWh por m\u00eas caso fique ligado durante 8h por dia. Sabendo que cada integrante trabalhar\u00e1 em um equipamento diferente e que o equipamento n\u00e3o dever\u00e1 ser usado mais do que 8h por dia, o consumo estimado ser\u00e1 de 1,66 kWh por semana.\u2074

7,20 kWh por m\u00eas \u00f7 4,33 semanas \u2248 1,66 kWh por semana

Segundo dados dispon\u00edveis no site da Neoenergia, a tarifa vigente no DF durante o per\u00edodo de desenvolvimento do projeto \u00e9 de aproximadamente 0,77. Aplicando essa tarifa de energia, o valor \u00e9 de aproximadamente R$ 1,28 por semana para cada integrante.

1,66 kWh por semana \u00d7 0,77 \u2248 R$ 1,28 por semana

Sendo assim, o custo de internet para os 9 membros \u00e9 de aproximadamente R$ 11,52 por semana.

"},{"location":"planejamento/planoDeCusto/#equipamentos","title":"Equipamentos","text":"

Para o custo dos equipamentos, ser\u00e1 considerado um notebook com processador Intel Core i5, 8 GB de mem\u00f3ria RAM e 256 GB de armazenamento, que \u00e9 capaz de executar as tecnologias utilizadas no projeto. Um notebook com estas especifica\u00e7\u00f5es est\u00e1 custando atualmente aproximadamente cerca de R$ 2.790,00. Sendo um notebook para cada um dos 9 integrantes, o custo total de R$ 25.110,00.

"},{"location":"planejamento/planoDeCusto/#planilha-de-custos","title":"Planilha de custos","text":"

Para melhor detalhado dos custos, foi elaborada uma planilha com os custos totais do MVP e do projeto completo.

"},{"location":"planejamento/planoDeCusto/#graficos","title":"Gr\u00e1ficos","text":"

Foi elaborado um gr\u00e1fico para visualizar a propor\u00e7\u00e3o dos custos totais esperados ao final do desenvolvimento do MVP do projeto.

"},{"location":"planejamento/planoDeCusto/#referencias","title":"Refer\u00eancias","text":"

[1] Jornal da Unesp. Cobran\u00e7a de mensalidade n\u00e3o \u00e9 a solu\u00e7\u00e3o para o financiamento da universidade p\u00fablica. Dispon\u00edvel em: https://jornal.unesp.br/2022/06/08/cobranca-de-mensalidade-nao-e-a-solucao-para-o-financiamento-da-universidade-publica. Acesso em: 13 jul. 2024.

[2] IBGE. O que \u00e9 infla\u00e7\u00e3o. Dispon\u00edvel em: https://www.ibge.gov.br/explica/inflacao.php. Acesso em: 13 jul. 2024.

[3] Melhor Escolha. Internet em Bras\u00edlia. Dispon\u00edvel em: https://melhorescolha.com/internet-banda-larga/brasilia-df. Acesso em: 13 jul. 2024.

[4] Showmetech. Gastando muita energia? Descubra 10 eletr\u00f4nicos vil\u00f5es da conta de luz. Dispon\u00edvel em: https://www.showmetech.com.br/eletronicos-que-mais-consomem-energia. Acesso em: 13 jul. 2024.

[5] Neoenergia. Composi\u00e7\u00e3o Tarif\u00e1ria. Dispon\u00edvel em: https://www.neoenergia.com/web/brasilia/sua-casa/composicao-tarifaria. Acesso em: 13 jul. 2024.

"},{"location":"planejamento/plano_de_comunicacao/","title":"Plano de comunica\u00e7\u00e3o","text":""},{"location":"planejamento/plano_de_comunicacao/#historico-de-versoes","title":"Hist\u00f3rico de vers\u00f5es","text":"Data Vers\u00e3o Descri\u00e7\u00e3o Autor 27/07/2024 1.0 Cria\u00e7\u00e3o do documento Sebastian Zuzunaga"},{"location":"planejamento/plano_de_comunicacao/#introducao","title":"Introdu\u00e7\u00e3o","text":"

O plano de comunica\u00e7\u00e3o nos ajudar\u00e1 a definir aspectos cruciais sobre como os membros do devem interagir. Usando-o \u00e9 definido como as informa\u00e7\u00f5es acerca do projeto devem ser transmitidas e por onde devem ser transmitidas, al\u00e9m do melhor horario de disponibilidade.

Ao longo do semestre, o grupo ter\u00e1 in\u00fameras reuni\u00f5es para desenvolver o projeto. Sabendo disso, mapear os melhores hor\u00e1rios para as reuni\u00f5es \u00e9 crucial. A seguir temos o quadro de disponibilidade que visa o levantamento dos melhores hor\u00e1rios para o agendamento de reuni\u00f5es, levando em considera\u00e7\u00e3o o maior n\u00famero de pessoas livres no hor\u00e1rio.

"},{"location":"planejamento/plano_de_comunicacao/#ferramentas","title":"Ferramentas","text":"Ferramenta Descri\u00e7\u00e3o Discord Comunica\u00e7\u00e3o r\u00e1pida entre o time e reuni\u00f5es do time WhatsApp Comunica\u00e7\u00e3o r\u00e1pida entre o time Teams Reuni\u00f5es com o cliente GitHub Reposit\u00f3rio central para documentos e c\u00f3digo ZenHub Documentar a baseline de requisitos, roadmap, servir como quadro Kanban para o time e atribui\u00e7\u00f5es de tarefas"},{"location":"planejamento/plano_de_comunicacao/#reunioes-pre-agendadas","title":"Reuni\u00f5es pr\u00e9 agendadas","text":"
  • Reuni\u00e3o de planejamento: s\u00e1bado \u00e0s 10h00
  • Reuni\u00e3o com o cliente: quarta-feira \u00e0s 16h00
"},{"location":"planejamento/plano_de_comunicacao/#quadro-de-disponibilidade","title":"Quadro de disponibilidade","text":"

Para o desenvolvimento do Quadro de Disponibilidade, o grupo pegou as informa\u00e7\u00f5es de disponibilidade de cada integrante e compilou os dados na agenda Geral.

"},{"location":"planejamento/plano_de_comunicacao/#quadro-geral","title":"Quadro geral","text":""},{"location":"planejamento/plano_de_comunicacao/#quadro-individual","title":"Quadro individual","text":""},{"location":"planejamento/plano_de_comunicacao/#plano-de-reunioes","title":"Plano de Reuni\u00f5es","text":""},{"location":"planejamento/plano_de_comunicacao/#reuniao-de-planejamento","title":"Reuni\u00e3o de planejamento","text":"

A reuni\u00e3o de planejamento \u00e9 realizada com os integrantes de EPS e MDS, todo s\u00e1bado \u00e0s 10h, seguindo a seguinte estrutura:

  1. Review
  2. Planning
  3. Valida\u00e7\u00e3o das pautas e d\u00favidas para reuni\u00e3o com PO

Durante a planning ocorre o plano de a\u00e7\u00e3o para as tarefas que foram transbordadas(notada durante a review), apresenta\u00e7\u00e3o das novas tasks, divis\u00e3o das atividades e a realiza\u00e7\u00e3o do planning poker para gerar estimativas.

"},{"location":"planejamento/plano_de_comunicacao/#reuniao-com-o-cliente","title":"Reuni\u00e3o com o cliente","text":"

A reuni\u00e3o ocorre semanalmente \u00e0s quartas-feiras com in\u00edcio \u00e0s 16h e dura\u00e7\u00e3o m\u00e9dia de 1 hora sem intervalos. Participam da reuni\u00e3o: toda a equipe de desenvolvimento, o Prof. Hilmer Neri e os membros do Enactus.

A reuni\u00e3o tem como pontap\u00e9 inicial as pautas feitas pelo PO, mais para frente a defini\u00e7\u00e3o das pautas ser\u00e1 gerido pelos membros de EPS que dever\u00e3o encaminhar a pauta da reuni\u00e3o indicando os assuntos e o membro ou membros respons\u00e1veis pela apresenta\u00e7\u00e3o da pauta.

"},{"location":"planejamento/plano_de_ger_riscos/","title":"Plano de Gest\u00e3o de Riscos","text":""},{"location":"planejamento/plano_de_ger_riscos/#historico-de-versoes","title":"Hist\u00f3rico de vers\u00f5es","text":"Vers\u00e3o Data Modifica\u00e7\u00e3o Autor 1.0 27/07/2024 Cria\u00e7\u00e3o do documento Nat\u00e1lia Rodrigues 1.1 24/08/2024 Cria\u00e7\u00e3o da tabela de riscos Nat\u00e1lia Rodrigues"},{"location":"planejamento/plano_de_ger_riscos/#introducao","title":"Introdu\u00e7\u00e3o","text":"

A gest\u00e3o de riscos \u00e9 um componente essencial no desenvolvimento de software, garantindo que os projetos alcancem seus objetivos com sucesso e dentro do prazo previsto. Este plano de gest\u00e3o de riscos tem como objetivo identificar, analisar, priorizar e mitigar os riscos potenciais que podem surgir ao longo do ciclo de vida do desenvolvimento de software. Este documento fornece uma vis\u00e3o geral das estrat\u00e9gias e processos que ser\u00e3o implementados para assegurar que os riscos sejam gerenciados de maneira eficaz, minimizando impactos negativos e promovendo a entrega de um produto de qualidade.

"},{"location":"planejamento/plano_de_ger_riscos/#tipos-de-risco","title":"Tipos de risco","text":"

Os riscos foram divididos nessas seguintes categorias:

  • Externo
  • Gerencial
  • Organizacional
  • T\u00e9cnico

## Defini\u00e7\u00f5es

"},{"location":"planejamento/plano_de_ger_riscos/#probabilidade-e-impacto-dos-riscos","title":"Probabilidade e impacto dos riscos","text":"N\u00edvel Probabilidade Porcentagem de certeza 1 Muito baixa 0% - 19% 2 Baixa 20% - 39% 3 M\u00e9dia 40% - 59% 4 Alta 60% - 79% 5 Muito alta 80% - 100%"},{"location":"planejamento/plano_de_ger_riscos/#impacto","title":"Impacto","text":"N\u00edvel Impacto 1 Muito baixo 2 Baixo 3 M\u00e9dio 4 Alto 5 Muito alto"},{"location":"planejamento/plano_de_ger_riscos/#matriz-de-probablidade-x-impacto","title":"Matriz de probablidade X impacto","text":"Probabilidade / Impacto Muito baixo Baixo M\u00e9dio Alto Muito alto Muito baixa 1 2 3 4 5 Baixa 2 4 6 8 10 M\u00e9dia 3 6 9 12 15 Alta 4 8 12 16 20 Muito alta 5 10 15 20 25"},{"location":"planejamento/plano_de_ger_riscos/#graus-de-risco","title":"Graus de risco","text":"Grau Risco 1 - 5 Baixo 6 - 12 M\u00e9dio 15 - 25 Elevado"},{"location":"planejamento/plano_de_ger_riscos/#levantamento-de-riscos","title":"Levantamento de riscos","text":""},{"location":"planejamento/plano_de_ger_riscos/#tabela-de-riscos","title":"Tabela de Riscos","text":"Risco Descri\u00e7\u00e3o Categoria R01 Dificuldade com as tecnologias definidas T\u00e9cnico R02 Sa\u00edda de algum integrante do projeto Gerencial R03 Falta de participa\u00e7\u00e3o de algum integrante do projeto Gerencial R04 Falta de integra\u00e7\u00e3o da equipe Gerencial R05 Diverg\u00eancia nos hor\u00e1rios dispon\u00edveis dos integrantes Organizacional R06 Altera\u00e7\u00e3o no escopo do projeto Gerencial R07 Integrante com problema de sa\u00fade Externo R08 Indisponibilidade do cliente Externo R09 Falta de disponibiliza\u00e7\u00e3o de releases para o cliente testar Gerencial R10 Falta de participa\u00e7\u00e3o durante as reuni\u00f5es Gerencial R11 Sobrecarga de membros da equipe Gerencial R12 Falha de equipamento Externo R13 Depend\u00eancia entre atividades Organizacional R14 Problemas com a infraestrutura de rede T\u00e9cnico R15 Dificuldade na adapta\u00e7\u00e3o a novas ferramentas T\u00e9cnico"},{"location":"planejamento/plano_de_ger_riscos/#causa-e-consequencia-dos-riscos","title":"Causa e Consequ\u00eancia dos Riscos","text":"Risco Causa Consequ\u00eancia R01 Complexidade ou falta de familiaridade com a tecnologia Atraso no cronograma R02 Motivos pessoais, profissionais ou insatisfa\u00e7\u00e3o Redistribui\u00e7\u00e3o de tarefas, sobrecarga dos membros restantes R03 Falta de compromisso, desmotiva\u00e7\u00e3o Redu\u00e7\u00e3o na produtividade, atraso nas entregas R04 Comunica\u00e7\u00e3o inadequada Conflitos internos, redu\u00e7\u00e3o na qualidade do trabalho R05 Compromissos pessoais e acad\u00eamicos Dificuldade de coordena\u00e7\u00e3o, atraso nas entregas R06 Mudan\u00e7as nos requisitos do cliente Aumento de escopo e atraso R07 Doen\u00e7a ou problemas de sa\u00fade inesperados Atraso nas atividades, prov\u00e1vel sobrecarga para outro membro da equipe R08 Agenda ocupada ou falta de interesse Atraso nas aprova\u00e7\u00f5es e feedback, impacto no cronograma R09 Falta de planejamento, problemas t\u00e9cnicos Dificuldade para identificar e corrigir erros, insatisfa\u00e7\u00e3o do cliente R10 Desinteresse, conflitos de hor\u00e1rios Falta de alinhamento, decis\u00f5es mal informadas R11 Distribui\u00e7\u00e3o inadequada de tarefas, falta de recursos Burnout, redu\u00e7\u00e3o na qualidade do trabalho R12 Equipamentos antigos ou mal mantidos Interrup\u00e7\u00e3o do trabalho, necessidade de reparos ou substitui\u00e7\u00e3o R13 Interdepend\u00eancia de tarefas, m\u00e1 gest\u00e3o de projeto Atrasos em cascata, complica\u00e7\u00f5es na gest\u00e3o do cronograma R14 Rede inst\u00e1vel ou inadequada Interrup\u00e7\u00e3o do trabalho, perda de dados R15 Novas ferramentas complexas, falta de experi\u00eancia Queda na produtividade, erros no trabalho"},{"location":"planejamento/plano_de_ger_riscos/#prevencao-e-solucao-dos-riscos","title":"Preven\u00e7\u00e3o e Solu\u00e7\u00e3o dos Riscos","text":"Risco Preven\u00e7\u00e3o Solu\u00e7\u00e3o R01 Escolha de tecnologias familiares e mais f\u00e1ceis Oferecer materiais de estudo e suporte, se poss\u00edvel R02 Manter uma boa comunica\u00e7\u00e3o e motiva\u00e7\u00e3o Redistribui\u00e7\u00e3o eficiente de tarefas R03 Incentivar o comprometimento, definir responsabilidades claras Reavaliar carga de trabalho, conversa com o integrante R04 Estabelecer canais de comunica\u00e7\u00e3o claros, promover a integra\u00e7\u00e3o Media\u00e7\u00e3o de conflitos R05 Planejar cronograma flex\u00edvel, considerar compromissos individuais Ajustar prazos conforme necess\u00e1rio, redistribuir tarefas temporariamente R06 Manter documenta\u00e7\u00e3o clara e requisitos bem definidos desde o in\u00edcio Reavaliar o escopo, renegociar prazos e or\u00e7amento R07 Incentivar h\u00e1bitos saud\u00e1veis, monitorar a sa\u00fade da equipe Redistribuir tarefas R08 Agendar reuni\u00f5es com anteced\u00eancia, manter cliente engajado Reagendar reuni\u00f5es, buscar alternativas de comunica\u00e7\u00e3o R09 Planejamento adequado, defini\u00e7\u00e3o de um cronograma realista Revis\u00e3o e corre\u00e7\u00e3o de problemas identificados, comunica\u00e7\u00e3o com o cliente R10 Encorajar participa\u00e7\u00e3o, tornar reuni\u00f5es mais eficientes Realinhar equipe, refor\u00e7ar a import\u00e2ncia das reuni\u00f5es R11 Planejamento de recursos adequado, monitoramento constante Redistribui\u00e7\u00e3o de tarefas, contratar ajuda tempor\u00e1ria se necess\u00e1rio R12 Manuten\u00e7\u00e3o regular, atualiza\u00e7\u00e3o de equipamentos Reparos r\u00e1pidos ou avaliar redistribui\u00e7\u00e3o da tarefa R13 Planejamento detalhado, gerenciamento de depend\u00eancias Replanejamento e ajustes, prioriza\u00e7\u00e3o de atividades cr\u00edticas R14 Monitoramento constante Uso de redes alternativas, backup de dados regular R15 Estudo de novas ferramentas Suporte, se poss\u00edvel, e estudo individual"},{"location":"planejamento/plano_de_ger_riscos/#monitoramento-dos-riscos","title":"Monitoramento dos Riscos","text":"

https://unbbr-my.sharepoint.com/:x:/g/personal/221037975_aluno_unb_br/ETrNtLioVAFPqvQIMZY4MXkBTPtbgWebHl4-DM3eDuUHKQ?e=DXB03V

"},{"location":"planejamento/plano_de_ger_riscos/#conclusao","title":"Conclus\u00e3o","text":"

A gest\u00e3o de riscos \u00e9 essencial no desenvolvimento de software para garantir que poss\u00edveis problemas sejam identificados e tratados antes de impactarem significativamente o projeto. Este Plano de Gest\u00e3o de Riscos fornece uma abordagem sistem\u00e1tica para identificar, analisar e mitigar riscos, minimizando incertezas e maximizando as chances de sucesso. Com a categoriza\u00e7\u00e3o detalhada dos riscos, suas causas e consequ\u00eancias, e a elabora\u00e7\u00e3o de estrat\u00e9gias de preven\u00e7\u00e3o e solu\u00e7\u00e3o, o plano assegura que a equipe esteja preparada para enfrentar desafios e realizar entregas com qualidade e dentro do prazo. A revis\u00e3o cont\u00ednua e a participa\u00e7\u00e3o ativa da equipe s\u00e3o fundamentais para adaptar-se a novos riscos e ajustar estrat\u00e9gias conforme necess\u00e1rio, garantindo uma trajet\u00f3ria segura e eficiente rumo \u00e0 entrega de um produto final de alta qualidade.

"},{"location":"planejamento/plano_de_ger_riscos/#referencias","title":"Refer\u00eancias","text":"

Gest\u00e3o de Riscos em Projetos de Software

"},{"location":"planejamento/plano_de_qualidade/","title":"Plano de qualidade","text":""},{"location":"planejamento/plano_de_qualidade/#historico-de-versoes","title":"Hist\u00f3rico de vers\u00f5es","text":"Data Vers\u00e3o Descri\u00e7\u00e3o Autor 25/07/2024 1.0 Cria\u00e7\u00e3o do documento Amanda Nobre"},{"location":"planejamento/plano_de_qualidade/#introducao","title":"Introdu\u00e7\u00e3o","text":"

A qualidade \u00e9 uma pedra angular em qualquer projeto de software. Para garantir que o nosso projeto atenda aos mais altos padr\u00f5es de qualidade, estabelecemos um plano que utiliza tecnologias e pr\u00e1ticas eficazes para aprimorar a qualidade do c\u00f3digo, a robustez da aplica\u00e7\u00e3o e a confiabilidade do software. Neste plano de qualidade, detalharemos como planejamos as m\u00e9tricas e tecnologias de suporte para garantia de qualidade.

"},{"location":"planejamento/plano_de_qualidade/#ferramentas","title":"Ferramentas","text":"Ferramenta Descri\u00e7\u00e3o Sonar Cloud Ferramenta de an\u00e1lise de c\u00f3digo Jest Framework de teste JavaScript"},{"location":"planejamento/plano_de_qualidade/#sonnar-cloud","title":"Sonnar Cloud","text":"

O SonarCloud \u00e9 uma ferramenta de an\u00e1lise de c\u00f3digo est\u00e1tica que fornece insights detalhados sobre a qualidade do c\u00f3digo, destacando problemas, vulnerabilidades e \u00e1reas de melhoria. Para garantir a qualidade do nosso projeto, planejamos integrar o SonarCloud ao processo de desenvolvimento de software.

"},{"location":"planejamento/plano_de_qualidade/#detalhes-do-uso-do-sonarcloud","title":"Detalhes do uso do SonarCloud:","text":"
  • An\u00e1lise de C\u00f3digo Cont\u00ednua: A integra\u00e7\u00e3o cont\u00ednua com o SonarCloud permite que a cada commit, pull request ou build, que ative o trigger definido no reposit\u00f3rio, uma an\u00e1lise de c\u00f3digo est\u00e1tica seja executada automaticamente.

  • Avalia\u00e7\u00e3o de Vulnerabilidades e Bugs: Identifica vulnerabilidades de seguran\u00e7a, bugs e problemas de qualidade no c\u00f3digo.

  • Acompanhamento de M\u00e9tricas de C\u00f3digo: Acompanhamento de m\u00e9tricas essenciais, como a cobertura de c\u00f3digo, a complexidade e a duplica\u00e7\u00e3o de c\u00f3digo, para manter o c\u00f3digo limpo e eficiente.

  • Integra\u00e7\u00e3o com Fluxo de Trabalho de Desenvolvimento: Integraremos o SonarCloud com nossos fluxos de trabalho de desenvolvimento, permitindo a revis\u00e3o e corre\u00e7\u00e3o de problemas de qualidade durante o ciclo de desenvolvimento.

"},{"location":"planejamento/plano_de_qualidade/#jest","title":"Jest","text":"

O Jest \u00e9 um framework de teste JavaScript amplamente utilizado para testar aplica\u00e7\u00f5es front-end e back-end. Planejamos utilizar o Jest para garantir a funcionalidade correta e a integridade do nosso software.

"},{"location":"planejamento/plano_de_qualidade/#detalhes-do-uso-do-jest","title":"Detalhes do uso do Jest:","text":"
  • Testes Unit\u00e1rios e de Integra\u00e7\u00e3o: Criaremos testes unit\u00e1rios e de integra\u00e7\u00e3o utilizando o Jest para avaliar a funcionalidade dos componentes do React no front-end e dos controladores, servi\u00e7os e m\u00f3dulos no back-end Nest.

  • Testes Automatizados: Configuraremos uma su\u00edte de testes automatizados que ser\u00e1 executada em um ambiente de integra\u00e7\u00e3o cont\u00ednua sempre que houver altera\u00e7\u00f5es no c\u00f3digo.

  • Cobertura de Testes: Monitoraremos a cobertura de testes para garantir que a maioria do c\u00f3digo seja testada, identificando \u00e1reas n\u00e3o testadas que requerem aten\u00e7\u00e3o.

  • Testes de Desempenho: Implementaremos testes de desempenho para garantir que o software seja responsivo e eficiente, especialmente em cen\u00e1rios de carga elevada.

"},{"location":"planejamento/plano_de_qualidade/#testes-unitarios","title":"Testes Unitarios","text":"

Os testes unit\u00e1rios s\u00e3o realizados para avaliar o comportamento das menores unidades em uma aplica\u00e7\u00e3o. Isso implica, tecnicamente, examinar o desempenho de entidades individuais, que podem ser representadas por classes em linguagens orientadas a objetos, ou at\u00e9 mesmo m\u00e9todos de classe, no contexto de linguagens orientadas a objetos. Em linguagens de programa\u00e7\u00e3o processuais e funcionais, as menores unidades podem se referir a procedimentos ou fun\u00e7\u00f5es independentes.

"},{"location":"planejamento/plano_de_qualidade/#testes-de-integracao","title":"Testes De Integra\u00e7\u00e3o","text":"

Os testes de integra\u00e7\u00e3o s\u00e3o uma parte essencial do processo de garantia de qualidade de software. Eles t\u00eam como objetivo avaliar como diferentes componentes de um sistema interagem entre si. Em contraste com os testes unit\u00e1rios, que se concentram na avalia\u00e7\u00e3o do comportamento de unidades individuais de c\u00f3digo, os testes de integra\u00e7\u00e3o abordam a funcionalidade do sistema como um todo. Eles s\u00e3o projetados para identificar problemas que podem surgir quando m\u00f3dulos ou componentes independentes s\u00e3o combinados e operam juntos. Os testes de integra\u00e7\u00e3o ajudam a verificar se as partes do sistema se comunicam e colaboram corretamente, garantindo que a aplica\u00e7\u00e3o funcione de maneira harmoniosa e cumpra os requisitos de neg\u00f3cios. Eles desempenham um papel fundamental na identifica\u00e7\u00e3o de poss\u00edveis falhas, inconsist\u00eancias ou incompatibilidades que podem surgir nas interfaces entre os componentes, proporcionando uma vis\u00e3o abrangente da robustez e da integridade do software.

"},{"location":"planejamento/plano_de_qualidade/#testes-e2e","title":"Testes E2E","text":"

Al\u00e9m dos testes unit\u00e1rios e de integra\u00e7\u00e3o, incorporaremos testes E2E (End to end) em Node.js, os testes E2E s para garantir que todo o fluxo de aplica\u00e7\u00e3o, desde a interface do usu\u00e1rio at\u00e9 o banco de dados, funcione de maneira integrada e sem problemas. Usaremos bibliotecas e ferramentas dispon\u00edveis junto ao node para realizar testes E2E. O objetivo dessa ferramenta de teste \u00e9 validar a experi\u00eancia do usu\u00e1rio final e identificar problemas em cen\u00e1rios do mundo real.

"},{"location":"planejamento/plano_de_qualidade/#referencias","title":"Refer\u00eancias","text":"

SONNAR CLOUD, https://www.sonarsource.com/products/sonarcloud/.

JEST, https://jestjs.io/pt-BR/

GeroCuidado 2023.2 https://fga-eps-mds.github.io/2023-2-GEROcuidado-Doc/planejamento/plano_de_qualidade/

"},{"location":"planejamento/quadro_de_conhecimentos/","title":"Quadro de Disponibilidade","text":""},{"location":"planejamento/quadro_de_conhecimentos/#historico-de-versoes","title":"Hist\u00f3rico de vers\u00f5es","text":"Data Vers\u00e3o Descri\u00e7\u00e3o Autor 06/04/2024 1.0 Cria\u00e7\u00e3o do documento Sebastian Zuzunaga 07/04/2024 1.1 Tabela de conhecimento Gustavo Abrantes 27/07/2024 1.2 Tabela de conhecimento Marcella Anderle 27/07/2024 1.3 Tabela de conhecimento Jessica Luiza

O quadro de conhecimento tem a fun\u00e7\u00e3o de monitorar a evolu\u00e7\u00e3o do conhecimento dos integrantes de MDS e MPS com respeito \u00e0s tecnologias utilizadas no projeto, sua implementa\u00e7\u00e3o come\u00e7a na semana 2 e \u00e9 atualizado cada Sprint.

O quadro da semana 2 servir\u00e1 para ver com que tecnologias j\u00e1 est\u00e3o familiarizados os membros do grupo, enquanto os quadros atualizados servir\u00e1 para ver quanto cada membro aprendeu com o trabalho realizado durante o Sprint anterior, os quadros ser\u00e3o atualizados no in\u00edcio de um novo Sprint.

"},{"location":"planejamento/quadro_de_conhecimentos/#quadro-de-conhecimento-geral","title":"Quadro de conhecimento geral","text":"

Quadro de conhecimento do GEROcuidado

"},{"location":"planejamento/quadro_de_conhecimentos/#quadro-de-conhecimento-da-semana-1","title":"Quadro de Conhecimento da Semana 1:","text":""},{"location":"planejamento/quadro_de_conhecimentos/#quadro-de-conhecimento-da-semana-2","title":"Quadro de Conhecimento da Semana 2:","text":""},{"location":"planejamento/quadro_de_conhecimentos/#quadro-de-conhecimento-da-semana-3","title":"Quadro de Conhecimento da Semana 3:","text":""},{"location":"planejamento/quadro_de_conhecimentos/#quadro-de-conhecimento-da-semana-4","title":"Quadro de Conhecimento da Semana 4:","text":""},{"location":"planejamento/quadro_de_conhecimentos/#quadro-de-conhecimento-da-semana-5","title":"Quadro de Conhecimento da Semana 5:","text":""},{"location":"planejamento/quadro_de_conhecimentos/#quadro-de-conhecimento-da-semana-6","title":"Quadro de Conhecimento da Semana 6:","text":""},{"location":"planejamento/quadro_de_conhecimentos/#quadro-de-conhecimento-da-sprint-1","title":"Quadro de Conhecimento da Sprint 1:","text":""},{"location":"planejamento/quadro_de_conhecimentos/#quadro-de-conhecimento-da-sprint-2","title":"Quadro de Conhecimento da Sprint 2:","text":""},{"location":"planejamento/quadro_de_conhecimentos/#quadro-de-conhecimento-da-sprint-3","title":"Quadro de Conhecimento da Sprint 3:","text":""},{"location":"planejamento/quadro_de_conhecimentos/#quadro-de-conhecimento-da-sprint-4","title":"Quadro de Conhecimento da Sprint 4:","text":""},{"location":"planejamento/quadro_de_conhecimentos/#quadro-de-conhecimento-da-sprint-5","title":"Quadro de Conhecimento da Sprint 5:","text":""},{"location":"planejamento/quadro_de_conhecimentos/#quadro-de-conhecimento-da-sprint-6","title":"Quadro de Conhecimento da Sprint 6:","text":""},{"location":"planejamento/quadro_de_conhecimentos/#quadro-de-conhecimento-da-sprint-7","title":"Quadro de Conhecimento da Sprint 7:","text":""},{"location":"planejamento/quadro_de_conhecimentos/#quadro-de-conhecimento-da-sprint-8","title":"Quadro de Conhecimento da Sprint 8:","text":""},{"location":"planejamento/quadro_de_disponibilidade/","title":"Quadro de Disponibilidade","text":""},{"location":"planejamento/quadro_de_disponibilidade/#historico-de-versoes","title":"Hist\u00f3rico de vers\u00f5es","text":"Data Vers\u00e3o Descri\u00e7\u00e3o Autor 01/04/2024 1.0 Cria\u00e7\u00e3o do documento Amanda Nobre"},{"location":"planejamento/quadro_de_disponibilidade/#introducao","title":"Introdu\u00e7\u00e3o","text":"

O quadro de disponibilidade \u00e9 uma ferramenta amplamente utilizada que permite visualizar a disponibilidade dos membros de equipe em um determinado projeto. Aqui inserimos o dia e hor\u00e1rio dispon\u00edvel de cada membro e posteriormente elaboramos um mapa de calor.

"},{"location":"planejamento/quadro_de_disponibilidade/#heatmap","title":"Heatmap","text":"

O heatmap consiste em uma t\u00e9cnica atrav\u00e9s da qual se torna poss\u00edvel a visualiza\u00e7\u00e3o e an\u00e1lise da magnitude de um fen\u00f4meno por meio de cores atribu\u00eddas aos dados coletados.

Para o contexto do projeto, esta t\u00e9cnica foi utilizada com o intuito de atuar como um suporte para uma an\u00e1lise inicial mais eficiente no que diz respeito \u00e0s viabilidades de hor\u00e1rios concernentes \u00e0 rotina dos membros.

O Heatmap da equipe foi feito atrav\u00e9s da m\u00e9dia das disponibilidades de todos os integrantes:

"},{"location":"planejamento/quadro_de_pareamento/","title":"Quadro de pareamento","text":""},{"location":"planejamento/quadro_de_pareamento/#historico-de-versoes","title":"Hist\u00f3rico de vers\u00f5es","text":"Vers\u00e3o Data Descri\u00e7\u00e3o Autores 1.0 26/07/2024 Abertura do documento Jessica Luiza Silva de Oliveira 2.0 08/09/2024 Atualiza\u00e7\u00e3o do Documento Gabriel Santos Monteiro"},{"location":"planejamento/quadro_de_pareamento/#introducao","title":"Introdu\u00e7\u00e3o","text":"

O quadro de pareamento \u00e9 uma t\u00e9cnica de colabora\u00e7\u00e3o no desenvolvimento de software que envolve dois ou mais desenvolvedores trabalhando juntos. Seguindo os padr\u00f5es da mat\u00e9ria e pela escolha do time, foi realizado a escolha dos pareamentos da seguinte forma:

"},{"location":"planejamento/quadro_de_pareamento/#sprint-1","title":"Sprint 1:","text":"
  • 1 EPS e 3 MDS;
  • 1 EPS e 3 MDS;
  • 1 EPS;
"},{"location":"planejamento/quadro_de_pareamento/#sprint-2-ate-o-8","title":"Sprint 2 at\u00e9 o 8:","text":"
  • 3 EPS;
  • 6 MDS;
  • 1 EPS e 6 MDS;
"},{"location":"planejamento/quadro_de_pareamento/#quadro-de-pareamento_1","title":"Quadro de Pareamento","text":""},{"location":"produto/prototipo/prototipo/","title":"Prot\u00f3tipo","text":""},{"location":"produto/prototipo/prototipo/#historico-de-versoes","title":"Hist\u00f3rico de vers\u00f5es","text":"Data Vers\u00e3o Descri\u00e7\u00e3o Autor 27/07/2024 1.0 Cria\u00e7\u00e3o do documento Gabriel Monteiro"},{"location":"produto/prototipo/prototipo/#introducao","title":"Introdu\u00e7\u00e3o","text":"

Na \u00e1rea de desenvolvimento de software, a cria\u00e7\u00e3o de prot\u00f3tipos desempenha um papel fundamental na concep\u00e7\u00e3o e no aprimoramento de sistemas e aplica\u00e7\u00f5es. Um prot\u00f3tipo \u00e9 uma representa\u00e7\u00e3o inicial de um software que permite aos desenvolvedores, designers e partes interessadas visualizarem e interagirem com as funcionalidades e a apar\u00eancia do sistema antes da implementa\u00e7\u00e3o final. Os prot\u00f3tipos s\u00e3o uma ferramenta valiosa para validar conceitos, coletar feedback, identificar requisitos e economizar tempo e recursos no ciclo de desenvolvimento.

No entanto, os prot\u00f3tipos podem ser classificados em duas categorias distintas: prot\u00f3tipos de baixa fidelidade e prot\u00f3tipos de alta fidelidade. A diferen\u00e7a entre esses dois tipos de prot\u00f3tipos reside na profundidade do detalhe e na precis\u00e3o com que representam o sistema final. Prot\u00f3tipos de baixa fidelidade geralmente s\u00e3o simplificados e r\u00e1pidos de criar, enquanto prot\u00f3tipos de alta fidelidade se assemelham mais de perto ao produto final em termos de funcionalidade e apar\u00eancia.

"},{"location":"produto/prototipo/prototipo/#prototipos-do-gerocuidado","title":"Prot\u00f3tipos do GEROcuidado","text":"

A prototipa\u00e7\u00e3o que ocorreu no projeto GEROcuidado, foi um pocuo diferente, de certa forma um caso at\u00edpico, o que ocorreu foi que o cliente, no caso os membros do Enactus, j\u00e1 tinham um prot\u00f3tipo de alta fidelidade desenvolvido, dessa forma muitas das funcionalidades abordadas por eles durante a cria\u00e7\u00e3o da vis\u00e3o do produto j\u00e1 estavam evidenciados no prot\u00f3tipo. Entrentanto, apesar do prot\u00f3tipo trazer essas difer\u00e7as funcionalidades, ele ainda precisava ser complementado, visto que o mesmo n\u00e3o abordava todas as telas necess\u00e1rias para ser ter cada um dos fluxos propostos, dessa forma o time de desenvolvimento, realizou mudan\u00e7as para que o prot\u00f3tipo atendesse ao fluxo funcional das funcionalidades. tendo ent\u00e3o o resultado abaixo:

"},{"location":"produto/prototipo/prototipo/#prototipo-funcional","title":"Prot\u00f3tipo Funcional","text":"

Ao serem criados as telas foi pensado no esquema de prototipar para utiliza\u00e7\u00e3o, logo foi gerado o seguinte resultado

"},{"location":"produto/prototipo/prototipo/#telas-de-prototipo","title":"Telas de Prot\u00f3tipo","text":""},{"location":"produto/prototipo/prototipo/#tutorial","title":"Tutorial","text":""},{"location":"produto/prototipo/prototipo/#tela-inicial","title":"Tela Inicial","text":""},{"location":"produto/prototipo/prototipo/#login","title":"Login","text":""},{"location":"produto/prototipo/prototipo/#cadastrar-perfil-de-usuario","title":"Cadastrar Perfil de Usu\u00e1rio","text":""},{"location":"produto/prototipo/prototipo/#perfil-de-usuario","title":"Perfil de Usu\u00e1rio","text":""},{"location":"produto/prototipo/prototipo/#cadastrar-idoso","title":"Cadastrar Idoso","text":""},{"location":"produto/prototipo/prototipo/#forum","title":"F\u00f3rum","text":""},{"location":"produto/prototipo/prototipo/#editar-publicacao","title":"Editar Publica\u00e7\u00e3o","text":""},{"location":"produto/prototipo/prototipo/#moderacao","title":"Modera\u00e7\u00e3o","text":""},{"location":"produto/prototipo/prototipo/#cadastrar-rotina","title":"Cadastrar Rotina","text":""},{"location":"produto/prototipo/prototipo/#notificacoes","title":"Notifica\u00e7\u00f5es","text":""},{"location":"produto/prototipo/prototipo/#visualizar-rotina","title":"Visualizar Rotina","text":""},{"location":"produto/prototipo/prototipo/#metricas-de-saude","title":"M\u00e9tricas de s\u00e1ude","text":""},{"location":"produto/prototipo/prototipo/#sem-conexao","title":"Sem Conex\u00e3o","text":""},{"location":"semanas/semana_1/resumo_semana_1/","title":"Semana 1","text":"Data Vers\u00e3o Descri\u00e7\u00e3o Autor 22/07/2024 1.0 Cria\u00e7\u00e3o do documento Amanda Nobre"},{"location":"semanas/semana_1/resumo_semana_1/#descricao","title":"Descri\u00e7\u00e3o","text":"

Na primeira semana, ocorreu a divis\u00e3o dos grupos e foi marcada a primeira reuni\u00e3o com o cliente para a pr\u00f3xima semana. O objetivo dessa reuni\u00e3o \u00e9 conhecer melhor o projeto e os integrantes da Enactus.

"},{"location":"semanas/semana_2/reuniao_geral_27_03/","title":"Ata reuni\u00e3o 27/03/2024","text":"Data Vers\u00e3o Descri\u00e7\u00e3o Autor 12/04/2024 1.0 Cria\u00e7\u00e3o do documento Jessica Luiza e Yuri Ezequiel"},{"location":"semanas/semana_2/reuniao_geral_27_03/#pauta","title":"Pauta","text":"
  • Comentando sobre o desenvolvimento do semestre passado com a Enactus;
  • Vis\u00e3o para esse semestre com a equipe de MDS e EPS;
  • Apresenta\u00e7\u00e3o do dos integrantes do time Enactus;
  • O que \u00e9 o time Enactus e o projeto Gerocuidado;
  • Aprenseta\u00e7\u00e3o dos integrantes de EPS/MDS;
Presentes na Reuni\u00e3o Equipe Pertencente Info Amanda Jeniffer Pereira Nobre EPS Presente Ugor Marcilio Brandao Costa EPS Presente Victor Jorge da Silva Gon\u00e7alves EPS Presente Gabriel Santos Monteiro MDS Presente Gustavo Abrantes de Souza MDS Presente Jessica Luiza Silva de Oliveira MDS Presente Marcella Sousa Anderle MDS Presente Natalia Rodrigues de Morais MDS Presente Yuri Ezequiel Lima da Silva MDS Presente Larissa Maria de Almeida Ganoza Enactus Presente Maria Beatriz Lima Nascimento Enactus Presente Pedro Leite Tunholi Enactus Presente Hilmer Rodrigues Neri Professor Presente Dura\u00e7\u00e3o 00:57:18"},{"location":"semanas/semana_3/reuniao_po_03_04/","title":"Ata reuni\u00e3o 03/04/2024","text":"Data Vers\u00e3o Descri\u00e7\u00e3o Autor 12/04/2024 1.0 Cria\u00e7\u00e3o do documento Gabriel Monteiro e Natalia Rodrigues"},{"location":"semanas/semana_3/reuniao_po_03_04/#pauta","title":"Pauta","text":"
  • Vis\u00e3o geral e defini\u00e7\u00e3o do time

  • Vis\u00e3o geral do produto

    Logo no come\u00e7o, foi passado o escopo do projeto por cima, visando sintetizar o que j\u00e1 havia sido definido semestres anteriores, a fun\u00e7\u00e3o do produto e o seu p\u00fablico alvo, de forma mais superficial.

  • Defini\u00e7\u00e3o das fun\u00e7\u00f5es no figma

    Nos primeiros 10 minutos foi atribu\u00eddo no figma o time do projeto e a disponibilidade de cada um, ou seja, quem iria participar em cada etapa do projeto, no qual ficou definido que a equipe de MDS e EPS estariam em todas asa atividades, j\u00e1 a equipe da Enactus estariam apenas no Kickoff e no showcase.

  • Vis\u00e3o detalhada do produto

    Abordado durante os 20 minutos seguintes de reuni\u00e7\u00e3o, foi constru\u00eddo de forma detalhada a ideia do produto, dessa forma, ficou definido o seu p\u00fablico-alvo que s\u00e3o cuidadores formais e familiares, os problemas que o produto possui o fito de solucionar, a defini\u00e7\u00e3o do Gerocuidado como um aplicativo que apoia o gerenciamente e organiza\u00e7\u00e3o dos cuidados aos idosos e o porqu\u00ea o produto \u00e9 essencial e diferente dos demais oferecidos no mercado.

  • A ess\u00eancia do produto

    Discutido em todo o resto da reuni\u00e3o, comp\u00f5e o que o produto deve ou n\u00e3o ser, o que deve ou n\u00e3o fazer. Nessa etapa, foi definido o que o Gerocuidado precisa oferecer ao usu\u00e1rio, como o gerenciamento de atividades di\u00e1ria, a gera\u00e7\u00e3o de relat\u00f3rios de acompanhamento, intera\u00e7\u00e3o entre os diversos cuidadores, o registro das condi\u00e7\u00f5es de sa\u00fade dos idosos, dentre diversas funcionalidades destacadas no Figma.

    Ademais, foi nessa etapa que destacou-se o que \u00e9 essencialmente o Gerocuidado, sendo destacado que \u00e9 um aplicativo gratuito, crss-plataform, leve, mobile e f\u00e1cil de utilizar, o qual merece \u00eanfase a decis\u00e3o tomada que o produto deve ser instal\u00e1vel. Al\u00e9m disso, o produto n\u00e3o \u00e9 um app nativo ou progressive web app, at\u00e9 o momento da reuni\u00e3o, e n\u00e3o \u00e9 uma rede social. Por fim, definiu-se o que o aplicativo n\u00e3o \u00e9 e o que ele n\u00e3o deve fazer, sendo enf\u00e1tico que n\u00e3o h\u00e1 conex\u00e3o dos usu\u00e1rios com m\u00e9dicos, dessa feita, o produto n\u00e3o prescreve medicamentos, n\u00e3o promove o diagn\u00f3stico de exames e n\u00e3o tem uma integra\u00e7\u00e3o f\u00edsica com instrumentos de medica\u00e7\u00e3o.

  • Conclus\u00e3o

    Portanto, nesta reuni\u00e3o foi definido de forma detalhada quem s\u00e3o os membros do projeto e em que fase atuar\u00e3o. Al\u00e9m disso, foi definido o que o produto deve oferecer e para quem deve oferecer, sendo disponibilizado aos cuidadores formais e aos parentes um aplicativo instal\u00e1vel de f\u00e1cil acesso que deve organizar e facilitar os cuidados com a pessoa idosa.

Presentes na Reuni\u00e3o Equipe Pertencente Info Amanda Jeniffer Pereira Nobre EPS Presente Ugor Marc\u00edlio Brand\u00e3o Costa EPS Presente Victor Jorge da Silva Gon\u00e7alves EPS Presente Gabriel Santos Monteiro MDS Presente Gustavo Abrantes de Souza MDS Presente Jessica Luiza Silva de Oliveira MDS Presente Lucas Carminati MDS Presente Marcella Sousa Anderle MDS Ausente Natalia Rodrigues de Morais MDS Presente Sebasti\u00e1n H\u00e9ctor Zuzunaga Rosado MDS Presente Yuri Ezequiel Lima da Silva MDS Ausente Larissa Gonoza Enactus Presente Maria Beatriz Enactus Presente Pedro Leite Enactus Presente Ruth Ferreira Enactus Ausente Hilmer Rodrigues Neri Professor Presente Dura\u00e7\u00e3o 00:54:18"},{"location":"semanas/semana_3/reuniao_po_04_04/","title":"Ata reuni\u00e3o 04/04/2024","text":"Data Vers\u00e3o Descri\u00e7\u00e3o Autor 12/04/2024 1.0 Cria\u00e7\u00e3o do documento Amanda Nobre"},{"location":"semanas/semana_3/reuniao_po_04_04/#pauta","title":"Pauta","text":"
  • Revis\u00e3o dos objetivos do produto.
  • Revis\u00e3o das Personas:
    • Remo\u00e7\u00e3o da persona do idoso autodidata.
    • Adi\u00e7\u00e3o de uma persona de um cuidado homecare.
  • Revis\u00e3o das jornadas:
    • Adi\u00e7\u00e3o da jornada da nova persona.
  • Combinado o envio do figma para o pessoal da Enactus revisar.
  • Alinhamento de que na pr\u00f3xima reuni\u00e3o ocorrer\u00e1 o Brainstorm de funcionalidades.
Presentes na Reuni\u00e3o Equipe Pertencente Info Amanda Jeniffer Pereira Nobre EPS Presente Ugor Marcilio Brandao Costa EPS Presente Victor Jorge da Silva Gon\u00e7alves EPS Presente Gabriel Santos Monteiro MDS Ausente Gustavo Abrantes de Souza MDS Presente Jessica Luiza Silva de Oliveira MDS Ausente Marcella Sousa Anderle MDS Ausente Natalia Rodrigues de Morais MDS Ausente Yuri Ezequiel Lima da Silva MDS Ausente Larissa Maria de Almeida Ganoza Enactus Presente Maria Beatriz Lima Nascimento Enactus Ausente Pedro Leite Tunholi Enactus Presente Hilmer Rodrigues Neri Professor Ausente Dura\u00e7\u00e3o 00:55:36"},{"location":"semanas/semana_4/reuniao_po_10_04/","title":"Ata reuni\u00e3o 10/04/2024","text":"Data Vers\u00e3o Descri\u00e7\u00e3o Autor 20/04/2024 1.0 Cria\u00e7\u00e3o do documento Marcella Anderle"},{"location":"semanas/semana_4/reuniao_po_10_04/#pauta","title":"Pauta","text":"
  • Realiza\u00e7\u00e3o de Brainstorming de Funcionalidades:
  • Vis\u00e3o do produto;
  • Idea\u00e7\u00e3o em equipe como etapa criativa para gerar ideias: Foi cronometrado 10 minutos para que toda a equipe multiprofissional pudesse escrever nos post its;
  • Visualiza\u00e7\u00e3o do que foi e do que ser\u00e1 implementado;

  • Troca de ideias e explica\u00e7\u00e3o individual para o grupo a partir dos post its escritos no quadro:

  • Separa\u00e7\u00e3o das funcionalidades em clusters;
Presentes na Reuni\u00e3o Equipe Pertencente Info Amanda Jeniffer Pereira Nobre EPS Presente Ugor Marcilio Brandao Costa EPS Presente Victor Jorge da Silva Gon\u00e7alves EPS Ausente Gabriel Santos Monteiro MDS Presente Gustavo Abrantes de Souza MDS Presente Marcella Sousa Anderle MDS Presente Natalia Rodrigues de Morais MDS Presente Yuri Ezequiel Lima da Silva MDS Presente Larissa Maria de Almeida Ganoza Enactus Presente Maria Beatriz Lima Nascimento Enactus Presente Pedro Leite Tunholi Enactus Presente Hilmer Rodrigues Neri Professor Presente Dura\u00e7\u00e3o 01:13:47"},{"location":"semanas/semana_5/reuniao_geral_17_07/","title":"Ata reuni\u00e3o 17/07/2024","text":"Data Vers\u00e3o Descri\u00e7\u00e3o Autor 25/07/2024 1.0 Cria\u00e7\u00e3o do documento Gustavo Abrantes"},{"location":"semanas/semana_5/reuniao_geral_17_07/#pauta","title":"Pauta","text":"
  • Backlog do Produto:
    • Neste dia 17/07, foi apresentado ao usu\u00e1rio o backlog do produto.
    • Apresentado as hist\u00f3rias de usu\u00e1rio aos Po's do projeto.
    • Validada algumas hist\u00f3rias de usu\u00e1rio j\u00e1 pra entrega na release 1.
  • Roadmap do projeto:

    • Foi apresentado aos Po's do projeto, a estrutua e din\u00e2mica do zenhub/github, para que os mesmos pudessem acompanhar como estaria o desenvolvimento do projeto.
  • EAP do Projeto:

    • Foi apresentado aos usu\u00e1rios do projeto, o conceito e a ideia geral da Estrutura Anal\u00edtica do Projeto(EAP).
    • A Estrutura Anal\u00edtica de um Projeto \u00e9 um diagrama que organiza o escopo do projeto de forma visual, hier\u00e1rquica e em partes menores, a fim de facilitar o gerenciamento das entregas.
Presentes na Reuni\u00e3o Equipe Pertencente Info Amanda Jeniffer Pereira Nobre EPS Presente Ugor Marcilio Brandao Costa EPS Presente Victor Jorge da Silva Gon\u00e7alves EPS Presente Gabriel Santos Monteiro MDS Ausente Gustavo Abrantes de Souza MDS Presente Jessica Luiza Silva de Oliveira MDS Presente Marcella Sousa Anderle MDS Presente Natalia Rodrigues de Morais MDS Presente Larissa Maria de Almeida Ganoza Enactus Ausente Pedro Leite Tunholi Enactus Presente Hilmer Rodrigues Neri Professor Presente Dura\u00e7\u00e3o 00:58:19"},{"location":"semanas/semana_5/reuniao_geral_19_04/","title":"Ata reuni\u00e3o 24/04/2024","text":"Data Vers\u00e3o Descri\u00e7\u00e3o Autor 19/04/2024 1.0 Cria\u00e7\u00e3o do documento J\u00e9ssica Luiza"},{"location":"semanas/semana_5/reuniao_geral_19_04/#pauta","title":"Pauta","text":"
  • Decis\u00e3o entre aplicativo mobile ou permanecer no web app;

  • Decis\u00e3o de quais funcionalidades s\u00e3o prioridades para migrar pro offiline;

  • Revis\u00e3o t\u00e9cnica, de neg\u00f3cio e UX.

Presentes na Reuni\u00e3o Equipe Pertencente Info Amanda Jeniffer Pereira Nobre EPS Presente Ugor Marcilio Brandao Costa EPS Presente Victor Jorge da Silva Gon\u00e7alves EPS Presente Gabriel Santos Monteiro MDS Ausente Gustavo Abrantes de Souza MDS Presente Jessica Luiza Silva de Oliveira MDS Presente Marcella Sousa Anderle MDS Presente Natalia Rodrigues de Morais MDS Presente Yuri Ezequiel Lima da Silva MDS Presente Larissa Maria de Almeida Ganoza Enactus Ausente Maria Beatriz Lima Nascimento Enactus Ausente Pedro Leite Tunholi Enactus Presente Hilmer Rodrigues Neri Professor Presente Dura\u00e7\u00e3o 00:53:27"},{"location":"semanas/semana_5/reuniao_geral_24_04/","title":"Ata reuni\u00e3o 24/04/2024","text":"Data Vers\u00e3o Descri\u00e7\u00e3o Autor 24/04/2024 1.0 Cria\u00e7\u00e3o do documento Marcella Anderle"},{"location":"semanas/semana_5/reuniao_geral_24_04/#pauta","title":"Pauta","text":"
  • Apresenta\u00e7\u00e3o do Sequenciador;

  • Esclarecimento para a equipe sobre as funcionalidades que permanecer\u00e3o online e as que ser\u00e3o offline;

  • In\u00edcio da defini\u00e7\u00e3o do MVP (Minimum Viable Product), sendo a aprova\u00e7\u00e3o adiada para a pr\u00f3xima reuni\u00e3o.

Presentes na Reuni\u00e3o Equipe Pertencente Info Amanda Jeniffer Pereira Nobre EPS Presente Ugor Marcilio Brandao Costa EPS Presente Victor Jorge da Silva Gon\u00e7alves EPS Ausente Jessica Luiza Silva de Oliveira MDS Presente Sebasti\u00e1n H\u00e9ctor Zuzunaga Rosado MDS Presente Marcella Sousa Anderle MDS Presente Natalia Rodrigues de Morais MDS Presente Yuri Ezequiel Lima da Silva MDS Presente Larissa Maria de Almeida Ganoza Enactus Presente Maria Beatriz Lima Nascimento Enactus Presente Pedro Leite Tunholi Enactus Presente Hilmer Rodrigues Neri Professor Presente Dura\u00e7\u00e3o 00:59:29"},{"location":"semanas/semana_6/reuniao_geral_24_07/","title":"Ata reuni\u00e3o 25/07/2024","text":"Data Vers\u00e3o Descri\u00e7\u00e3o Autor 27/07/2024 1.0 Cria\u00e7\u00e3o do documento Nat\u00e1lia Rodrigues"},{"location":"semanas/semana_6/reuniao_geral_24_07/#pauta","title":"Pauta","text":"
  • Apresenta\u00e7\u00e3o do cronograma para o professor
  • Explica\u00e7\u00e3o da organiza\u00e7\u00e3o da Sprint 1 e a 2
  • Explica\u00e7\u00e3o sobre a sincroniza\u00e7\u00e3o do login do site e do app

  • Valida\u00e7\u00e3o da hist\u00f3ria de usu\u00e1rio de usu\u00e1rio 02 e ajustes dos crit\u00e9rios de aceita\u00e7\u00e3o

  • Discuss\u00e3o sobre a retirada do f\u00f3rum da tela inicial
  • Defini\u00e7\u00e3o do texto livre nos rem\u00e9dios e alimentos
  • Difini\u00e7\u00e3o da adi\u00e7\u00e3o da op\u00e7\u00e3o de editar tarefa

  • Defini\u00e7\u00e3o do hor\u00e1rio da reuni\u00e3o da semana seguinte

Presentes na Reuni\u00e3o Equipe Pertencente Info Amanda Jeniffer Pereira Nobre EPS Presente Ugor Marc\u00edlio Brand\u00e3o Costa EPS Presente Victor Jorge da Silva Gon\u00e7alves EPS Ausente Gabriel Santos Monteiro MDS Presente Jessica Luiza Silva de Oliveira MDS Presente Marcella Sousa Anderle MDS Presente Nat\u00e1lia Rodrigues de Morais MDS Presente Gustavo Abrantes de Souza MDS Presente Sebasti\u00e1n H\u00e9ctor Zuzunaga Rosado MDS Presente Larissa Maria De Almeida Ganoza Enactus Presente Ruth dos Santos Araujo Enactus Presente Pedro Leite Tunholi Enactus Presente Hilmer Rodrigues Neri Professor Presente Dura\u00e7\u00e3o 01:06:40"},{"location":"sprints/sprint_1/planning/","title":"Planning","text":"

TO-DO

"},{"location":"sprints/sprint_1/review/","title":"Review","text":"

TO-DO

"},{"location":"sprints/templates/meeting_doc/","title":"Ata reuni\u00e3o XX/0X/2024","text":"Data Vers\u00e3o Descri\u00e7\u00e3o Autor XX/XX/2024 1.0 Cria\u00e7\u00e3o do documento Nome Sobrenome"},{"location":"sprints/templates/meeting_doc/#pauta","title":"Pauta","text":"
  • T\u00f3pico
  • Subt\u00f3pico 1
  • Subt\u00f3pico 2
  • Subt\u00f3pico 3

  • T\u00f3pico 2

  • T\u00f3pico 3

Presentes na Reuni\u00e3o Equipe Pertencente Info Nome EPS Presente Nome EPS Presente Nome EPS Ausente Nome MDS Presente Nome MDS Presente Nome MDS Presente Nome MDS Presente Nome MDS Presente Nome MDS Presente Nome MDS Presente Nome MDS Presente Nome Enactus Presente Nome Monitor Presente Nome Professor Presente Dura\u00e7\u00e3o XX:XX:XX"},{"location":"sprints/templates/planning_template/","title":"Planejamento Sprint X","text":"Data Vers\u00e3o Descri\u00e7\u00e3o Autor XX/XX/2024 1.0 Cria\u00e7\u00e3o do documento Nome Sobrenome"},{"location":"sprints/templates/planning_template/#visao-geral","title":"Vis\u00e3o Geral","text":"

N\u00famero da Semana: x; Data de In\u00edcio: xx/0x/2024; Data de T\u00e9rmino: xx/0x/2024; Dura\u00e7\u00e3o: 7 dias;

"},{"location":"sprints/templates/planning_template/#objetivos","title":"Objetivos","text":"

A Sprint X tem como objetivos: - Objetivo 1. - Objetivo 2. - Objetivo 3.

"},{"location":"sprints/templates/planning_template/#total-de-pontuacao-planejada","title":"Total de Pontua\u00e7\u00e3o Planejada","text":"
  • XX pontos de issues.
"},{"location":"sprints/templates/planning_template/#backlog-da-semana","title":"Backlog da Semana","text":""},{"location":"sprints/templates/planning_template/#desenvolvimento","title":"Desenvolvimento","text":"

Issue: #TAG - Nome da Issue Respons\u00e1veis: Maria, Joao. Pontua\u00e7\u00e3o: XX

Issue: #TAG - Nome da Issue Respons\u00e1veis: Maria, Joao. Pontua\u00e7\u00e3o: XX

"},{"location":"sprints/templates/planning_template/#documentacao","title":"Documenta\u00e7\u00e3o","text":"

Issue: #TAG - Nome da Issue Respons\u00e1veis: Maria, Joao. Pontua\u00e7\u00e3o: XX

Issue: #TAG - Nome da Issue Respons\u00e1veis: Maria, Joao. Pontua\u00e7\u00e3o: XX

"},{"location":"sprints/templates/review_template/","title":"Review Sprint X","text":"Data Vers\u00e3o Descri\u00e7\u00e3o Autor XX/XX/2024 1.0 Cria\u00e7\u00e3o do documento Nome Sobrenome"},{"location":"sprints/templates/review_template/#visao-geral","title":"Vis\u00e3o Geral","text":"

N\u00famero da Sprint: X; Data de In\u00edcio: XX/0X/2024; Data de T\u00e9rmino: XX/0X/2024; Dura\u00e7\u00e3o: 7 dias;

"},{"location":"sprints/templates/review_template/#sprint-backlog","title":"Sprint Backlog","text":""},{"location":"sprints/templates/review_template/#dividas","title":"D\u00edvidas","text":"

Issue: #TAG - Nome da Issue Respons\u00e1veis: Maria, Joao. Pontua\u00e7\u00e3o: XX

"},{"location":"sprints/templates/review_template/#concluidas","title":"Conclu\u00eddas","text":"

Issue: #TAG - Nome da Issue Respons\u00e1veis: Maria, Joao. Pontua\u00e7\u00e3o: XX

"},{"location":"sprints/templates/review_template/#resultados","title":"Resultados","text":""},{"location":"sprints/templates/review_template/#burndown","title":"Burndown","text":"

imagem

"},{"location":"sprints/templates/review_template/#velocity","title":"Velocity","text":"

imagem

"},{"location":"sprints/templates/review_template/#retrospective","title":"Retrospective","text":""},{"location":"sprints/templates/review_template/#pontos-positivos","title":"Pontos Positivos","text":"
  • a
  • b
  • c
"},{"location":"sprints/templates/review_template/#pontos-negativos","title":"Pontos Negativos","text":"
  • a
  • b
  • c
"}]} \ No newline at end of file diff --git a/semanas/semana_1/resumo_semana_1/index.html b/semanas/semana_1/resumo_semana_1/index.html new file mode 100644 index 0000000..345f96a --- /dev/null +++ b/semanas/semana_1/resumo_semana_1/index.html @@ -0,0 +1,1864 @@ + + + + + + + + + + + + + + + + + + + + + + + Resumo semana 1 - GEROcuidado + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + + + + + + +
+ +
+ + + + +
+
+ + + +
+
+
+ + + + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + +

Semana 1

+ + + + + + + + + + + + + + + + + +
DataVersãoDescriçãoAutor
22/07/20241.0Criação do documentoAmanda Nobre
+

Descrição

+

Na primeira semana, ocorreu a divisão dos grupos e foi marcada a primeira reunião com o cliente para a próxima semana. O objetivo dessa reunião é conhecer melhor o projeto e os integrantes da Enactus.

+ + + + + + +
+
+ + +
+ +
+ + + +
+
+
+
+ + + + + + + + + \ No newline at end of file diff --git a/semanas/semana_2/reuniao_geral_27_03/index.html b/semanas/semana_2/reuniao_geral_27_03/index.html new file mode 100644 index 0000000..9645230 --- /dev/null +++ b/semanas/semana_2/reuniao_geral_27_03/index.html @@ -0,0 +1,1951 @@ + + + + + + + + + + + + + + + + + + + + + + + Reunião Geral 27/03 - GEROcuidado + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + + + + + + +
+ +
+ + + + +
+
+ + + +
+
+
+ + + + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + +

Ata reunião 27/03/2024

+ + + + + + + + + + + + + + + + + +
DataVersãoDescriçãoAutor
12/04/20241.0Criação do documentoJessica Luiza e Yuri Ezequiel
+

Pauta

+
    +
  • Comentando sobre o desenvolvimento do semestre passado com a Enactus;
  • +
  • Visão para esse semestre com a equipe de MDS e EPS;
  • +
  • Apresentação do dos integrantes do time Enactus;
  • +
  • O que é o time Enactus e o projeto Gerocuidado;
  • +
  • Aprensetação dos integrantes de EPS/MDS;
  • +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Presentes na ReuniãoEquipe PertencenteInfo
Amanda Jeniffer Pereira NobreEPSPresente
Ugor Marcilio Brandao CostaEPSPresente
Victor Jorge da Silva GonçalvesEPSPresente
Gabriel Santos MonteiroMDSPresente
Gustavo Abrantes de SouzaMDSPresente
Jessica Luiza Silva de OliveiraMDSPresente
Marcella Sousa AnderleMDSPresente
Natalia Rodrigues de MoraisMDSPresente
Yuri Ezequiel Lima da SilvaMDSPresente
Larissa Maria de Almeida GanozaEnactusPresente
Maria Beatriz Lima NascimentoEnactusPresente
Pedro Leite TunholiEnactusPresente
Hilmer Rodrigues NeriProfessorPresente
Duração00:57:18
+ + + + + + +
+
+ + +
+ +
+ + + +
+
+
+
+ + + + + + + + + \ No newline at end of file diff --git a/semanas/semana_3/reuniao_po_03_04/index.html b/semanas/semana_3/reuniao_po_03_04/index.html new file mode 100644 index 0000000..3e2ef6a --- /dev/null +++ b/semanas/semana_3/reuniao_po_03_04/index.html @@ -0,0 +1,1985 @@ + + + + + + + + + + + + + + + + + + + + + + + Reunião Geral 03/04 - GEROcuidado + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + + + + + + +
+ +
+ + + + +
+
+ + + +
+
+
+ + + + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + +

Ata reunião 03/04/2024

+ + + + + + + + + + + + + + + + + +
DataVersãoDescriçãoAutor
12/04/20241.0Criação do documentoGabriel Monteiro e Natalia Rodrigues
+

Pauta

+
    +
  • +

    Visão geral e definição do time

    +
  • +
  • +

    Visão geral do produto

    +

    Logo no começo, foi passado o escopo do projeto por cima, visando sintetizar o que já havia sido definido semestres anteriores, a função do produto e o seu público alvo, de forma mais superficial.

    +
  • +
  • +

    Definição das funções no figma

    +

    Nos primeiros 10 minutos foi atribuído no figma o time do projeto e a disponibilidade de cada um, ou seja, quem iria participar em cada etapa do projeto, no qual ficou definido que a equipe de MDS e EPS estariam em todas asa atividades, já a equipe da Enactus estariam apenas no Kickoff e no showcase.

    +
  • +
  • +

    Visão detalhada do produto

    +

    Abordado durante os 20 minutos seguintes de reunição, foi construído de forma detalhada a ideia do produto, dessa forma, ficou definido o seu público-alvo que são cuidadores formais e familiares, os problemas que o produto possui o fito de solucionar, a definição do Gerocuidado como um aplicativo que apoia o gerenciamente e organização dos cuidados aos idosos e o porquê o produto é essencial e diferente dos demais oferecidos no mercado.

    +
  • +
  • +

    A essência do produto

    +

    Discutido em todo o resto da reunião, compõe o que o produto deve ou não ser, o que deve ou não fazer. Nessa etapa, foi definido o que o Gerocuidado precisa oferecer ao usuário, como o gerenciamento de atividades diária, a geração de relatórios de acompanhamento, interação entre os diversos cuidadores, o registro das condições de saúde dos idosos, dentre diversas funcionalidades destacadas no Figma.

    +

    Ademais, foi nessa etapa que destacou-se o que é essencialmente o Gerocuidado, sendo destacado que é um aplicativo gratuito, crss-plataform, leve, mobile e fácil de utilizar, o qual merece ênfase a decisão tomada que o produto deve ser instalável. Além disso, o produto não é um app nativo ou progressive web app, até o momento da reunião, e não é uma rede social. Por fim, definiu-se o que o aplicativo não é e o que ele não deve fazer, sendo enfático que não há conexão dos usuários com médicos, dessa feita, o produto não prescreve medicamentos, não promove o diagnóstico de exames e não tem uma integração física com instrumentos de medicação.

    +
  • +
  • +

    Conclusão

    +

    Portanto, nesta reunião foi definido de forma detalhada quem são os membros do projeto e em que fase atuarão. Além disso, foi definido o que o produto deve oferecer e para quem deve oferecer, sendo disponibilizado aos cuidadores formais e aos parentes um aplicativo instalável de fácil acesso que deve organizar e facilitar os cuidados com a pessoa idosa.

    +
  • +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Presentes na ReuniãoEquipe PertencenteInfo
Amanda Jeniffer Pereira NobreEPSPresente
Ugor Marcílio Brandão CostaEPSPresente
Victor Jorge da Silva GonçalvesEPSPresente
Gabriel Santos MonteiroMDSPresente
Gustavo Abrantes de SouzaMDSPresente
Jessica Luiza Silva de OliveiraMDSPresente
Lucas CarminatiMDSPresente
Marcella Sousa AnderleMDSAusente
Natalia Rodrigues de MoraisMDSPresente
Sebastián Héctor Zuzunaga RosadoMDSPresente
Yuri Ezequiel Lima da SilvaMDSAusente
Larissa GonozaEnactusPresente
Maria BeatrizEnactusPresente
Pedro LeiteEnactusPresente
Ruth FerreiraEnactusAusente
Hilmer Rodrigues NeriProfessorPresente
Duração00:54:18
+ + + + + + +
+
+ + +
+ +
+ + + +
+
+
+
+ + + + + + + + + \ No newline at end of file diff --git a/semanas/semana_3/reuniao_po_04_04/index.html b/semanas/semana_3/reuniao_po_04_04/index.html new file mode 100644 index 0000000..45104e4 --- /dev/null +++ b/semanas/semana_3/reuniao_po_04_04/index.html @@ -0,0 +1,1958 @@ + + + + + + + + + + + + + + + + + + + + + + + Reunião Geral 04/04 - GEROcuidado + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + + + + + + +
+ +
+ + + + +
+
+ + + +
+
+
+ + + + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + +

Ata reunião 04/04/2024

+ + + + + + + + + + + + + + + + + +
DataVersãoDescriçãoAutor
12/04/20241.0Criação do documentoAmanda Nobre
+

Pauta

+
    +
  • Revisão dos objetivos do produto.
  • +
  • Revisão das Personas:
      +
    • Remoção da persona do idoso autodidata.
    • +
    • Adição de uma persona de um cuidado homecare.
    • +
    +
  • +
  • Revisão das jornadas:
      +
    • Adição da jornada da nova persona.
    • +
    +
  • +
  • Combinado o envio do figma para o pessoal da Enactus revisar.
  • +
  • Alinhamento de que na próxima reunião ocorrerá o Brainstorm de funcionalidades.
  • +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Presentes na ReuniãoEquipe PertencenteInfo
Amanda Jeniffer Pereira NobreEPSPresente
Ugor Marcilio Brandao CostaEPSPresente
Victor Jorge da Silva GonçalvesEPSPresente
Gabriel Santos MonteiroMDSAusente
Gustavo Abrantes de SouzaMDSPresente
Jessica Luiza Silva de OliveiraMDSAusente
Marcella Sousa AnderleMDSAusente
Natalia Rodrigues de MoraisMDSAusente
Yuri Ezequiel Lima da SilvaMDSAusente
Larissa Maria de Almeida GanozaEnactusPresente
Maria Beatriz Lima NascimentoEnactusAusente
Pedro Leite TunholiEnactusPresente
Hilmer Rodrigues NeriProfessorAusente
Duração00:55:36
+ + + + + + +
+
+ + +
+ +
+ + + +
+
+
+
+ + + + + + + + + \ No newline at end of file diff --git a/semanas/semana_4/reuniao_po_10_04/index.html b/semanas/semana_4/reuniao_po_10_04/index.html new file mode 100644 index 0000000..33ebc3a --- /dev/null +++ b/semanas/semana_4/reuniao_po_10_04/index.html @@ -0,0 +1,1951 @@ + + + + + + + + + + + + + + + + + + + + + + + Reunião Geral 10/04 - GEROcuidado + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + + + + + + +
+ +
+ + + + +
+
+ + + +
+
+
+ + + + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + +

Ata reunião 10/04/2024

+ + + + + + + + + + + + + + + + + +
DataVersãoDescriçãoAutor
20/04/20241.0Criação do documentoMarcella Anderle
+

Pauta

+
    +
  • Realização de Brainstorming de Funcionalidades:
  • +
  • Visão do produto;
  • +
  • Ideação em equipe como etapa criativa para gerar ideias: Foi cronometrado 10 minutos para que toda a equipe multiprofissional pudesse escrever nos post its;
  • +
  • +

    Visualização do que foi e do que será implementado;

    +
  • +
  • +

    Troca de ideias e explicação individual para o grupo a partir dos post its escritos no quadro:

    +
  • +
  • Separação das funcionalidades em clusters;
  • +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Presentes na ReuniãoEquipe PertencenteInfo
Amanda Jeniffer Pereira NobreEPSPresente
Ugor Marcilio Brandao CostaEPSPresente
Victor Jorge da Silva GonçalvesEPSAusente
Gabriel Santos MonteiroMDSPresente
Gustavo Abrantes de SouzaMDSPresente
Marcella Sousa AnderleMDSPresente
Natalia Rodrigues de MoraisMDSPresente
Yuri Ezequiel Lima da SilvaMDSPresente
Larissa Maria de Almeida GanozaEnactusPresente
Maria Beatriz Lima NascimentoEnactusPresente
Pedro Leite TunholiEnactusPresente
Hilmer Rodrigues NeriProfessorPresente
Duração01:13:47
+ + + + + + +
+
+ + +
+ +
+ + + +
+
+
+
+ + + + + + + + + \ No newline at end of file diff --git a/semanas/semana_5/reuniao_geral_17_07/index.html b/semanas/semana_5/reuniao_geral_17_07/index.html new file mode 100644 index 0000000..8f4f0a4 --- /dev/null +++ b/semanas/semana_5/reuniao_geral_17_07/index.html @@ -0,0 +1,1955 @@ + + + + + + + + + + + + + + + + + + + + + + + Reunião Geral 17/07 - GEROcuidado + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + + + + + + +
+ +
+ + + + +
+
+ + + +
+
+
+ + + + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + +

Ata reunião 17/07/2024

+ + + + + + + + + + + + + + + + + +
DataVersãoDescriçãoAutor
25/07/20241.0Criação do documentoGustavo Abrantes
+

Pauta

+
    +
  • Backlog do Produto:
      +
    • Neste dia 17/07, foi apresentado ao usuário o backlog do produto.
    • +
    • Apresentado as histórias de usuário aos Po's do projeto.
    • +
    • Validada algumas histórias de usuário já pra entrega na release 1.
    • +
    +
  • +
  • +

    Roadmap do projeto:

    +
      +
    • Foi apresentado aos Po's do projeto, a estrutua e dinâmica do zenhub/github, para que os mesmos pudessem acompanhar como estaria o desenvolvimento do projeto.
    • +
    +
  • +
  • +

    EAP do Projeto:

    +
      +
    • Foi apresentado aos usuários do projeto, o conceito e a ideia geral da Estrutura Analítica do Projeto(EAP).
    • +
    • A Estrutura Analítica de um Projeto é um diagrama que organiza o escopo do projeto de forma visual, hierárquica e em partes menores, a fim de facilitar o gerenciamento das entregas.
    • +
    +
  • +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Presentes na ReuniãoEquipe PertencenteInfo
Amanda Jeniffer Pereira NobreEPSPresente
Ugor Marcilio Brandao CostaEPSPresente
Victor Jorge da Silva GonçalvesEPSPresente
Gabriel Santos MonteiroMDSAusente
Gustavo Abrantes de SouzaMDSPresente
Jessica Luiza Silva de OliveiraMDSPresente
Marcella Sousa AnderleMDSPresente
Natalia Rodrigues de MoraisMDSPresente
Larissa Maria de Almeida GanozaEnactusAusente
Pedro Leite TunholiEnactusPresente
Hilmer Rodrigues NeriProfessorPresente
Duração00:58:19
+ + + + + + +
+
+ + +
+ +
+ + + +
+
+
+
+ + + + + + + + + \ No newline at end of file diff --git a/semanas/semana_5/reuniao_geral_19_04/index.html b/semanas/semana_5/reuniao_geral_19_04/index.html new file mode 100644 index 0000000..87fb20f --- /dev/null +++ b/semanas/semana_5/reuniao_geral_19_04/index.html @@ -0,0 +1,1955 @@ + + + + + + + + + + + + + + + + + + + + + + + Reunião Geral 19/04 - GEROcuidado + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + + + + + + +
+ +
+ + + + +
+
+ + + +
+
+
+ + + + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + +

Ata reunião 24/04/2024

+ + + + + + + + + + + + + + + + + +
DataVersãoDescriçãoAutor
19/04/20241.0Criação do documentoJéssica Luiza
+

Pauta

+
    +
  • +

    Decisão entre aplicativo mobile ou permanecer no web app;

    +
  • +
  • +

    Decisão de quais funcionalidades são prioridades para migrar pro offiline;

    +
  • +
  • +

    Revisão técnica, de negócio e UX.

    +
  • +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Presentes na ReuniãoEquipe PertencenteInfo
Amanda Jeniffer Pereira NobreEPSPresente
Ugor Marcilio Brandao CostaEPSPresente
Victor Jorge da Silva GonçalvesEPSPresente
Gabriel Santos MonteiroMDSAusente
Gustavo Abrantes de SouzaMDSPresente
Jessica Luiza Silva de OliveiraMDSPresente
Marcella Sousa AnderleMDSPresente
Natalia Rodrigues de MoraisMDSPresente
Yuri Ezequiel Lima da SilvaMDSPresente
Larissa Maria de Almeida GanozaEnactusAusente
Maria Beatriz Lima NascimentoEnactusAusente
Pedro Leite TunholiEnactusPresente
Hilmer Rodrigues NeriProfessorPresente
Duração00:53:27
+ + + + + + +
+
+ + +
+ +
+ + + +
+
+
+
+ + + + + + + + + \ No newline at end of file diff --git a/semanas/semana_5/reuniao_geral_24_04/index.html b/semanas/semana_5/reuniao_geral_24_04/index.html new file mode 100644 index 0000000..4afc15d --- /dev/null +++ b/semanas/semana_5/reuniao_geral_24_04/index.html @@ -0,0 +1,1950 @@ + + + + + + + + + + + + + + + + + + + + + + + Reunião Geral 24/04 - GEROcuidado + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + + + + + + +
+ +
+ + + + +
+
+ + + +
+
+
+ + + + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + +

Ata reunião 24/04/2024

+ + + + + + + + + + + + + + + + + +
DataVersãoDescriçãoAutor
24/04/20241.0Criação do documentoMarcella Anderle
+

Pauta

+
    +
  • +

    Apresentação do Sequenciador;

    +
  • +
  • +

    Esclarecimento para a equipe sobre as funcionalidades que permanecerão online e as que serão offline;

    +
  • +
  • +

    Início da definição do MVP (Minimum Viable Product), sendo a aprovação adiada para a próxima reunião.

    +
  • +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Presentes na ReuniãoEquipe PertencenteInfo
Amanda Jeniffer Pereira NobreEPSPresente
Ugor Marcilio Brandao CostaEPSPresente
Victor Jorge da Silva GonçalvesEPSAusente
Jessica Luiza Silva de OliveiraMDSPresente
Sebastián Héctor Zuzunaga RosadoMDSPresente
Marcella Sousa AnderleMDSPresente
Natalia Rodrigues de MoraisMDSPresente
Yuri Ezequiel Lima da SilvaMDSPresente
Larissa Maria de Almeida GanozaEnactusPresente
Maria Beatriz Lima NascimentoEnactusPresente
Pedro Leite TunholiEnactusPresente
Hilmer Rodrigues NeriProfessorPresente
Duração00:59:29
+ + + + + + +
+
+ + +
+ +
+ + + +
+
+
+
+ + + + + + + + + \ No newline at end of file diff --git a/semanas/semana_6/reuniao_geral_24_07/index.html b/semanas/semana_6/reuniao_geral_24_07/index.html new file mode 100644 index 0000000..6e72dfa --- /dev/null +++ b/semanas/semana_6/reuniao_geral_24_07/index.html @@ -0,0 +1,1962 @@ + + + + + + + + + + + + + + + + + + + + + + + Reunião Geral 24/07 - GEROcuidado + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + + + + + + +
+ +
+ + + + +
+
+ + + +
+
+
+ + + + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + +

Ata reunião 25/07/2024

+ + + + + + + + + + + + + + + + + +
DataVersãoDescriçãoAutor
27/07/20241.0Criação do documentoNatália Rodrigues
+

Pauta

+
    +
  • Apresentação do cronograma para o professor
  • +
  • Explicação da organização da Sprint 1 e a 2
  • +
  • +

    Explicação sobre a sincronização do login do site e do app

    +
  • +
  • +

    Validação da história de usuário de usuário 02 e ajustes dos critérios de aceitação

    +
  • +
  • Discussão sobre a retirada do fórum da tela inicial
  • +
  • Definição do texto livre nos remédios e alimentos
  • +
  • +

    Difinição da adição da opção de editar tarefa

    +
  • +
  • +

    Definição do horário da reunião da semana seguinte

    +
  • +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Presentes na ReuniãoEquipe PertencenteInfo
Amanda Jeniffer Pereira NobreEPSPresente
Ugor Marcílio Brandão CostaEPSPresente
Victor Jorge da Silva GonçalvesEPSAusente
Gabriel Santos MonteiroMDSPresente
Jessica Luiza Silva de OliveiraMDSPresente
Marcella Sousa AnderleMDSPresente
Natália Rodrigues de MoraisMDSPresente
Gustavo Abrantes de SouzaMDSPresente
Sebastián Héctor Zuzunaga RosadoMDSPresente
Larissa Maria De Almeida GanozaEnactusPresente
Ruth dos Santos AraujoEnactusPresente
Pedro Leite TunholiEnactusPresente
Hilmer Rodrigues NeriProfessorPresente
Duração01:06:40
+ + + + + + +
+
+ + +
+ +
+ + + +
+
+
+
+ + + + + + + + + \ No newline at end of file diff --git a/sitemap.xml b/sitemap.xml new file mode 100644 index 0000000..0f8724e --- /dev/null +++ b/sitemap.xml @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/sitemap.xml.gz b/sitemap.xml.gz new file mode 100644 index 0000000..b5ecc0a Binary files /dev/null and b/sitemap.xml.gz differ diff --git a/sprints/sprint_1/planning/index.html b/sprints/sprint_1/planning/index.html new file mode 100644 index 0000000..ecaac1d --- /dev/null +++ b/sprints/sprint_1/planning/index.html @@ -0,0 +1,1785 @@ + + + + + + + + + + + + + + + + + + + + + + + Planning - GEROcuidado + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+ +
+ + + + + + +
+ + + + + + + +
+ +
+ + + + +
+
+ + + +
+
+
+ + + + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + +

Planning

+ +

TO-DO

+ + + + + + +
+
+ + +
+ +
+ + + +
+
+
+
+ + + + + + + + + \ No newline at end of file diff --git a/sprints/sprint_1/review/index.html b/sprints/sprint_1/review/index.html new file mode 100644 index 0000000..0385934 --- /dev/null +++ b/sprints/sprint_1/review/index.html @@ -0,0 +1,1785 @@ + + + + + + + + + + + + + + + + + + + + + + + Review - GEROcuidado + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+ +
+ + + + + + +
+ + + + + + + +
+ +
+ + + + +
+
+ + + +
+
+
+ + + + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + +

Review

+ +

TO-DO

+ + + + + + +
+
+ + +
+ +
+ + + +
+
+
+
+ + + + + + + + + \ No newline at end of file diff --git a/sprints/templates/meeting_doc/index.html b/sprints/templates/meeting_doc/index.html new file mode 100644 index 0000000..2c7409f --- /dev/null +++ b/sprints/templates/meeting_doc/index.html @@ -0,0 +1,1908 @@ + + + + + + + + + + + + + + + + + + + Ata reunião XX/0X/2024 - GEROcuidado + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + + + + + + +
+ +
+ + + + +
+
+ + + +
+
+
+ + + + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + +

Ata reunião XX/0X/2024

+ + + + + + + + + + + + + + + + + +
DataVersãoDescriçãoAutor
XX/XX/20241.0Criação do documentoNome Sobrenome
+

Pauta

+
    +
  • Tópico
  • +
  • Subtópico 1
  • +
  • Subtópico 2
  • +
  • +

    Subtópico 3

    +
  • +
  • +

    Tópico 2

    +
  • +
  • +

    Tópico 3

    +
  • +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Presentes na ReuniãoEquipe PertencenteInfo
NomeEPSPresente
NomeEPSPresente
NomeEPSAusente
NomeMDSPresente
NomeMDSPresente
NomeMDSPresente
NomeMDSPresente
NomeMDSPresente
NomeMDSPresente
NomeMDSPresente
NomeMDSPresente
NomeEnactusPresente
NomeMonitorPresente
NomeProfessorPresente
DuraçãoXX:XX:XX
+ + + + + + +
+
+ + +
+ +
+ + + +
+
+
+
+ + + + + + + + + \ No newline at end of file diff --git a/sprints/templates/planning_template/index.html b/sprints/templates/planning_template/index.html new file mode 100644 index 0000000..6c69403 --- /dev/null +++ b/sprints/templates/planning_template/index.html @@ -0,0 +1,1883 @@ + + + + + + + + + + + + + + + + + + + Planejamento Sprint X - GEROcuidado + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + + + + + + +
+ +
+ + + + +
+
+ + + +
+
+
+ + + + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + +

Planejamento Sprint X

+ + + + + + + + + + + + + + + + + +
DataVersãoDescriçãoAutor
XX/XX/20241.0Criação do documentoNome Sobrenome
+

Visão Geral

+

Número da Semana: x; +Data de Início: xx/0x/2024; +Data de Término: xx/0x/2024; +Duração: 7 dias;

+

Objetivos

+

A Sprint X tem como objetivos: +- Objetivo 1. +- Objetivo 2. +- Objetivo 3.

+

Total de Pontuação Planejada

+
    +
  • XX pontos de issues.
  • +
+

Backlog da Semana

+

Desenvolvimento

+

Issue: #TAG - Nome da Issue +Responsáveis: Maria, Joao. +Pontuação: XX

+

Issue: #TAG - Nome da Issue +Responsáveis: Maria, Joao. +Pontuação: XX

+

Documentação

+

Issue: #TAG - Nome da Issue +Responsáveis: Maria, Joao. +Pontuação: XX

+

Issue: #TAG - Nome da Issue +Responsáveis: Maria, Joao. +Pontuação: XX

+ + + + + + +
+
+ + +
+ +
+ + + +
+
+
+
+ + + + + + + + + \ No newline at end of file diff --git a/sprints/templates/review_template/index.html b/sprints/templates/review_template/index.html new file mode 100644 index 0000000..5f41b6a --- /dev/null +++ b/sprints/templates/review_template/index.html @@ -0,0 +1,1920 @@ + + + + + + + + + + + + + + + + + + + Review Sprint X - GEROcuidado + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + + + + + + +
+ +
+ + + + +
+
+ + + +
+
+
+ + + + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + +

Review Sprint X

+ + + + + + + + + + + + + + + + + +
DataVersãoDescriçãoAutor
XX/XX/20241.0Criação do documentoNome Sobrenome
+

Visão Geral

+

Número da Sprint: X; +Data de Início: XX/0X/2024; +Data de Término: XX/0X/2024; +Duração: 7 dias;

+

Sprint Backlog

+

Dívidas

+

Issue: #TAG - Nome da Issue +Responsáveis: Maria, Joao. +Pontuação: XX

+

Concluídas

+

Issue: #TAG - Nome da Issue +Responsáveis: Maria, Joao. +Pontuação: XX

+

Resultados

+

Burndown

+

imagem

+

Velocity

+

imagem

+

Retrospective

+

Pontos Positivos

+
    +
  • a
  • +
  • b
  • +
  • c
  • +
+

Pontos Negativos

+
    +
  • a
  • +
  • b
  • +
  • c
  • +
+ + + + + + +
+
+ + +
+ +
+ + + +
+
+
+
+ + + + + + + + + \ No newline at end of file diff --git a/stylesheets/styles.css b/stylesheets/styles.css new file mode 100644 index 0000000..e69de29