From 3b3c74ecc8640b85b9d096a191aef9e8ca98ef70 Mon Sep 17 00:00:00 2001 From: <> Date: Tue, 14 Jan 2025 00:50:13 +0000 Subject: [PATCH] Deployed 5575a8f with MkDocs version: 1.6.1 --- .nojekyll | 0 404.html | 548 ++ DML_DDL/index.html | 783 ++ apresentacao/modulo1/index.html | 666 ++ assets/images/capa.jpeg | Bin 0 -> 16394 bytes assets/images/der.png | Bin 0 -> 217383 bytes assets/images/favicon.png | Bin 0 -> 1870 bytes assets/images/logo1.png | Bin 0 -> 12575 bytes assets/javascripts/bundle.88dd0f4e.min.js | 16 + assets/javascripts/bundle.88dd0f4e.min.js.map | 7 + assets/javascripts/lunr/min/lunr.ar.min.js | 1 + assets/javascripts/lunr/min/lunr.da.min.js | 18 + assets/javascripts/lunr/min/lunr.de.min.js | 18 + assets/javascripts/lunr/min/lunr.du.min.js | 18 + assets/javascripts/lunr/min/lunr.el.min.js | 1 + assets/javascripts/lunr/min/lunr.es.min.js | 18 + assets/javascripts/lunr/min/lunr.fi.min.js | 18 + assets/javascripts/lunr/min/lunr.fr.min.js | 18 + assets/javascripts/lunr/min/lunr.he.min.js | 1 + assets/javascripts/lunr/min/lunr.hi.min.js | 1 + assets/javascripts/lunr/min/lunr.hu.min.js | 18 + assets/javascripts/lunr/min/lunr.hy.min.js | 1 + assets/javascripts/lunr/min/lunr.it.min.js | 18 + assets/javascripts/lunr/min/lunr.ja.min.js | 1 + assets/javascripts/lunr/min/lunr.jp.min.js | 1 + assets/javascripts/lunr/min/lunr.kn.min.js | 1 + assets/javascripts/lunr/min/lunr.ko.min.js | 1 + assets/javascripts/lunr/min/lunr.multi.min.js | 1 + assets/javascripts/lunr/min/lunr.nl.min.js | 18 + assets/javascripts/lunr/min/lunr.no.min.js | 18 + assets/javascripts/lunr/min/lunr.pt.min.js | 18 + assets/javascripts/lunr/min/lunr.ro.min.js | 18 + assets/javascripts/lunr/min/lunr.ru.min.js | 18 + assets/javascripts/lunr/min/lunr.sa.min.js | 1 + .../lunr/min/lunr.stemmer.support.min.js | 1 + assets/javascripts/lunr/min/lunr.sv.min.js | 18 + assets/javascripts/lunr/min/lunr.ta.min.js | 1 + assets/javascripts/lunr/min/lunr.te.min.js | 1 + assets/javascripts/lunr/min/lunr.th.min.js | 1 + assets/javascripts/lunr/min/lunr.tr.min.js | 18 + assets/javascripts/lunr/min/lunr.vi.min.js | 1 + assets/javascripts/lunr/min/lunr.zh.min.js | 1 + assets/javascripts/lunr/tinyseg.js | 206 + assets/javascripts/lunr/wordcut.js | 6708 +++++++++++++++++ .../workers/search.6ce7567c.min.js | 42 + .../workers/search.6ce7567c.min.js.map | 7 + assets/stylesheets/main.6f8fc17f.min.css | 1 + assets/stylesheets/main.6f8fc17f.min.css.map | 1 + assets/stylesheets/palette.06af60db.min.css | 1 + .../stylesheets/palette.06af60db.min.css.map | 1 + index.html | 738 ++ modulo01/der/index.html | 809 ++ modulo01/dicionario/index.html | 3665 +++++++++ modulo01/mer/index.html | 1915 +++++ modulo01/ml/index.html | 806 ++ modulo02/DDL/index.html | 1227 +++ modulo02/DML/index.html | 842 +++ modulo02/DQL/index.html | 708 ++ search/search_index.json | 1 + sitemap.xml | 3 + sitemap.xml.gz | Bin 0 -> 127 bytes 61 files changed, 19988 insertions(+) create mode 100644 .nojekyll create mode 100644 404.html create mode 100644 DML_DDL/index.html create mode 100644 apresentacao/modulo1/index.html create mode 100644 assets/images/capa.jpeg create mode 100644 assets/images/der.png create mode 100644 assets/images/favicon.png create mode 100644 assets/images/logo1.png create mode 100644 assets/javascripts/bundle.88dd0f4e.min.js create mode 100644 assets/javascripts/bundle.88dd0f4e.min.js.map create mode 100644 assets/javascripts/lunr/min/lunr.ar.min.js create mode 100644 assets/javascripts/lunr/min/lunr.da.min.js create mode 100644 assets/javascripts/lunr/min/lunr.de.min.js create mode 100644 assets/javascripts/lunr/min/lunr.du.min.js create mode 100644 assets/javascripts/lunr/min/lunr.el.min.js create mode 100644 assets/javascripts/lunr/min/lunr.es.min.js create mode 100644 assets/javascripts/lunr/min/lunr.fi.min.js create mode 100644 assets/javascripts/lunr/min/lunr.fr.min.js create mode 100644 assets/javascripts/lunr/min/lunr.he.min.js create mode 100644 assets/javascripts/lunr/min/lunr.hi.min.js create mode 100644 assets/javascripts/lunr/min/lunr.hu.min.js create mode 100644 assets/javascripts/lunr/min/lunr.hy.min.js create mode 100644 assets/javascripts/lunr/min/lunr.it.min.js create mode 100644 assets/javascripts/lunr/min/lunr.ja.min.js create mode 100644 assets/javascripts/lunr/min/lunr.jp.min.js create mode 100644 assets/javascripts/lunr/min/lunr.kn.min.js create mode 100644 assets/javascripts/lunr/min/lunr.ko.min.js create mode 100644 assets/javascripts/lunr/min/lunr.multi.min.js create mode 100644 assets/javascripts/lunr/min/lunr.nl.min.js create mode 100644 assets/javascripts/lunr/min/lunr.no.min.js create mode 100644 assets/javascripts/lunr/min/lunr.pt.min.js create mode 100644 assets/javascripts/lunr/min/lunr.ro.min.js create mode 100644 assets/javascripts/lunr/min/lunr.ru.min.js create mode 100644 assets/javascripts/lunr/min/lunr.sa.min.js create mode 100644 assets/javascripts/lunr/min/lunr.stemmer.support.min.js create mode 100644 assets/javascripts/lunr/min/lunr.sv.min.js create mode 100644 assets/javascripts/lunr/min/lunr.ta.min.js create mode 100644 assets/javascripts/lunr/min/lunr.te.min.js create mode 100644 assets/javascripts/lunr/min/lunr.th.min.js create mode 100644 assets/javascripts/lunr/min/lunr.tr.min.js create mode 100644 assets/javascripts/lunr/min/lunr.vi.min.js create mode 100644 assets/javascripts/lunr/min/lunr.zh.min.js create mode 100644 assets/javascripts/lunr/tinyseg.js create mode 100644 assets/javascripts/lunr/wordcut.js create mode 100644 assets/javascripts/workers/search.6ce7567c.min.js create mode 100644 assets/javascripts/workers/search.6ce7567c.min.js.map create mode 100644 assets/stylesheets/main.6f8fc17f.min.css create mode 100644 assets/stylesheets/main.6f8fc17f.min.css.map create mode 100644 assets/stylesheets/palette.06af60db.min.css create mode 100644 assets/stylesheets/palette.06af60db.min.css.map create mode 100644 index.html create mode 100644 modulo01/der/index.html create mode 100644 modulo01/dicionario/index.html create mode 100644 modulo01/mer/index.html create mode 100644 modulo01/ml/index.html create mode 100644 modulo02/DDL/index.html create mode 100644 modulo02/DML/index.html create mode 100644 modulo02/DQL/index.html create mode 100644 search/search_index.json create mode 100644 sitemap.xml create mode 100644 sitemap.xml.gz 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..9d0ef67 --- /dev/null +++ b/404.html @@ -0,0 +1,548 @@ + + + + + + + + + + + + + + + + + + + Cavaleiros do Zodiaco + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+ +
+ + + + + + + + +
+ + + + + + + +
+ +
+ + + + +
+
+ + + +
+
+
+ + + + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ +

404 - Not found

+ +
+
+ + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/DML_DDL/index.html b/DML_DDL/index.html new file mode 100644 index 0000000..2203bb0 --- /dev/null +++ b/DML_DDL/index.html @@ -0,0 +1,783 @@ + + + + + + + + + + + + + + + + + + + DML DDL - Cavaleiros do Zodiaco + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + Pular para conteúdo + + +
+
+ +
+ + + + + + + + +
+ + + + + + + +
+ +
+ + + + +
+
+ + + +
+
+
+ + + + + + + +
+
+
+ + + + + + + +
+
+ + + + + + + +

Introdução

+

Este projeto utiliza um banco de dados relacional para gerenciar informações dos NPCs (personagens não jogáveis), missões e salas dentro do jogo. A estrutura foi desenvolvida utilizando comandos SQL, com o uso de DDL (Data Definition Language) para criar e alterar tabelas e DML (Data Manipulation Language) para manipulação dos dados.

+

O objetivo desta documentação é detalhar como o banco foi estruturado e apresentar exemplos práticos de DDL e DML.

+
+

Estrutura do Banco de Dados

+

Principais Tabelas

+
    +
  1. Npc_Ferreiro:
  2. +
  3. Gerencia informações sobre ferreiros no jogo.
  4. +
  5. +

    Contém colunas como:

    +
      +
    • id_npc_ferreiro: Identificador único.
    • +
    • id_sala: Relaciona a sala onde o ferreiro está localizado.
    • +
    • Campos descritivos como nome, descricao e diálogos (ex.: dialogo_inicial).
    • +
    +
  6. +
  7. +

    Npc_Quest:

    +
  8. +
  9. Armazena informações sobre NPCs que oferecem missões.
  10. +
  11. +

    Principais colunas:

    +
      +
    • id_npc_quest: Identificador único.
    • +
    • id_sala: Relaciona a sala onde o NPC está localizado.
    • +
    • nome e descricao do NPC.
    • +
    +
  12. +
  13. +

    Npc_Mercador:

    +
  14. +
  15. Contém dados sobre mercadores no jogo.
  16. +
  17. Principais colunas:
      +
    • id_npc_mercador: Identificador único.
    • +
    • id_sala: Relaciona a sala onde o mercador está.
    • +
    • Campos como dialogo_comprar, dialogo_vender e dialogo_sair.
    • +
    +
  18. +
+

Diagrama de Relacionamento

+

Figura 1 - DER

+ + +
+

Comandos DDL (Data Definition Language)

+

Criação de Tabelas

+

Abaixo está um exemplo de como a tabela Npc_Ferreiro foi criada:

+
CREATE TABLE Npc_Ferreiro (
+    id_npc_ferreiro INTEGER PRIMARY KEY,
+    id_sala INTEGER NOT NULL,
+    id_missao_desbloqueia INTEGER NOT NULL,
+    nome VARCHAR NOT NULL,
+    descricao VARCHAR,
+    dialogo_inicial VARCHAR,
+    dialogo_reparar VARCHAR,
+    dialogo_upgrade VARCHAR
+);
+
+

Alteração de tabelas

+
-- Adiciona uma chave estrangeira que conecta Npc_Ferreiro à tabela Sala
+ALTER TABLE Npc_Ferreiro ADD CONSTRAINT FK_Npc_Ferreiro_2
+    FOREIGN KEY (id_sala)
+    REFERENCES Sala (id_sala);
+
+-- Adiciona uma chave estrangeira que conecta Npc_Ferreiro à tabela Missao
+ALTER TABLE Npc_Ferreiro ADD CONSTRAINT FK_Npc_Ferreiro_3
+    FOREIGN KEY (id_missao_desbloqueia)
+    REFERENCES Missao (id_missao);
+
+

Comandos DML (Data Mnaipulation Language)

+

Inseção de dados

+

Abaixo, um exemplo de inserção de dados na tabela Npc_Ferreiro:

+
INSERT INTO Npc_Ferreiro (id_npc_ferreiro, id_sala, id_missao_desbloqueia, nome, descricao)
+VALUES (1, 2, 3, 'Ferreiro João', 'Especialista em armas pesadas');
+
+

Consulta, Arualização e Exclusao de dados

+

Abaixo seguem exemplos dessas três operações.

+
SELECT * FROM Npc_Ferreiro;
+SELECT * FROM Npc_Ferreiro;
+UPDATE Npc_Ferreiro
+SET descricao = 'Especialista em armaduras'
+WHERE id_npc_ferreiro = 1;
+DELETE FROM Npc_Ferreiro
+WHERE id_npc_ferreiro = 1;
+
+ + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/apresentacao/modulo1/index.html b/apresentacao/modulo1/index.html new file mode 100644 index 0000000..e88b7ec --- /dev/null +++ b/apresentacao/modulo1/index.html @@ -0,0 +1,666 @@ + + + + + + + + + + + + + + + + + + + + + Apresentação - Cavaleiros do Zodiaco + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + Pular para conteúdo + + +
+
+ +
+ + + + + + + + +
+ + + + + + + +
+ +
+ + + + +
+
+ + + +
+
+
+ + + + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + +

Apresentação

+ +

Introdução

+

O objetivo dessa pagina é mostrar o vídeo da apresentação da entrega do Módulo 1 do projeto, que consiste em Modelo Entidade-Relacionamento (MER), Diagrama Entidade Relacionamento (DER) e Dicionário de Dados.

+

Vídeo da apresentação

+

No vídeo 1 abaixo segue o vídeo da nossa apresentação do módulo 1, ou acesse clicando aqui

+

+

Vídeo 1 - Apresentação do módulo 1

+ + +

Fonte: Pedro Lucas

+

+ + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/assets/images/capa.jpeg b/assets/images/capa.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..60c49cf3243cc9ed2be6cc50ad13c0e59b318c9f GIT binary patch literal 16394 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 literal 0 HcmV?d00001 diff --git a/assets/images/der.png b/assets/images/der.png new file mode 100644 index 0000000000000000000000000000000000000000..cb62d8be152e75a4fb57d395e11710160824daaa GIT binary patch literal 217383 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

Z)DHyTF~E)N!tbKS#{<+airM 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 literal 0 HcmV?d00001 diff --git a/assets/images/favicon.png b/assets/images/favicon.png new file mode 100644 index 0000000000000000000000000000000000000000..1cf13b9f9d978896599290a74f77d5dbe7d1655c GIT binary patch literal 1870 zcmV-U2eJ5xP)Gc)JR9QMau)O=X#!i9;T z37kk-upj^(fsR36MHs_+1RCI)NNu9}lD0S{B^g8PN?Ww(5|~L#Ng*g{WsqleV}|#l zz8@ri&cTzw_h33bHI+12+kK6WN$h#n5cD8OQt`5kw6p~9H3()bUQ8OS4Q4HTQ=1Ol z_JAocz`fLbT2^{`8n~UAo=#AUOf=SOq4pYkt;XbC&f#7lb$*7=$na!mWCQ`dBQsO0 zLFBSPj*N?#u5&pf2t4XjEGH|=pPQ8xh7tpx;US5Cx_Ju;!O`ya-yF`)b%TEt5>eP1ZX~}sjjA%FJF?h7cX8=b!DZl<6%Cv z*G0uvvU+vmnpLZ2paivG-(cd*y3$hCIcsZcYOGh{$&)A6*XX&kXZd3G8m)G$Zz-LV z^GF3VAW^Mdv!)4OM8EgqRiz~*Cji;uzl2uC9^=8I84vNp;ltJ|q-*uQwGp2ma6cY7 z;`%`!9UXO@fr&Ebapfs34OmS9^u6$)bJxrucutf>`dKPKT%%*d3XlFVKunp9 zasduxjrjs>f8V=D|J=XNZp;_Zy^WgQ$9WDjgY=z@stwiEBm9u5*|34&1Na8BMjjgf3+SHcr`5~>oz1Y?SW^=K z^bTyO6>Gar#P_W2gEMwq)ot3; zREHn~U&Dp0l6YT0&k-wLwYjb?5zGK`W6S2v+K>AM(95m2C20L|3m~rN8dprPr@t)5lsk9Hu*W z?pS990s;Ez=+Rj{x7p``4>+c0G5^pYnB1^!TL=(?HLHZ+HicG{~4F1d^5Awl_2!1jICM-!9eoLhbbT^;yHcefyTAaqRcY zmuctDopPT!%k+}x%lZRKnzykr2}}XfG_ne?nRQO~?%hkzo;@RN{P6o`&mMUWBYMTe z6i8ChtjX&gXl`nvrU>jah)2iNM%JdjqoaeaU%yVn!^70x-flljp6Q5tK}5}&X8&&G zX3fpb3E(!rH=zVI_9Gjl45w@{(ITqngWFe7@9{mX;tO25Z_8 zQHEpI+FkTU#4xu>RkN>b3Tnc3UpWzPXWm#o55GKF09j^Mh~)K7{QqbO_~(@CVq! zS<8954|P8mXN2MRs86xZ&Q4EfM@JB94b=(YGuk)s&^jiSF=t3*oNK3`rD{H`yQ?d; ztE=laAUoZx5?RC8*WKOj`%LXEkgDd>&^Q4M^z`%u0rg-It=hLCVsq!Z%^6eB-OvOT zFZ28TN&cRmgU}Elrnk43)!>Z1FCPL2K$7}gwzIc48NX}#!A1BpJP?#v5wkNprhV** z?Cpalt1oH&{r!o3eSKc&ap)iz2BTn_VV`4>9M^b3;(YY}4>#ML6{~(4mH+?%07*qo IM6N<$f(jP3KmY&$ literal 0 HcmV?d00001 diff --git a/assets/images/logo1.png b/assets/images/logo1.png new file mode 100644 index 0000000000000000000000000000000000000000..3949899ad2085b1747263168f20939d8ef15d395 GIT binary patch literal 12575 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 B@kIat literal 0 HcmV?d00001 diff --git a/assets/javascripts/bundle.88dd0f4e.min.js b/assets/javascripts/bundle.88dd0f4e.min.js new file mode 100644 index 0000000..fb8f310 --- /dev/null +++ b/assets/javascripts/bundle.88dd0f4e.min.js @@ -0,0 +1,16 @@ +"use strict";(()=>{var Wi=Object.create;var gr=Object.defineProperty;var Di=Object.getOwnPropertyDescriptor;var Vi=Object.getOwnPropertyNames,Vt=Object.getOwnPropertySymbols,Ni=Object.getPrototypeOf,yr=Object.prototype.hasOwnProperty,ao=Object.prototype.propertyIsEnumerable;var io=(e,t,r)=>t in e?gr(e,t,{enumerable:!0,configurable:!0,writable:!0,value:r}):e[t]=r,$=(e,t)=>{for(var r in t||(t={}))yr.call(t,r)&&io(e,r,t[r]);if(Vt)for(var r of Vt(t))ao.call(t,r)&&io(e,r,t[r]);return e};var so=(e,t)=>{var r={};for(var o in e)yr.call(e,o)&&t.indexOf(o)<0&&(r[o]=e[o]);if(e!=null&&Vt)for(var o of Vt(e))t.indexOf(o)<0&&ao.call(e,o)&&(r[o]=e[o]);return r};var xr=(e,t)=>()=>(t||e((t={exports:{}}).exports,t),t.exports);var zi=(e,t,r,o)=>{if(t&&typeof t=="object"||typeof t=="function")for(let n of Vi(t))!yr.call(e,n)&&n!==r&&gr(e,n,{get:()=>t[n],enumerable:!(o=Di(t,n))||o.enumerable});return e};var Mt=(e,t,r)=>(r=e!=null?Wi(Ni(e)):{},zi(t||!e||!e.__esModule?gr(r,"default",{value:e,enumerable:!0}):r,e));var co=(e,t,r)=>new Promise((o,n)=>{var i=p=>{try{s(r.next(p))}catch(c){n(c)}},a=p=>{try{s(r.throw(p))}catch(c){n(c)}},s=p=>p.done?o(p.value):Promise.resolve(p.value).then(i,a);s((r=r.apply(e,t)).next())});var lo=xr((Er,po)=>{(function(e,t){typeof Er=="object"&&typeof po!="undefined"?t():typeof define=="function"&&define.amd?define(t):t()})(Er,function(){"use strict";function e(r){var o=!0,n=!1,i=null,a={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 s(k){return!!(k&&k!==document&&k.nodeName!=="HTML"&&k.nodeName!=="BODY"&&"classList"in k&&"contains"in k.classList)}function p(k){var ft=k.type,qe=k.tagName;return!!(qe==="INPUT"&&a[ft]&&!k.readOnly||qe==="TEXTAREA"&&!k.readOnly||k.isContentEditable)}function c(k){k.classList.contains("focus-visible")||(k.classList.add("focus-visible"),k.setAttribute("data-focus-visible-added",""))}function l(k){k.hasAttribute("data-focus-visible-added")&&(k.classList.remove("focus-visible"),k.removeAttribute("data-focus-visible-added"))}function f(k){k.metaKey||k.altKey||k.ctrlKey||(s(r.activeElement)&&c(r.activeElement),o=!0)}function u(k){o=!1}function d(k){s(k.target)&&(o||p(k.target))&&c(k.target)}function y(k){s(k.target)&&(k.target.classList.contains("focus-visible")||k.target.hasAttribute("data-focus-visible-added"))&&(n=!0,window.clearTimeout(i),i=window.setTimeout(function(){n=!1},100),l(k.target))}function L(k){document.visibilityState==="hidden"&&(n&&(o=!0),X())}function X(){document.addEventListener("mousemove",J),document.addEventListener("mousedown",J),document.addEventListener("mouseup",J),document.addEventListener("pointermove",J),document.addEventListener("pointerdown",J),document.addEventListener("pointerup",J),document.addEventListener("touchmove",J),document.addEventListener("touchstart",J),document.addEventListener("touchend",J)}function te(){document.removeEventListener("mousemove",J),document.removeEventListener("mousedown",J),document.removeEventListener("mouseup",J),document.removeEventListener("pointermove",J),document.removeEventListener("pointerdown",J),document.removeEventListener("pointerup",J),document.removeEventListener("touchmove",J),document.removeEventListener("touchstart",J),document.removeEventListener("touchend",J)}function J(k){k.target.nodeName&&k.target.nodeName.toLowerCase()==="html"||(o=!1,te())}document.addEventListener("keydown",f,!0),document.addEventListener("mousedown",u,!0),document.addEventListener("pointerdown",u,!0),document.addEventListener("touchstart",u,!0),document.addEventListener("visibilitychange",L,!0),X(),r.addEventListener("focus",d,!0),r.addEventListener("blur",y,!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 qr=xr((hy,On)=>{"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=/["'&<>]/;On.exports=Pa;function Pa(e){var t=""+e,r=$a.exec(t);if(!r)return t;var o,n="",i=0,a=0;for(i=r.index;i{/*! + * clipboard.js v2.0.11 + * https://clipboardjs.com/ + * + * Licensed MIT © Zeno Rocha + */(function(t,r){typeof It=="object"&&typeof Yr=="object"?Yr.exports=r():typeof define=="function"&&define.amd?define([],r):typeof It=="object"?It.ClipboardJS=r():t.ClipboardJS=r()})(It,function(){return function(){var e={686:function(o,n,i){"use strict";i.d(n,{default:function(){return Ui}});var a=i(279),s=i.n(a),p=i(370),c=i.n(p),l=i(817),f=i.n(l);function u(V){try{return document.execCommand(V)}catch(A){return!1}}var d=function(A){var M=f()(A);return u("cut"),M},y=d;function L(V){var A=document.documentElement.getAttribute("dir")==="rtl",M=document.createElement("textarea");M.style.fontSize="12pt",M.style.border="0",M.style.padding="0",M.style.margin="0",M.style.position="absolute",M.style[A?"right":"left"]="-9999px";var F=window.pageYOffset||document.documentElement.scrollTop;return M.style.top="".concat(F,"px"),M.setAttribute("readonly",""),M.value=V,M}var X=function(A,M){var F=L(A);M.container.appendChild(F);var D=f()(F);return u("copy"),F.remove(),D},te=function(A){var M=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{container:document.body},F="";return typeof A=="string"?F=X(A,M):A instanceof HTMLInputElement&&!["text","search","url","tel","password"].includes(A==null?void 0:A.type)?F=X(A.value,M):(F=f()(A),u("copy")),F},J=te;function k(V){"@babel/helpers - typeof";return typeof Symbol=="function"&&typeof Symbol.iterator=="symbol"?k=function(M){return typeof M}:k=function(M){return M&&typeof Symbol=="function"&&M.constructor===Symbol&&M!==Symbol.prototype?"symbol":typeof M},k(V)}var ft=function(){var A=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{},M=A.action,F=M===void 0?"copy":M,D=A.container,Y=A.target,$e=A.text;if(F!=="copy"&&F!=="cut")throw new Error('Invalid "action" value, use either "copy" or "cut"');if(Y!==void 0)if(Y&&k(Y)==="object"&&Y.nodeType===1){if(F==="copy"&&Y.hasAttribute("disabled"))throw new Error('Invalid "target" attribute. Please use "readonly" instead of "disabled" attribute');if(F==="cut"&&(Y.hasAttribute("readonly")||Y.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($e)return J($e,{container:D});if(Y)return F==="cut"?y(Y):J(Y,{container:D})},qe=ft;function Fe(V){"@babel/helpers - typeof";return typeof Symbol=="function"&&typeof Symbol.iterator=="symbol"?Fe=function(M){return typeof M}:Fe=function(M){return M&&typeof Symbol=="function"&&M.constructor===Symbol&&M!==Symbol.prototype?"symbol":typeof M},Fe(V)}function ki(V,A){if(!(V instanceof A))throw new TypeError("Cannot call a class as a function")}function no(V,A){for(var M=0;M0&&arguments[0]!==void 0?arguments[0]:{};this.action=typeof D.action=="function"?D.action:this.defaultAction,this.target=typeof D.target=="function"?D.target:this.defaultTarget,this.text=typeof D.text=="function"?D.text:this.defaultText,this.container=Fe(D.container)==="object"?D.container:document.body}},{key:"listenClick",value:function(D){var Y=this;this.listener=c()(D,"click",function($e){return Y.onClick($e)})}},{key:"onClick",value:function(D){var Y=D.delegateTarget||D.currentTarget,$e=this.action(Y)||"copy",Dt=qe({action:$e,container:this.container,target:this.target(Y),text:this.text(Y)});this.emit(Dt?"success":"error",{action:$e,text:Dt,trigger:Y,clearSelection:function(){Y&&Y.focus(),window.getSelection().removeAllRanges()}})}},{key:"defaultAction",value:function(D){return vr("action",D)}},{key:"defaultTarget",value:function(D){var Y=vr("target",D);if(Y)return document.querySelector(Y)}},{key:"defaultText",value:function(D){return vr("text",D)}},{key:"destroy",value:function(){this.listener.destroy()}}],[{key:"copy",value:function(D){var Y=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{container:document.body};return J(D,Y)}},{key:"cut",value:function(D){return y(D)}},{key:"isSupported",value:function(){var D=arguments.length>0&&arguments[0]!==void 0?arguments[0]:["copy","cut"],Y=typeof D=="string"?[D]:D,$e=!!document.queryCommandSupported;return Y.forEach(function(Dt){$e=$e&&!!document.queryCommandSupported(Dt)}),$e}}]),M}(s()),Ui=Fi},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 a(s,p){for(;s&&s.nodeType!==n;){if(typeof s.matches=="function"&&s.matches(p))return s;s=s.parentNode}}o.exports=a},438:function(o,n,i){var a=i(828);function s(l,f,u,d,y){var L=c.apply(this,arguments);return l.addEventListener(u,L,y),{destroy:function(){l.removeEventListener(u,L,y)}}}function p(l,f,u,d,y){return typeof l.addEventListener=="function"?s.apply(null,arguments):typeof u=="function"?s.bind(null,document).apply(null,arguments):(typeof l=="string"&&(l=document.querySelectorAll(l)),Array.prototype.map.call(l,function(L){return s(L,f,u,d,y)}))}function c(l,f,u,d){return function(y){y.delegateTarget=a(y.target,f),y.delegateTarget&&d.call(l,y)}}o.exports=p},879:function(o,n){n.node=function(i){return i!==void 0&&i instanceof HTMLElement&&i.nodeType===1},n.nodeList=function(i){var a=Object.prototype.toString.call(i);return i!==void 0&&(a==="[object NodeList]"||a==="[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 a=Object.prototype.toString.call(i);return a==="[object Function]"}},370:function(o,n,i){var a=i(879),s=i(438);function p(u,d,y){if(!u&&!d&&!y)throw new Error("Missing required arguments");if(!a.string(d))throw new TypeError("Second argument must be a String");if(!a.fn(y))throw new TypeError("Third argument must be a Function");if(a.node(u))return c(u,d,y);if(a.nodeList(u))return l(u,d,y);if(a.string(u))return f(u,d,y);throw new TypeError("First argument must be a String, HTMLElement, HTMLCollection, or NodeList")}function c(u,d,y){return u.addEventListener(d,y),{destroy:function(){u.removeEventListener(d,y)}}}function l(u,d,y){return Array.prototype.forEach.call(u,function(L){L.addEventListener(d,y)}),{destroy:function(){Array.prototype.forEach.call(u,function(L){L.removeEventListener(d,y)})}}}function f(u,d,y){return s(document.body,u,d,y)}o.exports=p},817:function(o){function n(i){var a;if(i.nodeName==="SELECT")i.focus(),a=i.value;else if(i.nodeName==="INPUT"||i.nodeName==="TEXTAREA"){var s=i.hasAttribute("readonly");s||i.setAttribute("readonly",""),i.select(),i.setSelectionRange(0,i.value.length),s||i.removeAttribute("readonly"),a=i.value}else{i.hasAttribute("contenteditable")&&i.focus();var p=window.getSelection(),c=document.createRange();c.selectNodeContents(i),p.removeAllRanges(),p.addRange(c),a=p.toString()}return a}o.exports=n},279:function(o){function n(){}n.prototype={on:function(i,a,s){var p=this.e||(this.e={});return(p[i]||(p[i]=[])).push({fn:a,ctx:s}),this},once:function(i,a,s){var p=this;function c(){p.off(i,c),a.apply(s,arguments)}return c._=a,this.on(i,c,s)},emit:function(i){var a=[].slice.call(arguments,1),s=((this.e||(this.e={}))[i]||[]).slice(),p=0,c=s.length;for(p;p0&&i[i.length-1])&&(c[0]===6||c[0]===2)){r=0;continue}if(c[0]===3&&(!i||c[1]>i[0]&&c[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 N(e,t){var r=typeof Symbol=="function"&&e[Symbol.iterator];if(!r)return e;var o=r.call(e),n,i=[],a;try{for(;(t===void 0||t-- >0)&&!(n=o.next()).done;)i.push(n.value)}catch(s){a={error:s}}finally{try{n&&!n.done&&(r=o.return)&&r.call(o)}finally{if(a)throw a.error}}return i}function q(e,t,r){if(r||arguments.length===2)for(var o=0,n=t.length,i;o1||p(d,L)})},y&&(n[d]=y(n[d])))}function p(d,y){try{c(o[d](y))}catch(L){u(i[0][3],L)}}function c(d){d.value instanceof nt?Promise.resolve(d.value.v).then(l,f):u(i[0][2],d)}function l(d){p("next",d)}function f(d){p("throw",d)}function u(d,y){d(y),i.shift(),i.length&&p(i[0][0],i[0][1])}}function uo(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 he=="function"?he(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(a){return new Promise(function(s,p){a=e[i](a),n(s,p,a.done,a.value)})}}function n(i,a,s,p){Promise.resolve(p).then(function(c){i({value:c,done:s})},a)}}function H(e){return typeof e=="function"}function ut(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 zt=ut(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 Qe(e,t){if(e){var r=e.indexOf(t);0<=r&&e.splice(r,1)}}var Ue=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 a=this._parentage;if(a)if(this._parentage=null,Array.isArray(a))try{for(var s=he(a),p=s.next();!p.done;p=s.next()){var c=p.value;c.remove(this)}}catch(L){t={error:L}}finally{try{p&&!p.done&&(r=s.return)&&r.call(s)}finally{if(t)throw t.error}}else a.remove(this);var l=this.initialTeardown;if(H(l))try{l()}catch(L){i=L instanceof zt?L.errors:[L]}var f=this._finalizers;if(f){this._finalizers=null;try{for(var u=he(f),d=u.next();!d.done;d=u.next()){var y=d.value;try{ho(y)}catch(L){i=i!=null?i:[],L instanceof zt?i=q(q([],N(i)),N(L.errors)):i.push(L)}}}catch(L){o={error:L}}finally{try{d&&!d.done&&(n=u.return)&&n.call(u)}finally{if(o)throw o.error}}}if(i)throw new zt(i)}},e.prototype.add=function(t){var r;if(t&&t!==this)if(this.closed)ho(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)&&Qe(r,t)},e.prototype.remove=function(t){var r=this._finalizers;r&&Qe(r,t),t instanceof e&&t._removeParent(this)},e.EMPTY=function(){var t=new e;return t.closed=!0,t}(),e}();var Tr=Ue.EMPTY;function qt(e){return e instanceof Ue||e&&"closed"in e&&H(e.remove)&&H(e.add)&&H(e.unsubscribe)}function ho(e){H(e)?e():e.unsubscribe()}var Pe={onUnhandledError:null,onStoppedNotification:null,Promise:void 0,useDeprecatedSynchronousErrorHandling:!1,useDeprecatedNextContext:!1};var dt={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,a=n.isStopped,s=n.observers;return i||a?Tr:(this.currentObservers=null,s.push(r),new Ue(function(){o.currentObservers=null,Qe(s,r)}))},t.prototype._checkFinalizedStatuses=function(r){var o=this,n=o.hasError,i=o.thrownError,a=o.isStopped;n?r.error(i):a&&r.complete()},t.prototype.asObservable=function(){var r=new j;return r.source=this,r},t.create=function(r,o){return new To(r,o)},t}(j);var To=function(e){oe(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:Tr},t}(g);var _r=function(e){oe(t,e);function t(r){var o=e.call(this)||this;return o._value=r,o}return Object.defineProperty(t.prototype,"value",{get:function(){return this.getValue()},enumerable:!1,configurable:!0}),t.prototype._subscribe=function(r){var o=e.prototype._subscribe.call(this,r);return!o.closed&&r.next(this._value),o},t.prototype.getValue=function(){var r=this,o=r.hasError,n=r.thrownError,i=r._value;if(o)throw n;return this._throwIfClosed(),i},t.prototype.next=function(r){e.prototype.next.call(this,this._value=r)},t}(g);var At={now:function(){return(At.delegate||Date).now()},delegate:void 0};var Ct=function(e){oe(t,e);function t(r,o,n){r===void 0&&(r=1/0),o===void 0&&(o=1/0),n===void 0&&(n=At);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,a=o._infiniteTimeWindow,s=o._timestampProvider,p=o._windowTime;n||(i.push(r),!a&&i.push(s.now()+p)),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,a=n._buffer,s=a.slice(),p=0;p0?e.prototype.schedule.call(this,r,o):(this.delay=o,this.state=r,this.scheduler.flush(this),this)},t.prototype.execute=function(r,o){return o>0||this.closed?e.prototype.execute.call(this,r,o):this._execute(r,o)},t.prototype.requestAsyncId=function(r,o,n){return n===void 0&&(n=0),n!=null&&n>0||n==null&&this.delay>0?e.prototype.requestAsyncId.call(this,r,o,n):(r.flush(this),0)},t}(gt);var Lo=function(e){oe(t,e);function t(){return e!==null&&e.apply(this,arguments)||this}return t}(yt);var kr=new Lo(Oo);var Mo=function(e){oe(t,e);function t(r,o){var n=e.call(this,r,o)||this;return n.scheduler=r,n.work=o,n}return t.prototype.requestAsyncId=function(r,o,n){return n===void 0&&(n=0),n!==null&&n>0?e.prototype.requestAsyncId.call(this,r,o,n):(r.actions.push(this),r._scheduled||(r._scheduled=vt.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 a=r.actions;o!=null&&((i=a[a.length-1])===null||i===void 0?void 0:i.id)!==o&&(vt.cancelAnimationFrame(o),r._scheduled=void 0)},t}(gt);var _o=function(e){oe(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}(yt);var me=new _o(Mo);var S=new j(function(e){return e.complete()});function Yt(e){return e&&H(e.schedule)}function Hr(e){return e[e.length-1]}function Xe(e){return H(Hr(e))?e.pop():void 0}function ke(e){return Yt(Hr(e))?e.pop():void 0}function Bt(e,t){return typeof Hr(e)=="number"?e.pop():t}var xt=function(e){return e&&typeof e.length=="number"&&typeof e!="function"};function Gt(e){return H(e==null?void 0:e.then)}function Jt(e){return H(e[bt])}function Xt(e){return Symbol.asyncIterator&&H(e==null?void 0:e[Symbol.asyncIterator])}function Zt(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 Zi(){return typeof Symbol!="function"||!Symbol.iterator?"@@iterator":Symbol.iterator}var er=Zi();function tr(e){return H(e==null?void 0:e[er])}function rr(e){return fo(this,arguments,function(){var r,o,n,i;return Nt(this,function(a){switch(a.label){case 0:r=e.getReader(),a.label=1;case 1:a.trys.push([1,,9,10]),a.label=2;case 2:return[4,nt(r.read())];case 3:return o=a.sent(),n=o.value,i=o.done,i?[4,nt(void 0)]:[3,5];case 4:return[2,a.sent()];case 5:return[4,nt(n)];case 6:return[4,a.sent()];case 7:return a.sent(),[3,2];case 8:return[3,10];case 9:return r.releaseLock(),[7];case 10:return[2]}})})}function or(e){return H(e==null?void 0:e.getReader)}function U(e){if(e instanceof j)return e;if(e!=null){if(Jt(e))return ea(e);if(xt(e))return ta(e);if(Gt(e))return ra(e);if(Xt(e))return Ao(e);if(tr(e))return oa(e);if(or(e))return na(e)}throw Zt(e)}function ea(e){return new j(function(t){var r=e[bt]();if(H(r.subscribe))return r.subscribe(t);throw new TypeError("Provided object does not correctly implement Symbol.observable")})}function ta(e){return new j(function(t){for(var r=0;r=2;return function(o){return o.pipe(e?b(function(n,i){return e(n,i,o)}):le,Te(1),r?De(t):Qo(function(){return new ir}))}}function jr(e){return e<=0?function(){return S}:E(function(t,r){var o=[];t.subscribe(T(r,function(n){o.push(n),e=2,!0))}function pe(e){e===void 0&&(e={});var t=e.connector,r=t===void 0?function(){return new g}:t,o=e.resetOnError,n=o===void 0?!0:o,i=e.resetOnComplete,a=i===void 0?!0:i,s=e.resetOnRefCountZero,p=s===void 0?!0:s;return function(c){var l,f,u,d=0,y=!1,L=!1,X=function(){f==null||f.unsubscribe(),f=void 0},te=function(){X(),l=u=void 0,y=L=!1},J=function(){var k=l;te(),k==null||k.unsubscribe()};return E(function(k,ft){d++,!L&&!y&&X();var qe=u=u!=null?u:r();ft.add(function(){d--,d===0&&!L&&!y&&(f=Ur(J,p))}),qe.subscribe(ft),!l&&d>0&&(l=new at({next:function(Fe){return qe.next(Fe)},error:function(Fe){L=!0,X(),f=Ur(te,n,Fe),qe.error(Fe)},complete:function(){y=!0,X(),f=Ur(te,a),qe.complete()}}),U(k).subscribe(l))})(c)}}function Ur(e,t){for(var r=[],o=2;oe.next(document)),e}function P(e,t=document){return Array.from(t.querySelectorAll(e))}function R(e,t=document){let r=fe(e,t);if(typeof r=="undefined")throw new ReferenceError(`Missing element: expected "${e}" to be present`);return r}function fe(e,t=document){return t.querySelector(e)||void 0}function Ie(){var e,t,r,o;return(o=(r=(t=(e=document.activeElement)==null?void 0:e.shadowRoot)==null?void 0:t.activeElement)!=null?r:document.activeElement)!=null?o:void 0}var wa=O(h(document.body,"focusin"),h(document.body,"focusout")).pipe(_e(1),Q(void 0),m(()=>Ie()||document.body),G(1));function et(e){return wa.pipe(m(t=>e.contains(t)),K())}function $t(e,t){return C(()=>O(h(e,"mouseenter").pipe(m(()=>!0)),h(e,"mouseleave").pipe(m(()=>!1))).pipe(t?Ht(r=>Le(+!r*t)):le,Q(e.matches(":hover"))))}function Jo(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)Jo(e,r)}function x(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)Jo(o,n);return o}function sr(e){if(e>999){let t=+((e-950)%1e3>99);return`${((e+1e-6)/1e3).toFixed(t)}k`}else return e.toString()}function Tt(e){let t=x("script",{src:e});return C(()=>(document.head.appendChild(t),O(h(t,"load"),h(t,"error").pipe(v(()=>$r(()=>new ReferenceError(`Invalid script: ${e}`))))).pipe(m(()=>{}),_(()=>document.head.removeChild(t)),Te(1))))}var Xo=new g,Ta=C(()=>typeof ResizeObserver=="undefined"?Tt("https://unpkg.com/resize-observer-polyfill"):I(void 0)).pipe(m(()=>new ResizeObserver(e=>e.forEach(t=>Xo.next(t)))),v(e=>O(Ye,I(e)).pipe(_(()=>e.disconnect()))),G(1));function ce(e){return{width:e.offsetWidth,height:e.offsetHeight}}function ge(e){let t=e;for(;t.clientWidth===0&&t.parentElement;)t=t.parentElement;return Ta.pipe(w(r=>r.observe(t)),v(r=>Xo.pipe(b(o=>o.target===t),_(()=>r.unobserve(t)))),m(()=>ce(e)),Q(ce(e)))}function St(e){return{width:e.scrollWidth,height:e.scrollHeight}}function cr(e){let t=e.parentElement;for(;t&&(e.scrollWidth<=t.scrollWidth&&e.scrollHeight<=t.scrollHeight);)t=(e=t).parentElement;return t?e:void 0}function Zo(e){let t=[],r=e.parentElement;for(;r;)(e.clientWidth>r.clientWidth||e.clientHeight>r.clientHeight)&&t.push(r),r=(e=r).parentElement;return t.length===0&&t.push(document.documentElement),t}function Ve(e){return{x:e.offsetLeft,y:e.offsetTop}}function en(e){let t=e.getBoundingClientRect();return{x:t.x+window.scrollX,y:t.y+window.scrollY}}function tn(e){return O(h(window,"load"),h(window,"resize")).pipe(Me(0,me),m(()=>Ve(e)),Q(Ve(e)))}function pr(e){return{x:e.scrollLeft,y:e.scrollTop}}function Ne(e){return O(h(e,"scroll"),h(window,"scroll"),h(window,"resize")).pipe(Me(0,me),m(()=>pr(e)),Q(pr(e)))}var rn=new g,Sa=C(()=>I(new IntersectionObserver(e=>{for(let t of e)rn.next(t)},{threshold:0}))).pipe(v(e=>O(Ye,I(e)).pipe(_(()=>e.disconnect()))),G(1));function tt(e){return Sa.pipe(w(t=>t.observe(e)),v(t=>rn.pipe(b(({target:r})=>r===e),_(()=>t.unobserve(e)),m(({isIntersecting:r})=>r))))}function on(e,t=16){return Ne(e).pipe(m(({y:r})=>{let o=ce(e),n=St(e);return r>=n.height-o.height-t}),K())}var lr={drawer:R("[data-md-toggle=drawer]"),search:R("[data-md-toggle=search]")};function nn(e){return lr[e].checked}function Je(e,t){lr[e].checked!==t&&lr[e].click()}function ze(e){let t=lr[e];return h(t,"change").pipe(m(()=>t.checked),Q(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 La(){return O(h(window,"compositionstart").pipe(m(()=>!0)),h(window,"compositionend").pipe(m(()=>!1))).pipe(Q(!1))}function an(){let e=h(window,"keydown").pipe(b(t=>!(t.metaKey||t.ctrlKey)),m(t=>({mode:nn("search")?"search":"global",type:t.key,claim(){t.preventDefault(),t.stopPropagation()}})),b(({mode:t,type:r})=>{if(t==="global"){let o=Ie();if(typeof o!="undefined")return!Oa(o,r)}return!0}),pe());return La().pipe(v(t=>t?S:e))}function ye(){return new URL(location.href)}function lt(e,t=!1){if(B("navigation.instant")&&!t){let r=x("a",{href:e.href});document.body.appendChild(r),r.click(),r.remove()}else location.href=e.href}function sn(){return new g}function cn(){return location.hash.slice(1)}function pn(e){let t=x("a",{href:e});t.addEventListener("click",r=>r.stopPropagation()),t.click()}function Ma(e){return O(h(window,"hashchange"),e).pipe(m(cn),Q(cn()),b(t=>t.length>0),G(1))}function ln(e){return Ma(e).pipe(m(t=>fe(`[id="${t}"]`)),b(t=>typeof t!="undefined"))}function Pt(e){let t=matchMedia(e);return ar(r=>t.addListener(()=>r(t.matches))).pipe(Q(t.matches))}function mn(){let e=matchMedia("print");return O(h(window,"beforeprint").pipe(m(()=>!0)),h(window,"afterprint").pipe(m(()=>!1))).pipe(Q(e.matches))}function Nr(e,t){return e.pipe(v(r=>r?t():S))}function zr(e,t){return new j(r=>{let o=new XMLHttpRequest;return o.open("GET",`${e}`),o.responseType="blob",o.addEventListener("load",()=>{o.status>=200&&o.status<300?(r.next(o.response),r.complete()):r.error(new Error(o.statusText))}),o.addEventListener("error",()=>{r.error(new Error("Network error"))}),o.addEventListener("abort",()=>{r.complete()}),typeof(t==null?void 0:t.progress$)!="undefined"&&(o.addEventListener("progress",n=>{var i;if(n.lengthComputable)t.progress$.next(n.loaded/n.total*100);else{let a=(i=o.getResponseHeader("Content-Length"))!=null?i:0;t.progress$.next(n.loaded/+a*100)}}),t.progress$.next(5)),o.send(),()=>o.abort()})}function je(e,t){return zr(e,t).pipe(v(r=>r.text()),m(r=>JSON.parse(r)),G(1))}function fn(e,t){let r=new DOMParser;return zr(e,t).pipe(v(o=>o.text()),m(o=>r.parseFromString(o,"text/html")),G(1))}function un(e,t){let r=new DOMParser;return zr(e,t).pipe(v(o=>o.text()),m(o=>r.parseFromString(o,"text/xml")),G(1))}function dn(){return{x:Math.max(0,scrollX),y:Math.max(0,scrollY)}}function hn(){return O(h(window,"scroll",{passive:!0}),h(window,"resize",{passive:!0})).pipe(m(dn),Q(dn()))}function bn(){return{width:innerWidth,height:innerHeight}}function vn(){return h(window,"resize",{passive:!0}).pipe(m(bn),Q(bn()))}function gn(){return z([hn(),vn()]).pipe(m(([e,t])=>({offset:e,size:t})),G(1))}function mr(e,{viewport$:t,header$:r}){let o=t.pipe(ee("size")),n=z([o,r]).pipe(m(()=>Ve(e)));return z([r,t,n]).pipe(m(([{height:i},{offset:a,size:s},{x:p,y:c}])=>({offset:{x:a.x-p,y:a.y-c+i},size:s})))}function _a(e){return h(e,"message",t=>t.data)}function Aa(e){let t=new g;return t.subscribe(r=>e.postMessage(r)),t}function yn(e,t=new Worker(e)){let r=_a(t),o=Aa(t),n=new g;n.subscribe(o);let i=o.pipe(Z(),ie(!0));return n.pipe(Z(),Re(r.pipe(W(i))),pe())}var Ca=R("#__config"),Ot=JSON.parse(Ca.textContent);Ot.base=`${new URL(Ot.base,ye())}`;function xe(){return Ot}function B(e){return Ot.features.includes(e)}function Ee(e,t){return typeof t!="undefined"?Ot.translations[e].replace("#",t.toString()):Ot.translations[e]}function Se(e,t=document){return R(`[data-md-component=${e}]`,t)}function ae(e,t=document){return P(`[data-md-component=${e}]`,t)}function ka(e){let t=R(".md-typeset > :first-child",e);return h(t,"click",{once:!0}).pipe(m(()=>R(".md-typeset",e)),m(r=>({hash:__md_hash(r.innerHTML)})))}function xn(e){if(!B("announce.dismiss")||!e.childElementCount)return S;if(!e.hidden){let t=R(".md-typeset",e);__md_hash(t.innerHTML)===__md_get("__announce")&&(e.hidden=!0)}return C(()=>{let t=new g;return t.subscribe(({hash:r})=>{e.hidden=!0,__md_set("__announce",r)}),ka(e).pipe(w(r=>t.next(r)),_(()=>t.complete()),m(r=>$({ref:e},r)))})}function Ha(e,{target$:t}){return t.pipe(m(r=>({hidden:r!==e})))}function En(e,t){let r=new g;return r.subscribe(({hidden:o})=>{e.hidden=o}),Ha(e,t).pipe(w(o=>r.next(o)),_(()=>r.complete()),m(o=>$({ref:e},o)))}function Rt(e,t){return t==="inline"?x("div",{class:"md-tooltip md-tooltip--inline",id:e,role:"tooltip"},x("div",{class:"md-tooltip__inner md-typeset"})):x("div",{class:"md-tooltip",id:e,role:"tooltip"},x("div",{class:"md-tooltip__inner md-typeset"}))}function wn(...e){return x("div",{class:"md-tooltip2",role:"tooltip"},x("div",{class:"md-tooltip2__inner md-typeset"},e))}function Tn(e,t){if(t=t?`${t}_annotation_${e}`:void 0,t){let r=t?`#${t}`:void 0;return x("aside",{class:"md-annotation",tabIndex:0},Rt(t),x("a",{href:r,class:"md-annotation__index",tabIndex:-1},x("span",{"data-md-annotation-id":e})))}else return x("aside",{class:"md-annotation",tabIndex:0},Rt(t),x("span",{class:"md-annotation__index",tabIndex:-1},x("span",{"data-md-annotation-id":e})))}function Sn(e){return x("button",{class:"md-clipboard md-icon",title:Ee("clipboard.copy"),"data-clipboard-target":`#${e} > code`})}var Ln=Mt(qr());function Qr(e,t){let r=t&2,o=t&1,n=Object.keys(e.terms).filter(p=>!e.terms[p]).reduce((p,c)=>[...p,x("del",null,(0,Ln.default)(c))," "],[]).slice(0,-1),i=xe(),a=new URL(e.location,i.base);B("search.highlight")&&a.searchParams.set("h",Object.entries(e.terms).filter(([,p])=>p).reduce((p,[c])=>`${p} ${c}`.trim(),""));let{tags:s}=xe();return x("a",{href:`${a}`,class:"md-search-result__link",tabIndex:-1},x("article",{class:"md-search-result__article md-typeset","data-md-score":e.score.toFixed(2)},r>0&&x("div",{class:"md-search-result__icon md-icon"}),r>0&&x("h1",null,e.title),r<=0&&x("h2",null,e.title),o>0&&e.text.length>0&&e.text,e.tags&&x("nav",{class:"md-tags"},e.tags.map(p=>{let c=s?p in s?`md-tag-icon md-tag--${s[p]}`:"md-tag-icon":"";return x("span",{class:`md-tag ${c}`},p)})),o>0&&n.length>0&&x("p",{class:"md-search-result__terms"},Ee("search.result.term.missing"),": ",...n)))}function Mn(e){let t=e[0].score,r=[...e],o=xe(),n=r.findIndex(l=>!`${new URL(l.location,o.base)}`.includes("#")),[i]=r.splice(n,1),a=r.findIndex(l=>l.scoreQr(l,1)),...p.length?[x("details",{class:"md-search-result__more"},x("summary",{tabIndex:-1},x("div",null,p.length>0&&p.length===1?Ee("search.result.more.one"):Ee("search.result.more.other",p.length))),...p.map(l=>Qr(l,1)))]:[]];return x("li",{class:"md-search-result__item"},c)}function _n(e){return x("ul",{class:"md-source__facts"},Object.entries(e).map(([t,r])=>x("li",{class:`md-source__fact md-source__fact--${t}`},typeof r=="number"?sr(r):r)))}function Kr(e){let t=`tabbed-control tabbed-control--${e}`;return x("div",{class:t,hidden:!0},x("button",{class:"tabbed-button",tabIndex:-1,"aria-hidden":"true"}))}function An(e){return x("div",{class:"md-typeset__scrollwrap"},x("div",{class:"md-typeset__table"},e))}function Ra(e){var o;let t=xe(),r=new URL(`../${e.version}/`,t.base);return x("li",{class:"md-version__item"},x("a",{href:`${r}`,class:"md-version__link"},e.title,((o=t.version)==null?void 0:o.alias)&&e.aliases.length>0&&x("span",{class:"md-version__alias"},e.aliases[0])))}function Cn(e,t){var o;let r=xe();return e=e.filter(n=>{var i;return!((i=n.properties)!=null&&i.hidden)}),x("div",{class:"md-version"},x("button",{class:"md-version__current","aria-label":Ee("select.version")},t.title,((o=r.version)==null?void 0:o.alias)&&t.aliases.length>0&&x("span",{class:"md-version__alias"},t.aliases[0])),x("ul",{class:"md-version__list"},e.map(Ra)))}var Ia=0;function ja(e){let t=z([et(e),$t(e)]).pipe(m(([o,n])=>o||n),K()),r=C(()=>Zo(e)).pipe(ne(Ne),pt(1),He(t),m(()=>en(e)));return t.pipe(Ae(o=>o),v(()=>z([t,r])),m(([o,n])=>({active:o,offset:n})),pe())}function Fa(e,t){let{content$:r,viewport$:o}=t,n=`__tooltip2_${Ia++}`;return C(()=>{let i=new g,a=new _r(!1);i.pipe(Z(),ie(!1)).subscribe(a);let s=a.pipe(Ht(c=>Le(+!c*250,kr)),K(),v(c=>c?r:S),w(c=>c.id=n),pe());z([i.pipe(m(({active:c})=>c)),s.pipe(v(c=>$t(c,250)),Q(!1))]).pipe(m(c=>c.some(l=>l))).subscribe(a);let p=a.pipe(b(c=>c),re(s,o),m(([c,l,{size:f}])=>{let u=e.getBoundingClientRect(),d=u.width/2;if(l.role==="tooltip")return{x:d,y:8+u.height};if(u.y>=f.height/2){let{height:y}=ce(l);return{x:d,y:-16-y}}else return{x:d,y:16+u.height}}));return z([s,i,p]).subscribe(([c,{offset:l},f])=>{c.style.setProperty("--md-tooltip-host-x",`${l.x}px`),c.style.setProperty("--md-tooltip-host-y",`${l.y}px`),c.style.setProperty("--md-tooltip-x",`${f.x}px`),c.style.setProperty("--md-tooltip-y",`${f.y}px`),c.classList.toggle("md-tooltip2--top",f.y<0),c.classList.toggle("md-tooltip2--bottom",f.y>=0)}),a.pipe(b(c=>c),re(s,(c,l)=>l),b(c=>c.role==="tooltip")).subscribe(c=>{let l=ce(R(":scope > *",c));c.style.setProperty("--md-tooltip-width",`${l.width}px`),c.style.setProperty("--md-tooltip-tail","0px")}),a.pipe(K(),ve(me),re(s)).subscribe(([c,l])=>{l.classList.toggle("md-tooltip2--active",c)}),z([a.pipe(b(c=>c)),s]).subscribe(([c,l])=>{l.role==="dialog"?(e.setAttribute("aria-controls",n),e.setAttribute("aria-haspopup","dialog")):e.setAttribute("aria-describedby",n)}),a.pipe(b(c=>!c)).subscribe(()=>{e.removeAttribute("aria-controls"),e.removeAttribute("aria-describedby"),e.removeAttribute("aria-haspopup")}),ja(e).pipe(w(c=>i.next(c)),_(()=>i.complete()),m(c=>$({ref:e},c)))})}function mt(e,{viewport$:t},r=document.body){return Fa(e,{content$:new j(o=>{let n=e.title,i=wn(n);return o.next(i),e.removeAttribute("title"),r.append(i),()=>{i.remove(),e.setAttribute("title",n)}}),viewport$:t})}function Ua(e,t){let r=C(()=>z([tn(e),Ne(t)])).pipe(m(([{x:o,y:n},i])=>{let{width:a,height:s}=ce(e);return{x:o-i.x+a/2,y:n-i.y+s/2}}));return et(e).pipe(v(o=>r.pipe(m(n=>({active:o,offset:n})),Te(+!o||1/0))))}function kn(e,t,{target$:r}){let[o,n]=Array.from(e.children);return C(()=>{let i=new g,a=i.pipe(Z(),ie(!0));return i.subscribe({next({offset:s}){e.style.setProperty("--md-tooltip-x",`${s.x}px`),e.style.setProperty("--md-tooltip-y",`${s.y}px`)},complete(){e.style.removeProperty("--md-tooltip-x"),e.style.removeProperty("--md-tooltip-y")}}),tt(e).pipe(W(a)).subscribe(s=>{e.toggleAttribute("data-md-visible",s)}),O(i.pipe(b(({active:s})=>s)),i.pipe(_e(250),b(({active:s})=>!s))).subscribe({next({active:s}){s?e.prepend(o):o.remove()},complete(){e.prepend(o)}}),i.pipe(Me(16,me)).subscribe(({active:s})=>{o.classList.toggle("md-tooltip--active",s)}),i.pipe(pt(125,me),b(()=>!!e.offsetParent),m(()=>e.offsetParent.getBoundingClientRect()),m(({x:s})=>s)).subscribe({next(s){s?e.style.setProperty("--md-tooltip-0",`${-s}px`):e.style.removeProperty("--md-tooltip-0")},complete(){e.style.removeProperty("--md-tooltip-0")}}),h(n,"click").pipe(W(a),b(s=>!(s.metaKey||s.ctrlKey))).subscribe(s=>{s.stopPropagation(),s.preventDefault()}),h(n,"mousedown").pipe(W(a),re(i)).subscribe(([s,{active:p}])=>{var c;if(s.button!==0||s.metaKey||s.ctrlKey)s.preventDefault();else if(p){s.preventDefault();let l=e.parentElement.closest(".md-annotation");l instanceof HTMLElement?l.focus():(c=Ie())==null||c.blur()}}),r.pipe(W(a),b(s=>s===o),Ge(125)).subscribe(()=>e.focus()),Ua(e,t).pipe(w(s=>i.next(s)),_(()=>i.complete()),m(s=>$({ref:e},s)))})}function Wa(e){return e.tagName==="CODE"?P(".c, .c1, .cm",e):[e]}function Da(e){let t=[];for(let r of Wa(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 a;for(;a=/(\(\d+\))(!)?/.exec(i.textContent);){let[,s,p]=a;if(typeof p=="undefined"){let c=i.splitText(a.index);i=c.splitText(s.length),t.push(c)}else{i.textContent=s,t.push(i);break}}}}return t}function Hn(e,t){t.append(...Array.from(e.childNodes))}function fr(e,t,{target$:r,print$:o}){let n=t.closest("[id]"),i=n==null?void 0:n.id,a=new Map;for(let s of Da(t)){let[,p]=s.textContent.match(/\((\d+)\)/);fe(`:scope > li:nth-child(${p})`,e)&&(a.set(p,Tn(p,i)),s.replaceWith(a.get(p)))}return a.size===0?S:C(()=>{let s=new g,p=s.pipe(Z(),ie(!0)),c=[];for(let[l,f]of a)c.push([R(".md-typeset",f),R(`:scope > li:nth-child(${l})`,e)]);return o.pipe(W(p)).subscribe(l=>{e.hidden=!l,e.classList.toggle("md-annotation-list",l);for(let[f,u]of c)l?Hn(f,u):Hn(u,f)}),O(...[...a].map(([,l])=>kn(l,t,{target$:r}))).pipe(_(()=>s.complete()),pe())})}function $n(e){if(e.nextElementSibling){let t=e.nextElementSibling;if(t.tagName==="OL")return t;if(t.tagName==="P"&&!t.children.length)return $n(t)}}function Pn(e,t){return C(()=>{let r=$n(e);return typeof r!="undefined"?fr(r,e,t):S})}var Rn=Mt(Br());var Va=0;function In(e){if(e.nextElementSibling){let t=e.nextElementSibling;if(t.tagName==="OL")return t;if(t.tagName==="P"&&!t.children.length)return In(t)}}function Na(e){return ge(e).pipe(m(({width:t})=>({scrollable:St(e).width>t})),ee("scrollable"))}function jn(e,t){let{matches:r}=matchMedia("(hover)"),o=C(()=>{let n=new g,i=n.pipe(jr(1));n.subscribe(({scrollable:c})=>{c&&r?e.setAttribute("tabindex","0"):e.removeAttribute("tabindex")});let a=[];if(Rn.default.isSupported()&&(e.closest(".copy")||B("content.code.copy")&&!e.closest(".no-copy"))){let c=e.closest("pre");c.id=`__code_${Va++}`;let l=Sn(c.id);c.insertBefore(l,e),B("content.tooltips")&&a.push(mt(l,{viewport$}))}let s=e.closest(".highlight");if(s instanceof HTMLElement){let c=In(s);if(typeof c!="undefined"&&(s.classList.contains("annotate")||B("content.code.annotate"))){let l=fr(c,e,t);a.push(ge(s).pipe(W(i),m(({width:f,height:u})=>f&&u),K(),v(f=>f?l:S)))}}return P(":scope > span[id]",e).length&&e.classList.add("md-code__content"),Na(e).pipe(w(c=>n.next(c)),_(()=>n.complete()),m(c=>$({ref:e},c)),Re(...a))});return B("content.lazy")?tt(e).pipe(b(n=>n),Te(1),v(()=>o)):o}function za(e,{target$:t,print$:r}){let o=!0;return O(t.pipe(m(n=>n.closest("details:not([open])")),b(n=>e===n),m(()=>({action:"open",reveal:!0}))),r.pipe(b(n=>n||!o),w(()=>o=e.open),m(n=>({action:n?"open":"close"}))))}function Fn(e,t){return C(()=>{let r=new g;return r.subscribe(({action:o,reveal:n})=>{e.toggleAttribute("open",o==="open"),n&&e.scrollIntoView()}),za(e,t).pipe(w(o=>r.next(o)),_(()=>r.complete()),m(o=>$({ref:e},o)))})}var Un=".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}.flowchartTitleText{fill:var(--md-mermaid-label-fg-color)}.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 p,.label div .edgeLabel{background-color:var(--md-mermaid-label-bg-color)}.edgeLabel,.edgeLabel p{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}.classDiagramTitleText{fill:var(--md-mermaid-label-fg-color)}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}.statediagramTitleText{fill:var(--md-mermaid-label-fg-color)}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,.nodeLabel p{color:var(--md-mermaid-label-fg-color);font-family:var(--md-mermaid-font-family)}a .nodeLabel{text-decoration:underline}.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)}.entityTitleText{fill:var(--md-mermaid-label-fg-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)}text:not([class]):last-child{fill:var(--md-mermaid-label-fg-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 Gr,Qa=0;function Ka(){return typeof mermaid=="undefined"||mermaid instanceof Element?Tt("https://unpkg.com/mermaid@11/dist/mermaid.min.js"):I(void 0)}function Wn(e){return e.classList.remove("mermaid"),Gr||(Gr=Ka().pipe(w(()=>mermaid.initialize({startOnLoad:!1,themeCSS:Un,sequence:{actorFontSize:"16px",messageFontSize:"16px",noteFontSize:"16px"}})),m(()=>{}),G(1))),Gr.subscribe(()=>co(this,null,function*(){e.classList.add("mermaid");let t=`__mermaid_${Qa++}`,r=x("div",{class:"mermaid"}),o=e.textContent,{svg:n,fn:i}=yield mermaid.render(t,o),a=r.attachShadow({mode:"closed"});a.innerHTML=n,e.replaceWith(r),i==null||i(a)})),Gr.pipe(m(()=>({ref:e})))}var Dn=x("table");function Vn(e){return e.replaceWith(Dn),Dn.replaceWith(An(e)),I({ref:e})}function Ya(e){let t=e.find(r=>r.checked)||e[0];return O(...e.map(r=>h(r,"change").pipe(m(()=>R(`label[for="${r.id}"]`))))).pipe(Q(R(`label[for="${t.id}"]`)),m(r=>({active:r})))}function Nn(e,{viewport$:t,target$:r}){let o=R(".tabbed-labels",e),n=P(":scope > input",e),i=Kr("prev");e.append(i);let a=Kr("next");return e.append(a),C(()=>{let s=new g,p=s.pipe(Z(),ie(!0));z([s,ge(e),tt(e)]).pipe(W(p),Me(1,me)).subscribe({next([{active:c},l]){let f=Ve(c),{width:u}=ce(c);e.style.setProperty("--md-indicator-x",`${f.x}px`),e.style.setProperty("--md-indicator-width",`${u}px`);let d=pr(o);(f.xd.x+l.width)&&o.scrollTo({left:Math.max(0,f.x-16),behavior:"smooth"})},complete(){e.style.removeProperty("--md-indicator-x"),e.style.removeProperty("--md-indicator-width")}}),z([Ne(o),ge(o)]).pipe(W(p)).subscribe(([c,l])=>{let f=St(o);i.hidden=c.x<16,a.hidden=c.x>f.width-l.width-16}),O(h(i,"click").pipe(m(()=>-1)),h(a,"click").pipe(m(()=>1))).pipe(W(p)).subscribe(c=>{let{width:l}=ce(o);o.scrollBy({left:l*c,behavior:"smooth"})}),r.pipe(W(p),b(c=>n.includes(c))).subscribe(c=>c.click()),o.classList.add("tabbed-labels--linked");for(let c of n){let l=R(`label[for="${c.id}"]`);l.replaceChildren(x("a",{href:`#${l.htmlFor}`,tabIndex:-1},...Array.from(l.childNodes))),h(l.firstElementChild,"click").pipe(W(p),b(f=>!(f.metaKey||f.ctrlKey)),w(f=>{f.preventDefault(),f.stopPropagation()})).subscribe(()=>{history.replaceState({},"",`#${l.htmlFor}`),l.click()})}return B("content.tabs.link")&&s.pipe(Ce(1),re(t)).subscribe(([{active:c},{offset:l}])=>{let f=c.innerText.trim();if(c.hasAttribute("data-md-switching"))c.removeAttribute("data-md-switching");else{let u=e.offsetTop-l.y;for(let y of P("[data-tabs]"))for(let L of P(":scope > input",y)){let X=R(`label[for="${L.id}"]`);if(X!==c&&X.innerText.trim()===f){X.setAttribute("data-md-switching",""),L.click();break}}window.scrollTo({top:e.offsetTop-u});let d=__md_get("__tabs")||[];__md_set("__tabs",[...new Set([f,...d])])}}),s.pipe(W(p)).subscribe(()=>{for(let c of P("audio, video",e))c.pause()}),Ya(n).pipe(w(c=>s.next(c)),_(()=>s.complete()),m(c=>$({ref:e},c)))}).pipe(Ke(se))}function zn(e,{viewport$:t,target$:r,print$:o}){return O(...P(".annotate:not(.highlight)",e).map(n=>Pn(n,{target$:r,print$:o})),...P("pre:not(.mermaid) > code",e).map(n=>jn(n,{target$:r,print$:o})),...P("pre.mermaid",e).map(n=>Wn(n)),...P("table:not([class])",e).map(n=>Vn(n)),...P("details",e).map(n=>Fn(n,{target$:r,print$:o})),...P("[data-tabs]",e).map(n=>Nn(n,{viewport$:t,target$:r})),...P("[title]",e).filter(()=>B("content.tooltips")).map(n=>mt(n,{viewport$:t})))}function Ba(e,{alert$:t}){return t.pipe(v(r=>O(I(!0),I(!1).pipe(Ge(2e3))).pipe(m(o=>({message:r,active:o})))))}function qn(e,t){let r=R(".md-typeset",e);return C(()=>{let o=new g;return o.subscribe(({message:n,active:i})=>{e.classList.toggle("md-dialog--active",i),r.textContent=n}),Ba(e,t).pipe(w(n=>o.next(n)),_(()=>o.complete()),m(n=>$({ref:e},n)))})}var Ga=0;function Ja(e,t){document.body.append(e);let{width:r}=ce(e);e.style.setProperty("--md-tooltip-width",`${r}px`),e.remove();let o=cr(t),n=typeof o!="undefined"?Ne(o):I({x:0,y:0}),i=O(et(t),$t(t)).pipe(K());return z([i,n]).pipe(m(([a,s])=>{let{x:p,y:c}=Ve(t),l=ce(t),f=t.closest("table");return f&&t.parentElement&&(p+=f.offsetLeft+t.parentElement.offsetLeft,c+=f.offsetTop+t.parentElement.offsetTop),{active:a,offset:{x:p-s.x+l.width/2-r/2,y:c-s.y+l.height+8}}}))}function Qn(e){let t=e.title;if(!t.length)return S;let r=`__tooltip_${Ga++}`,o=Rt(r,"inline"),n=R(".md-typeset",o);return n.innerHTML=t,C(()=>{let i=new g;return i.subscribe({next({offset:a}){o.style.setProperty("--md-tooltip-x",`${a.x}px`),o.style.setProperty("--md-tooltip-y",`${a.y}px`)},complete(){o.style.removeProperty("--md-tooltip-x"),o.style.removeProperty("--md-tooltip-y")}}),O(i.pipe(b(({active:a})=>a)),i.pipe(_e(250),b(({active:a})=>!a))).subscribe({next({active:a}){a?(e.insertAdjacentElement("afterend",o),e.setAttribute("aria-describedby",r),e.removeAttribute("title")):(o.remove(),e.removeAttribute("aria-describedby"),e.setAttribute("title",t))},complete(){o.remove(),e.removeAttribute("aria-describedby"),e.setAttribute("title",t)}}),i.pipe(Me(16,me)).subscribe(({active:a})=>{o.classList.toggle("md-tooltip--active",a)}),i.pipe(pt(125,me),b(()=>!!e.offsetParent),m(()=>e.offsetParent.getBoundingClientRect()),m(({x:a})=>a)).subscribe({next(a){a?o.style.setProperty("--md-tooltip-0",`${-a}px`):o.style.removeProperty("--md-tooltip-0")},complete(){o.style.removeProperty("--md-tooltip-0")}}),Ja(o,e).pipe(w(a=>i.next(a)),_(()=>i.complete()),m(a=>$({ref:e},a)))}).pipe(Ke(se))}function Xa({viewport$:e}){if(!B("header.autohide"))return I(!1);let t=e.pipe(m(({offset:{y:n}})=>n),Be(2,1),m(([n,i])=>[nMath.abs(i-n.y)>100),m(([,[n]])=>n),K()),o=ze("search");return z([e,o]).pipe(m(([{offset:n},i])=>n.y>400&&!i),K(),v(n=>n?r:I(!1)),Q(!1))}function Kn(e,t){return C(()=>z([ge(e),Xa(t)])).pipe(m(([{height:r},o])=>({height:r,hidden:o})),K((r,o)=>r.height===o.height&&r.hidden===o.hidden),G(1))}function Yn(e,{header$:t,main$:r}){return C(()=>{let o=new g,n=o.pipe(Z(),ie(!0));o.pipe(ee("active"),He(t)).subscribe(([{active:a},{hidden:s}])=>{e.classList.toggle("md-header--shadow",a&&!s),e.hidden=s});let i=ue(P("[title]",e)).pipe(b(()=>B("content.tooltips")),ne(a=>Qn(a)));return r.subscribe(o),t.pipe(W(n),m(a=>$({ref:e},a)),Re(i.pipe(W(n))))})}function Za(e,{viewport$:t,header$:r}){return mr(e,{viewport$:t,header$:r}).pipe(m(({offset:{y:o}})=>{let{height:n}=ce(e);return{active:o>=n}}),ee("active"))}function Bn(e,t){return C(()=>{let r=new g;r.subscribe({next({active:n}){e.classList.toggle("md-header__title--active",n)},complete(){e.classList.remove("md-header__title--active")}});let o=fe(".md-content h1");return typeof o=="undefined"?S:Za(o,t).pipe(w(n=>r.next(n)),_(()=>r.complete()),m(n=>$({ref:e},n)))})}function Gn(e,{viewport$:t,header$:r}){let o=r.pipe(m(({height:i})=>i),K()),n=o.pipe(v(()=>ge(e).pipe(m(({height:i})=>({top:e.offsetTop,bottom:e.offsetTop+i})),ee("bottom"))));return z([o,n,t]).pipe(m(([i,{top:a,bottom:s},{offset:{y:p},size:{height:c}}])=>(c=Math.max(0,c-Math.max(0,a-p,i)-Math.max(0,c+p-s)),{offset:a-i,height:c,active:a-i<=p})),K((i,a)=>i.offset===a.offset&&i.height===a.height&&i.active===a.active))}function es(e){let t=__md_get("__palette")||{index:e.findIndex(o=>matchMedia(o.getAttribute("data-md-color-media")).matches)},r=Math.max(0,Math.min(t.index,e.length-1));return I(...e).pipe(ne(o=>h(o,"change").pipe(m(()=>o))),Q(e[r]),m(o=>({index:e.indexOf(o),color:{media:o.getAttribute("data-md-color-media"),scheme:o.getAttribute("data-md-color-scheme"),primary:o.getAttribute("data-md-color-primary"),accent:o.getAttribute("data-md-color-accent")}})),G(1))}function Jn(e){let t=P("input",e),r=x("meta",{name:"theme-color"});document.head.appendChild(r);let o=x("meta",{name:"color-scheme"});document.head.appendChild(o);let n=Pt("(prefers-color-scheme: light)");return C(()=>{let i=new g;return i.subscribe(a=>{if(document.body.setAttribute("data-md-color-switching",""),a.color.media==="(prefers-color-scheme)"){let s=matchMedia("(prefers-color-scheme: light)"),p=document.querySelector(s.matches?"[data-md-color-media='(prefers-color-scheme: light)']":"[data-md-color-media='(prefers-color-scheme: dark)']");a.color.scheme=p.getAttribute("data-md-color-scheme"),a.color.primary=p.getAttribute("data-md-color-primary"),a.color.accent=p.getAttribute("data-md-color-accent")}for(let[s,p]of Object.entries(a.color))document.body.setAttribute(`data-md-color-${s}`,p);for(let s=0;sa.key==="Enter"),re(i,(a,s)=>s)).subscribe(({index:a})=>{a=(a+1)%t.length,t[a].click(),t[a].focus()}),i.pipe(m(()=>{let a=Se("header"),s=window.getComputedStyle(a);return o.content=s.colorScheme,s.backgroundColor.match(/\d+/g).map(p=>(+p).toString(16).padStart(2,"0")).join("")})).subscribe(a=>r.content=`#${a}`),i.pipe(ve(se)).subscribe(()=>{document.body.removeAttribute("data-md-color-switching")}),es(t).pipe(W(n.pipe(Ce(1))),ct(),w(a=>i.next(a)),_(()=>i.complete()),m(a=>$({ref:e},a)))})}function Xn(e,{progress$:t}){return C(()=>{let r=new g;return r.subscribe(({value:o})=>{e.style.setProperty("--md-progress-value",`${o}`)}),t.pipe(w(o=>r.next({value:o})),_(()=>r.complete()),m(o=>({ref:e,value:o})))})}var Jr=Mt(Br());function ts(e){e.setAttribute("data-md-copying","");let t=e.closest("[data-copy]"),r=t?t.getAttribute("data-copy"):e.innerText;return e.removeAttribute("data-md-copying"),r.trimEnd()}function Zn({alert$:e}){Jr.default.isSupported()&&new j(t=>{new Jr.default("[data-clipboard-target], [data-clipboard-text]",{text:r=>r.getAttribute("data-clipboard-text")||ts(R(r.getAttribute("data-clipboard-target")))}).on("success",r=>t.next(r))}).pipe(w(t=>{t.trigger.focus()}),m(()=>Ee("clipboard.copied"))).subscribe(e)}function ei(e,t){return e.protocol=t.protocol,e.hostname=t.hostname,e}function rs(e,t){let r=new Map;for(let o of P("url",e)){let n=R("loc",o),i=[ei(new URL(n.textContent),t)];r.set(`${i[0]}`,i);for(let a of P("[rel=alternate]",o)){let s=a.getAttribute("href");s!=null&&i.push(ei(new URL(s),t))}}return r}function ur(e){return un(new URL("sitemap.xml",e)).pipe(m(t=>rs(t,new URL(e))),de(()=>I(new Map)))}function os(e,t){if(!(e.target instanceof Element))return S;let r=e.target.closest("a");if(r===null)return S;if(r.target||e.metaKey||e.ctrlKey)return S;let o=new URL(r.href);return o.search=o.hash="",t.has(`${o}`)?(e.preventDefault(),I(new URL(r.href))):S}function ti(e){let t=new Map;for(let r of P(":scope > *",e.head))t.set(r.outerHTML,r);return t}function ri(e){for(let t of P("[href], [src]",e))for(let r of["href","src"]){let o=t.getAttribute(r);if(o&&!/^(?:[a-z]+:)?\/\//i.test(o)){t[r]=t[r];break}}return I(e)}function ns(e){for(let o of["[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]",...B("navigation.tabs.sticky")?["[data-md-component=tabs]"]:[]]){let n=fe(o),i=fe(o,e);typeof n!="undefined"&&typeof i!="undefined"&&n.replaceWith(i)}let t=ti(document);for(let[o,n]of ti(e))t.has(o)?t.delete(o):document.head.appendChild(n);for(let o of t.values()){let n=o.getAttribute("name");n!=="theme-color"&&n!=="color-scheme"&&o.remove()}let r=Se("container");return We(P("script",r)).pipe(v(o=>{let n=e.createElement("script");if(o.src){for(let i of o.getAttributeNames())n.setAttribute(i,o.getAttribute(i));return o.replaceWith(n),new j(i=>{n.onload=()=>i.complete()})}else return n.textContent=o.textContent,o.replaceWith(n),S}),Z(),ie(document))}function oi({location$:e,viewport$:t,progress$:r}){let o=xe();if(location.protocol==="file:")return S;let n=ur(o.base);I(document).subscribe(ri);let i=h(document.body,"click").pipe(He(n),v(([p,c])=>os(p,c)),pe()),a=h(window,"popstate").pipe(m(ye),pe());i.pipe(re(t)).subscribe(([p,{offset:c}])=>{history.replaceState(c,""),history.pushState(null,"",p)}),O(i,a).subscribe(e);let s=e.pipe(ee("pathname"),v(p=>fn(p,{progress$:r}).pipe(de(()=>(lt(p,!0),S)))),v(ri),v(ns),pe());return O(s.pipe(re(e,(p,c)=>c)),s.pipe(v(()=>e),ee("pathname"),v(()=>e),ee("hash")),e.pipe(K((p,c)=>p.pathname===c.pathname&&p.hash===c.hash),v(()=>i),w(()=>history.back()))).subscribe(p=>{var c,l;history.state!==null||!p.hash?window.scrollTo(0,(l=(c=history.state)==null?void 0:c.y)!=null?l:0):(history.scrollRestoration="auto",pn(p.hash),history.scrollRestoration="manual")}),e.subscribe(()=>{history.scrollRestoration="manual"}),h(window,"beforeunload").subscribe(()=>{history.scrollRestoration="auto"}),t.pipe(ee("offset"),_e(100)).subscribe(({offset:p})=>{history.replaceState(p,"")}),s}var ni=Mt(qr());function ii(e){let t=e.separator.split("|").map(n=>n.replace(/(\(\?[!=<][^)]+\))/g,"").length===0?"\uFFFD":n).join("|"),r=new RegExp(t,"img"),o=(n,i,a)=>`${i}${a}`;return n=>{n=n.replace(/[\s*+\-:~^]+/g," ").trim();let i=new RegExp(`(^|${e.separator}|)(${n.replace(/[|\\{}()[\]^$+*?.-]/g,"\\$&").replace(r,"|")})`,"img");return a=>(0,ni.default)(a).replace(i,o).replace(/<\/mark>(\s+)]*>/img,"$1")}}function jt(e){return e.type===1}function dr(e){return e.type===3}function ai(e,t){let r=yn(e);return O(I(location.protocol!=="file:"),ze("search")).pipe(Ae(o=>o),v(()=>t)).subscribe(({config:o,docs:n})=>r.next({type:0,data:{config:o,docs:n,options:{suggest:B("search.suggest")}}})),r}function si(e){var l;let{selectedVersionSitemap:t,selectedVersionBaseURL:r,currentLocation:o,currentBaseURL:n}=e,i=(l=Xr(n))==null?void 0:l.pathname;if(i===void 0)return;let a=ss(o.pathname,i);if(a===void 0)return;let s=ps(t.keys());if(!t.has(s))return;let p=Xr(a,s);if(!p||!t.has(p.href))return;let c=Xr(a,r);if(c)return c.hash=o.hash,c.search=o.search,c}function Xr(e,t){try{return new URL(e,t)}catch(r){return}}function ss(e,t){if(e.startsWith(t))return e.slice(t.length)}function cs(e,t){let r=Math.min(e.length,t.length),o;for(o=0;oS)),o=r.pipe(m(n=>{let[,i]=t.base.match(/([^/]+)\/?$/);return n.find(({version:a,aliases:s})=>a===i||s.includes(i))||n[0]}));r.pipe(m(n=>new Map(n.map(i=>[`${new URL(`../${i.version}/`,t.base)}`,i]))),v(n=>h(document.body,"click").pipe(b(i=>!i.metaKey&&!i.ctrlKey),re(o),v(([i,a])=>{if(i.target instanceof Element){let s=i.target.closest("a");if(s&&!s.target&&n.has(s.href)){let p=s.href;return!i.target.closest(".md-version")&&n.get(p)===a?S:(i.preventDefault(),I(new URL(p)))}}return S}),v(i=>ur(i).pipe(m(a=>{var s;return(s=si({selectedVersionSitemap:a,selectedVersionBaseURL:i,currentLocation:ye(),currentBaseURL:t.base}))!=null?s:i})))))).subscribe(n=>lt(n,!0)),z([r,o]).subscribe(([n,i])=>{R(".md-header__topic").appendChild(Cn(n,i))}),e.pipe(v(()=>o)).subscribe(n=>{var a;let i=__md_get("__outdated",sessionStorage);if(i===null){i=!0;let s=((a=t.version)==null?void 0:a.default)||"latest";Array.isArray(s)||(s=[s]);e:for(let p of s)for(let c of n.aliases.concat(n.version))if(new RegExp(p,"i").test(c)){i=!1;break e}__md_set("__outdated",i,sessionStorage)}if(i)for(let s of ae("outdated"))s.hidden=!1})}function ls(e,{worker$:t}){let{searchParams:r}=ye();r.has("q")&&(Je("search",!0),e.value=r.get("q"),e.focus(),ze("search").pipe(Ae(i=>!i)).subscribe(()=>{let i=ye();i.searchParams.delete("q"),history.replaceState({},"",`${i}`)}));let o=et(e),n=O(t.pipe(Ae(jt)),h(e,"keyup"),o).pipe(m(()=>e.value),K());return z([n,o]).pipe(m(([i,a])=>({value:i,focus:a})),G(1))}function pi(e,{worker$:t}){let r=new g,o=r.pipe(Z(),ie(!0));z([t.pipe(Ae(jt)),r],(i,a)=>a).pipe(ee("value")).subscribe(({value:i})=>t.next({type:2,data:i})),r.pipe(ee("focus")).subscribe(({focus:i})=>{i&&Je("search",i)}),h(e.form,"reset").pipe(W(o)).subscribe(()=>e.focus());let n=R("header [for=__search]");return h(n,"click").subscribe(()=>e.focus()),ls(e,{worker$:t}).pipe(w(i=>r.next(i)),_(()=>r.complete()),m(i=>$({ref:e},i)),G(1))}function li(e,{worker$:t,query$:r}){let o=new g,n=on(e.parentElement).pipe(b(Boolean)),i=e.parentElement,a=R(":scope > :first-child",e),s=R(":scope > :last-child",e);ze("search").subscribe(l=>s.setAttribute("role",l?"list":"presentation")),o.pipe(re(r),Wr(t.pipe(Ae(jt)))).subscribe(([{items:l},{value:f}])=>{switch(l.length){case 0:a.textContent=f.length?Ee("search.result.none"):Ee("search.result.placeholder");break;case 1:a.textContent=Ee("search.result.one");break;default:let u=sr(l.length);a.textContent=Ee("search.result.other",u)}});let p=o.pipe(w(()=>s.innerHTML=""),v(({items:l})=>O(I(...l.slice(0,10)),I(...l.slice(10)).pipe(Be(4),Vr(n),v(([f])=>f)))),m(Mn),pe());return p.subscribe(l=>s.appendChild(l)),p.pipe(ne(l=>{let f=fe("details",l);return typeof f=="undefined"?S:h(f,"toggle").pipe(W(o),m(()=>f))})).subscribe(l=>{l.open===!1&&l.offsetTop<=i.scrollTop&&i.scrollTo({top:l.offsetTop})}),t.pipe(b(dr),m(({data:l})=>l)).pipe(w(l=>o.next(l)),_(()=>o.complete()),m(l=>$({ref:e},l)))}function ms(e,{query$:t}){return t.pipe(m(({value:r})=>{let o=ye();return o.hash="",r=r.replace(/\s+/g,"+").replace(/&/g,"%26").replace(/=/g,"%3D"),o.search=`q=${r}`,{url:o}}))}function mi(e,t){let r=new g,o=r.pipe(Z(),ie(!0));return r.subscribe(({url:n})=>{e.setAttribute("data-clipboard-text",e.href),e.href=`${n}`}),h(e,"click").pipe(W(o)).subscribe(n=>n.preventDefault()),ms(e,t).pipe(w(n=>r.next(n)),_(()=>r.complete()),m(n=>$({ref:e},n)))}function fi(e,{worker$:t,keyboard$:r}){let o=new g,n=Se("search-query"),i=O(h(n,"keydown"),h(n,"focus")).pipe(ve(se),m(()=>n.value),K());return o.pipe(He(i),m(([{suggest:s},p])=>{let c=p.split(/([\s-]+)/);if(s!=null&&s.length&&c[c.length-1]){let l=s[s.length-1];l.startsWith(c[c.length-1])&&(c[c.length-1]=l)}else c.length=0;return c})).subscribe(s=>e.innerHTML=s.join("").replace(/\s/g," ")),r.pipe(b(({mode:s})=>s==="search")).subscribe(s=>{switch(s.type){case"ArrowRight":e.innerText.length&&n.selectionStart===n.value.length&&(n.value=e.innerText);break}}),t.pipe(b(dr),m(({data:s})=>s)).pipe(w(s=>o.next(s)),_(()=>o.complete()),m(()=>({ref:e})))}function ui(e,{index$:t,keyboard$:r}){let o=xe();try{let n=ai(o.search,t),i=Se("search-query",e),a=Se("search-result",e);h(e,"click").pipe(b(({target:p})=>p instanceof Element&&!!p.closest("a"))).subscribe(()=>Je("search",!1)),r.pipe(b(({mode:p})=>p==="search")).subscribe(p=>{let c=Ie();switch(p.type){case"Enter":if(c===i){let l=new Map;for(let f of P(":first-child [href]",a)){let u=f.firstElementChild;l.set(f,parseFloat(u.getAttribute("data-md-score")))}if(l.size){let[[f]]=[...l].sort(([,u],[,d])=>d-u);f.click()}p.claim()}break;case"Escape":case"Tab":Je("search",!1),i.blur();break;case"ArrowUp":case"ArrowDown":if(typeof c=="undefined")i.focus();else{let l=[i,...P(":not(details) > [href], summary, details[open] [href]",a)],f=Math.max(0,(Math.max(0,l.indexOf(c))+l.length+(p.type==="ArrowUp"?-1:1))%l.length);l[f].focus()}p.claim();break;default:i!==Ie()&&i.focus()}}),r.pipe(b(({mode:p})=>p==="global")).subscribe(p=>{switch(p.type){case"f":case"s":case"/":i.focus(),i.select(),p.claim();break}});let s=pi(i,{worker$:n});return O(s,li(a,{worker$:n,query$:s})).pipe(Re(...ae("search-share",e).map(p=>mi(p,{query$:s})),...ae("search-suggest",e).map(p=>fi(p,{worker$:n,keyboard$:r}))))}catch(n){return e.hidden=!0,Ye}}function di(e,{index$:t,location$:r}){return z([t,r.pipe(Q(ye()),b(o=>!!o.searchParams.get("h")))]).pipe(m(([o,n])=>ii(o.config)(n.searchParams.get("h"))),m(o=>{var a;let n=new Map,i=document.createNodeIterator(e,NodeFilter.SHOW_TEXT);for(let s=i.nextNode();s;s=i.nextNode())if((a=s.parentElement)!=null&&a.offsetHeight){let p=s.textContent,c=o(p);c.length>p.length&&n.set(s,c)}for(let[s,p]of n){let{childNodes:c}=x("span",null,p);s.replaceWith(...Array.from(c))}return{ref:e,nodes:n}}))}function fs(e,{viewport$:t,main$:r}){let o=e.closest(".md-grid"),n=o.offsetTop-o.parentElement.offsetTop;return z([r,t]).pipe(m(([{offset:i,height:a},{offset:{y:s}}])=>(a=a+Math.min(n,Math.max(0,s-i))-n,{height:a,locked:s>=i+n})),K((i,a)=>i.height===a.height&&i.locked===a.locked))}function Zr(e,o){var n=o,{header$:t}=n,r=so(n,["header$"]);let i=R(".md-sidebar__scrollwrap",e),{y:a}=Ve(i);return C(()=>{let s=new g,p=s.pipe(Z(),ie(!0)),c=s.pipe(Me(0,me));return c.pipe(re(t)).subscribe({next([{height:l},{height:f}]){i.style.height=`${l-2*a}px`,e.style.top=`${f}px`},complete(){i.style.height="",e.style.top=""}}),c.pipe(Ae()).subscribe(()=>{for(let l of P(".md-nav__link--active[href]",e)){if(!l.clientHeight)continue;let f=l.closest(".md-sidebar__scrollwrap");if(typeof f!="undefined"){let u=l.offsetTop-f.offsetTop,{height:d}=ce(f);f.scrollTo({top:u-d/2})}}}),ue(P("label[tabindex]",e)).pipe(ne(l=>h(l,"click").pipe(ve(se),m(()=>l),W(p)))).subscribe(l=>{let f=R(`[id="${l.htmlFor}"]`);R(`[aria-labelledby="${l.id}"]`).setAttribute("aria-expanded",`${f.checked}`)}),fs(e,r).pipe(w(l=>s.next(l)),_(()=>s.complete()),m(l=>$({ref:e},l)))})}function hi(e,t){if(typeof t!="undefined"){let r=`https://api.github.com/repos/${e}/${t}`;return st(je(`${r}/releases/latest`).pipe(de(()=>S),m(o=>({version:o.tag_name})),De({})),je(r).pipe(de(()=>S),m(o=>({stars:o.stargazers_count,forks:o.forks_count})),De({}))).pipe(m(([o,n])=>$($({},o),n)))}else{let r=`https://api.github.com/users/${e}`;return je(r).pipe(m(o=>({repositories:o.public_repos})),De({}))}}function bi(e,t){let r=`https://${e}/api/v4/projects/${encodeURIComponent(t)}`;return st(je(`${r}/releases/permalink/latest`).pipe(de(()=>S),m(({tag_name:o})=>({version:o})),De({})),je(r).pipe(de(()=>S),m(({star_count:o,forks_count:n})=>({stars:o,forks:n})),De({}))).pipe(m(([o,n])=>$($({},o),n)))}function vi(e){let t=e.match(/^.+github\.com\/([^/]+)\/?([^/]+)?/i);if(t){let[,r,o]=t;return hi(r,o)}if(t=e.match(/^.+?([^/]*gitlab[^/]+)\/(.+?)\/?$/i),t){let[,r,o]=t;return bi(r,o)}return S}var us;function ds(e){return us||(us=C(()=>{let t=__md_get("__source",sessionStorage);if(t)return I(t);if(ae("consent").length){let o=__md_get("__consent");if(!(o&&o.github))return S}return vi(e.href).pipe(w(o=>__md_set("__source",o,sessionStorage)))}).pipe(de(()=>S),b(t=>Object.keys(t).length>0),m(t=>({facts:t})),G(1)))}function gi(e){let t=R(":scope > :last-child",e);return C(()=>{let r=new g;return r.subscribe(({facts:o})=>{t.appendChild(_n(o)),t.classList.add("md-source__repository--active")}),ds(e).pipe(w(o=>r.next(o)),_(()=>r.complete()),m(o=>$({ref:e},o)))})}function hs(e,{viewport$:t,header$:r}){return ge(document.body).pipe(v(()=>mr(e,{header$:r,viewport$:t})),m(({offset:{y:o}})=>({hidden:o>=10})),ee("hidden"))}function yi(e,t){return C(()=>{let r=new g;return r.subscribe({next({hidden:o}){e.hidden=o},complete(){e.hidden=!1}}),(B("navigation.tabs.sticky")?I({hidden:!1}):hs(e,t)).pipe(w(o=>r.next(o)),_(()=>r.complete()),m(o=>$({ref:e},o)))})}function bs(e,{viewport$:t,header$:r}){let o=new Map,n=P(".md-nav__link",e);for(let s of n){let p=decodeURIComponent(s.hash.substring(1)),c=fe(`[id="${p}"]`);typeof c!="undefined"&&o.set(s,c)}let i=r.pipe(ee("height"),m(({height:s})=>{let p=Se("main"),c=R(":scope > :first-child",p);return s+.8*(c.offsetTop-p.offsetTop)}),pe());return ge(document.body).pipe(ee("height"),v(s=>C(()=>{let p=[];return I([...o].reduce((c,[l,f])=>{for(;p.length&&o.get(p[p.length-1]).tagName>=f.tagName;)p.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 c.set([...p=[...p,l]].reverse(),u)},new Map))}).pipe(m(p=>new Map([...p].sort(([,c],[,l])=>c-l))),He(i),v(([p,c])=>t.pipe(Fr(([l,f],{offset:{y:u},size:d})=>{let y=u+d.height>=Math.floor(s.height);for(;f.length;){let[,L]=f[0];if(L-c=u&&!y)f=[l.pop(),...f];else break}return[l,f]},[[],[...p]]),K((l,f)=>l[0]===f[0]&&l[1]===f[1])))))).pipe(m(([s,p])=>({prev:s.map(([c])=>c),next:p.map(([c])=>c)})),Q({prev:[],next:[]}),Be(2,1),m(([s,p])=>s.prev.length{let i=new g,a=i.pipe(Z(),ie(!0));if(i.subscribe(({prev:s,next:p})=>{for(let[c]of p)c.classList.remove("md-nav__link--passed"),c.classList.remove("md-nav__link--active");for(let[c,[l]]of s.entries())l.classList.add("md-nav__link--passed"),l.classList.toggle("md-nav__link--active",c===s.length-1)}),B("toc.follow")){let s=O(t.pipe(_e(1),m(()=>{})),t.pipe(_e(250),m(()=>"smooth")));i.pipe(b(({prev:p})=>p.length>0),He(o.pipe(ve(se))),re(s)).subscribe(([[{prev:p}],c])=>{let[l]=p[p.length-1];if(l.offsetHeight){let f=cr(l);if(typeof f!="undefined"){let u=l.offsetTop-f.offsetTop,{height:d}=ce(f);f.scrollTo({top:u-d/2,behavior:c})}}})}return B("navigation.tracking")&&t.pipe(W(a),ee("offset"),_e(250),Ce(1),W(n.pipe(Ce(1))),ct({delay:250}),re(i)).subscribe(([,{prev:s}])=>{let p=ye(),c=s[s.length-1];if(c&&c.length){let[l]=c,{hash:f}=new URL(l.href);p.hash!==f&&(p.hash=f,history.replaceState({},"",`${p}`))}else p.hash="",history.replaceState({},"",`${p}`)}),bs(e,{viewport$:t,header$:r}).pipe(w(s=>i.next(s)),_(()=>i.complete()),m(s=>$({ref:e},s)))})}function vs(e,{viewport$:t,main$:r,target$:o}){let n=t.pipe(m(({offset:{y:a}})=>a),Be(2,1),m(([a,s])=>a>s&&s>0),K()),i=r.pipe(m(({active:a})=>a));return z([i,n]).pipe(m(([a,s])=>!(a&&s)),K(),W(o.pipe(Ce(1))),ie(!0),ct({delay:250}),m(a=>({hidden:a})))}function Ei(e,{viewport$:t,header$:r,main$:o,target$:n}){let i=new g,a=i.pipe(Z(),ie(!0));return i.subscribe({next({hidden:s}){e.hidden=s,s?(e.setAttribute("tabindex","-1"),e.blur()):e.removeAttribute("tabindex")},complete(){e.style.top="",e.hidden=!0,e.removeAttribute("tabindex")}}),r.pipe(W(a),ee("height")).subscribe(({height:s})=>{e.style.top=`${s+16}px`}),h(e,"click").subscribe(s=>{s.preventDefault(),window.scrollTo({top:0})}),vs(e,{viewport$:t,main$:o,target$:n}).pipe(w(s=>i.next(s)),_(()=>i.complete()),m(s=>$({ref:e},s)))}function wi({document$:e,viewport$:t}){e.pipe(v(()=>P(".md-ellipsis")),ne(r=>tt(r).pipe(W(e.pipe(Ce(1))),b(o=>o),m(()=>r),Te(1))),b(r=>r.offsetWidth{let o=r.innerText,n=r.closest("a")||r;return n.title=o,B("content.tooltips")?mt(n,{viewport$:t}).pipe(W(e.pipe(Ce(1))),_(()=>n.removeAttribute("title"))):S})).subscribe(),B("content.tooltips")&&e.pipe(v(()=>P(".md-status")),ne(r=>mt(r,{viewport$:t}))).subscribe()}function Ti({document$:e,tablet$:t}){e.pipe(v(()=>P(".md-toggle--indeterminate")),w(r=>{r.indeterminate=!0,r.checked=!1}),ne(r=>h(r,"change").pipe(Dr(()=>r.classList.contains("md-toggle--indeterminate")),m(()=>r))),re(t)).subscribe(([r,o])=>{r.classList.remove("md-toggle--indeterminate"),o&&(r.checked=!1)})}function gs(){return/(iPad|iPhone|iPod)/.test(navigator.userAgent)}function Si({document$:e}){e.pipe(v(()=>P("[data-md-scrollfix]")),w(t=>t.removeAttribute("data-md-scrollfix")),b(gs),ne(t=>h(t,"touchstart").pipe(m(()=>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}){z([ze("search"),t]).pipe(m(([r,o])=>r&&!o),v(r=>I(r).pipe(Ge(r?400:100))),re(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 ys(){return location.protocol==="file:"?Tt(`${new URL("search/search_index.js",eo.base)}`).pipe(m(()=>__index),G(1)):je(new URL("search/search_index.json",eo.base))}document.documentElement.classList.remove("no-js");document.documentElement.classList.add("js");var ot=Go(),Ut=sn(),Lt=ln(Ut),to=an(),Oe=gn(),hr=Pt("(min-width: 960px)"),Mi=Pt("(min-width: 1220px)"),_i=mn(),eo=xe(),Ai=document.forms.namedItem("search")?ys():Ye,ro=new g;Zn({alert$:ro});var oo=new g;B("navigation.instant")&&oi({location$:Ut,viewport$:Oe,progress$:oo}).subscribe(ot);var Li;((Li=eo.version)==null?void 0:Li.provider)==="mike"&&ci({document$:ot});O(Ut,Lt).pipe(Ge(125)).subscribe(()=>{Je("drawer",!1),Je("search",!1)});to.pipe(b(({mode:e})=>e==="global")).subscribe(e=>{switch(e.type){case"p":case",":let t=fe("link[rel=prev]");typeof t!="undefined"&<(t);break;case"n":case".":let r=fe("link[rel=next]");typeof r!="undefined"&<(r);break;case"Enter":let o=Ie();o instanceof HTMLLabelElement&&o.click()}});wi({viewport$:Oe,document$:ot});Ti({document$:ot,tablet$:hr});Si({document$:ot});Oi({viewport$:Oe,tablet$:hr});var rt=Kn(Se("header"),{viewport$:Oe}),Ft=ot.pipe(m(()=>Se("main")),v(e=>Gn(e,{viewport$:Oe,header$:rt})),G(1)),xs=O(...ae("consent").map(e=>En(e,{target$:Lt})),...ae("dialog").map(e=>qn(e,{alert$:ro})),...ae("palette").map(e=>Jn(e)),...ae("progress").map(e=>Xn(e,{progress$:oo})),...ae("search").map(e=>ui(e,{index$:Ai,keyboard$:to})),...ae("source").map(e=>gi(e))),Es=C(()=>O(...ae("announce").map(e=>xn(e)),...ae("content").map(e=>zn(e,{viewport$:Oe,target$:Lt,print$:_i})),...ae("content").map(e=>B("search.highlight")?di(e,{index$:Ai,location$:Ut}):S),...ae("header").map(e=>Yn(e,{viewport$:Oe,header$:rt,main$:Ft})),...ae("header-title").map(e=>Bn(e,{viewport$:Oe,header$:rt})),...ae("sidebar").map(e=>e.getAttribute("data-md-type")==="navigation"?Nr(Mi,()=>Zr(e,{viewport$:Oe,header$:rt,main$:Ft})):Nr(hr,()=>Zr(e,{viewport$:Oe,header$:rt,main$:Ft}))),...ae("tabs").map(e=>yi(e,{viewport$:Oe,header$:rt})),...ae("toc").map(e=>xi(e,{viewport$:Oe,header$:rt,main$:Ft,target$:Lt})),...ae("top").map(e=>Ei(e,{viewport$:Oe,header$:rt,main$:Ft,target$:Lt})))),Ci=ot.pipe(v(()=>Es),Re(xs),G(1));Ci.subscribe();window.document$=ot;window.location$=Ut;window.target$=Lt;window.keyboard$=to;window.viewport$=Oe;window.tablet$=hr;window.screen$=Mi;window.print$=_i;window.alert$=ro;window.progress$=oo;window.component$=Ci;})(); +//# sourceMappingURL=bundle.88dd0f4e.min.js.map + diff --git a/assets/javascripts/bundle.88dd0f4e.min.js.map b/assets/javascripts/bundle.88dd0f4e.min.js.map new file mode 100644 index 0000000..dab2a87 --- /dev/null +++ b/assets/javascripts/bundle.88dd0f4e.min.js.map @@ -0,0 +1,7 @@ +{ + "version": 3, + "sources": ["node_modules/focus-visible/dist/focus-visible.js", "node_modules/escape-html/index.js", "node_modules/clipboard/dist/clipboard.js", "src/templates/assets/javascripts/bundle.ts", "node_modules/tslib/tslib.es6.mjs", "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/BehaviorSubject.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/QueueAction.ts", "node_modules/rxjs/src/internal/scheduler/QueueScheduler.ts", "node_modules/rxjs/src/internal/scheduler/queue.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/debounce.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/takeLast.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/templates/assets/javascripts/browser/document/index.ts", "src/templates/assets/javascripts/browser/element/_/index.ts", "src/templates/assets/javascripts/browser/element/focus/index.ts", "src/templates/assets/javascripts/browser/element/hover/index.ts", "src/templates/assets/javascripts/utilities/h/index.ts", "src/templates/assets/javascripts/utilities/round/index.ts", "src/templates/assets/javascripts/browser/script/index.ts", "src/templates/assets/javascripts/browser/element/size/_/index.ts", "src/templates/assets/javascripts/browser/element/size/content/index.ts", "src/templates/assets/javascripts/browser/element/offset/_/index.ts", "src/templates/assets/javascripts/browser/element/offset/content/index.ts", "src/templates/assets/javascripts/browser/element/visibility/index.ts", "src/templates/assets/javascripts/browser/toggle/index.ts", "src/templates/assets/javascripts/browser/keyboard/index.ts", "src/templates/assets/javascripts/browser/location/_/index.ts", "src/templates/assets/javascripts/browser/location/hash/index.ts", "src/templates/assets/javascripts/browser/media/index.ts", "src/templates/assets/javascripts/browser/request/index.ts", "src/templates/assets/javascripts/browser/viewport/offset/index.ts", "src/templates/assets/javascripts/browser/viewport/size/index.ts", "src/templates/assets/javascripts/browser/viewport/_/index.ts", "src/templates/assets/javascripts/browser/viewport/at/index.ts", "src/templates/assets/javascripts/browser/worker/index.ts", "src/templates/assets/javascripts/_/index.ts", "src/templates/assets/javascripts/components/_/index.ts", "src/templates/assets/javascripts/components/announce/index.ts", "src/templates/assets/javascripts/components/consent/index.ts", "src/templates/assets/javascripts/templates/tooltip/index.tsx", "src/templates/assets/javascripts/templates/annotation/index.tsx", "src/templates/assets/javascripts/templates/clipboard/index.tsx", "src/templates/assets/javascripts/templates/search/index.tsx", "src/templates/assets/javascripts/templates/source/index.tsx", "src/templates/assets/javascripts/templates/tabbed/index.tsx", "src/templates/assets/javascripts/templates/table/index.tsx", "src/templates/assets/javascripts/templates/version/index.tsx", "src/templates/assets/javascripts/components/tooltip2/index.ts", "src/templates/assets/javascripts/components/content/annotation/_/index.ts", "src/templates/assets/javascripts/components/content/annotation/list/index.ts", "src/templates/assets/javascripts/components/content/annotation/block/index.ts", "src/templates/assets/javascripts/components/content/code/_/index.ts", "src/templates/assets/javascripts/components/content/details/index.ts", "src/templates/assets/javascripts/components/content/mermaid/index.css", "src/templates/assets/javascripts/components/content/mermaid/index.ts", "src/templates/assets/javascripts/components/content/table/index.ts", "src/templates/assets/javascripts/components/content/tabs/index.ts", "src/templates/assets/javascripts/components/content/_/index.ts", "src/templates/assets/javascripts/components/dialog/index.ts", "src/templates/assets/javascripts/components/tooltip/index.ts", "src/templates/assets/javascripts/components/header/_/index.ts", "src/templates/assets/javascripts/components/header/title/index.ts", "src/templates/assets/javascripts/components/main/index.ts", "src/templates/assets/javascripts/components/palette/index.ts", "src/templates/assets/javascripts/components/progress/index.ts", "src/templates/assets/javascripts/integrations/clipboard/index.ts", "src/templates/assets/javascripts/integrations/sitemap/index.ts", "src/templates/assets/javascripts/integrations/instant/index.ts", "src/templates/assets/javascripts/integrations/search/highlighter/index.ts", "src/templates/assets/javascripts/integrations/search/worker/message/index.ts", "src/templates/assets/javascripts/integrations/search/worker/_/index.ts", "src/templates/assets/javascripts/integrations/version/findurl/index.ts", "src/templates/assets/javascripts/integrations/version/index.ts", "src/templates/assets/javascripts/components/search/query/index.ts", "src/templates/assets/javascripts/components/search/result/index.ts", "src/templates/assets/javascripts/components/search/share/index.ts", "src/templates/assets/javascripts/components/search/suggest/index.ts", "src/templates/assets/javascripts/components/search/_/index.ts", "src/templates/assets/javascripts/components/search/highlight/index.ts", "src/templates/assets/javascripts/components/sidebar/index.ts", "src/templates/assets/javascripts/components/source/facts/github/index.ts", "src/templates/assets/javascripts/components/source/facts/gitlab/index.ts", "src/templates/assets/javascripts/components/source/facts/_/index.ts", "src/templates/assets/javascripts/components/source/_/index.ts", "src/templates/assets/javascripts/components/tabs/index.ts", "src/templates/assets/javascripts/components/toc/index.ts", "src/templates/assets/javascripts/components/top/index.ts", "src/templates/assets/javascripts/patches/ellipsis/index.ts", "src/templates/assets/javascripts/patches/indeterminate/index.ts", "src/templates/assets/javascripts/patches/scrollfix/index.ts", "src/templates/assets/javascripts/patches/scrolllock/index.ts", "src/templates/assets/javascripts/polyfills/index.ts"], + "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 * 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 * 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 * Copyright (c) 2016-2024 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 mountProgress,\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 setupInstantNavigation,\n setupVersionSelector\n} from \"./integrations\"\nimport {\n patchEllipsis,\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 progress indicator */\nconst progress$ = new Subject()\n\n/* Set up instant navigation, if enabled */\nif (feature(\"navigation.instant\"))\n setupInstantNavigation({ location$, viewport$, progress$ })\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 */\npatchEllipsis({ viewport$, document$ })\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 /* Color palette */\n ...getComponentElements(\"palette\")\n .map(el => mountPalette(el)),\n\n /* Progress bar */\n ...getComponentElements(\"progress\")\n .map(el => mountProgress(el, { progress$ })),\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 */\n ...getComponentElements(\"header\")\n .map(el => mountHeader(el, { viewport$, header$, main$ })),\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.progress$ = progress$ /* Progress indicator subject */\nwindow.component$ = component$ /* Component observable */\n", "/******************************************************************************\nCopyright (c) Microsoft Corporation.\n\nPermission to use, copy, modify, and/or distribute this software for any\npurpose with or without fee is hereby granted.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\nPERFORMANCE OF THIS SOFTWARE.\n***************************************************************************** */\n/* global Reflect, Promise, SuppressedError, Symbol, Iterator */\n\nvar extendStatics = function(d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\n return extendStatics(d, b);\n};\n\nexport function __extends(d, b) {\n if (typeof b !== \"function\" && b !== null)\n throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n}\n\nexport var __assign = function() {\n __assign = Object.assign || function __assign(t) {\n for (var s, i = 1, n = arguments.length; i < n; i++) {\n s = arguments[i];\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\n }\n return t;\n }\n return __assign.apply(this, arguments);\n}\n\nexport function __rest(s, e) {\n var t = {};\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\n t[p] = s[p];\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\n t[p[i]] = s[p[i]];\n }\n return t;\n}\n\nexport function __decorate(decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\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;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n}\n\nexport function __param(paramIndex, decorator) {\n return function (target, key) { decorator(target, key, paramIndex); }\n}\n\nexport function __esDecorate(ctor, descriptorIn, decorators, contextIn, initializers, extraInitializers) {\n function accept(f) { if (f !== void 0 && typeof f !== \"function\") throw new TypeError(\"Function expected\"); return f; }\n var kind = contextIn.kind, key = kind === \"getter\" ? \"get\" : kind === \"setter\" ? \"set\" : \"value\";\n var target = !descriptorIn && ctor ? contextIn[\"static\"] ? ctor : ctor.prototype : null;\n var descriptor = descriptorIn || (target ? Object.getOwnPropertyDescriptor(target, contextIn.name) : {});\n var _, done = false;\n for (var i = decorators.length - 1; i >= 0; i--) {\n var context = {};\n for (var p in contextIn) context[p] = p === \"access\" ? {} : contextIn[p];\n for (var p in contextIn.access) context.access[p] = contextIn.access[p];\n context.addInitializer = function (f) { if (done) throw new TypeError(\"Cannot add initializers after decoration has completed\"); extraInitializers.push(accept(f || null)); };\n var result = (0, decorators[i])(kind === \"accessor\" ? { get: descriptor.get, set: descriptor.set } : descriptor[key], context);\n if (kind === \"accessor\") {\n if (result === void 0) continue;\n if (result === null || typeof result !== \"object\") throw new TypeError(\"Object expected\");\n if (_ = accept(result.get)) descriptor.get = _;\n if (_ = accept(result.set)) descriptor.set = _;\n if (_ = accept(result.init)) initializers.unshift(_);\n }\n else if (_ = accept(result)) {\n if (kind === \"field\") initializers.unshift(_);\n else descriptor[key] = _;\n }\n }\n if (target) Object.defineProperty(target, contextIn.name, descriptor);\n done = true;\n};\n\nexport function __runInitializers(thisArg, initializers, value) {\n var useValue = arguments.length > 2;\n for (var i = 0; i < initializers.length; i++) {\n value = useValue ? initializers[i].call(thisArg, value) : initializers[i].call(thisArg);\n }\n return useValue ? value : void 0;\n};\n\nexport function __propKey(x) {\n return typeof x === \"symbol\" ? x : \"\".concat(x);\n};\n\nexport function __setFunctionName(f, name, prefix) {\n if (typeof name === \"symbol\") name = name.description ? \"[\".concat(name.description, \"]\") : \"\";\n return Object.defineProperty(f, \"name\", { configurable: true, value: prefix ? \"\".concat(prefix, \" \", name) : name });\n};\n\nexport function __metadata(metadataKey, metadataValue) {\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\n}\n\nexport function __awaiter(thisArg, _arguments, P, generator) {\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n}\n\nexport function __generator(thisArg, body) {\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g = Object.create((typeof Iterator === \"function\" ? Iterator : Object).prototype);\n return g.next = verb(0), g[\"throw\"] = verb(1), g[\"return\"] = verb(2), typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\n function verb(n) { return function (v) { return step([n, v]); }; }\n function step(op) {\n if (f) throw new TypeError(\"Generator is already executing.\");\n while (g && (g = 0, op[0] && (_ = 0)), _) try {\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;\n if (y = 0, t) op = [op[0] & 2, t.value];\n switch (op[0]) {\n case 0: case 1: t = op; break;\n case 4: _.label++; return { value: op[1], done: false };\n case 5: _.label++; y = op[1]; op = [0]; continue;\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\n default:\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\n if (t[2]) _.ops.pop();\n _.trys.pop(); continue;\n }\n op = body.call(thisArg, _);\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\n }\n}\n\nexport var __createBinding = Object.create ? (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n var desc = Object.getOwnPropertyDescriptor(m, k);\n if (!desc || (\"get\" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\n desc = { enumerable: true, get: function() { return m[k]; } };\n }\n Object.defineProperty(o, k2, desc);\n}) : (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n o[k2] = m[k];\n});\n\nexport function __exportStar(m, o) {\n for (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(o, p)) __createBinding(o, m, p);\n}\n\nexport function __values(o) {\n var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\n if (m) return m.call(o);\n if (o && typeof o.length === \"number\") return {\n next: function () {\n if (o && i >= o.length) o = void 0;\n return { value: o && o[i++], done: !o };\n }\n };\n throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\n}\n\nexport function __read(o, n) {\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\n if (!m) return o;\n var i = m.call(o), r, ar = [], e;\n try {\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\n }\n catch (error) { e = { error: error }; }\n finally {\n try {\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\n }\n finally { if (e) throw e.error; }\n }\n return ar;\n}\n\n/** @deprecated */\nexport function __spread() {\n for (var ar = [], i = 0; i < arguments.length; i++)\n ar = ar.concat(__read(arguments[i]));\n return ar;\n}\n\n/** @deprecated */\nexport function __spreadArrays() {\n for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\n for (var r = Array(s), k = 0, i = 0; i < il; i++)\n for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\n r[k] = a[j];\n return r;\n}\n\nexport function __spreadArray(to, from, pack) {\n if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {\n if (ar || !(i in from)) {\n if (!ar) ar = Array.prototype.slice.call(from, 0, i);\n ar[i] = from[i];\n }\n }\n return to.concat(ar || Array.prototype.slice.call(from));\n}\n\nexport function __await(v) {\n return this instanceof __await ? (this.v = v, this) : new __await(v);\n}\n\nexport function __asyncGenerator(thisArg, _arguments, generator) {\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\n var g = generator.apply(thisArg, _arguments || []), i, q = [];\n return i = Object.create((typeof AsyncIterator === \"function\" ? AsyncIterator : Object).prototype), verb(\"next\"), verb(\"throw\"), verb(\"return\", awaitReturn), i[Symbol.asyncIterator] = function () { return this; }, i;\n function awaitReturn(f) { return function (v) { return Promise.resolve(v).then(f, reject); }; }\n function verb(n, f) { if (g[n]) { i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; if (f) i[n] = f(i[n]); } }\n function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\n function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\n function fulfill(value) { resume(\"next\", value); }\n function reject(value) { resume(\"throw\", value); }\n function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\n}\n\nexport function __asyncDelegator(o) {\n var i, p;\n return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\n function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: false } : f ? f(v) : v; } : f; }\n}\n\nexport function __asyncValues(o) {\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\n var m = o[Symbol.asyncIterator], i;\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);\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); }); }; }\n function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\n}\n\nexport function __makeTemplateObject(cooked, raw) {\n if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\n return cooked;\n};\n\nvar __setModuleDefault = Object.create ? (function(o, v) {\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\n}) : function(o, v) {\n o[\"default\"] = v;\n};\n\nexport function __importStar(mod) {\n if (mod && mod.__esModule) return mod;\n var result = {};\n if (mod != null) for (var k in mod) if (k !== \"default\" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);\n __setModuleDefault(result, mod);\n return result;\n}\n\nexport function __importDefault(mod) {\n return (mod && mod.__esModule) ? mod : { default: mod };\n}\n\nexport function __classPrivateFieldGet(receiver, state, kind, f) {\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a getter\");\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\");\n return kind === \"m\" ? f : kind === \"a\" ? f.call(receiver) : f ? f.value : state.get(receiver);\n}\n\nexport function __classPrivateFieldSet(receiver, state, value, kind, f) {\n if (kind === \"m\") throw new TypeError(\"Private method is not writable\");\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a setter\");\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\");\n return (kind === \"a\" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;\n}\n\nexport function __classPrivateFieldIn(state, receiver) {\n if (receiver === null || (typeof receiver !== \"object\" && typeof receiver !== \"function\")) throw new TypeError(\"Cannot use 'in' operator on non-object\");\n return typeof state === \"function\" ? receiver === state : state.has(receiver);\n}\n\nexport function __addDisposableResource(env, value, async) {\n if (value !== null && value !== void 0) {\n if (typeof value !== \"object\" && typeof value !== \"function\") throw new TypeError(\"Object expected.\");\n var dispose, inner;\n if (async) {\n if (!Symbol.asyncDispose) throw new TypeError(\"Symbol.asyncDispose is not defined.\");\n dispose = value[Symbol.asyncDispose];\n }\n if (dispose === void 0) {\n if (!Symbol.dispose) throw new TypeError(\"Symbol.dispose is not defined.\");\n dispose = value[Symbol.dispose];\n if (async) inner = dispose;\n }\n if (typeof dispose !== \"function\") throw new TypeError(\"Object not disposable.\");\n if (inner) dispose = function() { try { inner.call(this); } catch (e) { return Promise.reject(e); } };\n env.stack.push({ value: value, dispose: dispose, async: async });\n }\n else if (async) {\n env.stack.push({ async: true });\n }\n return value;\n}\n\nvar _SuppressedError = typeof SuppressedError === \"function\" ? SuppressedError : function (error, suppressed, message) {\n var e = new Error(message);\n return e.name = \"SuppressedError\", e.error = error, e.suppressed = suppressed, e;\n};\n\nexport function __disposeResources(env) {\n function fail(e) {\n env.error = env.hasError ? new _SuppressedError(e, env.error, \"An error was suppressed during disposal.\") : e;\n env.hasError = true;\n }\n var r, s = 0;\n function next() {\n while (r = env.stack.pop()) {\n try {\n if (!r.async && s === 1) return s = 0, env.stack.push(r), Promise.resolve().then(next);\n if (r.dispose) {\n var result = r.dispose.call(r.value);\n if (r.async) return s |= 2, Promise.resolve(result).then(next, function(e) { fail(e); return next(); });\n }\n else s |= 1;\n }\n catch (e) {\n fail(e);\n }\n }\n if (s === 1) return env.hasError ? Promise.reject(env.error) : Promise.resolve();\n if (env.hasError) throw env.error;\n }\n return next();\n}\n\nexport default {\n __extends,\n __assign,\n __rest,\n __decorate,\n __param,\n __metadata,\n __awaiter,\n __generator,\n __createBinding,\n __exportStar,\n __values,\n __read,\n __spread,\n __spreadArrays,\n __spreadArray,\n __await,\n __asyncGenerator,\n __asyncDelegator,\n __asyncValues,\n __makeTemplateObject,\n __importStar,\n __importDefault,\n __classPrivateFieldGet,\n __classPrivateFieldSet,\n __classPrivateFieldIn,\n __addDisposableResource,\n __disposeResources,\n};\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 { Subject } from './Subject';\nimport { Subscriber } from './Subscriber';\nimport { Subscription } from './Subscription';\n\n/**\n * A variant of Subject that requires an initial value and emits its current\n * value whenever it is subscribed to.\n *\n * @class BehaviorSubject\n */\nexport class BehaviorSubject extends Subject {\n constructor(private _value: T) {\n super();\n }\n\n get value(): T {\n return this.getValue();\n }\n\n /** @internal */\n protected _subscribe(subscriber: Subscriber): Subscription {\n const subscription = super._subscribe(subscriber);\n !subscription.closed && subscriber.next(this._value);\n return subscription;\n }\n\n getValue(): T {\n const { hasError, thrownError, _value } = this;\n if (hasError) {\n throw thrownError;\n }\n this._throwIfClosed();\n return _value;\n }\n\n next(value: T): void {\n super.next((this._value = value));\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 { Subscription } from '../Subscription';\nimport { QueueScheduler } from './QueueScheduler';\nimport { SchedulerAction } from '../types';\nimport { TimerHandle } from './timerHandle';\n\nexport class QueueAction extends AsyncAction {\n constructor(protected scheduler: QueueScheduler, protected work: (this: SchedulerAction, state?: T) => void) {\n super(scheduler, work);\n }\n\n public schedule(state?: T, delay: number = 0): Subscription {\n if (delay > 0) {\n return super.schedule(state, delay);\n }\n this.delay = delay;\n this.state = state;\n this.scheduler.flush(this);\n return this;\n }\n\n public execute(state: T, delay: number): any {\n return delay > 0 || this.closed ? super.execute(state, delay) : this._execute(state, delay);\n }\n\n protected requestAsyncId(scheduler: QueueScheduler, id?: TimerHandle, delay: number = 0): TimerHandle {\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\n if ((delay != null && delay > 0) || (delay == null && this.delay > 0)) {\n return super.requestAsyncId(scheduler, id, delay);\n }\n\n // Otherwise flush the scheduler starting with this action.\n scheduler.flush(this);\n\n // HACK: In the past, this was returning `void`. However, `void` isn't a valid\n // `TimerHandle`, and generally the return value here isn't really used. So the\n // compromise is to return `0` which is both \"falsy\" and a valid `TimerHandle`,\n // as opposed to refactoring every other instanceo of `requestAsyncId`.\n return 0;\n }\n}\n", "import { AsyncScheduler } from './AsyncScheduler';\n\nexport class QueueScheduler extends AsyncScheduler {\n}\n", "import { QueueAction } from './QueueAction';\nimport { QueueScheduler } from './QueueScheduler';\n\n/**\n *\n * Queue Scheduler\n *\n * Put every next task on a queue, instead of executing it immediately\n *\n * `queue` scheduler, when used with delay, behaves the same as {@link asyncScheduler} scheduler.\n *\n * When used without delay, it schedules given task synchronously - executes it right when\n * it is scheduled. However when called recursively, that is when inside the scheduled task,\n * another task is scheduled with queue scheduler, instead of executing immediately as well,\n * that task will be put on a queue and wait for current one to finish.\n *\n * This means that when you execute task with `queue` scheduler, you are sure it will end\n * before any other task scheduled with that scheduler will start.\n *\n * ## Examples\n * Schedule recursively first, then do something\n * ```ts\n * import { queueScheduler } from 'rxjs';\n *\n * queueScheduler.schedule(() => {\n * queueScheduler.schedule(() => console.log('second')); // will not happen now, but will be put on a queue\n *\n * console.log('first');\n * });\n *\n * // Logs:\n * // \"first\"\n * // \"second\"\n * ```\n *\n * Reschedule itself recursively\n * ```ts\n * import { queueScheduler } from 'rxjs';\n *\n * queueScheduler.schedule(function(state) {\n * if (state !== 0) {\n * console.log('before', state);\n * this.schedule(state - 1); // `this` references currently executing Action,\n * // which we reschedule with new state\n * console.log('after', state);\n * }\n * }, 0, 3);\n *\n * // In scheduler that runs recursively, you would expect:\n * // \"before\", 3\n * // \"before\", 2\n * // \"before\", 1\n * // \"after\", 1\n * // \"after\", 2\n * // \"after\", 3\n *\n * // But with queue it logs:\n * // \"before\", 3\n * // \"after\", 3\n * // \"before\", 2\n * // \"after\", 2\n * // \"before\", 1\n * // \"after\", 1\n * ```\n */\n\nexport const queueScheduler = new QueueScheduler(QueueAction);\n\n/**\n * @deprecated Renamed to {@link queueScheduler}. Will be removed in v8.\n */\nexport const queue = queueScheduler;\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 + + +

+

+

Figura 2 - DER Versão 1.1

+ + +

Fonte: Pedro Lucas

+

+

+

Figura 3 - DER Versão 2.0

+ + +

Fonte: Pedro Lucas

+

+

Referência Bibliográfica

+
+

[1] ELMASRI, Ramez; NAVATHE, Shamkant B. Sistemas de banco de dados. Tradução: Daniel Vieira. Revisão técnica: Enzo Seraphim; Thatyana de Faria Piola Seraphim. 6. ed. São Paulo: Pearson Addison Wesley, 2011. Capítulo 7. Modelagem de dados usando o modelo Entidade-Relacionamento (ER), páginas 131 e 146.

+
+

Bibliografia

+
+

Diagrama Entidade Relacionamento Stardew Valley. Disponível em: https://github.com/SBD1/2023.2-Grupo01-StardewValley/blob/main/docs/Entrega-01/DER_StardewValley_v1.0.md. Acesso em 24 de novembro de 2024.

+

Diagrama Entidade Relacionamento Fear and Hunger. Disponível em: https://github.com/SBD1/2023.2_Fear_and_Hunger/blob/main/docs/modulo_01/assets/DERv/DERv2.3.png. Acesso em 24 de novembro de 2024.

+
+

Histórico de versão

+ + + + + + + + + + + + + + + + + + + + +
DataDescriçãoAutor
24/11/2024Versão inicial do DERPedro Lucas
12/01/2024Versão 2.0 do DERPedro Lucas
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/modulo01/dicionario/index.html b/modulo01/dicionario/index.html new file mode 100644 index 0000000..c471a6b --- /dev/null +++ b/modulo01/dicionario/index.html @@ -0,0 +1,3665 @@ + + + + + + + + + + + + + + + + + + + + + + + Dicionário de Dados - Cavaleiros do Zodiaco + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+ + + + + + + +
+ +
+ + + + +
+
+ + + +
+
+
+ + + + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + +

Dicionário de Dados

+

Tabelas e Relações

+

Tabela: Npc_Ferreiro

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AtributoTipoRestrições
id_npc_ferreiroINTEGERPRIMARY KEY
id_salaINTEGERFOREIGN KEY (id_sala) REFERENCES Sala(id_sala)
id_missao_desbloqueiaINTEGERFOREIGN KEY (id_missao_desbloqueia) REFERENCES Missao(id_missao)
nomeVARCHARNOT NULL
descricaoVARCHAR
dialogo_inicialVARCHAR
dialogo_repararVARCHAR
dialogo_upgradeVARCHAR
+
+

Tabela: Npc_Quest

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AtributoTipoRestrições
id_npc_questINTEGERPRIMARY KEY
id_salaINTEGERFOREIGN KEY (id_sala) REFERENCES Sala(id_sala)
nomeVARCHARNOT NULL
descricaoVARCHAR
dialogo_inicialVARCHAR
dialogo_recusaVARCHAR
+
+

Tabela: Npc_Mercador

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AtributoTipoRestrições
id_npc_mercadorINTEGERPRIMARY KEY
id_salaINTEGERFOREIGN KEY (id_sala) REFERENCES Sala(id_sala)
nomeVARCHARNOT NULL
descricaoVARCHAR
dialogo_inicialVARCHAR
dialogo_venderVARCHAR
dialogo_comprarVARCHAR
dialogo_sairVARCHAR
+
+

Tabela: Cavaleiro

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AtributoTipoRestrições
id_cavaleiroSERIALPRIMARY KEY
id_classeINTEGERFOREIGN KEY (id_classe) REFERENCES Classe(id_classe)
id_elementoINTEGERFOREIGN KEY (id_elemento) REFERENCES Elemento(id_elemento)
nomeVARCHARUNIQUE, NOT NULL
nivelINTEGERNOT NULL
hp_maxINTEGERNOT NULL
magia_maxINTEGERNOT NULL
velocidade_baseINTEGERNOT NULL
ataque_fisico_baseINTEGERNOT NULL
ataque_magico_baseINTEGERNOT NULL
+
+

Tabela: Boss

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AtributoTipoRestrições
id_bossSERIALPRIMARY KEY
id_salaINTEGERFOREIGN KEY (id_sala) REFERENCES Sala(id_sala)
nomeINTEGERNOT NULL
nivelINTEGERNOT NULL
xp_acumuladoINTEGERNOT NULL
hp_maxINTEGERNOT NULL
hp_atualINTEGERNOT NULL
magia_maxINTEGERNOT NULL
magia_atualINTEGERNOT NULL
velocidadeINTEGERNOT NULL
ataque_fisico_baseINTEGERNOT NULL
ataque_magico_baseINTEGERNOT NULL
dinheiroINTEGERNOT NULL
fala_inicioVARCHAR
fala_derrotar_playerVARCHAR
fala_derrotadoVARCHAR
fala_condicaoVARCHAR
+
+

Tabela: Inimigo

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AtributoTipoRestrições
id_inimigoSERIALPRIMARY KEY
id_classeINTEGERFOREIGN KEY (id_classe) REFERENCES Classe(id_classe)
id_elementoINTEGERFOREIGN KEY (id_elemento) REFERENCES Elemento(id_elemento)
nomeVARCHARNOT NULL
nivelINTEGERNOT NULL
xp_acumuladoINTEGERNOT NULL
hp_maxINTEGERNOT NULL
magia_maxINTEGERNOT NULL
velocidadeINTEGERNOT NULL
ataque_fisico_baseINTEGERNOT NULL
ataque_magico_baseINTEGERNOT NULL
dinheiroINTEGERNOT NULL
fala_inicioVARCHAR
+
+

Tabela: Grupo_inimigo

+ + + + + + + + + + + + + + + + + + + + +
AtributoTipoRestrições
id_grupoSERIALPRIMARY KEY
id_salaINTEGERFOREIGN KEY (id_sala) REFERENCES Sala(id_sala)
+
+

Tabela: Instancia_Inimigo

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AtributoTipoRestrições
id_instanciaSERIALPRIMARY KEY
id_inimigoINTEGERFOREIGN KEY (id_inimigo) REFERENCES Inimigo(id_inimigo)
id_grupoINTEGERFOREIGN KEY (id_grupo) REFERENCES Grupo_inimigo(id_grupo)
hp_atualINTEGERNOT NULL
magia_atualINTEGERNOT NULL
defesa_fisica_bonusINTEGER
defesa_magica_bonusINTEGER
+
+

Tabela: Inventario

+ + + + + + + + + + + + + + + + + + + + +
AtributoTipoRestrições
id_playerINTEGERPRIMARY KEY, FOREIGN KEY (id_player) REFERENCES Player(id_player)
dinheiroINTEGERNOT NULL
+
+

Tabela: Armadura_Instancia

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AtributoTipoRestrições
id_armaduraINTEGERFOREIGN KEY (id_armadura, id_parte_corpo_armadura) REFERENCES Armadura(id_armadura, id_parte_corpo)
id_parte_corpo_armaduraenum_parte_corpoFOREIGN KEY (id_armadura, id_parte_corpo_armadura) REFERENCES Armadura(id_armadura, id_parte_corpo)
id_instanciaSERIALPRIMARY KEY
id_inventarioINTEGERFOREIGN KEY (id_inventario) REFERENCES Inventario(id_player)
raridade_armaduraINTEGERNOT NULL
defesa_magicaINTEGERNOT NULL
defesa_fisicaINTEGERNOT NULL
ataque_magicoINTEGERNOT NULL
ataque_fisicoINTEGERNOT NULL
durabilidade_maxINTEGERNOT NULL
preco_vendaINTEGERNOT NULL
+
+

Tabela: Item_a_venda

+ + + + + + + + + + + + + + + + + + + + + + + + + +
AtributoTipoRestrições
id_itemINTEGERPRIMARY KEY
preco_compraINTEGERNOT NULL
level_minimoINTEGERNOT NULL
+
+

Tabela: Party

+ + + + + + + + + + + + + + + + + + + + +
AtributoTipoRestrições
id_playerINTEGERPRIMARY KEY
id_salaINTEGERNOT NULL
+
+

Tabela: Instancia_Cavaleiro

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AtributoTipoRestrições
id_instancia_cavaleiroSERIALPRIMARY KEY
id_cavaleiroINTEGERFOREIGN KEY (id_cavaleiro) REFERENCES Cavaleiro(id_cavaleiro)
id_partyINTEGERFOREIGN KEY (id_party) REFERENCES Party(id_player)
nivelINTEGERNOT NULL
xp_atualINTEGERNOT NULL
hp_maxINTEGERNOT NULL
magia_maxINTEGERNOT NULL
hp_atualINTEGERNOT NULL
magia_atualINTEGERNOT NULL
velocidadeINTEGERNOT NULL
ataque_fisicoINTEGERNOT NULL
ataque_magicoINTEGERNOT NULL
+
+

Tabela: Elemento

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AtributoTipoRestrições
id_elementoSERIALPRIMARY KEY
nomeVARCHARUNIQUE, NOT NULL
descricaoVARCHAR
fraco_contraINTEGER(Possível chave estrangeira)
forte_contraINTEGER(Possível chave estrangeira)
+
+

Tabela: Progresso_Player

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AtributoTipoRestrições
id_playerINTEGERFOREIGN KEY (id_player) REFERENCES Player(id_player)
id_bossINTEGERFOREIGN KEY (id_boss) REFERENCES Boss(id_boss)
id_cavaleiroINTEGERFOREIGN KEY (id_cavaleiro) REFERENCES Cavaleiro(id_cavaleiro)
status_derrotadoBOOLEANNOT NULL
+
+

Tabela: Receita

+ + + + + + + + + + + + + + + + + + + + +
AtributoTipoRestrições
id_item_geradoINTEGERPRIMARY KEY
descricaoVARCHAR
+
+

Tabela: Player_Missao

+ + + + + + + + + + + + + + + + + + + + + + + + + +
AtributoTipoRestrições
id_playerINTEGERFOREIGN KEY (id_player) REFERENCES Player(id_player)
id_missaoINTEGERFOREIGN KEY (id_missao) REFERENCES Missao(id_missao)
status_missaoenum_status_missaoNOT NULL
+
+

Tabela: Xp_Necessaria

+ + + + + + + + + + + + + + + + + + + + +
AtributoTipoRestrições
nivelINTEGERPRIMARY KEY
xp_necessariaINTEGERNOT NULL
+
+

Tabela: Material_Receita

+ + + + + + + + + + + + + + + + + + + + + + + + + +
AtributoTipoRestrições
id_receitaINTEGERFOREIGN KEY (id_receita) REFERENCES Receita(id_item_gerado)
id_materialINTEGERFOREIGN KEY (id_material) REFERENCES Material(id_material)
quantidadeINTEGERNOT NULL
+
+

Tabela: Habilidade_Player

+ + + + + + + + + + + + + + + + + + + + + + + + + +
AtributoTipoRestrições
id_playerINTEGERFOREIGN KEY (id_player) REFERENCES Player(id_player)
id_habilidadeINTEGERFOREIGN KEY (id_habilidade) REFERENCES Habilidade(id_habilidade)
slotINTEGERNOT NULL
+
+

Tabela: Habilidade_Cavaleiro

+ + + + + + + + + + + + + + + + + + + + + + + + + +
AtributoTipoRestrições
id_cavaleiroINTEGERFOREIGN KEY (id_cavaleiro) REFERENCES Cavaleiro(id_cavaleiro)
id_habilidadeINTEGERFOREIGN KEY (id_habilidade) REFERENCES Habilidade(id_habilidade)
slotINTEGERNOT NULL
+
+

Tabela: Habilidade_Boss

+ + + + + + + + + + + + + + + + + + + + +
AtributoTipoRestrições
id_bossINTEGERFOREIGN KEY (id_boss) REFERENCES Boss(id_boss)
id_habilidadeINTEGERFOREIGN KEY (id_habilidade) REFERENCES Habilidade(id_habilidade)
+
+

Tabela: Parte_Corpo_Boss

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AtributoTipoRestrições
id_bossINTEGERFOREIGN KEY (id_boss) REFERENCES Boss(id_boss)
parte_corpoenum_parte_corpoFOREIGN KEY (parte_corpo) REFERENCES Parte_Corpo(id_parte_corpo)
defesa_fisicaINTEGERNOT NULL
defesa_magicaINTEGERNOT NULL
chance_acerto_baseINTEGERNOT NULL
chance_acerto_criticoINTEGERNOT NULL
+
+

Tabela: Parte_Corpo_Cavaleiro

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AtributoTipoRestrições
id_cavaleiroINTEGERFOREIGN KEY (id_cavaleiro) REFERENCES Cavaleiro(id_cavaleiro)
parte_corpoenum_parte_corpoFOREIGN KEY (parte_corpo) REFERENCES Parte_Corpo(id_parte_corpo)
id_instancia_cavaleiroINTEGERFOREIGN KEY (id_instancia_cavaleiro) REFERENCES Instancia_Cavaleiro(id_instancia_cavaleiro)
defesa_fisica_bonusINTEGERNOT NULL
defesa_magico_bonusINTEGERNOT NULL
chance_acerto_baseINTEGERNOT NULL
chance_acerto_criticoINTEGERNOT NULL
+
+

Tabela: Player

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AtributoTipoRestrições
id_playerSERIALPRIMARY KEY
id_elementoINTEGERFOREIGN KEY (id_elemento) REFERENCES Elemento(id_elemento)
nomeVARCHARUNIQUE, NOT NULL
nivelINTEGERNOT NULL
xp_acumuladoINTEGERNOT NULL
hp_maxINTEGERNOT NULL
magia_maxINTEGERNOT NULL
hp_atualINTEGERNOT NULL
magia_atualINTEGERNOT NULL
velocidadeINTEGERNOT NULL
ataque_fisico_baseINTEGERNOT NULL
ataque_magico_baseINTEGERNOT NULL
id_sala_safeINTEGERNOT NULL
+
+

Tabela: Parte_Corpo_Player

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AtributoTipoRestrições
id_playerINTEGERFOREIGN KEY (id_player) REFERENCES Player(id_player)
parte_corpoenum_parte_corpoFOREIGN KEY (parte_corpo) REFERENCES Parte_Corpo(id_parte_corpo)
armadura_equipadaINTEGERFOREIGN KEY (armadura_equipada) REFERENCES Armadura(id_armadura)
instancia_armadura_equipadaINTEGERFOREIGN KEY (instancia_armadura_equipada) REFERENCES Armadura_Instancia(id_instancia)
+
+

Tabela: Elemento_Boss

+ + + + + + + + + + + + + + + + + + + + +
AtributoTipoRestrições
id_elementoINTEGERFOREIGN KEY (id_elemento) REFERENCES Elemento(id_elemento)
id_bossINTEGERFOREIGN KEY (id_boss) REFERENCES Boss(id_boss)
+
+

Tabela: Habilidade_Inimigo

+ + + + + + + + + + + + + + + + + + + + +
AtributoTipoRestrições
id_habilidadeINTEGERFOREIGN KEY (id_habilidade) REFERENCES Habilidade(id_habilidade)
id_playerINTEGERFOREIGN KEY (id_player) REFERENCES Inimigo(id_inimigo)
+
+

Tabela: Item_Armazenado

+ + + + + + + + + + + + + + + + + + + + + + + + + +
AtributoTipoRestrições
id_inventarioINTEGERFOREIGN KEY (id_inventario) REFERENCES Inventario(id_player)
id_itemINTEGERFOREIGN KEY (id_item) REFERENCES Tipo_Item(id_item)
quantidadeINTEGERNOT NULL
+
+

Tabela: Item_grupo_inimigo_dropa

+ + + + + + + + + + + + + + + + + + + + + + + + + +
AtributoTipoRestrições
id_itemINTEGERFOREIGN KEY (id_item) REFERENCES Tipo_Item(id_item)
id_grupo_inimigoINTEGERFOREIGN KEY (id_grupo_inimigo) REFERENCES Grupo_inimigo(id_grupo)
quantidadeINTEGERNOT NULL
+
+

Tabela: Classe

+ + + + + + + + + + + + + + + + + + + + + + + + + +
AtributoTipoRestrições
id_classeSERIALPRIMARY KEY
nomeVARCHARUNIQUE, NOT NULL
descricaoVARCHAR
+
+

Tabela: Habilidade

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AtributoTipoRestrições
id_habilidadeSERIALPRIMARY KEY
classe_habilidadeINTEGERFOREIGN KEY (classe_habilidade) REFERENCES Classe(id_classe)
elemento_habilidadeINTEGERFOREIGN KEY (elemento_habilidade) REFERENCES Elemento(id_elemento)
nomeVARCHAR
custoINTEGER
descricaoVARCHAR
frase_usoVARCHAR
nivel_necessarioINTEGER
+
+

Tabela: Tipo_Item

+ + + + + + + + + + + + + + + + + + + + +
AtributoTipoRestrições
id_itemSERIALPRIMARY KEY
tipo_itemenum_tipo_itemNOT NULL
+
+

Tabela: Armadura

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AtributoTipoRestrições
id_armaduraINTEGERPRIMARY KEY
id_parte_corpoenum_parte_corpoFOREIGN KEY (id_parte_corpo) REFERENCES Parte_Corpo(id_parte_corpo)
nomeVARCHARNOT NULL
raridade_armaduraVARCHARNOT NULL
defesa_magicaINTEGER
defesa_fisicaINTEGER
ataque_magicoINTEGER
ataque_fisicoINTEGER
durabilidade_maxINTEGER
preco_vendaINTEGER
descricaoINTEGER
+
+

Tabela: Material

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AtributoTipoRestrições
id_materialINTEGERPRIMARY KEY
nomeVARCHARUNIQUE, NOT NULL
preco_vendaINTEGERNOT NULL
descricaoVARCHAR
+
+

Tabela: Item_Missao

+ + + + + + + + + + + + + + + + + + + + + + + + + +
AtributoTipoRestrições
id_itemINTEGERPRIMARY KEY
nomeVARCHARUNIQUE, NOT NULL
descricaoVARCHAR
+
+

Tabela: Consumivel

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AtributoTipoRestrições
id_itemINTEGERPRIMARY KEY
nomeVARCHARUNIQUE, NOT NULL
descricaoVARCHAR
preco_vendaINTEGERNOT NULL
saude_restauradaINTEGER
magia_restauradaINTEGER
saude_maximaINTEGER
magia_maximaINTEGER
+
+

Tabela: Livro

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AtributoTipoRestrições
id_itemINTEGERPRIMARY KEY
id_habilidadeINTEGERFOREIGN KEY (id_habilidade) REFERENCES Habilidade(id_habilidade)
nomeVARCHARUNIQUE, NOT NULL
descricaoVARCHAR
preco_vendaINTEGERNOT NULL
+
+

Tabela: Missao

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AtributoTipoRestrições
id_missaoSERIALPRIMARY KEY
id_missao_anteriorINTEGERFOREIGN KEY (id_missao_anterior) REFERENCES Missao(id_missao)
item_necessarioINTEGERFOREIGN KEY (item_necessario) REFERENCES Item_Missao(id_item)
nomeINTEGERUNIQUE, NOT NULL
dialogo_inicialVARCHAR
dialogo_duranteVARCHAR
dialogo_completaVARCHAR
+
+

Tabela: Santuario

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AtributoTipoRestrições
id_santuarioSERIALPRIMARY KEY
id_missao_requisitoINTEGERFOREIGN KEY (id_missao_requisito) REFERENCES Missao(id_missao)
id_missao_proximo_santuarioINTEGERFOREIGN KEY (id_missao_proximo_santuario) REFERENCES Missao(id_missao)
nomeVARCHARUNIQUE, NOT NULL
descricaoVARCHAR
nivel_recomendadoINTEGERNOT NULL
+
+

Tabela: Casa

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AtributoTipoRestrições
id_casaSERIALPRIMARY KEY
id_santuarioINTEGERFOREIGN KEY (id_santuario) REFERENCES Santuario(id_santuario)
id_missao_requisitoINTEGERFOREIGN KEY (id_missao_requisito) REFERENCES Missao(id_missao)
id_missao_proxima_casaINTEGERFOREIGN KEY (id_missao_proxima_casa) REFERENCES Missao(id_missao)
nomeVARCHARNOT NULL
descricaoVARCHAR
nivel_recomendadoINTEGERNOT NULL
+
+

Tabela: Sala

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AtributoTipoRestrições
id_salaSERIALPRIMARY KEY
id_casaINTEGERFOREIGN KEY (id_casa) REFERENCES Casa(id_casa)
nomeVARCHARNOT NULL
id_sala_norteINTEGER(Possivelmente referência para outra sala)
id_sala_sulINTEGER(Possivelmente referência para outra sala)
id_sala_lesteINTEGER(Possivelmente referência para outra sala)
id_sala_oesteINTEGER(Possivelmente referência para outra sala)
+
+

Relacionamentos

+
    +
  • Instancia_Cavaleiro:
  • +
  • id_cavaleiroCavaleiro(id_cavaleiro)
  • +
  • +

    id_partyParty(id_player)

    +
  • +
  • +

    Elemento:

    +
  • +
  • fraco_contraElemento(id_elemento)
  • +
  • +

    forte_contraElemento(id_elemento)

    +
  • +
  • +

    Progresso_Player:

    +
  • +
  • id_playerPlayer(id_player)
  • +
  • id_bossBoss(id_boss)
  • +
  • +

    id_cavaleiroCavaleiro(id_cavaleiro)

    +
  • +
  • +

    Receita:

    +
  • +
  • +

    N/A

    +
  • +
  • +

    Player_Missao:

    +
  • +
  • id_playerPlayer(id_player)
  • +
  • +

    id_missaoMissao(id_missao)

    +
  • +
  • +

    Xp_Necessaria:

    +
  • +
  • +

    N/A

    +
  • +
  • +

    Material_Receita:

    +
  • +
  • id_receitaReceita(id_item_gerado)
  • +
  • +

    id_materialMaterial(id_material)

    +
  • +
  • +

    Habilidade_Player:

    +
  • +
  • id_playerPlayer(id_player)
  • +
  • +

    id_habilidadeHabilidade(id_habilidade)

    +
  • +
  • +

    Habilidade_Cavaleiro:

    +
  • +
  • id_cavaleiroCavaleiro(id_cavaleiro)
  • +
  • +

    id_habilidadeHabilidade(id_habilidade)

    +
  • +
  • +

    Habilidade_Boss:

    +
  • +
  • id_bossBoss(id_boss)
  • +
  • +

    id_habilidadeHabilidade(id_habilidade)

    +
  • +
  • +

    Parte_Corpo_Boss:

    +
  • +
  • id_bossBoss(id_boss)
  • +
  • +

    parte_corpoParte_Corpo(id_parte_corpo)

    +
  • +
  • +

    Parte_Corpo_Cavaleiro:

    +
  • +
  • id_cavaleiroCavaleiro(id_cavaleiro)
  • +
  • parte_corpoParte_Corpo(id_parte_corpo)
  • +
  • +

    id_instancia_cavaleiroInstancia_Cavaleiro(id_instancia_cavaleiro)

    +
  • +
  • +

    Player:

    +
  • +
  • +

    id_elementoElemento(id_elemento)

    +
  • +
  • +

    Parte_Corpo_Player:

    +
  • +
  • id_playerPlayer(id_player)
  • +
  • parte_corpoParte_Corpo(id_parte_corpo)
  • +
  • armadura_equipadaArmadura(id_armadura)
  • +
  • +

    instancia_armadura_equipadaArmadura_Instancia(id_instancia)

    +
  • +
  • +

    Elemento_Boss:

    +
  • +
  • id_elementoElemento(id_elemento)
  • +
  • +

    id_bossBoss(id_boss)

    +
  • +
  • +

    Habilidade_Inimigo:

    +
  • +
  • id_habilidadeHabilidade(id_habilidade)
  • +
  • +

    id_playerInimigo(id_inimigo)

    +
  • +
  • +

    Item_Armazenado:

    +
  • +
  • id_inventarioInventario(id_player)
  • +
  • +

    id_itemTipo_Item(id_item)

    +
  • +
  • +

    Item_grupo_inimigo_dropa:

    +
  • +
  • id_itemTipo_Item(id_item)
  • +
  • +

    id_grupo_inimigoGrupo_inimigo(id_grupo)

    +
  • +
  • +

    Classe:

    +
  • +
  • +

    N/A

    +
  • +
  • +

    Habilidade:

    +
  • +
  • classe_habilidadeClasse(id_classe)
  • +
  • +

    elemento_habilidadeElemento(id_elemento)

    +
  • +
  • +

    Tipo_Item:

    +
  • +
  • +

    N/A

    +
  • +
  • +

    Armadura:

    +
  • +
  • +

    id_parte_corpoParte_Corpo(id_parte_corpo)

    +
  • +
  • +

    Material:

    +
  • +
  • +

    N/A

    +
  • +
  • +

    Item_Missao:

    +
  • +
  • +

    N/A

    +
  • +
  • +

    Consumivel:

    +
  • +
  • +

    N/A

    +
  • +
  • +

    Livro:

    +
  • +
  • +

    id_habilidadeHabilidade(id_habilidade)

    +
  • +
  • +

    Missao:

    +
  • +
  • id_missao_anteriorMissao(id_missao)
  • +
  • +

    item_necessarioItem_Missao(id_item)

    +
  • +
  • +

    Santuario:

    +
  • +
  • id_missao_requisitoMissao(id_missao)
  • +
  • +

    id_missao_proximo_santuarioMissao(id_missao)

    +
  • +
  • +

    Casa:

    +
  • +
  • id_santuarioSantuario(id_santuario)
  • +
  • id_missao_requisitoMissao(id_missao)
  • +
  • +

    id_missao_proxima_casaMissao(id_missao)

    +
  • +
  • +

    Sala:

    +
  • +
  • +

    id_casaCasa(id_casa)

    +
  • +
  • +

    Npc_Ferreiro:

    +
  • +
  • id_salaSala(id_sala)
  • +
  • +

    id_missao_desbloqueiaMissao(id_missao)

    +
  • +
  • +

    Npc_Quest:

    +
  • +
  • +

    id_salaSala(id_sala)

    +
  • +
  • +

    Npc_Mercador:

    +
  • +
  • +

    id_salaSala(id_sala)

    +
  • +
  • +

    Inimigo:

    +
  • +
  • id_elementoElemento(id_elemento)
  • +
  • +

    id_classeClasse(id_classe)

    +
  • +
  • +

    Instancia_Inimigo:

    +
  • +
  • id_inimigoInimigo(id_inimigo)
  • +
  • +

    id_grupoGrupo_inimigo(id_grupo)

    +
  • +
  • +

    Grupo_inimigo:

    +
  • +
  • +

    id_salaSala(id_sala)

    +
  • +
  • +

    Inventario:

    +
  • +
  • +

    id_playerPlayer(id_player)

    +
  • +
  • +

    Armadura_Instancia:

    +
  • +
  • id_armadura, id_parte_corpo_armaduraArmadura(id_armadura, id_parte_corpo)
  • +
  • +

    id_inventarioInventario(id_player)

    +
  • +
  • +

    Item_a_venda:

    +
  • +
  • +

    id_itemTipo_Item(id_item)

    +
  • +
  • +

    Party:

    +
  • +
  • id_salaSala(id_sala)
  • +
+

Tipo: tipo_item

+

Representa os tipos de itens no sistema.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ValorSignificado
aarmadura
mmaterial
iitem_missao
cconsumivel
llivro
+
+

Tipo: parte_corpo

+

Representa as partes do corpo.

+ + + + + + + + + + + + + + + + + + + + + + + + + +
ValorSignificado
ccabeça
ttronco
bbraços
ppernas
+
+

Tipo: enum_tipo_item

+

Representa os tipos de itens no sistema.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ValorSignificado
aarmadura
mmaterial
iitem_missao
cconsumivel
llivro
+
+

Tipo: enum_parte_corpo

+

Representa as partes do corpo.

+ + + + + + + + + + + + + + + + + + + + + + + + + +
ValorSignificado
ccabeça
ttronco
bbraços
ppernas
+
+ + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/modulo01/mer/index.html b/modulo01/mer/index.html new file mode 100644 index 0000000..42cc58a --- /dev/null +++ b/modulo01/mer/index.html @@ -0,0 +1,1915 @@ + + + + + + + + + + + + + + + + + + + + + + + Modelo Entidade Relacionamento - Cavaleiros do Zodiaco + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+ + + + + + + +
+ +
+ + + + +
+
+ + + +
+
+
+ + + + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + +

Modelo Entidade Relacionamento

+ +

Modelo Entidade-Relacionamento (MER)

+

O Modelo Entidade-Relacionamento (MER) é uma descrição textual das entidades e relacionamentos que compõem a estrutura de um banco de dados. Diferentemente do DER, o MER apresenta as informações de forma textual, facilitando a compreensão e detalhamento dos componentes.

+

Tabelas e Atributos

+

Personagem

+
    +
  • id_personagem
  • +
  • nome
  • +
+

Player

+
    +
  • id_personagem
  • +
+

NPC Quest

+
    +
  • id_personagem
  • +
  • dialogo_inicial
  • +
  • dialogo_recusa
  • +
+

NPC Mercado

+
    +
  • id_personagem
  • +
  • dialogo_inicial
  • +
  • dialogo_vender
  • +
  • dialogo_comprar
  • +
  • dialogo_sair
  • +
+

Party

+
    +
  • id_player
  • +
  • id_sala
  • +
+

Inventário

+
    +
  • id_player
  • +
  • dinheiro
  • +
+

Progresso Jogador

+
    +
  • id_player
  • +
  • id_boss
  • +
  • status_derrotado
  • +
  • cavaleiro_desbloqueado
  • +
+

Personagem Luta

+
    +
  • id_personagem
  • +
  • nivel
  • +
  • hp_max
  • +
  • hp_atual
  • +
  • magia_max
  • +
  • magia_atual
  • +
  • velocidade
  • +
+

Cavaleiro

+
    +
  • id_personagem
  • +
  • desbloqueado
  • +
  • classe
  • +
+

Inimigo

+
    +
  • id_personagem
  • +
  • dinheiro
  • +
  • fala_inicio
  • +
+

Boss

+
    +
  • id_personagem
  • +
  • dinheiro
  • +
  • fala_inicio
  • +
  • fala_derrota
  • +
+

Sala

+
    +
  • id_sala
  • +
  • nome
  • +
  • sala_norte
  • +
  • sala_sul
  • +
  • sala_leste
  • +
  • sala_oeste
  • +
+

Santuário

+
    +
  • id_santuario
  • +
  • nome
  • +
  • descricao
  • +
  • id_pre_req_missao
  • +
+

Grupo Inimigo

+
    +
  • id_grupo_inimigo
  • +
  • id_sala
  • +
+

Missão

+
    +
  • id_missao
  • +
  • nome
  • +
  • item_necessario
  • +
  • dialogo_inicial
  • +
  • dialogo_durante
  • +
  • dialogo_completa
  • +
+

Missão Jogador

+
    +
  • id_missao
  • +
  • id_jogador
  • +
+

Item

+
    +
  • id_item
  • +
  • nome
  • +
  • tipo_item
  • +
  • preco_compra
  • +
  • preco_venda
  • +
+

Armadura

+
    +
  • id_item
  • +
  • defesa_magica
  • +
  • defesa_fisica
  • +
  • ataque_magico
  • +
  • ataque_fisico
  • +
  • durabilidade_max
  • +
  • parte_corpo
  • +
+

Material

+
    +
  • id_item
  • +
+

Consumível

+
    +
  • id_item
  • +
  • saude
  • +
  • magia
  • +
  • saude_maxima
  • +
  • magia_maxima
  • +
  • quantidade
  • +
+

Livro

+
    +
  • id_item
  • +
+

Item Instanciado

+
    +
  • id_nivel
  • +
  • durabilidade_atual
  • +
+

Receita

+
    +
  • id_receita
  • +
  • material_necessario
  • +
+

Habilidade

+
    +
  • id_habilidade
  • +
  • classe
  • +
  • tipo_habilidade
  • +
  • frase_uso
  • +
  • descricao
  • +
  • nome
  • +
  • valor
  • +
+

Elemento

+
    +
  • id_elemento
  • +
  • nome
  • +
  • fraco_contra
  • +
  • forte_contra
  • +
+

Parte do Corpo

+
    +
  • id_parte
  • +
  • tipo_parte
  • +
  • defesa
  • +
  • prob_acerto
  • +
  • chance_critico
  • +
+
+

Relacionamentos

+

Item Instanciado aponta para Item

+
    +
  • Um Item Instanciado aponta para um Item.
  • +
  • Um Item é apontado por N Itens Instanciados.
  • +
+

Parte do Corpo equipa Armadura

+
    +
  • Uma Parte do Corpo equipa uma Armadura.
  • +
  • Uma Armadura é equipada por N Partes do Corpo.
  • +
+

Personagem Luta possui Elemento

+
    +
  • Um Personagem Luta possui de 0 a N Elementos.
  • +
  • Um Elemento é possuído por 0 a N Personagens Luta.
  • +
+

Personagem Luta utiliza Habilidade

+
    +
  • Um Personagem Luta utiliza de 0 a N Habilidades.
  • +
  • Uma Habilidade é utilizada por 0 a N Personagens Luta.
  • +
+

Player está em Party

+
    +
  • Um Player está em uma Party.
  • +
  • Uma Party está com um Player.
  • +
+

Cavaleiro participa de Party

+
    +
  • Um Cavaleiro participa de uma Party.
  • +
  • Uma Party é participada por 0 a N Cavaleiros.
  • +
+

Progresso do Jogador desbloqueia Cavaleiro

+
    +
  • Um Progresso do Jogador desbloqueia de 0 a 1 Cavaleiro.
  • +
  • Um Cavaleiro é desbloqueado por um Progresso do Jogador.
  • +
+

Player avança Progresso Jogador

+
    +
  • Um Player avança 0 a N Progresso Jogador.
  • +
  • Um Progresso Jogador é avançado por um Player.
  • +
+

Progresso Jogador derrota Boss

+
    +
  • Um Progresso Jogador derrota um Boss.
  • +
  • Um Boss é derrotado por um Progresso Jogador.
  • +
+

Player possui Inventário

+
    +
  • Um Player possui um Inventário.
  • +
  • Um Inventário é possuído por um Player.
  • +
+

Inventário armazena Item Instanciado

+
    +
  • Um Inventário armazena de 0 a N Itens Instanciados.
  • +
  • Um Item Instanciado é armazenado por 0 a 1 Inventário.
  • +
+

Inimigo participa de Grupo Inimigo

+
    +
  • Um Inimigo participa de 0 a N Grupos de Inimigos.
  • +
  • Um Grupo Inimigo é participado por pelo menos 1 Inimigo.
  • +
+

Boss dropa Item Instanciado

+
    +
  • Um Boss dropa de 1 a N Itens Instanciados.
  • +
  • Um Item Instanciado é dropado por um Boss.
  • +
+

Santuário contém Salas

+
    +
  • Um Santuário contém de 1 a N Salas.
  • +
  • Uma Sala é contida por um Santuário.
  • +
+

Party está na Sala

+
    +
  • Uma Party está em uma Sala.
  • +
  • Em uma Sala está de 0 a 1 Party.
  • +
+

Grupo Inimigo está na Sala

+
    +
  • Um Grupo Inimigo está em uma Sala.
  • +
  • Em uma Sala está de 0 a N Grupos de Inimigos.
  • +
+

Livro ensina uma Habilidade

+
    +
  • Um Livro ensina uma Habilidade.
  • +
  • Uma Habilidade é ensinada por um Livro.
  • +
+

Player aceita Missão Jogador

+
    +
  • Um Player aceita de 0 a N Missões Jogadores.
  • +
  • Uma Missão Jogador é aceita por um Player.
  • +
+

NPC Mercado vende Item Instanciado

+
    +
  • Um NPC Mercado vende de 0 a N Itens Instanciados.
  • +
  • Um Item Instanciado é vendido por um NPC Mercado.
  • +
+

Grupo Inimigo dropa Item Instanciado

+
    +
  • Um Grupo Inimigo dropa de 0 a N Itens Instanciados.
  • +
  • Um Item Instanciado é dropado por um Grupo Inimigo.
  • +
+

Sala Origem viaja para uma Sala Destino

+
    +
  • Uma Sala Origem viaja para uma Sala Destino.
  • +
+

Material gera Armadura

+
    +
  • Um Material gera 0 ou 1 Armadura.
  • +
  • Uma Armadura pode ser gerada por 0 a N Materiais.
  • +
+

Receita gera Armadura

+
    +
  • Uma Receita gera 0 a N Armaduras.
  • +
  • Uma Armadura é gerada por 0 ou 1 Receita.
  • +
+

Histórico de versão

+ + + + + + + + + + + + + + + +
DataDescriçãoAutor
25/11/2024Versão inicial do Modelo Entidade RelacionamentoLucas Ramon
+ + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/modulo01/ml/index.html b/modulo01/ml/index.html new file mode 100644 index 0000000..e674c43 --- /dev/null +++ b/modulo01/ml/index.html @@ -0,0 +1,806 @@ + + + + + + + + + + + + + + + + + + + + + + + Modelo Lógico - Cavaleiros do Zodiaco + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+ + + + + + + +
+ +
+ + + + +
+
+ + + +
+
+
+ + + + + + + +
+
+
+ + + +
+ +
+ + + +
+
+ + + + + + + +

Modelo Lógico

+ +

Introdução

+

Segundo Elmasri e Navathe ¹, a modelagem conceitual é uma fase muito importante no projeto de uma aplicação de banco de dados bem-sucedida.

+

Objetivo

+

Apresentar o Modelo Lógico confeccionado a partir do Diagrama Entidade Relacionamento (DER) utilizando as 7 Etapas descritas por Elmasri e Navathe ¹. Com isso é facilitado o entendimento dos componentes que irão estar no banco de dados do projeto.

+

Modelo Lógico

+

A figura 1 a seguir mostra a primeira versão do Modelo Lógico desenvolvido pelo grupo:

+

+

Figura 1 - Primeira versão do Modelo Lógico

+ + +

Fonte: Pedro Lucas

+

+

+

Figura 2 - Modelo Lógico Versão 1.1

+ + +

Fonte: Pedro Lucas

+

+

+

Figura 3 - Modelo Lógico Versão 2.0

+ + +

Fonte: Pedro Lucas

+

+

Referência Bibliográfica

+
+

[1] ELMASRI, Ramez; NAVATHE, Shamkant B. Sistemas de banco de dados. Tradução: Daniel Vieira. Revisão técnica: Enzo Seraphim; Thatyana de Faria Piola Seraphim. 6. ed. São Paulo: Pearson Addison Wesley, 2011. Capítulo 7. Modelagem de dados usando o modelo Entidade-Relacionamento (ER), páginas 189-200.

+
+

Bibliografia

+
+

Diagrama Entidade Relacionamento Stardew Valley. Disponível em: https://github.com/SBD1/2023.2-Grupo01-StardewValley/blob/main/docs/Entrega-01/DER_StardewValley_v1.0.md. Acesso em 24 de novembro de 2024.

+

Diagrama Entidade Relacionamento Fear and Hunger. Disponível em: https://github.com/SBD1/2023.2_Fear_and_Hunger/blob/main/docs/modulo_01/assets/DERv/DERv2.3.png. Acesso em 24 de novembro de 2024.

+
+

Histórico de versão

+ + + + + + + + + + + + + + + + + + + + +
DataDescriçãoAutor
24/11/2024Versão inicial do Modelo LógicoPedro Lucas
12/01/2024Versão 2.0 do MLPedro Lucas
+ + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/modulo02/DDL/index.html b/modulo02/DDL/index.html new file mode 100644 index 0000000..04c98aa --- /dev/null +++ b/modulo02/DDL/index.html @@ -0,0 +1,1227 @@ + + + + + + + + + + + + + + + + + + + DDL - Cavaleiros do Zodiaco + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+ + + + + + + +
+ +
+ + + + +
+
+ + + +
+
+
+ + + + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + +

DDL

+ +

DDL

+

Versionamento

+ + + + + + + + + + + + + + + + + +
VersãoDataModificaçãoAutor
0.113/01/2025Criação do DocumentoVinícius Rufino
+

```sql +CREATE TABLE IF NOT EXISTS Elemento ( + id_elemento SERIAL PRIMARY KEY, + nome VARCHAR UNIQUE NOT NULL, + descricao VARCHAR, + fraco_contra INTEGER, + forte_contra INTEGER +);

+

CREATE TABLE Player ( + id_player SERIAL PRIMARY KEY, + id_elemento INTEGER, + nome VARCHAR UNIQUE NOT NULL, + nivel INTEGER NOT NULL, + xp_acumulado INTEGER NOT NULL, + hp_max INTEGER NOT NULL, + magia_max INTEGER NOT NULL, + hp_atual INTEGER NOT NULL, + magia_atual INTEGER NOT NULL, + velocidade INTEGER NOT NULL, + ataque_fisico_base INTEGER NOT NULL, + ataque_magico_base INTEGER NOT NULL, + id_sala_safe INTEGER NOT NULL +);

+

ALTER TABLE Player ADD CONSTRAINT FK_Player_2 + FOREIGN KEY (id_elemento) + REFERENCES Elemento (id_elemento);

+

CREATE TABLE Classe ( + id_classe SERIAL PRIMARY KEY, + nome VARCHAR UNIQUE NOT NULL, + descricao VARCHAR +);

+

CREATE TABLE Habilidade ( + id_habilidade SERIAL PRIMARY KEY, + classe_habilidade INTEGER, + elemento_habilidade INTEGER, + nome VARCHAR, + custo INTEGER, + descricao VARCHAR, + frase_uso VARCHAR, + nivel_necessario INTEGER +);

+

ALTER TABLE Habilidade ADD CONSTRAINT FK_Habilidade_2 + FOREIGN KEY (elemento_habilidade) + REFERENCES Elemento (id_elemento);

+

ALTER TABLE Habilidade ADD CONSTRAINT FK_Habilidade_3 + FOREIGN KEY (classe_habilidade) + REFERENCES Classe (id_classe);

+

CREATE TYPE tipo_item as ENUM ('a', 'm', 'i', 'c', 'l'); / a = armadura, m = material, i = item_missao, c = consumivel, l = livro / +CREATE TYPE parte_corpo as ENUM ('c', 't', 'b', 'p'); / c = cabeça, t = tronco, b = braços, p = pernas /

+

DROP TYPE parte_corpo; +DROP TYPE tipo_item;

+

CREATE TYPE enum_tipo_item as ENUM ('a', 'm', 'i', 'c', 'l'); / a = armadura, m = material, i = item_missao, c = consumivel, l = livro / +CREATE TYPE enum_parte_corpo as ENUM ('c', 't', 'b', 'p'); / c = cabeça, t = tronco, b = braços, p = pernas /

+

CREATE TABLE Parte_Corpo ( + id_parte_corpo enum_parte_corpo PRIMARY KEY, + nome VARCHAR UNIQUE NOT NULL, + defesa_magica INTEGER NOT NULL, + defesa_fisica INTEGER NOT NULL, + chance_acerto INTEGER NOT NULL, + chance_acerto_critico INTEGER NOT NULL +);

+

CREATE TABLE Tipo_Item ( + id_item SERIAL PRIMARY KEY, + tipo_item INTEGER NOT NULL +);

+

CREATE TABLE Armadura ( + id_armadura INTEGER, + id_parte_corpo enum_parte_corpo, + nome VARCHAR NOT NULL, + raridade_armadura VARCHAR NOT NULL, + defesa_magica INTEGER, + defesa_fisica INTEGER, + ataque_magico INTEGER, + ataque_fisico INTEGER, + durabilidade_max INTEGER, + preco_venda INTEGER, + descricao INTEGER, + PRIMARY KEY (id_armadura, id_parte_corpo) +);

+

CREATE TABLE Material ( + id_material INTEGER PRIMARY KEY, + nome VARCHAR UNIQUE NOT NULL, + preco_venda INTEGER NOT NULL, + descricao VARCHAR +);

+

CREATE TABLE Item_Missao ( + id_item INTEGER PRIMARY KEY, + nome VARCHAR UNIQUE NOT NULL, + descricao VARCHAR +);

+

CREATE TABLE Consumivel ( + id_item INTEGER PRIMARY KEY, + nome VARCHAR UNIQUE NOT NULL, + descricao VARCHAR, + preco_venda INTEGER NOT NULL, + saude_restaurada INTEGER, + magia_restaurada INTEGER, + saude_maxima INTEGER, + magia_maxima INTEGER +);

+

CREATE TABLE Livro ( + id_item INTEGER PRIMARY KEY, + id_habilidade INTEGER, + nome VARCHAR UNIQUE NOT NULL, + descricao VARCHAR, + preco_venda INTEGER NOT NULL +);

+

ALTER TABLE Armadura ADD CONSTRAINT FK_Armadura_2 + FOREIGN KEY (id_armadura) + REFERENCES Tipo_Item (id_item);

+

ALTER TABLE Armadura ADD CONSTRAINT FK_Armadura_3 + FOREIGN KEY (id_parte_corpo) + REFERENCES Parte_Corpo (id_parte_corpo);

+

ALTER TABLE Material ADD CONSTRAINT FK_Material_2 + FOREIGN KEY (id_material) + REFERENCES Tipo_Item (id_item);

+

ALTER TABLE Item_Missao ADD CONSTRAINT FK_Item_Missao_2 + FOREIGN KEY (id_item) + REFERENCES Tipo_Item (id_item);

+

ALTER TABLE Livro ADD CONSTRAINT FK_Livro_2 + FOREIGN KEY (id_item) + REFERENCES Tipo_Item (id_item);

+

ALTER TABLE Livro ADD CONSTRAINT FK_Livro_3 + FOREIGN KEY (id_habilidade) + REFERENCES Habilidade (id_habilidade);

+

ALTER TABLE Consumivel ADD CONSTRAINT FK_Consumivel_2 + FOREIGN KEY (id_item) + REFERENCES Tipo_Item (id_item);

+

CREATE TABLE Missao ( + id_missao SERIAL PRIMARY KEY, + id_missao_anterior INTEGER, + item_necessario INTEGER NOT NULL, + nome INTEGER UNIQUE NOT NULL, + dialogo_inicial VARCHAR, + dialogo_durante VARCHAR, + dialogo_completa VARCHAR +);

+

ALTER TABLE Missao ADD CONSTRAINT FK_Missao_2 + FOREIGN KEY (id_missao_anterior) + REFERENCES Missao (id_missao);

+

ALTER TABLE Missao ADD CONSTRAINT FK_Missao_3 + FOREIGN KEY (item_necessario) + REFERENCES Item_Missao (id_item);

+

CREATE TABLE Santuario ( + id_santuario SERIAL PRIMARY KEY, + id_missao_requisito INTEGER, + id_missao_proximo_santuario INTEGER, + nome VARCHAR UNIQUE NOT NULL, + descricao VARCHAR, + nivel_recomendado INTEGER NOT NULL +);

+

CREATE TABLE Casa ( + id_casa SERIAL PRIMARY KEY, + id_santuario INTEGER NOT NULL, + id_missao_requisito INTEGER, + id_missao_proxima_casa INTEGER, + nome VARCHAR NOT NULL, + descricao VARCHAR, + nivel_recomendado INTEGER NOT NULL +);

+

CREATE TABLE Sala ( + id_sala SERIAL PRIMARY KEY, + id_casa INTEGER NOT NULL, + nome VARCHAR NOT NULL, + id_sala_norte INTEGER, + id_sala_sul INTEGER, + id_sala_leste INTEGER, + id_sala_oeste INTEGER +);

+

ALTER TABLE Santuario ADD CONSTRAINT FK_Santuario_2 + FOREIGN KEY (id_missao_requisito) + REFERENCES Missao (id_missao);

+

ALTER TABLE Santuario ADD CONSTRAINT FK_Santuario_3 + FOREIGN KEY (id_missao_proximo_santuario) + REFERENCES Missao (id_missao);

+

ALTER TABLE Casa ADD CONSTRAINT FK_Casa_2 + FOREIGN KEY (id_santuario) + REFERENCES Santuario (id_santuario);

+

ALTER TABLE Casa ADD CONSTRAINT FK_Casa_3 + FOREIGN KEY (id_missao_requisito) + REFERENCES Missao (id_missao);

+

ALTER TABLE Casa ADD CONSTRAINT FK_Casa_4 + FOREIGN KEY (id_missao_proxima_casa) + REFERENCES Missao (id_missao);

+

ALTER TABLE Sala ADD CONSTRAINT FK_Sala_2 + FOREIGN KEY (id_casa) + REFERENCES Casa (id_casa);

+

CREATE TABLE Npc_Ferreiro ( + id_npc_ferreiro INTEGER PRIMARY KEY, + id_sala INTEGER NOT NULL, + id_missao_desbloqueia INTEGER NOT NULL, + nome VARCHAR NOT NULL, + descricao VARCHAR, + dialogo_inicial VARCHAR, + dialogo_reparar VARCHAR, + dialogo_upgrade VARCHAR +);

+

CREATE TABLE Npc_Quest ( + id_npc_quest INTEGER PRIMARY KEY, + id_sala INTEGER NOT NULL, + nome VARCHAR NOT NULL, + descricao VARCHAR, + dialogo_inicial VARCHAR, + dialogo_recusa VARCHAR +);

+

CREATE TABLE Npc_Mercador ( + id_npc_mercador INTEGER PRIMARY KEY, + id_sala INTEGER NOT NULL, + nome VARCHAR NOT NULL, + descricao VARCHAR, + dialogo_inicial VARCHAR, + dialogo_vender VARCHAR, + dialogo_comprar VARCHAR, + dialogo_sair VARCHAR +);

+

ALTER TABLE Npc_Ferreiro ADD CONSTRAINT FK_Npc_Ferreiro_2 + FOREIGN KEY (id_sala) + REFERENCES Sala (id_sala);

+

ALTER TABLE Npc_Ferreiro ADD CONSTRAINT FK_Npc_Ferreiro_3 + FOREIGN KEY (id_missao_desbloqueia) + REFERENCES Missao (id_missao);

+

ALTER TABLE Npc_Quest ADD CONSTRAINT FK_Npc_Quest_2 + FOREIGN KEY (id_sala) + REFERENCES Sala (id_sala);

+

ALTER TABLE Npc_Mercador ADD CONSTRAINT FK_Npc_Mercador_2 + FOREIGN KEY (id_sala) + REFERENCES Sala (id_sala);

+

CREATE TABLE Cavaleiro ( + id_cavaleiro SERIAL PRIMARY KEY, + id_classe INTEGER NOT NULL, + id_elemento INTEGER NOT NULL, + nome VARCHAR UNIQUE NOT NULL, + nivel INTEGER NOT NULL, + hp_max INTEGER NOT NULL, + magia_max INTEGER NOT NULL, + velocidade_base INTEGER NOT NULL, + ataque_fisico_base INTEGER NOT NULL, + ataque_magico_base INTEGER NOT NULL +);

+

ALTER TABLE Cavaleiro ADD CONSTRAINT FK_Cavaleiro_2 + FOREIGN KEY (id_classe) + REFERENCES Classe (id_classe);

+

ALTER TABLE Cavaleiro ADD CONSTRAINT FK_Cavaleiro_3 + FOREIGN KEY (id_elemento) + REFERENCES Elemento (id_elemento);

+

CREATE TABLE Boss ( + id_boss SERIAL PRIMARY KEY, + id_sala INTEGER NOT NULL, + nome INTEGER NOT NULL, + nivel INTEGER NOT NULL, + xp_acumulado INTEGER NOT NULL, + hp_max INTEGER NOT NULL, + hp_atual INTEGER NOT NULL, + magia_max INTEGER NOT NULL, + magia_atual INTEGER NOT NULL, + velocidade INTEGER NOT NULL, + ataque_fisico_base INTEGER NOT NULL, + ataque_magico_base INTEGER NOT NULL, + dinheiro INTEGER NOT NULL, + fala_inicio VARCHAR, + fala_derrotar_player VARCHAR, + fala_derrotado VARCHAR, + fala_condicao VARCHAR +);

+

ALTER TABLE Boss ADD CONSTRAINT FK_Boss_2 + FOREIGN KEY (id_sala) + REFERENCES Sala (id_sala);

+

CREATE TABLE Inimigo ( + id_inimigo SERIAL PRIMARY KEY, + id_classe INTEGER NOT NULL, + id_elemento INTEGER NOT NULL, + nome VARCHAR NOT NULL, + nivel INTEGER NOT NULL, + xp_acumulado INTEGER NOT NULL, + hp_max INTEGER NOT NULL, + magia_max INTEGER NOT NULL, + velocidade INTEGER NOT NULL, + ataque_fisico_base INTEGER NOT NULL, + ataque_magico_base INTEGER NOT NULL, + dinheiro INTEGER NOT NULL, + fala_inicio VARCHAR +);

+

ALTER TABLE Inimigo ADD CONSTRAINT FK_Inimigo_2 + FOREIGN KEY (id_elemento) + REFERENCES Elemento (id_elemento);

+

ALTER TABLE Inimigo ADD CONSTRAINT FK_Inimigo_3 + FOREIGN KEY (id_classe) + REFERENCES Classe (id_classe);

+

CREATE TABLE Grupo_inimigo ( + id_grupo SERIAL PRIMARY KEY, + id_sala INTEGER +);

+

CREATE TABLE Instancia_Inimigo ( + id_instancia SERIAL, + id_inimigo INTEGER, + id_grupo INTEGER, + hp_atual INTEGER NOT NULL, + magia_atual INTEGER NOT NULL, + defesa_fisica_bonus INTEGER, + defesa_magica_bonus INTEGER, + PRIMARY KEY (id_inimigo, id_instancia) +);

+

ALTER TABLE Instancia_Inimigo ADD CONSTRAINT FK_Instancia_Inimigo_2 + FOREIGN KEY (id_inimigo) + REFERENCES Inimigo (id_inimigo);

+

ALTER TABLE Instancia_Inimigo ADD CONSTRAINT FK_Instancia_Inimigo_3 + FOREIGN KEY (id_grupo) + REFERENCES Grupo_inimigo (id_grupo);

+

ALTER TABLE Grupo_inimigo ADD CONSTRAINT FK_Grupo_inimigo_2 + FOREIGN KEY (id_sala) + REFERENCES Sala (id_sala);

+

CREATE TABLE Inventario ( + id_player INTEGER PRIMARY KEY, + dinheiro INTEGER NOT NULL +);

+

ALTER TABLE Inventario ADD CONSTRAINT FK_Inventario_1 + FOREIGN KEY (id_player) + REFERENCES Player (id_player);

+

CREATE TABLE Armadura_Instancia ( + id_armadura INTEGER, + id_parte_corpo_armadura enum_parte_corpo, + id_instancia SERIAL, + id_inventario INTEGER, + raridade_armadura INTEGER NOT NULL, + defesa_magica INTEGER NOT NULL, + defesa_fisica INTEGER NOT NULL, + ataque_magico INTEGER NOT NULL, + ataque_fisico INTEGER NOT NULL, + durabilidade_max INTEGER NOT NULL, + preco_venda INTEGER NOT NULL, + PRIMARY KEY (id_armadura, id_instancia, id_parte_corpo_armadura) +);

+

ALTER TABLE Armadura_Instancia ADD CONSTRAINT FK_Armadura_Instancia_2 + FOREIGN KEY (id_armadura, id_parte_corpo_armadura) + REFERENCES Armadura (id_armadura, id_parte_corpo);

+

ALTER TABLE Armadura_Instancia ADD CONSTRAINT FK_Armadura_Instancia_3 + FOREIGN KEY (id_inventario) + REFERENCES Inventario (id_player);

+

CREATE TABLE Item_a_venda ( + id_item INTEGER PRIMARY KEY, + preco_compra INTEGER NOT NULL, + level_minimo INTEGER NOT NULL +);

+

ALTER TABLE Item_a_venda ADD CONSTRAINT FK_Item_a_venda_2 + FOREIGN KEY (id_item) + REFERENCES Tipo_Item (id_item);

+

CREATE TABLE Party ( + id_player INTEGER PRIMARY KEY, + id_sala INTEGER +);

+

ALTER TABLE Party ADD CONSTRAINT FK_Party_2 + FOREIGN KEY (id_sala) + REFERENCES Sala (id_sala);

+

CREATE TABLE Instancia_Cavaleiro ( + id_instancia_cavaleiro SERIAL, + id_cavaleiro INTEGER NOT NULL, + id_party INTEGER, + nivel INTEGER NOT NULL, + xp_atual INTEGER NOT NULL, + hp_max INTEGER NOT NULL, + magia_max INTEGER NOT NULL, + hp_atual INTEGER NOT NULL, + magia_atual INTEGER NOT NULL, + velocidade INTEGER NOT NULL, + ataque_fisico INTEGER NOT NULL, + ataque_magico INTEGER NOT NULL, + PRIMARY KEY (id_cavaleiro, id_instancia_cavaleiro) +);

+

ALTER TABLE Instancia_Cavaleiro ADD CONSTRAINT FK_Instancia_Cavaleiro_2 + FOREIGN KEY (id_cavaleiro) + REFERENCES Cavaleiro (id_cavaleiro);

+

ALTER TABLE Instancia_Cavaleiro ADD CONSTRAINT FK_Instancia_Cavaleiro_3 + FOREIGN KEY (id_party) + REFERENCES Party (id_player);

+

CREATE TABLE Progresso_Player ( + id_player INTEGER , + id_boss INTEGER, + id_cavaleiro INTEGER , + status_derrotado BOOLEAN, + PRIMARY KEY (id_player, id_boss) +);

+

ALTER TABLE Progresso_Player ADD CONSTRAINT FK_Progresso_Player_2 + FOREIGN KEY (id_player) + REFERENCES Player (id_player);

+

ALTER TABLE Progresso_Player ADD CONSTRAINT FK_Progresso_Player_3 + FOREIGN KEY (id_boss) + REFERENCES Boss (id_boss);

+

ALTER TABLE Progresso_Player ADD CONSTRAINT FK_Progresso_Player_4 + FOREIGN KEY (id_cavaleiro) + REFERENCES Cavaleiro (id_cavaleiro);

+

CREATE TABLE Receita ( + id_item_gerado INTEGER PRIMARY KEY, + descricao VARCHAR +);

+

ALTER TABLE Receita ADD CONSTRAINT FK_Receita_2 + FOREIGN KEY (id_item_gerado) + REFERENCES Tipo_Item (id_item);

+

CREATE TYPE enum_status_missao as ENUM ('c','i','ni'); / c = completo, i=iniciado,ni=não iniciado/ +CREATE TABLE Player_Missao ( + id_player INTEGER, + id_missao INTEGER, + status_missao enum_status_missao NOT NULL, + PRIMARY KEY (id_player, id_missao) +);

+

ALTER TABLE Player_Missao ADD CONSTRAINT FK_Player_Missao_2 + FOREIGN KEY (id_missao) + REFERENCES Missao (id_missao);

+

ALTER TABLE Player_Missao ADD CONSTRAINT FK_Player_Missao_3 + FOREIGN KEY (id_player) + REFERENCES Player (id_player);

+

CREATE TABLE Xp_Necessaria ( + nivel INTEGER PRIMARY KEY, + xp_necessaria INTEGER NOT NULL +);

+

CREATE TABLE Material_Receita ( + id_receita INTEGER, + id_material INTEGER, + quantidade INTEGER NOT NULL, + PRIMARY KEY (id_receita, id_material) +);

+

ALTER TABLE Material_Receita ADD CONSTRAINT FK_Material_Receita_2 + FOREIGN KEY (id_material) + REFERENCES Material (id_material);

+

ALTER TABLE Material_Receita ADD CONSTRAINT FK_Material_Receita_3 + FOREIGN KEY (id_receita) + REFERENCES Receita (id_item_gerado);

+

CREATE TABLE Habilidade_Player ( + id_player INTEGER, + id_habilidade INTEGER, + slot INTEGER NOT NULL, + PRIMARY KEY (id_player, id_habilidade, slot) +);

+

ALTER TABLE Habilidade_Player ADD CONSTRAINT FK_Habilidade_Player_2 + FOREIGN KEY (id_habilidade) + REFERENCES Habilidade (id_habilidade);

+

ALTER TABLE Habilidade_Player ADD CONSTRAINT FK_Habilidade_Player_3 + FOREIGN KEY (id_player) + REFERENCES Player (id_player);

+

CREATE TABLE Habilidade_Cavaleiro ( + id_cavaleiro INTEGER, + id_habilidade INTEGER, + slot INTEGER NOT NULL, + PRIMARY KEY (id_cavaleiro, id_habilidade, slot) +);

+

ALTER TABLE Habilidade_Cavaleiro ADD CONSTRAINT FK_Habilidade_Cavaleiro_2 + FOREIGN KEY (id_cavaleiro) + REFERENCES Cavaleiro (id_cavaleiro);

+

ALTER TABLE Habilidade_Cavaleiro ADD CONSTRAINT FK_Habilidade_Cavaleiro_3 + FOREIGN KEY (id_habilidade) + REFERENCES Habilidade (id_habilidade);

+

CREATE TABLE Habilidade_Boss ( + id_boss INTEGER, + id_habilidade INTEGER, + PRIMARY KEY (id_boss, id_habilidade) +);

+

ALTER TABLE Habilidade_Boss ADD CONSTRAINT FK_Habilidade_Boss_2 + FOREIGN KEY (id_boss) + REFERENCES Boss (id_boss);

+

ALTER TABLE Habilidade_Boss ADD CONSTRAINT FK_Habilidade_Boss_3 + FOREIGN KEY (id_habilidade) + REFERENCES Habilidade (id_habilidade);

+

CREATE TABLE Parte_Corpo_Boss ( + id_boss INTEGER, + parte_corpo enum_parte_corpo, + defesa_fisica INTEGER NOT NULL, + defesa_magica INTEGER NOT NULL, + chance_acerto_base INTEGER NOT NULL, + chance_acerto_critico INTEGER NOT NULL, + PRIMARY KEY (id_boss, parte_corpo) +);

+

ALTER TABLE Parte_Corpo_Boss ADD CONSTRAINT FK_Parte_Corpo_Boss_2 + FOREIGN KEY (id_boss) + REFERENCES Boss (id_boss);

+

ALTER TABLE Parte_Corpo_Boss ADD CONSTRAINT FK_Parte_Corpo_Boss_3 + FOREIGN KEY (parte_corpo) + REFERENCES Parte_Corpo (id_parte_corpo);

+

CREATE TABLE Parte_Corpo_Cavaleiro ( + id_cavaleiro INTEGER, + parte_corpo enum_parte_corpo, + id_instancia_cavaleiro INTEGER NOT NULL, + defesa_fisica_bonus INTEGER NOT NULL, + defesa_magico_bonus INTEGER NOT NULL, + chance_acerto_base INTEGER NOT NULL, + chance_acerto_critico INTEGER NOT NULL, + PRIMARY KEY (id_cavaleiro, parte_corpo) +);

+

ALTER TABLE Parte_Corpo_Cavaleiro ADD CONSTRAINT FK_Parte_Corpo_Cavaleiro_2 + FOREIGN KEY (parte_corpo) + REFERENCES Parte_Corpo (id_parte_corpo);

+

ALTER TABLE Parte_Corpo_Cavaleiro ADD CONSTRAINT FK_Parte_Corpo_Cavaleiro_3 + FOREIGN KEY (id_instancia_cavaleiro, id_cavaleiro) + REFERENCES Instancia_Cavaleiro (id_instancia_cavaleiro, id_cavaleiro);

+

CREATE TABLE Parte_Corpo_Player ( + id_player INTEGER, + parte_corpo enum_parte_corpo, + armadura_equipada INTEGER, + instancia_armadura_equipada INTEGER, + PRIMARY KEY (id_player, parte_corpo) +);

+

ALTER TABLE Parte_Corpo_Player ADD CONSTRAINT FK_Parte_Corpo_Player_2 + FOREIGN KEY (id_player) + REFERENCES Player (id_player);

+

ALTER TABLE Parte_Corpo_Player ADD CONSTRAINT FK_Parte_Corpo_Player_3 + FOREIGN KEY (parte_corpo) + REFERENCES Parte_Corpo (id_parte_corpo);

+

ALTER TABLE Parte_Corpo_Player ADD CONSTRAINT FK_Parte_Corpo_Player_4 + FOREIGN KEY (armadura_equipada, instancia_armadura_equipada, parte_corpo) + REFERENCES Armadura_Instancia (id_armadura, id_instancia, id_parte_corpo_armadura);

+

CREATE TABLE Elemento_Boss ( + id_elemento INTEGER, + id_boss INTEGER, + PRIMARY KEY (id_boss, id_elemento) +);

+

ALTER TABLE Elemento_Boss ADD CONSTRAINT FK_Elemento_Boss_1 + FOREIGN KEY (id_elemento) + REFERENCES Elemento (id_elemento);

+

ALTER TABLE Elemento_Boss ADD CONSTRAINT FK_Elemento_Boss_2 + FOREIGN KEY (id_boss) + REFERENCES Boss (id_boss);

+

CREATE TABLE Habilidade_Inimigo ( + id_habilidade INTEGER, + id_player INTEGER, + PRIMARY KEY (id_habilidade, id_player) +);

+

ALTER TABLE Habilidade_Inimigo ADD CONSTRAINT FK_Habilidade_Inimigo_2 + FOREIGN KEY (id_habilidade) + REFERENCES Habilidade (id_habilidade);

+

ALTER TABLE Habilidade_Inimigo ADD CONSTRAINT FK_Habilidade_Inimigo_3 + FOREIGN KEY (id_player) + REFERENCES Inimigo (id_inimigo);

+

CREATE TABLE Item_Armazenado ( + id_inventario INTEGER, + id_item INTEGER, + quantidade INTEGER NOT NULL, + PRIMARY KEY (id_inventario, id_item) +);

+

ALTER TABLE Item_Armazenado ADD CONSTRAINT FK_Item_Armazenado_2 + FOREIGN KEY (id_inventario) + REFERENCES Inventario (id_player);

+

ALTER TABLE Item_Armazenado ADD CONSTRAINT FK_Item_Armazenado_3 + FOREIGN KEY (id_item) + REFERENCES Tipo_Item (id_item);

+

CREATE TABLE Item_grupo_inimigo_dropa ( + id_item INTEGER, + id_grupo_inimigo INTEGER, + quantidade INTEGER NOT NULL, + PRIMARY KEY (id_item, id_grupo_inimigo) +);

+

ALTER TABLE Item_grupo_inimigo_dropa ADD CONSTRAINT FK_Item_grupo_inimigo_dropa_2 + FOREIGN KEY (id_item) + REFERENCES Tipo_Item (id_item);

+

ALTER TABLE Item_grupo_inimigo_dropa ADD CONSTRAINT FK_Item_grupo_inimigo_dropa_3 + FOREIGN KEY (id_grupo_inimigo) + REFERENCES Grupo_inimigo (id_grupo);

+

CREATE TABLE Texto ( + id SERIAL PRIMARY KEY, + texto TEXT NOT NULL, + nome_texto VARCHAR NOT NULL +);

+

INSERT INTO Texto (nome_texto, texto) +VALUES ( +'logo', +' __ __ _ __ __ _ +- / / ____ _ _ __ ____ _ / / ___ () _ _____ ____/ / ____ /__ / ____ ____/ / () _ _ _ +- / / / __ /| | / / / __/ / / / _ / / / / / __ / / / __ / / __ / / / __ / __ / / / / __ `/ / / / __ \ +- / / / // / | |/ / / // / / / / __/ / / / / / // / ( ) / // / / // / / // // // // / / / / // / / /__ / // / +- _/ _,/ |/ _,/ // _/ // // _/ // _,/ ____/ /____/____/ _,/ // _,/ ___/ ____/'
+);

+

INSERT INTO Texto (nome_texto, texto) +VALUES ('introducao', +'Desde tempos imemoriais, quando o mal ameaçou dominar o mundo, guerreiros sagrados se ergueram para proteger a paz na Terra. Vestindo armaduras forjadas pelas constelações, eles lutaram com coragem e honra em nome da deusa Atena. Esses guerreiros são conhecidos como os lendários Cavaleiros do Zodíaco.

+

Agora, as forças sombrias despertam mais uma vez, e o equilíbrio do mundo está em perigo. Somente aqueles com um coração puro e a força do Cosmo poderão enfrentar o destino e erguer-se como verdadeiros defensores da justiça.

+

Prepare-se para vestir sua armadura, elevar seu Cosmo e escrever sua própria lenda. A batalha pelo futuro da humanidade começa agora!' +);

+

CREATE OR REPLACE FUNCTION public.mudar_sala(id_player_input INTEGER, direcao TEXT) +RETURNS VOID +LANGUAGE plpgsql +AS $function$ +DECLARE + nova_sala_id INTEGER; +BEGIN + -- Verifica a sala conectada na direção especificada + SELECT CASE LOWER(direcao) + WHEN 'norte' THEN s.id_sala_norte + WHEN 'sul' THEN s.id_sala_sul + WHEN 'leste' THEN s.id_sala_leste + WHEN 'oeste' THEN s.id_sala_oeste + ELSE NULL + END INTO nova_sala_id + FROM public.sala s + JOIN public.party p ON p.id_sala = s.id_sala + WHERE p.id_player = id_player_input;

+
-- Verifica se a sala existe e atualiza a localização da party
+IF nova_sala_id IS NOT NULL THEN
+    UPDATE public.party
+    SET id_sala = nova_sala_id
+    WHERE id_player = id_player_input;
+ELSE
+    RAISE NOTICE 'Movimento inválido: Não há sala conectada nessa direção.';
+END IF;
+
+

END; +$function$;

+ + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/modulo02/DML/index.html b/modulo02/DML/index.html new file mode 100644 index 0000000..42d2300 --- /dev/null +++ b/modulo02/DML/index.html @@ -0,0 +1,842 @@ + + + + + + + + + + + + + + + + + + + DML - Cavaleiros do Zodiaco + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+ + + + + + + +
+ +
+ + + + +
+
+ + + +
+
+
+ + + + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + +

DML

+ +

DML

+

Versionamento

+ + + + + + + + + + + + + + + + + +
VersãoDataModificaçãoAutor
0.111/12/2023Criação do DocumentoVinícius Rufino
+

```ALTER TABLE santuario RENAME TO saga; +ALTER TABLE saga RENAME COLUMN id_santuario TO id_saga; +ALTER TABLE saga RENAME COLUMN id_missao_proximo_santuario TO id_missao_proxima_saga; +ALTER TABLE casa RENAME COLUMN id_santuario TO id_saga; +ALTER TABLE Missao ALTER COLUMN nome TYPE VARCHAR USING NULL;

+

INSERT INTO Saga (id_saga, id_missao_requisito, id_missao_proxima_saga, nome, descricao, nivel_recomendado) +VALUES (1, NULL, NULL, 'Saga SafeHouse', 'O início da jornada dos Cavaleiros de Bronze, onde cresceram e descobriram seus destinos.', 1);

+

INSERT INTO Casa (id_casa, id_saga, id_missao_requisito, id_missao_proxima_casa, nome, descricao, nivel_recomendado) +VALUES (1, 1, NULL, NULL, 'Casa SafeHouse', 'O lugar onde os +Cavaleiros de Bronze viveram antes de serem enviados para seus treinamentos.', 1);

+

INSERT INTO Sala (id_sala, id_casa, nome, id_sala_norte, id_sala_sul, id_sala_leste, id_sala_oeste) +VALUES (1, 1, 'Sala Principal SafeHouse', 2, 3, NULL, NULL);

+

INSERT INTO Sala (id_sala, id_casa, nome, id_sala_norte, id_sala_sul, id_sala_leste, id_sala_oeste) +VALUES (2, 1, 'Sala Das Missões', NULL, 1, NULL, NULL);

+

INSERT INTO Sala (id_sala, id_casa, nome, id_sala_norte, id_sala_sul, id_sala_leste, id_sala_oeste) +VALUES (3, 1, 'Oficina de Armaduras de Mu', 1, NULL, NULL, NULL);

+

INSERT INTO Saga (id_saga, id_missao_requisito, id_missao_proxima_saga, nome, descricao, nivel_recomendado) +VALUES (2, NULL, NULL, 'Saga das 12 Casas', 'Os Cavaleiros de Bronze enfrentam os Cavaleiros de Ouro para salvar Atena.', 1);

+

ALTER TABLE Tipo_Item ALTER COLUMN tipo_item TYPE enum_tipo_item USING NULL;

+

INSERT INTO public.tipo_item (id_item, tipo_item) +VALUES(1, 'i');

+

INSERT INTO public.item_missao +(id_item, nome, descricao) +VALUES(1, 'Benção de Mu', 'Ao derrotar Mu ele abençoa os Cavaleiros');

+

INSERT INTO public.missao +(id_missao_anterior, item_necessario, nome, dialogo_inicial, dialogo_durante, dialogo_completa) +VALUES( NULL, 1, 'Derrote o Cavaleiro de Áries', '', '', '');

+

INSERT INTO Casa (id_casa, id_saga, id_missao_requisito, id_missao_proxima_casa, nome, descricao, nivel_recomendado) +VALUES (2, 2, NULL, 1, 'Casa Áries', 'A casa protegida por Mu, o Cavaleiro de Áries, que repara as armaduras dos Cavaleiros de Bronze.', 1);

+

INSERT INTO Sala (id_sala, id_casa, nome, id_sala_norte, id_sala_sul, id_sala_leste, id_sala_oeste) +VALUES (4, 2, 'Covil dos esqueletos', 5, NULL, NULL, NULL);

+

INSERT INTO Sala (id_sala, id_casa, nome, id_sala_norte, id_sala_sul, id_sala_leste, id_sala_oeste) +VALUES (5, 2, 'Covil Dos Anões', NULL, 4, 6, 7);

+

INSERT INTO Sala (id_sala, id_casa, nome, id_sala_norte, id_sala_sul, id_sala_leste, id_sala_oeste) +VALUES (6, 2, 'Covil das serpentes', NULL, NULL, NULL, 5);

+

INSERT INTO Sala (id_sala, id_casa, nome, id_sala_norte, id_sala_sul, id_sala_leste, id_sala_oeste) +VALUES (7, 2, 'Sala dos Cavaleiros Negros', 8, NULL, 5, NULL);

+

INSERT INTO Sala (id_sala, id_casa, nome, id_sala_norte, id_sala_sul, id_sala_leste, id_sala_oeste) +VALUES (8, 2, 'Sala de combate de Áries', NULL, 7, NULL, NULL);

+

INSERT INTO Elemento (id_elemento, nome, descricao) +VALUES + (1, 'Fogo', 'Controla o calor e as chamas, usado frequentemente para atacar com intensidade.'), + (2, 'Água', 'Flui e adapta-se, frequentemente usada para defesa e restrição de movimentos.'), + (3, 'Terra', 'Sólido e confiável, usado para defesa e ataques físicos.'), + (4, 'Vento', 'Rápido e inconstante, usado para movimentação rápida e ataques evasivos.'), + (5, 'Trovão', 'Poderoso e chocante, usado para ataques elétricos rápidos e devastadores.');

+

UPDATE Elemento SET fraco_contra = 2, forte_contra = 3 WHERE id_elemento = 1; -- Fogo fraco contra Água, forte contra Terra +UPDATE Elemento SET fraco_contra = 3, forte_contra = 1 WHERE id_elemento = 2; -- Água fraca contra Terra, forte contra Fogo +UPDATE Elemento SET fraco_contra = 4, forte_contra = 5 WHERE id_elemento = 3; -- Terra fraca contra Vento, forte contra Trovão +UPDATE Elemento SET fraco_contra = 1, forte_contra = 3 WHERE id_elemento = 4; -- Vento fraco contra Fogo, forte contra Terra +UPDATE Elemento SET fraco_contra = 3, forte_contra = 2 WHERE id_elemento = 5; -- Trovão fraco contra Terra, forte contra Água

+

CREATE OR REPLACE FUNCTION insert_random_cdz_player() +RETURNS void AS +$$ +DECLARE + nome_cdz TEXT; + id_elemento_min INT; + id_elemento_max INT; +BEGIN

+
WITH nomes AS (
+    SELECT unnest(ARRAY['Arion', 'Celestis', 'Drakon', 'Helion', 'Zephyr']) AS nome
+)
+SELECT nome INTO nome_cdz FROM nomes ORDER BY random() LIMIT 1;
+
+-- Obter o mínimo e o máximo ID do elemento
+SELECT MIN(id_elemento), MAX(id_elemento) INTO id_elemento_min, id_elemento_max FROM Elemento;
+
+-- Inserir o registro com valores aleatórios
+INSERT INTO public.player
+(id_elemento, nome, nivel, xp_acumulado, hp_max, magia_max, hp_atual, magia_atual, velocidade, ataque_fisico_base, ataque_magico_base, id_sala_safe)
+VALUES
+(floor(random() * (id_elemento_max - id_elemento_min + 1) + id_elemento_min), nome_cdz, floor(random() * 61), floor(random() * 61), floor(random() * 61), floor(random() * 61), floor(random() * 61), floor(random() * 61), floor(random() * 61), floor(random() * 61), floor(random() * 61), floor(random() * 61));
+
+

END; +$$ +LANGUAGE plpgsql;

+

SELECT insert_random_cdz_player();

+

INSERT INTO party (id_player, id_sala) +VALUES(1, 1);

+

CREATE OR REPLACE FUNCTION setar_sala_inicial(id_player_input INT) +RETURNS VOID AS $$ +DECLARE + sala_inicial_id INT; +BEGIN + -- Recupera o menor id_sala da tabela sala + SELECT MIN(id_sala) INTO sala_inicial_id FROM public.sala;

+
-- Verifica se existe uma sala
+IF sala_inicial_id IS NOT NULL THEN
+    -- Atualiza o id_sala_safe do player
+    UPDATE public.player
+    SET id_sala_safe = sala_inicial_id
+    WHERE id_player = id_player_input;
+
+    -- Insere na party
+    INSERT INTO public.party (id_player, id_sala)
+    VALUES (id_player_input, sala_inicial_id);
+ELSE
+    RAISE EXCEPTION 'Nenhuma sala encontrada na tabela sala.';
+END IF;
+
+

END; +$$ LANGUAGE plpgsql;

+

CREATE OR REPLACE FUNCTION setar_nova_sala(id_player_input INT, id_sala_input INT) +RETURNS VOID AS $$ +BEGIN + -- Verifica se a sala existe + IF EXISTS (SELECT 1 FROM public.sala WHERE id_sala = id_sala_input) THEN + -- Atualiza o id_sala na tabela party para o jogador + UPDATE public.party + SET id_sala = id_sala_input + WHERE id_player = id_player_input;

+
    -- Verifica se o jogador já está na tabela party, caso contrário, insere
+    IF NOT FOUND THEN
+        INSERT INTO public.party (id_player, id_sala)
+        VALUES (id_player_input, id_sala_input);
+    END IF;
+ELSE
+    RAISE EXCEPTION 'Sala com id_sala % não encontrada.', id_sala_input;
+END IF;
+
+

END; +$$ LANGUAGE plpgsql;

+

CREATE OR REPLACE FUNCTION get_salas_conectadas(id_player_input INT) +RETURNS TABLE(id_sala INT, nome VARCHAR) AS $$ +BEGIN + RETURN QUERY + WITH salas_conectadas AS ( + SELECT + unnest(ARRAY[s.id_sala_norte, s.id_sala_sul, s.id_sala_leste, s.id_sala_oeste]) AS id_sala_direcao + FROM public.sala s + WHERE s.id_sala = ( + SELECT p.id_sala + FROM public.party p + WHERE p.id_player = id_player_input + LIMIT 1 + ) + ) + SELECT + s.id_sala, s.nome + FROM salas_conectadas sc + JOIN public.sala s ON sc.id_sala_direcao = s.id_sala + WHERE sc.id_sala_direcao IS NOT NULL; +END; +$$ LANGUAGE plpgsql;

+

CREATE OR REPLACE FUNCTION public.get_player_info(player_id integer) +RETURNS text +LANGUAGE plpgsql +AS $function$ +BEGIN + RETURN ( + SELECT STRING_AGG( + FORMAT( + 'Nome: %s %sNível: %s%sXP Acumulado: %s%sHP Máximo: %s%sMagia Máxima: %s%sHP Atual: %s%sMagia Atual: %s%sVelocidade: %s%sAtaque Físico Base: %s%sAtaque Mágico Base: %s%sElemento: %s', + p.nome, E'\n', + p.nivel, E'\n', + p.xp_acumulado, E'\n', + p.hp_max, E'\n', + p.magia_max, E'\n', + p.hp_atual, E'\n', + p.magia_atual, E'\n', + p.velocidade, E'\n', + p.ataque_fisico_base, E'\n', + p.ataque_magico_base, E'\n', + e.nome + ), + E'\n' -- Delimitador entre os registros (caso haja mais de um) + ) + FROM player p + INNER JOIN elemento e ON e.id_elemento = p.id_elemento + WHERE p.id_player = player_id + ); +END; +$function$;

+

CREATE OR REPLACE FUNCTION listar_jogadores_formatados() +RETURNS TEXT AS $$ +BEGIN + RETURN ( + SELECT STRING_AGG( + FORMAT( + 'Nome: %s Nível: %s Elemento: %s ', + p.nome, + p.nivel, + e.nome + ), + E'\n' -- Delimitador entre as entradas + ) + FROM + player p + INNER JOIN + elemento e ON e.id_elemento = p.id_elemento + ); +END; +$$ LANGUAGE plpgsql;

+

CREATE OR REPLACE FUNCTION get_sala_atual(id_player_input INT) +RETURNS TEXT AS $$ +BEGIN + RETURN ( + SELECT STRING_AGG( + FORMAT('Sala Atual: %s',s.nome), + '\n' + ) + FROM sala s + INNER JOIN party p ON s.id_sala = p.id_sala + WHERE p.id_player = id_player_input + ); +END; +$$ LANGUAGE plpgsql;

+

CREATE OR REPLACE FUNCTION get_nome_sala(id_sala_input INT) +RETURNS VARCHAR AS $$ +BEGIN + RETURN ( + SELECT s.nome + FROM sala s + WHERE s.id_sala = id_sala_input + LIMIT 1 + ); +END; +$$ LANGUAGE plpgsql;

+ + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/modulo02/DQL/index.html b/modulo02/DQL/index.html new file mode 100644 index 0000000..7b5f527 --- /dev/null +++ b/modulo02/DQL/index.html @@ -0,0 +1,708 @@ + + + + + + + + + + + + + + + + + + + DQL - Cavaleiros do Zodiaco + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+ + + + + + + +
+ +
+ + + + +
+
+ + + +
+
+
+ + + + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + +

DQL

+ +

DQL

+

Versionamento

+ + + + + + + + + + + + + + + + + +
VersãoDataModificaçãoAutor
0.111/12/2023Criação do DocumentoVinícius Rufino
+

```-- 1. Listar informações do play +SELECT * FROM Player; +-- 2. Listar todos os items no inventár +SELECT * FROM Inventario; +-- 3. Listar todos os cavaleiros desbloquead +SELECT * FROM Cavaleiro; +-- 4. Escolher qual cavaleiro desbloqueado quer ver e listar todas +informações do cavaleiro +SELECT * +FROM Cavaleiro +WHERE id_cavaleiro = {id_cavaleiro}; +-- 5. Mostrar em que sala o player es +SELECT id_sala +FROM Party +WHERE id_player = {id_player}; +-- 6. Listar pras quais salas a partir da sala que o player está ele pode +SELECT id_sala_norte, id_sala_sul, id_sala_leste, id_sala_oeste +FROM Sala +WHERE id_sala = (SELECT id_sala FROM Party WHERE id_player +{id_player}); +-- 7. Listar as habilidades do play +SELECT Habilidade. +FROM Habilidade_Player +JOIN Habilidade ON Habilidade_Player.id_habilidade +Habilidade.id_habilidade +WHERE id_player = {id_player}; +-- 8. Listar as habilidades dos cavaleiros desbloquead +SELECT Habilidade. +SELECTs e Procedure to Insert 2 +FROM Habilidade +JOIN Cavaleiro ON Habilidade.classe_habilidade Cavaleiro.id_classe +-- 9. Listar os cavaleiros na par +SELECT Cavaleiro. +FROM Cavaleiro +JOIN Party ON Party.id_player = {id_player}; +-- 10. Listar os items à ven +SELECT * FROM Item_a_venda; +-- 11. Listar as armaduras equipadas nas partes do corpo do play +SELECT Parte_Corpo_Player. +, Armadura. +FROM Parte_Corpo_Player +JOIN Armadura ON Parte_Corpo_Player.armadura_equipada +Armadura.id_armadura +WHERE id_player = {id_player}; +-- 12. Listar qual cavaleiro é desbloqueado ao derrotar certo bo +SELECT Progresso_Player.id_cavaleiro, Boss.nome +FROM Progresso_Player +JOIN Boss ON Progresso_Player.id_boss Boss.id_bos +WHERE Progresso_Player.status_derrotado TRUE +-- 13. Listar quais os inimigos que estão no grupo_inimigo e em qual sa +SELECT Inimigo., Grupo_inimigo.id_sala +FROM Grupo_inimigo +JOIN Inimigo ON Grupo_inimigo.id_grupo Inimigo.id_classe +-- 14. Listar habilidades do bo +SELECT Habilidade. +FROM Habilidade_Boss +JOIN Habilidade ON Habilidade_Boss.id_habilidade Habilidade.id_habilidad +WHERE Habilidade_Boss.id_boss = {id_boss}; +-- 15. Listar habilidades disponíveis para cavaleiro aprender de acordo c +seu nível, classe e elemento +SELECT Habilidade. +FROM Habilidade +SELECTs e Procedure to Insert 3 +JOIN Cavaleiro ON Habilidade.classe_habilidade Cavaleiro.id_classe AN +Habilidade.elemento_habilidade Cavaleiro.id_element +WHERE Habilidade.nivel_necessario = Cavaleiro.nive +-- 16. Listar todos os Boss de um santuário escolhido pelo jogador e o stat +(se está derrotado ou não) +SELECT Boss.*, Progresso_Player.status_derrotado +FROM Boss +JOIN Sala ON Boss.id_sala Sala.id_sal +JOIN Casa ON Sala.id_casa Casa.id_cas +JOIN Santuario ON Casa.id_santuario Santuario.id_santuari +WHERE Santuario.id_santuario = {id_santuario}; +CREATE OR REPLACE PROCEDURE insert_item( +id_item INTEGER, +tipo_item ENUM_tipo_item +) AS $ +BEGIN +INSERT INTO Tipo_Item (id_item, tipo_item) VALUES (id_item, tipo_item); +END; +$$ LANGUAGE plpgsql; +-- Exemplo de uso +CALL insert_item(1, 'a');

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

Figura 1 - Logo do desenho

"},{"location":"#sobre-o-projeto","title":"Sobre o projeto","text":"

Projeto criado para a disciplina de Sistema de Banco de Dados 1 ministrada pelo professor Mauricio Serrano. Neste projeto, ser\u00e1 desenvolvido um jogo MUD onde os conceitos de bancos de dados ser\u00e3o aplicados. Ao fim do projeto, ser\u00e1 entregue um jogo funcional inspirado no famoso desenho Cavaleiros do Zodiaco criado pelo Masami Kurumada.

"},{"location":"#entregas","title":"Entregas","text":"
  • Modulo 1:

  • Modelo Entidade Relacionamento

  • Diagrama Entidade Relacionamento

  • Modelo L\u00f3gico

  • Diagrama de dados

"},{"location":"#apresentacoes","title":"Apresenta\u00e7\u00f5es","text":"
  • M\u00f3dulo 1
"},{"location":"#membros-do-grupo","title":"Membros do grupo","text":"

Lucas Avelar Lucas Ramon Pedro Lucas Dourado Victor Andreozzi Vinicius Rufino

"},{"location":"DML_DDL/","title":"DML DDL","text":""},{"location":"DML_DDL/#introducao","title":"Introdu\u00e7\u00e3o","text":"

Este projeto utiliza um banco de dados relacional para gerenciar informa\u00e7\u00f5es dos NPCs (personagens n\u00e3o jog\u00e1veis), miss\u00f5es e salas dentro do jogo. A estrutura foi desenvolvida utilizando comandos SQL, com o uso de DDL (Data Definition Language) para criar e alterar tabelas e DML (Data Manipulation Language) para manipula\u00e7\u00e3o dos dados.

O objetivo desta documenta\u00e7\u00e3o \u00e9 detalhar como o banco foi estruturado e apresentar exemplos pr\u00e1ticos de DDL e DML.

"},{"location":"DML_DDL/#estrutura-do-banco-de-dados","title":"Estrutura do Banco de Dados","text":""},{"location":"DML_DDL/#principais-tabelas","title":"Principais Tabelas","text":"
  1. Npc_Ferreiro:
  2. Gerencia informa\u00e7\u00f5es sobre ferreiros no jogo.
  3. Cont\u00e9m colunas como:

    • id_npc_ferreiro: Identificador \u00fanico.
    • id_sala: Relaciona a sala onde o ferreiro est\u00e1 localizado.
    • Campos descritivos como nome, descricao e di\u00e1logos (ex.: dialogo_inicial).
  4. Npc_Quest:

  5. Armazena informa\u00e7\u00f5es sobre NPCs que oferecem miss\u00f5es.
  6. Principais colunas:

    • id_npc_quest: Identificador \u00fanico.
    • id_sala: Relaciona a sala onde o NPC est\u00e1 localizado.
    • nome e descricao do NPC.
  7. Npc_Mercador:

  8. Cont\u00e9m dados sobre mercadores no jogo.
  9. Principais colunas:
    • id_npc_mercador: Identificador \u00fanico.
    • id_sala: Relaciona a sala onde o mercador est\u00e1.
    • Campos como dialogo_comprar, dialogo_vender e dialogo_sair.
"},{"location":"DML_DDL/#diagrama-de-relacionamento","title":"Diagrama de Relacionamento","text":"

Figura 1 - DER

"},{"location":"DML_DDL/#comandos-ddl-data-definition-language","title":"Comandos DDL (Data Definition Language)","text":""},{"location":"DML_DDL/#criacao-de-tabelas","title":"Cria\u00e7\u00e3o de Tabelas","text":"

Abaixo est\u00e1 um exemplo de como a tabela Npc_Ferreiro foi criada:

CREATE TABLE Npc_Ferreiro (\n    id_npc_ferreiro INTEGER PRIMARY KEY,\n    id_sala INTEGER NOT NULL,\n    id_missao_desbloqueia INTEGER NOT NULL,\n    nome VARCHAR NOT NULL,\n    descricao VARCHAR,\n    dialogo_inicial VARCHAR,\n    dialogo_reparar VARCHAR,\n    dialogo_upgrade VARCHAR\n);\n
"},{"location":"DML_DDL/#alteracao-de-tabelas","title":"Altera\u00e7\u00e3o de tabelas","text":"
-- Adiciona uma chave estrangeira que conecta Npc_Ferreiro \u00e0 tabela Sala\nALTER TABLE Npc_Ferreiro ADD CONSTRAINT FK_Npc_Ferreiro_2\n    FOREIGN KEY (id_sala)\n    REFERENCES Sala (id_sala);\n\n-- Adiciona uma chave estrangeira que conecta Npc_Ferreiro \u00e0 tabela Missao\nALTER TABLE Npc_Ferreiro ADD CONSTRAINT FK_Npc_Ferreiro_3\n    FOREIGN KEY (id_missao_desbloqueia)\n    REFERENCES Missao (id_missao);\n
"},{"location":"DML_DDL/#comandos-dml-data-mnaipulation-language","title":"Comandos DML (Data Mnaipulation Language)","text":""},{"location":"DML_DDL/#insecao-de-dados","title":"Inse\u00e7\u00e3o de dados","text":"

Abaixo, um exemplo de inser\u00e7\u00e3o de dados na tabela Npc_Ferreiro:

INSERT INTO Npc_Ferreiro (id_npc_ferreiro, id_sala, id_missao_desbloqueia, nome, descricao)\nVALUES (1, 2, 3, 'Ferreiro Jo\u00e3o', 'Especialista em armas pesadas');\n
"},{"location":"DML_DDL/#consulta-arualizacao-e-exclusao-de-dados","title":"Consulta, Arualiza\u00e7\u00e3o e Exclusao de dados","text":"

Abaixo seguem exemplos dessas tr\u00eas opera\u00e7\u00f5es.

SELECT * FROM Npc_Ferreiro;\nSELECT * FROM Npc_Ferreiro;\nUPDATE Npc_Ferreiro\nSET descricao = 'Especialista em armaduras'\nWHERE id_npc_ferreiro = 1;\nDELETE FROM Npc_Ferreiro\nWHERE id_npc_ferreiro = 1;\n
"},{"location":"apresentacao/modulo1/","title":"Apresenta\u00e7\u00e3o","text":""},{"location":"apresentacao/modulo1/#introducao","title":"Introdu\u00e7\u00e3o","text":"

O objetivo dessa pagina \u00e9 mostrar o v\u00eddeo da apresenta\u00e7\u00e3o da entrega do M\u00f3dulo 1 do projeto, que consiste em Modelo Entidade-Relacionamento (MER), Diagrama Entidade Relacionamento (DER) e Dicion\u00e1rio de Dados.

"},{"location":"apresentacao/modulo1/#video-da-apresentacao","title":"V\u00eddeo da apresenta\u00e7\u00e3o","text":"

No v\u00eddeo 1 abaixo segue o v\u00eddeo da nossa apresenta\u00e7\u00e3o do m\u00f3dulo 1, ou acesse clicando aqui

V\u00eddeo 1 - Apresenta\u00e7\u00e3o do m\u00f3dulo 1

Fonte: Pedro Lucas

"},{"location":"modulo01/der/","title":"Diagrama Entidade Relacionamento","text":""},{"location":"modulo01/der/#introducao","title":"Introdu\u00e7\u00e3o","text":"

Segundo Elmasri e Navathe, a modelagem conceitual \u00e9 uma fase muito importante no projeto de uma aplica\u00e7\u00e3o de banco de dados bem-sucedida.

Sob esse vi\u00e9s, o Modelo Entidade-Relacionamento (ER) \u00e9 um modelo de dados conceitual popular de alto n\u00edvel em que esse modelo e suas varia\u00e7\u00f5es costumam ser utilizados para o projeto conceitual de aplica\u00e7\u00f5es de banco de dados, e muitas ferramentas de projeto de banco de dados empregam seus conceitos.

O Diagrama Entidade Relacionamento (DER) \u00e9 uma representa\u00e7\u00e3o gr\u00e1fica do Modelo Entidade Relacionamento (MER), ele possui tipos de entidade que s\u00e3o mostrados nas caixas retangulares; tipos de relacionamento ques\u00e3o mostrados em caixas em forma de losango, conectadas aos tipos de entidade participantes com linhas retas; atributos mostrados em ovais, e cada atributo \u00e9 conectado por uma linha reta a seu tipo de entidade ou tipo de relacionamento.

Al\u00e9m disso \u00e9 adotado os nomes de entidade no singular, Como uma pr\u00e1tica geral, dada uma descri\u00e7\u00e3o narrativa dos requisitos do banco de dados, os nomes que aparecem na narrativa tendem a gerar nomes de tipo de entidade, e os verbos tendem a indicar nomes de tipos de relacionamento.

"},{"location":"modulo01/der/#objetivo","title":"Objetivo","text":"

Apresentar o Diagrama Entidade-Relacionamento (DER) confeccionado para o projeto de forma que tenha uma representa\u00e7\u00e3o clara e estruturada do Modelo Entidade Relacionamento facilitando o entendimento dos componentes que ir\u00e3o estar no banco de dados do projeto.

"},{"location":"modulo01/der/#diagrama-entidade-relacionamento-der","title":"Diagrama Entidade-Relacionamento (DER)","text":"

A figura 1 a seguir mostra a primeira vers\u00e3o do Diagrama Entidade Relacionamento desenvolvido pelo grupo:

Figura 1 - Primeira vers\u00e3o do DER

Fonte: Pedro Lucas

Figura 2 - DER Vers\u00e3o 1.1

Fonte: Pedro Lucas

Figura 3 - DER Vers\u00e3o 2.0

Fonte: Pedro Lucas

"},{"location":"modulo01/der/#referencia-bibliografica","title":"Refer\u00eancia Bibliogr\u00e1fica","text":"

[1] ELMASRI, Ramez; NAVATHE, Shamkant B. Sistemas de banco de dados. Tradu\u00e7\u00e3o: Daniel Vieira. Revis\u00e3o t\u00e9cnica: Enzo Seraphim; Thatyana de Faria Piola Seraphim. 6. ed. S\u00e3o Paulo: Pearson Addison Wesley, 2011. Cap\u00edtulo 7. Modelagem de dados usando o modelo Entidade-Relacionamento (ER), p\u00e1ginas 131 e 146.

"},{"location":"modulo01/der/#bibliografia","title":"Bibliografia","text":"

Diagrama Entidade Relacionamento Stardew Valley. Dispon\u00edvel em: https://github.com/SBD1/2023.2-Grupo01-StardewValley/blob/main/docs/Entrega-01/DER_StardewValley_v1.0.md. Acesso em 24 de novembro de 2024.

Diagrama Entidade Relacionamento Fear and Hunger. Dispon\u00edvel em: https://github.com/SBD1/2023.2_Fear_and_Hunger/blob/main/docs/modulo_01/assets/DERv/DERv2.3.png. Acesso em 24 de novembro de 2024.

"},{"location":"modulo01/der/#historico-de-versao","title":"Hist\u00f3rico de vers\u00e3o","text":"Data Descri\u00e7\u00e3o Autor 24/11/2024 Vers\u00e3o inicial do DER Pedro Lucas 12/01/2024 Vers\u00e3o 2.0 do DER Pedro Lucas"},{"location":"modulo01/dicionario/","title":"Dicion\u00e1rio de Dados","text":""},{"location":"modulo01/dicionario/#tabelas-e-relacoes","title":"Tabelas e Rela\u00e7\u00f5es","text":""},{"location":"modulo01/dicionario/#tabela-npc_ferreiro","title":"Tabela: Npc_Ferreiro","text":"Atributo Tipo Restri\u00e7\u00f5es id_npc_ferreiro INTEGER PRIMARY KEY id_sala INTEGER FOREIGN KEY (id_sala) REFERENCES Sala(id_sala) id_missao_desbloqueia INTEGER FOREIGN KEY (id_missao_desbloqueia) REFERENCES Missao(id_missao) nome VARCHAR NOT NULL descricao VARCHAR dialogo_inicial VARCHAR dialogo_reparar VARCHAR dialogo_upgrade VARCHAR"},{"location":"modulo01/dicionario/#tabela-npc_quest","title":"Tabela: Npc_Quest","text":"Atributo Tipo Restri\u00e7\u00f5es id_npc_quest INTEGER PRIMARY KEY id_sala INTEGER FOREIGN KEY (id_sala) REFERENCES Sala(id_sala) nome VARCHAR NOT NULL descricao VARCHAR dialogo_inicial VARCHAR dialogo_recusa VARCHAR"},{"location":"modulo01/dicionario/#tabela-npc_mercador","title":"Tabela: Npc_Mercador","text":"Atributo Tipo Restri\u00e7\u00f5es id_npc_mercador INTEGER PRIMARY KEY id_sala INTEGER FOREIGN KEY (id_sala) REFERENCES Sala(id_sala) nome VARCHAR NOT NULL descricao VARCHAR dialogo_inicial VARCHAR dialogo_vender VARCHAR dialogo_comprar VARCHAR dialogo_sair VARCHAR"},{"location":"modulo01/dicionario/#tabela-cavaleiro","title":"Tabela: Cavaleiro","text":"Atributo Tipo Restri\u00e7\u00f5es id_cavaleiro SERIAL PRIMARY KEY id_classe INTEGER FOREIGN KEY (id_classe) REFERENCES Classe(id_classe) id_elemento INTEGER FOREIGN KEY (id_elemento) REFERENCES Elemento(id_elemento) nome VARCHAR UNIQUE, NOT NULL nivel INTEGER NOT NULL hp_max INTEGER NOT NULL magia_max INTEGER NOT NULL velocidade_base INTEGER NOT NULL ataque_fisico_base INTEGER NOT NULL ataque_magico_base INTEGER NOT NULL"},{"location":"modulo01/dicionario/#tabela-boss","title":"Tabela: Boss","text":"Atributo Tipo Restri\u00e7\u00f5es id_boss SERIAL PRIMARY KEY id_sala INTEGER FOREIGN KEY (id_sala) REFERENCES Sala(id_sala) nome INTEGER NOT NULL nivel INTEGER NOT NULL xp_acumulado INTEGER NOT NULL hp_max INTEGER NOT NULL hp_atual INTEGER NOT NULL magia_max INTEGER NOT NULL magia_atual INTEGER NOT NULL velocidade INTEGER NOT NULL ataque_fisico_base INTEGER NOT NULL ataque_magico_base INTEGER NOT NULL dinheiro INTEGER NOT NULL fala_inicio VARCHAR fala_derrotar_player VARCHAR fala_derrotado VARCHAR fala_condicao VARCHAR"},{"location":"modulo01/dicionario/#tabela-inimigo","title":"Tabela: Inimigo","text":"Atributo Tipo Restri\u00e7\u00f5es id_inimigo SERIAL PRIMARY KEY id_classe INTEGER FOREIGN KEY (id_classe) REFERENCES Classe(id_classe) id_elemento INTEGER FOREIGN KEY (id_elemento) REFERENCES Elemento(id_elemento) nome VARCHAR NOT NULL nivel INTEGER NOT NULL xp_acumulado INTEGER NOT NULL hp_max INTEGER NOT NULL magia_max INTEGER NOT NULL velocidade INTEGER NOT NULL ataque_fisico_base INTEGER NOT NULL ataque_magico_base INTEGER NOT NULL dinheiro INTEGER NOT NULL fala_inicio VARCHAR"},{"location":"modulo01/dicionario/#tabela-grupo_inimigo","title":"Tabela: Grupo_inimigo","text":"Atributo Tipo Restri\u00e7\u00f5es id_grupo SERIAL PRIMARY KEY id_sala INTEGER FOREIGN KEY (id_sala) REFERENCES Sala(id_sala)"},{"location":"modulo01/dicionario/#tabela-instancia_inimigo","title":"Tabela: Instancia_Inimigo","text":"Atributo Tipo Restri\u00e7\u00f5es id_instancia SERIAL PRIMARY KEY id_inimigo INTEGER FOREIGN KEY (id_inimigo) REFERENCES Inimigo(id_inimigo) id_grupo INTEGER FOREIGN KEY (id_grupo) REFERENCES Grupo_inimigo(id_grupo) hp_atual INTEGER NOT NULL magia_atual INTEGER NOT NULL defesa_fisica_bonus INTEGER defesa_magica_bonus INTEGER"},{"location":"modulo01/dicionario/#tabela-inventario","title":"Tabela: Inventario","text":"Atributo Tipo Restri\u00e7\u00f5es id_player INTEGER PRIMARY KEY, FOREIGN KEY (id_player) REFERENCES Player(id_player) dinheiro INTEGER NOT NULL"},{"location":"modulo01/dicionario/#tabela-armadura_instancia","title":"Tabela: Armadura_Instancia","text":"Atributo Tipo Restri\u00e7\u00f5es id_armadura INTEGER FOREIGN KEY (id_armadura, id_parte_corpo_armadura) REFERENCES Armadura(id_armadura, id_parte_corpo) id_parte_corpo_armadura enum_parte_corpo FOREIGN KEY (id_armadura, id_parte_corpo_armadura) REFERENCES Armadura(id_armadura, id_parte_corpo) id_instancia SERIAL PRIMARY KEY id_inventario INTEGER FOREIGN KEY (id_inventario) REFERENCES Inventario(id_player) raridade_armadura INTEGER NOT NULL defesa_magica INTEGER NOT NULL defesa_fisica INTEGER NOT NULL ataque_magico INTEGER NOT NULL ataque_fisico INTEGER NOT NULL durabilidade_max INTEGER NOT NULL preco_venda INTEGER NOT NULL"},{"location":"modulo01/dicionario/#tabela-item_a_venda","title":"Tabela: Item_a_venda","text":"Atributo Tipo Restri\u00e7\u00f5es id_item INTEGER PRIMARY KEY preco_compra INTEGER NOT NULL level_minimo INTEGER NOT NULL"},{"location":"modulo01/dicionario/#tabela-party","title":"Tabela: Party","text":"Atributo Tipo Restri\u00e7\u00f5es id_player INTEGER PRIMARY KEY id_sala INTEGER NOT NULL"},{"location":"modulo01/dicionario/#tabela-instancia_cavaleiro","title":"Tabela: Instancia_Cavaleiro","text":"Atributo Tipo Restri\u00e7\u00f5es id_instancia_cavaleiro SERIAL PRIMARY KEY id_cavaleiro INTEGER FOREIGN KEY (id_cavaleiro) REFERENCES Cavaleiro(id_cavaleiro) id_party INTEGER FOREIGN KEY (id_party) REFERENCES Party(id_player) nivel INTEGER NOT NULL xp_atual INTEGER NOT NULL hp_max INTEGER NOT NULL magia_max INTEGER NOT NULL hp_atual INTEGER NOT NULL magia_atual INTEGER NOT NULL velocidade INTEGER NOT NULL ataque_fisico INTEGER NOT NULL ataque_magico INTEGER NOT NULL"},{"location":"modulo01/dicionario/#tabela-elemento","title":"Tabela: Elemento","text":"Atributo Tipo Restri\u00e7\u00f5es id_elemento SERIAL PRIMARY KEY nome VARCHAR UNIQUE, NOT NULL descricao VARCHAR fraco_contra INTEGER (Poss\u00edvel chave estrangeira) forte_contra INTEGER (Poss\u00edvel chave estrangeira)"},{"location":"modulo01/dicionario/#tabela-progresso_player","title":"Tabela: Progresso_Player","text":"Atributo Tipo Restri\u00e7\u00f5es id_player INTEGER FOREIGN KEY (id_player) REFERENCES Player(id_player) id_boss INTEGER FOREIGN KEY (id_boss) REFERENCES Boss(id_boss) id_cavaleiro INTEGER FOREIGN KEY (id_cavaleiro) REFERENCES Cavaleiro(id_cavaleiro) status_derrotado BOOLEAN NOT NULL"},{"location":"modulo01/dicionario/#tabela-receita","title":"Tabela: Receita","text":"Atributo Tipo Restri\u00e7\u00f5es id_item_gerado INTEGER PRIMARY KEY descricao VARCHAR"},{"location":"modulo01/dicionario/#tabela-player_missao","title":"Tabela: Player_Missao","text":"Atributo Tipo Restri\u00e7\u00f5es id_player INTEGER FOREIGN KEY (id_player) REFERENCES Player(id_player) id_missao INTEGER FOREIGN KEY (id_missao) REFERENCES Missao(id_missao) status_missao enum_status_missao NOT NULL"},{"location":"modulo01/dicionario/#tabela-xp_necessaria","title":"Tabela: Xp_Necessaria","text":"Atributo Tipo Restri\u00e7\u00f5es nivel INTEGER PRIMARY KEY xp_necessaria INTEGER NOT NULL"},{"location":"modulo01/dicionario/#tabela-material_receita","title":"Tabela: Material_Receita","text":"Atributo Tipo Restri\u00e7\u00f5es id_receita INTEGER FOREIGN KEY (id_receita) REFERENCES Receita(id_item_gerado) id_material INTEGER FOREIGN KEY (id_material) REFERENCES Material(id_material) quantidade INTEGER NOT NULL"},{"location":"modulo01/dicionario/#tabela-habilidade_player","title":"Tabela: Habilidade_Player","text":"Atributo Tipo Restri\u00e7\u00f5es id_player INTEGER FOREIGN KEY (id_player) REFERENCES Player(id_player) id_habilidade INTEGER FOREIGN KEY (id_habilidade) REFERENCES Habilidade(id_habilidade) slot INTEGER NOT NULL"},{"location":"modulo01/dicionario/#tabela-habilidade_cavaleiro","title":"Tabela: Habilidade_Cavaleiro","text":"Atributo Tipo Restri\u00e7\u00f5es id_cavaleiro INTEGER FOREIGN KEY (id_cavaleiro) REFERENCES Cavaleiro(id_cavaleiro) id_habilidade INTEGER FOREIGN KEY (id_habilidade) REFERENCES Habilidade(id_habilidade) slot INTEGER NOT NULL"},{"location":"modulo01/dicionario/#tabela-habilidade_boss","title":"Tabela: Habilidade_Boss","text":"Atributo Tipo Restri\u00e7\u00f5es id_boss INTEGER FOREIGN KEY (id_boss) REFERENCES Boss(id_boss) id_habilidade INTEGER FOREIGN KEY (id_habilidade) REFERENCES Habilidade(id_habilidade)"},{"location":"modulo01/dicionario/#tabela-parte_corpo_boss","title":"Tabela: Parte_Corpo_Boss","text":"Atributo Tipo Restri\u00e7\u00f5es id_boss INTEGER FOREIGN KEY (id_boss) REFERENCES Boss(id_boss) parte_corpo enum_parte_corpo FOREIGN KEY (parte_corpo) REFERENCES Parte_Corpo(id_parte_corpo) defesa_fisica INTEGER NOT NULL defesa_magica INTEGER NOT NULL chance_acerto_base INTEGER NOT NULL chance_acerto_critico INTEGER NOT NULL"},{"location":"modulo01/dicionario/#tabela-parte_corpo_cavaleiro","title":"Tabela: Parte_Corpo_Cavaleiro","text":"Atributo Tipo Restri\u00e7\u00f5es id_cavaleiro INTEGER FOREIGN KEY (id_cavaleiro) REFERENCES Cavaleiro(id_cavaleiro) parte_corpo enum_parte_corpo FOREIGN KEY (parte_corpo) REFERENCES Parte_Corpo(id_parte_corpo) id_instancia_cavaleiro INTEGER FOREIGN KEY (id_instancia_cavaleiro) REFERENCES Instancia_Cavaleiro(id_instancia_cavaleiro) defesa_fisica_bonus INTEGER NOT NULL defesa_magico_bonus INTEGER NOT NULL chance_acerto_base INTEGER NOT NULL chance_acerto_critico INTEGER NOT NULL"},{"location":"modulo01/dicionario/#tabela-player","title":"Tabela: Player","text":"Atributo Tipo Restri\u00e7\u00f5es id_player SERIAL PRIMARY KEY id_elemento INTEGER FOREIGN KEY (id_elemento) REFERENCES Elemento(id_elemento) nome VARCHAR UNIQUE, NOT NULL nivel INTEGER NOT NULL xp_acumulado INTEGER NOT NULL hp_max INTEGER NOT NULL magia_max INTEGER NOT NULL hp_atual INTEGER NOT NULL magia_atual INTEGER NOT NULL velocidade INTEGER NOT NULL ataque_fisico_base INTEGER NOT NULL ataque_magico_base INTEGER NOT NULL id_sala_safe INTEGER NOT NULL"},{"location":"modulo01/dicionario/#tabela-parte_corpo_player","title":"Tabela: Parte_Corpo_Player","text":"Atributo Tipo Restri\u00e7\u00f5es id_player INTEGER FOREIGN KEY (id_player) REFERENCES Player(id_player) parte_corpo enum_parte_corpo FOREIGN KEY (parte_corpo) REFERENCES Parte_Corpo(id_parte_corpo) armadura_equipada INTEGER FOREIGN KEY (armadura_equipada) REFERENCES Armadura(id_armadura) instancia_armadura_equipada INTEGER FOREIGN KEY (instancia_armadura_equipada) REFERENCES Armadura_Instancia(id_instancia)"},{"location":"modulo01/dicionario/#tabela-elemento_boss","title":"Tabela: Elemento_Boss","text":"Atributo Tipo Restri\u00e7\u00f5es id_elemento INTEGER FOREIGN KEY (id_elemento) REFERENCES Elemento(id_elemento) id_boss INTEGER FOREIGN KEY (id_boss) REFERENCES Boss(id_boss)"},{"location":"modulo01/dicionario/#tabela-habilidade_inimigo","title":"Tabela: Habilidade_Inimigo","text":"Atributo Tipo Restri\u00e7\u00f5es id_habilidade INTEGER FOREIGN KEY (id_habilidade) REFERENCES Habilidade(id_habilidade) id_player INTEGER FOREIGN KEY (id_player) REFERENCES Inimigo(id_inimigo)"},{"location":"modulo01/dicionario/#tabela-item_armazenado","title":"Tabela: Item_Armazenado","text":"Atributo Tipo Restri\u00e7\u00f5es id_inventario INTEGER FOREIGN KEY (id_inventario) REFERENCES Inventario(id_player) id_item INTEGER FOREIGN KEY (id_item) REFERENCES Tipo_Item(id_item) quantidade INTEGER NOT NULL"},{"location":"modulo01/dicionario/#tabela-item_grupo_inimigo_dropa","title":"Tabela: Item_grupo_inimigo_dropa","text":"Atributo Tipo Restri\u00e7\u00f5es id_item INTEGER FOREIGN KEY (id_item) REFERENCES Tipo_Item(id_item) id_grupo_inimigo INTEGER FOREIGN KEY (id_grupo_inimigo) REFERENCES Grupo_inimigo(id_grupo) quantidade INTEGER NOT NULL"},{"location":"modulo01/dicionario/#tabela-classe","title":"Tabela: Classe","text":"Atributo Tipo Restri\u00e7\u00f5es id_classe SERIAL PRIMARY KEY nome VARCHAR UNIQUE, NOT NULL descricao VARCHAR"},{"location":"modulo01/dicionario/#tabela-habilidade","title":"Tabela: Habilidade","text":"Atributo Tipo Restri\u00e7\u00f5es id_habilidade SERIAL PRIMARY KEY classe_habilidade INTEGER FOREIGN KEY (classe_habilidade) REFERENCES Classe(id_classe) elemento_habilidade INTEGER FOREIGN KEY (elemento_habilidade) REFERENCES Elemento(id_elemento) nome VARCHAR custo INTEGER descricao VARCHAR frase_uso VARCHAR nivel_necessario INTEGER"},{"location":"modulo01/dicionario/#tabela-tipo_item","title":"Tabela: Tipo_Item","text":"Atributo Tipo Restri\u00e7\u00f5es id_item SERIAL PRIMARY KEY tipo_item enum_tipo_item NOT NULL"},{"location":"modulo01/dicionario/#tabela-armadura","title":"Tabela: Armadura","text":"Atributo Tipo Restri\u00e7\u00f5es id_armadura INTEGER PRIMARY KEY id_parte_corpo enum_parte_corpo FOREIGN KEY (id_parte_corpo) REFERENCES Parte_Corpo(id_parte_corpo) nome VARCHAR NOT NULL raridade_armadura VARCHAR NOT NULL defesa_magica INTEGER defesa_fisica INTEGER ataque_magico INTEGER ataque_fisico INTEGER durabilidade_max INTEGER preco_venda INTEGER descricao INTEGER"},{"location":"modulo01/dicionario/#tabela-material","title":"Tabela: Material","text":"Atributo Tipo Restri\u00e7\u00f5es id_material INTEGER PRIMARY KEY nome VARCHAR UNIQUE, NOT NULL preco_venda INTEGER NOT NULL descricao VARCHAR"},{"location":"modulo01/dicionario/#tabela-item_missao","title":"Tabela: Item_Missao","text":"Atributo Tipo Restri\u00e7\u00f5es id_item INTEGER PRIMARY KEY nome VARCHAR UNIQUE, NOT NULL descricao VARCHAR"},{"location":"modulo01/dicionario/#tabela-consumivel","title":"Tabela: Consumivel","text":"Atributo Tipo Restri\u00e7\u00f5es id_item INTEGER PRIMARY KEY nome VARCHAR UNIQUE, NOT NULL descricao VARCHAR preco_venda INTEGER NOT NULL saude_restaurada INTEGER magia_restaurada INTEGER saude_maxima INTEGER magia_maxima INTEGER"},{"location":"modulo01/dicionario/#tabela-livro","title":"Tabela: Livro","text":"Atributo Tipo Restri\u00e7\u00f5es id_item INTEGER PRIMARY KEY id_habilidade INTEGER FOREIGN KEY (id_habilidade) REFERENCES Habilidade(id_habilidade) nome VARCHAR UNIQUE, NOT NULL descricao VARCHAR preco_venda INTEGER NOT NULL"},{"location":"modulo01/dicionario/#tabela-missao","title":"Tabela: Missao","text":"Atributo Tipo Restri\u00e7\u00f5es id_missao SERIAL PRIMARY KEY id_missao_anterior INTEGER FOREIGN KEY (id_missao_anterior) REFERENCES Missao(id_missao) item_necessario INTEGER FOREIGN KEY (item_necessario) REFERENCES Item_Missao(id_item) nome INTEGER UNIQUE, NOT NULL dialogo_inicial VARCHAR dialogo_durante VARCHAR dialogo_completa VARCHAR"},{"location":"modulo01/dicionario/#tabela-santuario","title":"Tabela: Santuario","text":"Atributo Tipo Restri\u00e7\u00f5es id_santuario SERIAL PRIMARY KEY id_missao_requisito INTEGER FOREIGN KEY (id_missao_requisito) REFERENCES Missao(id_missao) id_missao_proximo_santuario INTEGER FOREIGN KEY (id_missao_proximo_santuario) REFERENCES Missao(id_missao) nome VARCHAR UNIQUE, NOT NULL descricao VARCHAR nivel_recomendado INTEGER NOT NULL"},{"location":"modulo01/dicionario/#tabela-casa","title":"Tabela: Casa","text":"Atributo Tipo Restri\u00e7\u00f5es id_casa SERIAL PRIMARY KEY id_santuario INTEGER FOREIGN KEY (id_santuario) REFERENCES Santuario(id_santuario) id_missao_requisito INTEGER FOREIGN KEY (id_missao_requisito) REFERENCES Missao(id_missao) id_missao_proxima_casa INTEGER FOREIGN KEY (id_missao_proxima_casa) REFERENCES Missao(id_missao) nome VARCHAR NOT NULL descricao VARCHAR nivel_recomendado INTEGER NOT NULL"},{"location":"modulo01/dicionario/#tabela-sala","title":"Tabela: Sala","text":"Atributo Tipo Restri\u00e7\u00f5es id_sala SERIAL PRIMARY KEY id_casa INTEGER FOREIGN KEY (id_casa) REFERENCES Casa(id_casa) nome VARCHAR NOT NULL id_sala_norte INTEGER (Possivelmente refer\u00eancia para outra sala) id_sala_sul INTEGER (Possivelmente refer\u00eancia para outra sala) id_sala_leste INTEGER (Possivelmente refer\u00eancia para outra sala) id_sala_oeste INTEGER (Possivelmente refer\u00eancia para outra sala)"},{"location":"modulo01/dicionario/#relacionamentos","title":"Relacionamentos","text":"
  • Instancia_Cavaleiro:
  • id_cavaleiro \u2192 Cavaleiro(id_cavaleiro)
  • id_party \u2192 Party(id_player)

  • Elemento:

  • fraco_contra \u2192 Elemento(id_elemento)
  • forte_contra \u2192 Elemento(id_elemento)

  • Progresso_Player:

  • id_player \u2192 Player(id_player)
  • id_boss \u2192 Boss(id_boss)
  • id_cavaleiro \u2192 Cavaleiro(id_cavaleiro)

  • Receita:

  • N/A

  • Player_Missao:

  • id_player \u2192 Player(id_player)
  • id_missao \u2192 Missao(id_missao)

  • Xp_Necessaria:

  • N/A

  • Material_Receita:

  • id_receita \u2192 Receita(id_item_gerado)
  • id_material \u2192 Material(id_material)

  • Habilidade_Player:

  • id_player \u2192 Player(id_player)
  • id_habilidade \u2192 Habilidade(id_habilidade)

  • Habilidade_Cavaleiro:

  • id_cavaleiro \u2192 Cavaleiro(id_cavaleiro)
  • id_habilidade \u2192 Habilidade(id_habilidade)

  • Habilidade_Boss:

  • id_boss \u2192 Boss(id_boss)
  • id_habilidade \u2192 Habilidade(id_habilidade)

  • Parte_Corpo_Boss:

  • id_boss \u2192 Boss(id_boss)
  • parte_corpo \u2192 Parte_Corpo(id_parte_corpo)

  • Parte_Corpo_Cavaleiro:

  • id_cavaleiro \u2192 Cavaleiro(id_cavaleiro)
  • parte_corpo \u2192 Parte_Corpo(id_parte_corpo)
  • id_instancia_cavaleiro \u2192 Instancia_Cavaleiro(id_instancia_cavaleiro)

  • Player:

  • id_elemento \u2192 Elemento(id_elemento)

  • Parte_Corpo_Player:

  • id_player \u2192 Player(id_player)
  • parte_corpo \u2192 Parte_Corpo(id_parte_corpo)
  • armadura_equipada \u2192 Armadura(id_armadura)
  • instancia_armadura_equipada \u2192 Armadura_Instancia(id_instancia)

  • Elemento_Boss:

  • id_elemento \u2192 Elemento(id_elemento)
  • id_boss \u2192 Boss(id_boss)

  • Habilidade_Inimigo:

  • id_habilidade \u2192 Habilidade(id_habilidade)
  • id_player \u2192 Inimigo(id_inimigo)

  • Item_Armazenado:

  • id_inventario \u2192 Inventario(id_player)
  • id_item \u2192 Tipo_Item(id_item)

  • Item_grupo_inimigo_dropa:

  • id_item \u2192 Tipo_Item(id_item)
  • id_grupo_inimigo \u2192 Grupo_inimigo(id_grupo)

  • Classe:

  • N/A

  • Habilidade:

  • classe_habilidade \u2192 Classe(id_classe)
  • elemento_habilidade \u2192 Elemento(id_elemento)

  • Tipo_Item:

  • N/A

  • Armadura:

  • id_parte_corpo \u2192 Parte_Corpo(id_parte_corpo)

  • Material:

  • N/A

  • Item_Missao:

  • N/A

  • Consumivel:

  • N/A

  • Livro:

  • id_habilidade \u2192 Habilidade(id_habilidade)

  • Missao:

  • id_missao_anterior \u2192 Missao(id_missao)
  • item_necessario \u2192 Item_Missao(id_item)

  • Santuario:

  • id_missao_requisito \u2192 Missao(id_missao)
  • id_missao_proximo_santuario \u2192 Missao(id_missao)

  • Casa:

  • id_santuario \u2192 Santuario(id_santuario)
  • id_missao_requisito \u2192 Missao(id_missao)
  • id_missao_proxima_casa \u2192 Missao(id_missao)

  • Sala:

  • id_casa \u2192 Casa(id_casa)

  • Npc_Ferreiro:

  • id_sala \u2192 Sala(id_sala)
  • id_missao_desbloqueia \u2192 Missao(id_missao)

  • Npc_Quest:

  • id_sala \u2192 Sala(id_sala)

  • Npc_Mercador:

  • id_sala \u2192 Sala(id_sala)

  • Inimigo:

  • id_elemento \u2192 Elemento(id_elemento)
  • id_classe \u2192 Classe(id_classe)

  • Instancia_Inimigo:

  • id_inimigo \u2192 Inimigo(id_inimigo)
  • id_grupo \u2192 Grupo_inimigo(id_grupo)

  • Grupo_inimigo:

  • id_sala \u2192 Sala(id_sala)

  • Inventario:

  • id_player \u2192 Player(id_player)

  • Armadura_Instancia:

  • id_armadura, id_parte_corpo_armadura \u2192 Armadura(id_armadura, id_parte_corpo)
  • id_inventario \u2192 Inventario(id_player)

  • Item_a_venda:

  • id_item \u2192 Tipo_Item(id_item)

  • Party:

  • id_sala \u2192 Sala(id_sala)
"},{"location":"modulo01/dicionario/#tipo-tipo_item","title":"Tipo: tipo_item","text":"

Representa os tipos de itens no sistema.

Valor Significado a armadura m material i item_missao c consumivel l livro"},{"location":"modulo01/dicionario/#tipo-parte_corpo","title":"Tipo: parte_corpo","text":"

Representa as partes do corpo.

Valor Significado c cabe\u00e7a t tronco b bra\u00e7os p pernas"},{"location":"modulo01/dicionario/#tipo-enum_tipo_item","title":"Tipo: enum_tipo_item","text":"

Representa os tipos de itens no sistema.

Valor Significado a armadura m material i item_missao c consumivel l livro"},{"location":"modulo01/dicionario/#tipo-enum_parte_corpo","title":"Tipo: enum_parte_corpo","text":"

Representa as partes do corpo.

Valor Significado c cabe\u00e7a t tronco b bra\u00e7os p pernas"},{"location":"modulo01/mer/","title":"Modelo Entidade Relacionamento","text":""},{"location":"modulo01/mer/#modelo-entidade-relacionamento-mer","title":"Modelo Entidade-Relacionamento (MER)","text":"

O Modelo Entidade-Relacionamento (MER) \u00e9 uma descri\u00e7\u00e3o textual das entidades e relacionamentos que comp\u00f5em a estrutura de um banco de dados. Diferentemente do DER, o MER apresenta as informa\u00e7\u00f5es de forma textual, facilitando a compreens\u00e3o e detalhamento dos componentes.

"},{"location":"modulo01/mer/#tabelas-e-atributos","title":"Tabelas e Atributos","text":""},{"location":"modulo01/mer/#personagem","title":"Personagem","text":"
  • id_personagem
  • nome
"},{"location":"modulo01/mer/#player","title":"Player","text":"
  • id_personagem
"},{"location":"modulo01/mer/#npc-quest","title":"NPC Quest","text":"
  • id_personagem
  • dialogo_inicial
  • dialogo_recusa
"},{"location":"modulo01/mer/#npc-mercado","title":"NPC Mercado","text":"
  • id_personagem
  • dialogo_inicial
  • dialogo_vender
  • dialogo_comprar
  • dialogo_sair
"},{"location":"modulo01/mer/#party","title":"Party","text":"
  • id_player
  • id_sala
"},{"location":"modulo01/mer/#inventario","title":"Invent\u00e1rio","text":"
  • id_player
  • dinheiro
"},{"location":"modulo01/mer/#progresso-jogador","title":"Progresso Jogador","text":"
  • id_player
  • id_boss
  • status_derrotado
  • cavaleiro_desbloqueado
"},{"location":"modulo01/mer/#personagem-luta","title":"Personagem Luta","text":"
  • id_personagem
  • nivel
  • hp_max
  • hp_atual
  • magia_max
  • magia_atual
  • velocidade
"},{"location":"modulo01/mer/#cavaleiro","title":"Cavaleiro","text":"
  • id_personagem
  • desbloqueado
  • classe
"},{"location":"modulo01/mer/#inimigo","title":"Inimigo","text":"
  • id_personagem
  • dinheiro
  • fala_inicio
"},{"location":"modulo01/mer/#boss","title":"Boss","text":"
  • id_personagem
  • dinheiro
  • fala_inicio
  • fala_derrota
"},{"location":"modulo01/mer/#sala","title":"Sala","text":"
  • id_sala
  • nome
  • sala_norte
  • sala_sul
  • sala_leste
  • sala_oeste
"},{"location":"modulo01/mer/#santuario","title":"Santu\u00e1rio","text":"
  • id_santuario
  • nome
  • descricao
  • id_pre_req_missao
"},{"location":"modulo01/mer/#grupo-inimigo","title":"Grupo Inimigo","text":"
  • id_grupo_inimigo
  • id_sala
"},{"location":"modulo01/mer/#missao","title":"Miss\u00e3o","text":"
  • id_missao
  • nome
  • item_necessario
  • dialogo_inicial
  • dialogo_durante
  • dialogo_completa
"},{"location":"modulo01/mer/#missao-jogador","title":"Miss\u00e3o Jogador","text":"
  • id_missao
  • id_jogador
"},{"location":"modulo01/mer/#item","title":"Item","text":"
  • id_item
  • nome
  • tipo_item
  • preco_compra
  • preco_venda
"},{"location":"modulo01/mer/#armadura","title":"Armadura","text":"
  • id_item
  • defesa_magica
  • defesa_fisica
  • ataque_magico
  • ataque_fisico
  • durabilidade_max
  • parte_corpo
"},{"location":"modulo01/mer/#material","title":"Material","text":"
  • id_item
"},{"location":"modulo01/mer/#consumivel","title":"Consum\u00edvel","text":"
  • id_item
  • saude
  • magia
  • saude_maxima
  • magia_maxima
  • quantidade
"},{"location":"modulo01/mer/#livro","title":"Livro","text":"
  • id_item
"},{"location":"modulo01/mer/#item-instanciado","title":"Item Instanciado","text":"
  • id_nivel
  • durabilidade_atual
"},{"location":"modulo01/mer/#receita","title":"Receita","text":"
  • id_receita
  • material_necessario
"},{"location":"modulo01/mer/#habilidade","title":"Habilidade","text":"
  • id_habilidade
  • classe
  • tipo_habilidade
  • frase_uso
  • descricao
  • nome
  • valor
"},{"location":"modulo01/mer/#elemento","title":"Elemento","text":"
  • id_elemento
  • nome
  • fraco_contra
  • forte_contra
"},{"location":"modulo01/mer/#parte-do-corpo","title":"Parte do Corpo","text":"
  • id_parte
  • tipo_parte
  • defesa
  • prob_acerto
  • chance_critico
"},{"location":"modulo01/mer/#relacionamentos","title":"Relacionamentos","text":""},{"location":"modulo01/mer/#item-instanciado-aponta-para-item","title":"Item Instanciado aponta para Item","text":"
  • Um Item Instanciado aponta para um Item.
  • Um Item \u00e9 apontado por N Itens Instanciados.
"},{"location":"modulo01/mer/#parte-do-corpo-equipa-armadura","title":"Parte do Corpo equipa Armadura","text":"
  • Uma Parte do Corpo equipa uma Armadura.
  • Uma Armadura \u00e9 equipada por N Partes do Corpo.
"},{"location":"modulo01/mer/#personagem-luta-possui-elemento","title":"Personagem Luta possui Elemento","text":"
  • Um Personagem Luta possui de 0 a N Elementos.
  • Um Elemento \u00e9 possu\u00eddo por 0 a N Personagens Luta.
"},{"location":"modulo01/mer/#personagem-luta-utiliza-habilidade","title":"Personagem Luta utiliza Habilidade","text":"
  • Um Personagem Luta utiliza de 0 a N Habilidades.
  • Uma Habilidade \u00e9 utilizada por 0 a N Personagens Luta.
"},{"location":"modulo01/mer/#player-esta-em-party","title":"Player est\u00e1 em Party","text":"
  • Um Player est\u00e1 em uma Party.
  • Uma Party est\u00e1 com um Player.
"},{"location":"modulo01/mer/#cavaleiro-participa-de-party","title":"Cavaleiro participa de Party","text":"
  • Um Cavaleiro participa de uma Party.
  • Uma Party \u00e9 participada por 0 a N Cavaleiros.
"},{"location":"modulo01/mer/#progresso-do-jogador-desbloqueia-cavaleiro","title":"Progresso do Jogador desbloqueia Cavaleiro","text":"
  • Um Progresso do Jogador desbloqueia de 0 a 1 Cavaleiro.
  • Um Cavaleiro \u00e9 desbloqueado por um Progresso do Jogador.
"},{"location":"modulo01/mer/#player-avanca-progresso-jogador","title":"Player avan\u00e7a Progresso Jogador","text":"
  • Um Player avan\u00e7a 0 a N Progresso Jogador.
  • Um Progresso Jogador \u00e9 avan\u00e7ado por um Player.
"},{"location":"modulo01/mer/#progresso-jogador-derrota-boss","title":"Progresso Jogador derrota Boss","text":"
  • Um Progresso Jogador derrota um Boss.
  • Um Boss \u00e9 derrotado por um Progresso Jogador.
"},{"location":"modulo01/mer/#player-possui-inventario","title":"Player possui Invent\u00e1rio","text":"
  • Um Player possui um Invent\u00e1rio.
  • Um Invent\u00e1rio \u00e9 possu\u00eddo por um Player.
"},{"location":"modulo01/mer/#inventario-armazena-item-instanciado","title":"Invent\u00e1rio armazena Item Instanciado","text":"
  • Um Invent\u00e1rio armazena de 0 a N Itens Instanciados.
  • Um Item Instanciado \u00e9 armazenado por 0 a 1 Invent\u00e1rio.
"},{"location":"modulo01/mer/#inimigo-participa-de-grupo-inimigo","title":"Inimigo participa de Grupo Inimigo","text":"
  • Um Inimigo participa de 0 a N Grupos de Inimigos.
  • Um Grupo Inimigo \u00e9 participado por pelo menos 1 Inimigo.
"},{"location":"modulo01/mer/#boss-dropa-item-instanciado","title":"Boss dropa Item Instanciado","text":"
  • Um Boss dropa de 1 a N Itens Instanciados.
  • Um Item Instanciado \u00e9 dropado por um Boss.
"},{"location":"modulo01/mer/#santuario-contem-salas","title":"Santu\u00e1rio cont\u00e9m Salas","text":"
  • Um Santu\u00e1rio cont\u00e9m de 1 a N Salas.
  • Uma Sala \u00e9 contida por um Santu\u00e1rio.
"},{"location":"modulo01/mer/#party-esta-na-sala","title":"Party est\u00e1 na Sala","text":"
  • Uma Party est\u00e1 em uma Sala.
  • Em uma Sala est\u00e1 de 0 a 1 Party.
"},{"location":"modulo01/mer/#grupo-inimigo-esta-na-sala","title":"Grupo Inimigo est\u00e1 na Sala","text":"
  • Um Grupo Inimigo est\u00e1 em uma Sala.
  • Em uma Sala est\u00e1 de 0 a N Grupos de Inimigos.
"},{"location":"modulo01/mer/#livro-ensina-uma-habilidade","title":"Livro ensina uma Habilidade","text":"
  • Um Livro ensina uma Habilidade.
  • Uma Habilidade \u00e9 ensinada por um Livro.
"},{"location":"modulo01/mer/#player-aceita-missao-jogador","title":"Player aceita Miss\u00e3o Jogador","text":"
  • Um Player aceita de 0 a N Miss\u00f5es Jogadores.
  • Uma Miss\u00e3o Jogador \u00e9 aceita por um Player.
"},{"location":"modulo01/mer/#npc-mercado-vende-item-instanciado","title":"NPC Mercado vende Item Instanciado","text":"
  • Um NPC Mercado vende de 0 a N Itens Instanciados.
  • Um Item Instanciado \u00e9 vendido por um NPC Mercado.
"},{"location":"modulo01/mer/#grupo-inimigo-dropa-item-instanciado","title":"Grupo Inimigo dropa Item Instanciado","text":"
  • Um Grupo Inimigo dropa de 0 a N Itens Instanciados.
  • Um Item Instanciado \u00e9 dropado por um Grupo Inimigo.
"},{"location":"modulo01/mer/#sala-origem-viaja-para-uma-sala-destino","title":"Sala Origem viaja para uma Sala Destino","text":"
  • Uma Sala Origem viaja para uma Sala Destino.
"},{"location":"modulo01/mer/#material-gera-armadura","title":"Material gera Armadura","text":"
  • Um Material gera 0 ou 1 Armadura.
  • Uma Armadura pode ser gerada por 0 a N Materiais.
"},{"location":"modulo01/mer/#receita-gera-armadura","title":"Receita gera Armadura","text":"
  • Uma Receita gera 0 a N Armaduras.
  • Uma Armadura \u00e9 gerada por 0 ou 1 Receita.
"},{"location":"modulo01/mer/#historico-de-versao","title":"Hist\u00f3rico de vers\u00e3o","text":"Data Descri\u00e7\u00e3o Autor 25/11/2024 Vers\u00e3o inicial do Modelo Entidade Relacionamento Lucas Ramon"},{"location":"modulo01/ml/","title":"Modelo L\u00f3gico","text":""},{"location":"modulo01/ml/#introducao","title":"Introdu\u00e7\u00e3o","text":"

Segundo Elmasri e Navathe \u00b9, a modelagem conceitual \u00e9 uma fase muito importante no projeto de uma aplica\u00e7\u00e3o de banco de dados bem-sucedida.

"},{"location":"modulo01/ml/#objetivo","title":"Objetivo","text":"

Apresentar o Modelo L\u00f3gico confeccionado a partir do Diagrama Entidade Relacionamento (DER) utilizando as 7 Etapas descritas por Elmasri e Navathe \u00b9. Com isso \u00e9 facilitado o entendimento dos componentes que ir\u00e3o estar no banco de dados do projeto.

"},{"location":"modulo01/ml/#modelo-logico","title":"Modelo L\u00f3gico","text":"

A figura 1 a seguir mostra a primeira vers\u00e3o do Modelo L\u00f3gico desenvolvido pelo grupo:

Figura 1 - Primeira vers\u00e3o do Modelo L\u00f3gico

Fonte: Pedro Lucas

Figura 2 - Modelo L\u00f3gico Vers\u00e3o 1.1

Fonte: Pedro Lucas

Figura 3 - Modelo L\u00f3gico Vers\u00e3o 2.0

Fonte: Pedro Lucas

"},{"location":"modulo01/ml/#referencia-bibliografica","title":"Refer\u00eancia Bibliogr\u00e1fica","text":"

[1] ELMASRI, Ramez; NAVATHE, Shamkant B. Sistemas de banco de dados. Tradu\u00e7\u00e3o: Daniel Vieira. Revis\u00e3o t\u00e9cnica: Enzo Seraphim; Thatyana de Faria Piola Seraphim. 6. ed. S\u00e3o Paulo: Pearson Addison Wesley, 2011. Cap\u00edtulo 7. Modelagem de dados usando o modelo Entidade-Relacionamento (ER), p\u00e1ginas 189-200.

"},{"location":"modulo01/ml/#bibliografia","title":"Bibliografia","text":"

Diagrama Entidade Relacionamento Stardew Valley. Dispon\u00edvel em: https://github.com/SBD1/2023.2-Grupo01-StardewValley/blob/main/docs/Entrega-01/DER_StardewValley_v1.0.md. Acesso em 24 de novembro de 2024.

Diagrama Entidade Relacionamento Fear and Hunger. Dispon\u00edvel em: https://github.com/SBD1/2023.2_Fear_and_Hunger/blob/main/docs/modulo_01/assets/DERv/DERv2.3.png. Acesso em 24 de novembro de 2024.

"},{"location":"modulo01/ml/#historico-de-versao","title":"Hist\u00f3rico de vers\u00e3o","text":"Data Descri\u00e7\u00e3o Autor 24/11/2024 Vers\u00e3o inicial do Modelo L\u00f3gico Pedro Lucas 12/01/2024 Vers\u00e3o 2.0 do ML Pedro Lucas"},{"location":"modulo02/DDL/","title":"DDL","text":""},{"location":"modulo02/DDL/#ddl","title":"DDL","text":""},{"location":"modulo02/DDL/#versionamento","title":"Versionamento","text":"Vers\u00e3o Data Modifica\u00e7\u00e3o Autor 0.1 13/01/2025 Cria\u00e7\u00e3o do Documento Vin\u00edcius Rufino

```sql CREATE TABLE IF NOT EXISTS Elemento ( id_elemento SERIAL PRIMARY KEY, nome VARCHAR UNIQUE NOT NULL, descricao VARCHAR, fraco_contra INTEGER, forte_contra INTEGER );

CREATE TABLE Player ( id_player SERIAL PRIMARY KEY, id_elemento INTEGER, nome VARCHAR UNIQUE NOT NULL, nivel INTEGER NOT NULL, xp_acumulado INTEGER NOT NULL, hp_max INTEGER NOT NULL, magia_max INTEGER NOT NULL, hp_atual INTEGER NOT NULL, magia_atual INTEGER NOT NULL, velocidade INTEGER NOT NULL, ataque_fisico_base INTEGER NOT NULL, ataque_magico_base INTEGER NOT NULL, id_sala_safe INTEGER NOT NULL );

ALTER TABLE Player ADD CONSTRAINT FK_Player_2 FOREIGN KEY (id_elemento) REFERENCES Elemento (id_elemento);

CREATE TABLE Classe ( id_classe SERIAL PRIMARY KEY, nome VARCHAR UNIQUE NOT NULL, descricao VARCHAR );

CREATE TABLE Habilidade ( id_habilidade SERIAL PRIMARY KEY, classe_habilidade INTEGER, elemento_habilidade INTEGER, nome VARCHAR, custo INTEGER, descricao VARCHAR, frase_uso VARCHAR, nivel_necessario INTEGER );

ALTER TABLE Habilidade ADD CONSTRAINT FK_Habilidade_2 FOREIGN KEY (elemento_habilidade) REFERENCES Elemento (id_elemento);

ALTER TABLE Habilidade ADD CONSTRAINT FK_Habilidade_3 FOREIGN KEY (classe_habilidade) REFERENCES Classe (id_classe);

CREATE TYPE tipo_item as ENUM ('a', 'm', 'i', 'c', 'l'); / a = armadura, m = material, i = item_missao, c = consumivel, l = livro / CREATE TYPE parte_corpo as ENUM ('c', 't', 'b', 'p'); / c = cabe\u00e7a, t = tronco, b = bra\u00e7os, p = pernas /

DROP TYPE parte_corpo; DROP TYPE tipo_item;

CREATE TYPE enum_tipo_item as ENUM ('a', 'm', 'i', 'c', 'l'); / a = armadura, m = material, i = item_missao, c = consumivel, l = livro / CREATE TYPE enum_parte_corpo as ENUM ('c', 't', 'b', 'p'); / c = cabe\u00e7a, t = tronco, b = bra\u00e7os, p = pernas /

CREATE TABLE Parte_Corpo ( id_parte_corpo enum_parte_corpo PRIMARY KEY, nome VARCHAR UNIQUE NOT NULL, defesa_magica INTEGER NOT NULL, defesa_fisica INTEGER NOT NULL, chance_acerto INTEGER NOT NULL, chance_acerto_critico INTEGER NOT NULL );

CREATE TABLE Tipo_Item ( id_item SERIAL PRIMARY KEY, tipo_item INTEGER NOT NULL );

CREATE TABLE Armadura ( id_armadura INTEGER, id_parte_corpo enum_parte_corpo, nome VARCHAR NOT NULL, raridade_armadura VARCHAR NOT NULL, defesa_magica INTEGER, defesa_fisica INTEGER, ataque_magico INTEGER, ataque_fisico INTEGER, durabilidade_max INTEGER, preco_venda INTEGER, descricao INTEGER, PRIMARY KEY (id_armadura, id_parte_corpo) );

CREATE TABLE Material ( id_material INTEGER PRIMARY KEY, nome VARCHAR UNIQUE NOT NULL, preco_venda INTEGER NOT NULL, descricao VARCHAR );

CREATE TABLE Item_Missao ( id_item INTEGER PRIMARY KEY, nome VARCHAR UNIQUE NOT NULL, descricao VARCHAR );

CREATE TABLE Consumivel ( id_item INTEGER PRIMARY KEY, nome VARCHAR UNIQUE NOT NULL, descricao VARCHAR, preco_venda INTEGER NOT NULL, saude_restaurada INTEGER, magia_restaurada INTEGER, saude_maxima INTEGER, magia_maxima INTEGER );

CREATE TABLE Livro ( id_item INTEGER PRIMARY KEY, id_habilidade INTEGER, nome VARCHAR UNIQUE NOT NULL, descricao VARCHAR, preco_venda INTEGER NOT NULL );

ALTER TABLE Armadura ADD CONSTRAINT FK_Armadura_2 FOREIGN KEY (id_armadura) REFERENCES Tipo_Item (id_item);

ALTER TABLE Armadura ADD CONSTRAINT FK_Armadura_3 FOREIGN KEY (id_parte_corpo) REFERENCES Parte_Corpo (id_parte_corpo);

ALTER TABLE Material ADD CONSTRAINT FK_Material_2 FOREIGN KEY (id_material) REFERENCES Tipo_Item (id_item);

ALTER TABLE Item_Missao ADD CONSTRAINT FK_Item_Missao_2 FOREIGN KEY (id_item) REFERENCES Tipo_Item (id_item);

ALTER TABLE Livro ADD CONSTRAINT FK_Livro_2 FOREIGN KEY (id_item) REFERENCES Tipo_Item (id_item);

ALTER TABLE Livro ADD CONSTRAINT FK_Livro_3 FOREIGN KEY (id_habilidade) REFERENCES Habilidade (id_habilidade);

ALTER TABLE Consumivel ADD CONSTRAINT FK_Consumivel_2 FOREIGN KEY (id_item) REFERENCES Tipo_Item (id_item);

CREATE TABLE Missao ( id_missao SERIAL PRIMARY KEY, id_missao_anterior INTEGER, item_necessario INTEGER NOT NULL, nome INTEGER UNIQUE NOT NULL, dialogo_inicial VARCHAR, dialogo_durante VARCHAR, dialogo_completa VARCHAR );

ALTER TABLE Missao ADD CONSTRAINT FK_Missao_2 FOREIGN KEY (id_missao_anterior) REFERENCES Missao (id_missao);

ALTER TABLE Missao ADD CONSTRAINT FK_Missao_3 FOREIGN KEY (item_necessario) REFERENCES Item_Missao (id_item);

CREATE TABLE Santuario ( id_santuario SERIAL PRIMARY KEY, id_missao_requisito INTEGER, id_missao_proximo_santuario INTEGER, nome VARCHAR UNIQUE NOT NULL, descricao VARCHAR, nivel_recomendado INTEGER NOT NULL );

CREATE TABLE Casa ( id_casa SERIAL PRIMARY KEY, id_santuario INTEGER NOT NULL, id_missao_requisito INTEGER, id_missao_proxima_casa INTEGER, nome VARCHAR NOT NULL, descricao VARCHAR, nivel_recomendado INTEGER NOT NULL );

CREATE TABLE Sala ( id_sala SERIAL PRIMARY KEY, id_casa INTEGER NOT NULL, nome VARCHAR NOT NULL, id_sala_norte INTEGER, id_sala_sul INTEGER, id_sala_leste INTEGER, id_sala_oeste INTEGER );

ALTER TABLE Santuario ADD CONSTRAINT FK_Santuario_2 FOREIGN KEY (id_missao_requisito) REFERENCES Missao (id_missao);

ALTER TABLE Santuario ADD CONSTRAINT FK_Santuario_3 FOREIGN KEY (id_missao_proximo_santuario) REFERENCES Missao (id_missao);

ALTER TABLE Casa ADD CONSTRAINT FK_Casa_2 FOREIGN KEY (id_santuario) REFERENCES Santuario (id_santuario);

ALTER TABLE Casa ADD CONSTRAINT FK_Casa_3 FOREIGN KEY (id_missao_requisito) REFERENCES Missao (id_missao);

ALTER TABLE Casa ADD CONSTRAINT FK_Casa_4 FOREIGN KEY (id_missao_proxima_casa) REFERENCES Missao (id_missao);

ALTER TABLE Sala ADD CONSTRAINT FK_Sala_2 FOREIGN KEY (id_casa) REFERENCES Casa (id_casa);

CREATE TABLE Npc_Ferreiro ( id_npc_ferreiro INTEGER PRIMARY KEY, id_sala INTEGER NOT NULL, id_missao_desbloqueia INTEGER NOT NULL, nome VARCHAR NOT NULL, descricao VARCHAR, dialogo_inicial VARCHAR, dialogo_reparar VARCHAR, dialogo_upgrade VARCHAR );

CREATE TABLE Npc_Quest ( id_npc_quest INTEGER PRIMARY KEY, id_sala INTEGER NOT NULL, nome VARCHAR NOT NULL, descricao VARCHAR, dialogo_inicial VARCHAR, dialogo_recusa VARCHAR );

CREATE TABLE Npc_Mercador ( id_npc_mercador INTEGER PRIMARY KEY, id_sala INTEGER NOT NULL, nome VARCHAR NOT NULL, descricao VARCHAR, dialogo_inicial VARCHAR, dialogo_vender VARCHAR, dialogo_comprar VARCHAR, dialogo_sair VARCHAR );

ALTER TABLE Npc_Ferreiro ADD CONSTRAINT FK_Npc_Ferreiro_2 FOREIGN KEY (id_sala) REFERENCES Sala (id_sala);

ALTER TABLE Npc_Ferreiro ADD CONSTRAINT FK_Npc_Ferreiro_3 FOREIGN KEY (id_missao_desbloqueia) REFERENCES Missao (id_missao);

ALTER TABLE Npc_Quest ADD CONSTRAINT FK_Npc_Quest_2 FOREIGN KEY (id_sala) REFERENCES Sala (id_sala);

ALTER TABLE Npc_Mercador ADD CONSTRAINT FK_Npc_Mercador_2 FOREIGN KEY (id_sala) REFERENCES Sala (id_sala);

CREATE TABLE Cavaleiro ( id_cavaleiro SERIAL PRIMARY KEY, id_classe INTEGER NOT NULL, id_elemento INTEGER NOT NULL, nome VARCHAR UNIQUE NOT NULL, nivel INTEGER NOT NULL, hp_max INTEGER NOT NULL, magia_max INTEGER NOT NULL, velocidade_base INTEGER NOT NULL, ataque_fisico_base INTEGER NOT NULL, ataque_magico_base INTEGER NOT NULL );

ALTER TABLE Cavaleiro ADD CONSTRAINT FK_Cavaleiro_2 FOREIGN KEY (id_classe) REFERENCES Classe (id_classe);

ALTER TABLE Cavaleiro ADD CONSTRAINT FK_Cavaleiro_3 FOREIGN KEY (id_elemento) REFERENCES Elemento (id_elemento);

CREATE TABLE Boss ( id_boss SERIAL PRIMARY KEY, id_sala INTEGER NOT NULL, nome INTEGER NOT NULL, nivel INTEGER NOT NULL, xp_acumulado INTEGER NOT NULL, hp_max INTEGER NOT NULL, hp_atual INTEGER NOT NULL, magia_max INTEGER NOT NULL, magia_atual INTEGER NOT NULL, velocidade INTEGER NOT NULL, ataque_fisico_base INTEGER NOT NULL, ataque_magico_base INTEGER NOT NULL, dinheiro INTEGER NOT NULL, fala_inicio VARCHAR, fala_derrotar_player VARCHAR, fala_derrotado VARCHAR, fala_condicao VARCHAR );

ALTER TABLE Boss ADD CONSTRAINT FK_Boss_2 FOREIGN KEY (id_sala) REFERENCES Sala (id_sala);

CREATE TABLE Inimigo ( id_inimigo SERIAL PRIMARY KEY, id_classe INTEGER NOT NULL, id_elemento INTEGER NOT NULL, nome VARCHAR NOT NULL, nivel INTEGER NOT NULL, xp_acumulado INTEGER NOT NULL, hp_max INTEGER NOT NULL, magia_max INTEGER NOT NULL, velocidade INTEGER NOT NULL, ataque_fisico_base INTEGER NOT NULL, ataque_magico_base INTEGER NOT NULL, dinheiro INTEGER NOT NULL, fala_inicio VARCHAR );

ALTER TABLE Inimigo ADD CONSTRAINT FK_Inimigo_2 FOREIGN KEY (id_elemento) REFERENCES Elemento (id_elemento);

ALTER TABLE Inimigo ADD CONSTRAINT FK_Inimigo_3 FOREIGN KEY (id_classe) REFERENCES Classe (id_classe);

CREATE TABLE Grupo_inimigo ( id_grupo SERIAL PRIMARY KEY, id_sala INTEGER );

CREATE TABLE Instancia_Inimigo ( id_instancia SERIAL, id_inimigo INTEGER, id_grupo INTEGER, hp_atual INTEGER NOT NULL, magia_atual INTEGER NOT NULL, defesa_fisica_bonus INTEGER, defesa_magica_bonus INTEGER, PRIMARY KEY (id_inimigo, id_instancia) );

ALTER TABLE Instancia_Inimigo ADD CONSTRAINT FK_Instancia_Inimigo_2 FOREIGN KEY (id_inimigo) REFERENCES Inimigo (id_inimigo);

ALTER TABLE Instancia_Inimigo ADD CONSTRAINT FK_Instancia_Inimigo_3 FOREIGN KEY (id_grupo) REFERENCES Grupo_inimigo (id_grupo);

ALTER TABLE Grupo_inimigo ADD CONSTRAINT FK_Grupo_inimigo_2 FOREIGN KEY (id_sala) REFERENCES Sala (id_sala);

CREATE TABLE Inventario ( id_player INTEGER PRIMARY KEY, dinheiro INTEGER NOT NULL );

ALTER TABLE Inventario ADD CONSTRAINT FK_Inventario_1 FOREIGN KEY (id_player) REFERENCES Player (id_player);

CREATE TABLE Armadura_Instancia ( id_armadura INTEGER, id_parte_corpo_armadura enum_parte_corpo, id_instancia SERIAL, id_inventario INTEGER, raridade_armadura INTEGER NOT NULL, defesa_magica INTEGER NOT NULL, defesa_fisica INTEGER NOT NULL, ataque_magico INTEGER NOT NULL, ataque_fisico INTEGER NOT NULL, durabilidade_max INTEGER NOT NULL, preco_venda INTEGER NOT NULL, PRIMARY KEY (id_armadura, id_instancia, id_parte_corpo_armadura) );

ALTER TABLE Armadura_Instancia ADD CONSTRAINT FK_Armadura_Instancia_2 FOREIGN KEY (id_armadura, id_parte_corpo_armadura) REFERENCES Armadura (id_armadura, id_parte_corpo);

ALTER TABLE Armadura_Instancia ADD CONSTRAINT FK_Armadura_Instancia_3 FOREIGN KEY (id_inventario) REFERENCES Inventario (id_player);

CREATE TABLE Item_a_venda ( id_item INTEGER PRIMARY KEY, preco_compra INTEGER NOT NULL, level_minimo INTEGER NOT NULL );

ALTER TABLE Item_a_venda ADD CONSTRAINT FK_Item_a_venda_2 FOREIGN KEY (id_item) REFERENCES Tipo_Item (id_item);

CREATE TABLE Party ( id_player INTEGER PRIMARY KEY, id_sala INTEGER );

ALTER TABLE Party ADD CONSTRAINT FK_Party_2 FOREIGN KEY (id_sala) REFERENCES Sala (id_sala);

CREATE TABLE Instancia_Cavaleiro ( id_instancia_cavaleiro SERIAL, id_cavaleiro INTEGER NOT NULL, id_party INTEGER, nivel INTEGER NOT NULL, xp_atual INTEGER NOT NULL, hp_max INTEGER NOT NULL, magia_max INTEGER NOT NULL, hp_atual INTEGER NOT NULL, magia_atual INTEGER NOT NULL, velocidade INTEGER NOT NULL, ataque_fisico INTEGER NOT NULL, ataque_magico INTEGER NOT NULL, PRIMARY KEY (id_cavaleiro, id_instancia_cavaleiro) );

ALTER TABLE Instancia_Cavaleiro ADD CONSTRAINT FK_Instancia_Cavaleiro_2 FOREIGN KEY (id_cavaleiro) REFERENCES Cavaleiro (id_cavaleiro);

ALTER TABLE Instancia_Cavaleiro ADD CONSTRAINT FK_Instancia_Cavaleiro_3 FOREIGN KEY (id_party) REFERENCES Party (id_player);

CREATE TABLE Progresso_Player ( id_player INTEGER , id_boss INTEGER, id_cavaleiro INTEGER , status_derrotado BOOLEAN, PRIMARY KEY (id_player, id_boss) );

ALTER TABLE Progresso_Player ADD CONSTRAINT FK_Progresso_Player_2 FOREIGN KEY (id_player) REFERENCES Player (id_player);

ALTER TABLE Progresso_Player ADD CONSTRAINT FK_Progresso_Player_3 FOREIGN KEY (id_boss) REFERENCES Boss (id_boss);

ALTER TABLE Progresso_Player ADD CONSTRAINT FK_Progresso_Player_4 FOREIGN KEY (id_cavaleiro) REFERENCES Cavaleiro (id_cavaleiro);

CREATE TABLE Receita ( id_item_gerado INTEGER PRIMARY KEY, descricao VARCHAR );

ALTER TABLE Receita ADD CONSTRAINT FK_Receita_2 FOREIGN KEY (id_item_gerado) REFERENCES Tipo_Item (id_item);

CREATE TYPE enum_status_missao as ENUM ('c','i','ni'); / c = completo, i=iniciado,ni=n\u00e3o iniciado/ CREATE TABLE Player_Missao ( id_player INTEGER, id_missao INTEGER, status_missao enum_status_missao NOT NULL, PRIMARY KEY (id_player, id_missao) );

ALTER TABLE Player_Missao ADD CONSTRAINT FK_Player_Missao_2 FOREIGN KEY (id_missao) REFERENCES Missao (id_missao);

ALTER TABLE Player_Missao ADD CONSTRAINT FK_Player_Missao_3 FOREIGN KEY (id_player) REFERENCES Player (id_player);

CREATE TABLE Xp_Necessaria ( nivel INTEGER PRIMARY KEY, xp_necessaria INTEGER NOT NULL );

CREATE TABLE Material_Receita ( id_receita INTEGER, id_material INTEGER, quantidade INTEGER NOT NULL, PRIMARY KEY (id_receita, id_material) );

ALTER TABLE Material_Receita ADD CONSTRAINT FK_Material_Receita_2 FOREIGN KEY (id_material) REFERENCES Material (id_material);

ALTER TABLE Material_Receita ADD CONSTRAINT FK_Material_Receita_3 FOREIGN KEY (id_receita) REFERENCES Receita (id_item_gerado);

CREATE TABLE Habilidade_Player ( id_player INTEGER, id_habilidade INTEGER, slot INTEGER NOT NULL, PRIMARY KEY (id_player, id_habilidade, slot) );

ALTER TABLE Habilidade_Player ADD CONSTRAINT FK_Habilidade_Player_2 FOREIGN KEY (id_habilidade) REFERENCES Habilidade (id_habilidade);

ALTER TABLE Habilidade_Player ADD CONSTRAINT FK_Habilidade_Player_3 FOREIGN KEY (id_player) REFERENCES Player (id_player);

CREATE TABLE Habilidade_Cavaleiro ( id_cavaleiro INTEGER, id_habilidade INTEGER, slot INTEGER NOT NULL, PRIMARY KEY (id_cavaleiro, id_habilidade, slot) );

ALTER TABLE Habilidade_Cavaleiro ADD CONSTRAINT FK_Habilidade_Cavaleiro_2 FOREIGN KEY (id_cavaleiro) REFERENCES Cavaleiro (id_cavaleiro);

ALTER TABLE Habilidade_Cavaleiro ADD CONSTRAINT FK_Habilidade_Cavaleiro_3 FOREIGN KEY (id_habilidade) REFERENCES Habilidade (id_habilidade);

CREATE TABLE Habilidade_Boss ( id_boss INTEGER, id_habilidade INTEGER, PRIMARY KEY (id_boss, id_habilidade) );

ALTER TABLE Habilidade_Boss ADD CONSTRAINT FK_Habilidade_Boss_2 FOREIGN KEY (id_boss) REFERENCES Boss (id_boss);

ALTER TABLE Habilidade_Boss ADD CONSTRAINT FK_Habilidade_Boss_3 FOREIGN KEY (id_habilidade) REFERENCES Habilidade (id_habilidade);

CREATE TABLE Parte_Corpo_Boss ( id_boss INTEGER, parte_corpo enum_parte_corpo, defesa_fisica INTEGER NOT NULL, defesa_magica INTEGER NOT NULL, chance_acerto_base INTEGER NOT NULL, chance_acerto_critico INTEGER NOT NULL, PRIMARY KEY (id_boss, parte_corpo) );

ALTER TABLE Parte_Corpo_Boss ADD CONSTRAINT FK_Parte_Corpo_Boss_2 FOREIGN KEY (id_boss) REFERENCES Boss (id_boss);

ALTER TABLE Parte_Corpo_Boss ADD CONSTRAINT FK_Parte_Corpo_Boss_3 FOREIGN KEY (parte_corpo) REFERENCES Parte_Corpo (id_parte_corpo);

CREATE TABLE Parte_Corpo_Cavaleiro ( id_cavaleiro INTEGER, parte_corpo enum_parte_corpo, id_instancia_cavaleiro INTEGER NOT NULL, defesa_fisica_bonus INTEGER NOT NULL, defesa_magico_bonus INTEGER NOT NULL, chance_acerto_base INTEGER NOT NULL, chance_acerto_critico INTEGER NOT NULL, PRIMARY KEY (id_cavaleiro, parte_corpo) );

ALTER TABLE Parte_Corpo_Cavaleiro ADD CONSTRAINT FK_Parte_Corpo_Cavaleiro_2 FOREIGN KEY (parte_corpo) REFERENCES Parte_Corpo (id_parte_corpo);

ALTER TABLE Parte_Corpo_Cavaleiro ADD CONSTRAINT FK_Parte_Corpo_Cavaleiro_3 FOREIGN KEY (id_instancia_cavaleiro, id_cavaleiro) REFERENCES Instancia_Cavaleiro (id_instancia_cavaleiro, id_cavaleiro);

CREATE TABLE Parte_Corpo_Player ( id_player INTEGER, parte_corpo enum_parte_corpo, armadura_equipada INTEGER, instancia_armadura_equipada INTEGER, PRIMARY KEY (id_player, parte_corpo) );

ALTER TABLE Parte_Corpo_Player ADD CONSTRAINT FK_Parte_Corpo_Player_2 FOREIGN KEY (id_player) REFERENCES Player (id_player);

ALTER TABLE Parte_Corpo_Player ADD CONSTRAINT FK_Parte_Corpo_Player_3 FOREIGN KEY (parte_corpo) REFERENCES Parte_Corpo (id_parte_corpo);

ALTER TABLE Parte_Corpo_Player ADD CONSTRAINT FK_Parte_Corpo_Player_4 FOREIGN KEY (armadura_equipada, instancia_armadura_equipada, parte_corpo) REFERENCES Armadura_Instancia (id_armadura, id_instancia, id_parte_corpo_armadura);

CREATE TABLE Elemento_Boss ( id_elemento INTEGER, id_boss INTEGER, PRIMARY KEY (id_boss, id_elemento) );

ALTER TABLE Elemento_Boss ADD CONSTRAINT FK_Elemento_Boss_1 FOREIGN KEY (id_elemento) REFERENCES Elemento (id_elemento);

ALTER TABLE Elemento_Boss ADD CONSTRAINT FK_Elemento_Boss_2 FOREIGN KEY (id_boss) REFERENCES Boss (id_boss);

CREATE TABLE Habilidade_Inimigo ( id_habilidade INTEGER, id_player INTEGER, PRIMARY KEY (id_habilidade, id_player) );

ALTER TABLE Habilidade_Inimigo ADD CONSTRAINT FK_Habilidade_Inimigo_2 FOREIGN KEY (id_habilidade) REFERENCES Habilidade (id_habilidade);

ALTER TABLE Habilidade_Inimigo ADD CONSTRAINT FK_Habilidade_Inimigo_3 FOREIGN KEY (id_player) REFERENCES Inimigo (id_inimigo);

CREATE TABLE Item_Armazenado ( id_inventario INTEGER, id_item INTEGER, quantidade INTEGER NOT NULL, PRIMARY KEY (id_inventario, id_item) );

ALTER TABLE Item_Armazenado ADD CONSTRAINT FK_Item_Armazenado_2 FOREIGN KEY (id_inventario) REFERENCES Inventario (id_player);

ALTER TABLE Item_Armazenado ADD CONSTRAINT FK_Item_Armazenado_3 FOREIGN KEY (id_item) REFERENCES Tipo_Item (id_item);

CREATE TABLE Item_grupo_inimigo_dropa ( id_item INTEGER, id_grupo_inimigo INTEGER, quantidade INTEGER NOT NULL, PRIMARY KEY (id_item, id_grupo_inimigo) );

ALTER TABLE Item_grupo_inimigo_dropa ADD CONSTRAINT FK_Item_grupo_inimigo_dropa_2 FOREIGN KEY (id_item) REFERENCES Tipo_Item (id_item);

ALTER TABLE Item_grupo_inimigo_dropa ADD CONSTRAINT FK_Item_grupo_inimigo_dropa_3 FOREIGN KEY (id_grupo_inimigo) REFERENCES Grupo_inimigo (id_grupo);

CREATE TABLE Texto ( id SERIAL PRIMARY KEY, texto TEXT NOT NULL, nome_texto VARCHAR NOT NULL );

INSERT INTO Texto (nome_texto, texto) VALUES ( 'logo', ' __ __ _ __ __ _ - / / ____ _ _ __ ____ _ / / ___ () _ _____ ____/ / ____ /__ / ____ ____/ / () _ _ _ - / / / __ /| | / / / __/ / / / _ / / / / / __ / / / __ / / __ / / / __ / __ / / / / __ `/ / / / __ \\ - / / / // / | |/ / / // / / / / __/ / / / / / // / ( ) / // / / // / / // // // // / / / / // / / /__ / // / - _/ _,/ |/ _,/ // _/ // // _/ // _,/ ____/ /____/____/ _,/ // _,/ ___/ ____/' );

INSERT INTO Texto (nome_texto, texto) VALUES ('introducao', 'Desde tempos imemoriais, quando o mal amea\u00e7ou dominar o mundo, guerreiros sagrados se ergueram para proteger a paz na Terra. Vestindo armaduras forjadas pelas constela\u00e7\u00f5es, eles lutaram com coragem e honra em nome da deusa Atena. Esses guerreiros s\u00e3o conhecidos como os lend\u00e1rios Cavaleiros do Zod\u00edaco.

Agora, as for\u00e7as sombrias despertam mais uma vez, e o equil\u00edbrio do mundo est\u00e1 em perigo. Somente aqueles com um cora\u00e7\u00e3o puro e a for\u00e7a do Cosmo poder\u00e3o enfrentar o destino e erguer-se como verdadeiros defensores da justi\u00e7a.

Prepare-se para vestir sua armadura, elevar seu Cosmo e escrever sua pr\u00f3pria lenda. A batalha pelo futuro da humanidade come\u00e7a agora!' );

CREATE OR REPLACE FUNCTION public.mudar_sala(id_player_input INTEGER, direcao TEXT) RETURNS VOID LANGUAGE plpgsql AS $function$ DECLARE nova_sala_id INTEGER; BEGIN -- Verifica a sala conectada na dire\u00e7\u00e3o especificada SELECT CASE LOWER(direcao) WHEN 'norte' THEN s.id_sala_norte WHEN 'sul' THEN s.id_sala_sul WHEN 'leste' THEN s.id_sala_leste WHEN 'oeste' THEN s.id_sala_oeste ELSE NULL END INTO nova_sala_id FROM public.sala s JOIN public.party p ON p.id_sala = s.id_sala WHERE p.id_player = id_player_input;

-- Verifica se a sala existe e atualiza a localiza\u00e7\u00e3o da party\nIF nova_sala_id IS NOT NULL THEN\n    UPDATE public.party\n    SET id_sala = nova_sala_id\n    WHERE id_player = id_player_input;\nELSE\n    RAISE NOTICE 'Movimento inv\u00e1lido: N\u00e3o h\u00e1 sala conectada nessa dire\u00e7\u00e3o.';\nEND IF;\n

END; $function$;

"},{"location":"modulo02/DML/","title":"DML","text":""},{"location":"modulo02/DML/#dml","title":"DML","text":""},{"location":"modulo02/DML/#versionamento","title":"Versionamento","text":"Vers\u00e3o Data Modifica\u00e7\u00e3o Autor 0.1 11/12/2023 Cria\u00e7\u00e3o do Documento Vin\u00edcius Rufino

```ALTER TABLE santuario RENAME TO saga; ALTER TABLE saga RENAME COLUMN id_santuario TO id_saga; ALTER TABLE saga RENAME COLUMN id_missao_proximo_santuario TO id_missao_proxima_saga; ALTER TABLE casa RENAME COLUMN id_santuario TO id_saga; ALTER TABLE Missao ALTER COLUMN nome TYPE VARCHAR USING NULL;

INSERT INTO Saga (id_saga, id_missao_requisito, id_missao_proxima_saga, nome, descricao, nivel_recomendado) VALUES (1, NULL, NULL, 'Saga SafeHouse', 'O in\u00edcio da jornada dos Cavaleiros de Bronze, onde cresceram e descobriram seus destinos.', 1);

INSERT INTO Casa (id_casa, id_saga, id_missao_requisito, id_missao_proxima_casa, nome, descricao, nivel_recomendado) VALUES (1, 1, NULL, NULL, 'Casa SafeHouse', 'O lugar onde os Cavaleiros de Bronze viveram antes de serem enviados para seus treinamentos.', 1);

INSERT INTO Sala (id_sala, id_casa, nome, id_sala_norte, id_sala_sul, id_sala_leste, id_sala_oeste) VALUES (1, 1, 'Sala Principal SafeHouse', 2, 3, NULL, NULL);

INSERT INTO Sala (id_sala, id_casa, nome, id_sala_norte, id_sala_sul, id_sala_leste, id_sala_oeste) VALUES (2, 1, 'Sala Das Miss\u00f5es', NULL, 1, NULL, NULL);

INSERT INTO Sala (id_sala, id_casa, nome, id_sala_norte, id_sala_sul, id_sala_leste, id_sala_oeste) VALUES (3, 1, 'Oficina de Armaduras de Mu', 1, NULL, NULL, NULL);

INSERT INTO Saga (id_saga, id_missao_requisito, id_missao_proxima_saga, nome, descricao, nivel_recomendado) VALUES (2, NULL, NULL, 'Saga das 12 Casas', 'Os Cavaleiros de Bronze enfrentam os Cavaleiros de Ouro para salvar Atena.', 1);

ALTER TABLE Tipo_Item ALTER COLUMN tipo_item TYPE enum_tipo_item USING NULL;

INSERT INTO public.tipo_item (id_item, tipo_item) VALUES(1, 'i');

INSERT INTO public.item_missao (id_item, nome, descricao) VALUES(1, 'Ben\u00e7\u00e3o de Mu', 'Ao derrotar Mu ele aben\u00e7oa os Cavaleiros');

INSERT INTO public.missao (id_missao_anterior, item_necessario, nome, dialogo_inicial, dialogo_durante, dialogo_completa) VALUES( NULL, 1, 'Derrote o Cavaleiro de \u00c1ries', '', '', '');

INSERT INTO Casa (id_casa, id_saga, id_missao_requisito, id_missao_proxima_casa, nome, descricao, nivel_recomendado) VALUES (2, 2, NULL, 1, 'Casa \u00c1ries', 'A casa protegida por Mu, o Cavaleiro de \u00c1ries, que repara as armaduras dos Cavaleiros de Bronze.', 1);

INSERT INTO Sala (id_sala, id_casa, nome, id_sala_norte, id_sala_sul, id_sala_leste, id_sala_oeste) VALUES (4, 2, 'Covil dos esqueletos', 5, NULL, NULL, NULL);

INSERT INTO Sala (id_sala, id_casa, nome, id_sala_norte, id_sala_sul, id_sala_leste, id_sala_oeste) VALUES (5, 2, 'Covil Dos An\u00f5es', NULL, 4, 6, 7);

INSERT INTO Sala (id_sala, id_casa, nome, id_sala_norte, id_sala_sul, id_sala_leste, id_sala_oeste) VALUES (6, 2, 'Covil das serpentes', NULL, NULL, NULL, 5);

INSERT INTO Sala (id_sala, id_casa, nome, id_sala_norte, id_sala_sul, id_sala_leste, id_sala_oeste) VALUES (7, 2, 'Sala dos Cavaleiros Negros', 8, NULL, 5, NULL);

INSERT INTO Sala (id_sala, id_casa, nome, id_sala_norte, id_sala_sul, id_sala_leste, id_sala_oeste) VALUES (8, 2, 'Sala de combate de \u00c1ries', NULL, 7, NULL, NULL);

INSERT INTO Elemento (id_elemento, nome, descricao) VALUES (1, 'Fogo', 'Controla o calor e as chamas, usado frequentemente para atacar com intensidade.'), (2, '\u00c1gua', 'Flui e adapta-se, frequentemente usada para defesa e restri\u00e7\u00e3o de movimentos.'), (3, 'Terra', 'S\u00f3lido e confi\u00e1vel, usado para defesa e ataques f\u00edsicos.'), (4, 'Vento', 'R\u00e1pido e inconstante, usado para movimenta\u00e7\u00e3o r\u00e1pida e ataques evasivos.'), (5, 'Trov\u00e3o', 'Poderoso e chocante, usado para ataques el\u00e9tricos r\u00e1pidos e devastadores.');

UPDATE Elemento SET fraco_contra = 2, forte_contra = 3 WHERE id_elemento = 1; -- Fogo fraco contra \u00c1gua, forte contra Terra UPDATE Elemento SET fraco_contra = 3, forte_contra = 1 WHERE id_elemento = 2; -- \u00c1gua fraca contra Terra, forte contra Fogo UPDATE Elemento SET fraco_contra = 4, forte_contra = 5 WHERE id_elemento = 3; -- Terra fraca contra Vento, forte contra Trov\u00e3o UPDATE Elemento SET fraco_contra = 1, forte_contra = 3 WHERE id_elemento = 4; -- Vento fraco contra Fogo, forte contra Terra UPDATE Elemento SET fraco_contra = 3, forte_contra = 2 WHERE id_elemento = 5; -- Trov\u00e3o fraco contra Terra, forte contra \u00c1gua

CREATE OR REPLACE FUNCTION insert_random_cdz_player() RETURNS void AS $$ DECLARE nome_cdz TEXT; id_elemento_min INT; id_elemento_max INT; BEGIN

WITH nomes AS (\n    SELECT unnest(ARRAY['Arion', 'Celestis', 'Drakon', 'Helion', 'Zephyr']) AS nome\n)\nSELECT nome INTO nome_cdz FROM nomes ORDER BY random() LIMIT 1;\n\n-- Obter o m\u00ednimo e o m\u00e1ximo ID do elemento\nSELECT MIN(id_elemento), MAX(id_elemento) INTO id_elemento_min, id_elemento_max FROM Elemento;\n\n-- Inserir o registro com valores aleat\u00f3rios\nINSERT INTO public.player\n(id_elemento, nome, nivel, xp_acumulado, hp_max, magia_max, hp_atual, magia_atual, velocidade, ataque_fisico_base, ataque_magico_base, id_sala_safe)\nVALUES\n(floor(random() * (id_elemento_max - id_elemento_min + 1) + id_elemento_min), nome_cdz, floor(random() * 61), floor(random() * 61), floor(random() * 61), floor(random() * 61), floor(random() * 61), floor(random() * 61), floor(random() * 61), floor(random() * 61), floor(random() * 61), floor(random() * 61));\n

END; $$ LANGUAGE plpgsql;

SELECT insert_random_cdz_player();

INSERT INTO party (id_player, id_sala) VALUES(1, 1);

CREATE OR REPLACE FUNCTION setar_sala_inicial(id_player_input INT) RETURNS VOID AS $$ DECLARE sala_inicial_id INT; BEGIN -- Recupera o menor id_sala da tabela sala SELECT MIN(id_sala) INTO sala_inicial_id FROM public.sala;

-- Verifica se existe uma sala\nIF sala_inicial_id IS NOT NULL THEN\n    -- Atualiza o id_sala_safe do player\n    UPDATE public.player\n    SET id_sala_safe = sala_inicial_id\n    WHERE id_player = id_player_input;\n\n    -- Insere na party\n    INSERT INTO public.party (id_player, id_sala)\n    VALUES (id_player_input, sala_inicial_id);\nELSE\n    RAISE EXCEPTION 'Nenhuma sala encontrada na tabela sala.';\nEND IF;\n

END; $$ LANGUAGE plpgsql;

CREATE OR REPLACE FUNCTION setar_nova_sala(id_player_input INT, id_sala_input INT) RETURNS VOID AS $$ BEGIN -- Verifica se a sala existe IF EXISTS (SELECT 1 FROM public.sala WHERE id_sala = id_sala_input) THEN -- Atualiza o id_sala na tabela party para o jogador UPDATE public.party SET id_sala = id_sala_input WHERE id_player = id_player_input;

    -- Verifica se o jogador j\u00e1 est\u00e1 na tabela party, caso contr\u00e1rio, insere\n    IF NOT FOUND THEN\n        INSERT INTO public.party (id_player, id_sala)\n        VALUES (id_player_input, id_sala_input);\n    END IF;\nELSE\n    RAISE EXCEPTION 'Sala com id_sala % n\u00e3o encontrada.', id_sala_input;\nEND IF;\n

END; $$ LANGUAGE plpgsql;

CREATE OR REPLACE FUNCTION get_salas_conectadas(id_player_input INT) RETURNS TABLE(id_sala INT, nome VARCHAR) AS $$ BEGIN RETURN QUERY WITH salas_conectadas AS ( SELECT unnest(ARRAY[s.id_sala_norte, s.id_sala_sul, s.id_sala_leste, s.id_sala_oeste]) AS id_sala_direcao FROM public.sala s WHERE s.id_sala = ( SELECT p.id_sala FROM public.party p WHERE p.id_player = id_player_input LIMIT 1 ) ) SELECT s.id_sala, s.nome FROM salas_conectadas sc JOIN public.sala s ON sc.id_sala_direcao = s.id_sala WHERE sc.id_sala_direcao IS NOT NULL; END; $$ LANGUAGE plpgsql;

CREATE OR REPLACE FUNCTION public.get_player_info(player_id integer) RETURNS text LANGUAGE plpgsql AS $function$ BEGIN RETURN ( SELECT STRING_AGG( FORMAT( 'Nome: %s %sN\u00edvel: %s%sXP Acumulado: %s%sHP M\u00e1ximo: %s%sMagia M\u00e1xima: %s%sHP Atual: %s%sMagia Atual: %s%sVelocidade: %s%sAtaque F\u00edsico Base: %s%sAtaque M\u00e1gico Base: %s%sElemento: %s', p.nome, E'\\n', p.nivel, E'\\n', p.xp_acumulado, E'\\n', p.hp_max, E'\\n', p.magia_max, E'\\n', p.hp_atual, E'\\n', p.magia_atual, E'\\n', p.velocidade, E'\\n', p.ataque_fisico_base, E'\\n', p.ataque_magico_base, E'\\n', e.nome ), E'\\n' -- Delimitador entre os registros (caso haja mais de um) ) FROM player p INNER JOIN elemento e ON e.id_elemento = p.id_elemento WHERE p.id_player = player_id ); END; $function$;

CREATE OR REPLACE FUNCTION listar_jogadores_formatados() RETURNS TEXT AS $$ BEGIN RETURN ( SELECT STRING_AGG( FORMAT( 'Nome: %s N\u00edvel: %s Elemento: %s ', p.nome, p.nivel, e.nome ), E'\\n' -- Delimitador entre as entradas ) FROM player p INNER JOIN elemento e ON e.id_elemento = p.id_elemento ); END; $$ LANGUAGE plpgsql;

CREATE OR REPLACE FUNCTION get_sala_atual(id_player_input INT) RETURNS TEXT AS $$ BEGIN RETURN ( SELECT STRING_AGG( FORMAT('Sala Atual: %s',s.nome), '\\n' ) FROM sala s INNER JOIN party p ON s.id_sala = p.id_sala WHERE p.id_player = id_player_input ); END; $$ LANGUAGE plpgsql;

CREATE OR REPLACE FUNCTION get_nome_sala(id_sala_input INT) RETURNS VARCHAR AS $$ BEGIN RETURN ( SELECT s.nome FROM sala s WHERE s.id_sala = id_sala_input LIMIT 1 ); END; $$ LANGUAGE plpgsql;

"},{"location":"modulo02/DQL/","title":"DQL","text":""},{"location":"modulo02/DQL/#dql","title":"DQL","text":""},{"location":"modulo02/DQL/#versionamento","title":"Versionamento","text":"Vers\u00e3o Data Modifica\u00e7\u00e3o Autor 0.1 11/12/2023 Cria\u00e7\u00e3o do Documento Vin\u00edcius Rufino

```-- 1. Listar informa\u00e7\u00f5es do play SELECT * FROM Player; -- 2. Listar todos os items no invent\u00e1r SELECT * FROM Inventario; -- 3. Listar todos os cavaleiros desbloquead SELECT * FROM Cavaleiro; -- 4. Escolher qual cavaleiro desbloqueado quer ver e listar todas informa\u00e7\u00f5es do cavaleiro SELECT * FROM Cavaleiro WHERE id_cavaleiro = {id_cavaleiro}; -- 5. Mostrar em que sala o player es SELECT id_sala FROM Party WHERE id_player = {id_player}; -- 6. Listar pras quais salas a partir da sala que o player est\u00e1 ele pode SELECT id_sala_norte, id_sala_sul, id_sala_leste, id_sala_oeste FROM Sala WHERE id_sala = (SELECT id_sala FROM Party WHERE id_player {id_player}); -- 7. Listar as habilidades do play SELECT Habilidade. FROM Habilidade_Player JOIN Habilidade ON Habilidade_Player.id_habilidade Habilidade.id_habilidade WHERE id_player = {id_player}; -- 8. Listar as habilidades dos cavaleiros desbloquead SELECT Habilidade. SELECTs e Procedure to Insert 2 FROM Habilidade JOIN Cavaleiro ON Habilidade.classe_habilidade Cavaleiro.id_classe -- 9. Listar os cavaleiros na par SELECT Cavaleiro. FROM Cavaleiro JOIN Party ON Party.id_player = {id_player}; -- 10. Listar os items \u00e0 ven SELECT * FROM Item_a_venda; -- 11. Listar as armaduras equipadas nas partes do corpo do play SELECT Parte_Corpo_Player. , Armadura. FROM Parte_Corpo_Player JOIN Armadura ON Parte_Corpo_Player.armadura_equipada Armadura.id_armadura WHERE id_player = {id_player}; -- 12. Listar qual cavaleiro \u00e9 desbloqueado ao derrotar certo bo SELECT Progresso_Player.id_cavaleiro, Boss.nome FROM Progresso_Player JOIN Boss ON Progresso_Player.id_boss Boss.id_bos WHERE Progresso_Player.status_derrotado TRUE -- 13. Listar quais os inimigos que est\u00e3o no grupo_inimigo e em qual sa SELECT Inimigo., Grupo_inimigo.id_sala FROM Grupo_inimigo JOIN Inimigo ON Grupo_inimigo.id_grupo Inimigo.id_classe -- 14. Listar habilidades do bo SELECT Habilidade. FROM Habilidade_Boss JOIN Habilidade ON Habilidade_Boss.id_habilidade Habilidade.id_habilidad WHERE Habilidade_Boss.id_boss = {id_boss}; -- 15. Listar habilidades dispon\u00edveis para cavaleiro aprender de acordo c seu n\u00edvel, classe e elemento SELECT Habilidade. FROM Habilidade SELECTs e Procedure to Insert 3 JOIN Cavaleiro ON Habilidade.classe_habilidade Cavaleiro.id_classe AN Habilidade.elemento_habilidade Cavaleiro.id_element WHERE Habilidade.nivel_necessario = Cavaleiro.nive -- 16. Listar todos os Boss de um santu\u00e1rio escolhido pelo jogador e o stat (se est\u00e1 derrotado ou n\u00e3o) SELECT Boss.*, Progresso_Player.status_derrotado FROM Boss JOIN Sala ON Boss.id_sala Sala.id_sal JOIN Casa ON Sala.id_casa Casa.id_cas JOIN Santuario ON Casa.id_santuario Santuario.id_santuari WHERE Santuario.id_santuario = {id_santuario}; CREATE OR REPLACE PROCEDURE insert_item( id_item INTEGER, tipo_item ENUM_tipo_item ) AS $ BEGIN INSERT INTO Tipo_Item (id_item, tipo_item) VALUES (id_item, tipo_item); END; $$ LANGUAGE plpgsql; -- Exemplo de uso CALL insert_item(1, 'a');

"}]} \ 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 0000000000000000000000000000000000000000..2d1c33fff09d2d37b82fe45b24b5257c46c5c235 GIT binary patch literal 127 zcmV-_0D%7=iwFn+sfA|(|8r?{Wo=<_E_iKh04<9_3V)_WXo8&M?ytk3HC}0~zlG)Vu

Fonte: Pedro Lucas