From 12acfb144c1a9fee16fe4f6db78a86c69ed55ab9 Mon Sep 17 00:00:00 2001 From: TelegramSam Date: Mon, 24 Jun 2024 19:48:16 +0000 Subject: [PATCH] =?UTF-8?q?deployed=20via=20Gatsby=20Publish=20Action=20?= =?UTF-8?q?=F0=9F=8E=A9=20for=20ac06a447e44337cb0e04c880f66cef1fab3ac5af?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../media-sharing-basic-flow.png | Bin 0 -> 24200 bytes .../media-sharing-as-response.png | Bin 0 -> 29260 bytes 404.html | 17 + 404/index.html | 17 + .../media-sharing-sender-states.png | Bin 0 -> 19073 bytes .../profile-exchange.png | Bin 0 -> 11865 bytes CNAME | 1 + action-menu/1.0/index.html | 19 + action-menu/2.0/index.html | 215 ++++++ app-1359be652999c4132455.js | 2 + app-1359be652999c4132455.js.map | 1 + basicmessage/1.0/index.html | 19 + basicmessage/2.0/index.html | 83 +++ book/v2/authentication/index.html | 18 + book/v2/didrotation/index.html | 58 ++ book/v2/extensions/index.html | 25 + book/v2/faq/index.html | 37 + book/v2/helloencrypt/index.html | 35 + book/v2/hellolibstools/index.html | 93 +++ book/v2/helloworldpy/index.html | 107 +++ book/v2/index.html | 92 +++ book/v2/intro/index.html | 18 + book/v2/migratorscript/index.html | 184 +++++ book/v2/mitm/index.html | 18 + book/v2/mobileagents/index.html | 41 ++ book/v2/oidc/index.html | 30 + book/v2/pfs/index.html | 41 ++ book/v2/privacy/index.html | 21 + book/v2/problemcodes/index.html | 105 +++ book/v2/problems/index.html | 29 + book/v2/routing/index.html | 124 ++++ book/v2/scrapbook/index.html | 31 + book/v2/startConnection/index.html | 236 +++++++ book/v2/threading/index.html | 33 + book/v2/timeouts/index.html | 17 + book/v2/whatsnew/index.html | 48 ++ book/v2/why/index.html | 18 + .../receipts-flow.png | Bin 0 -> 33890 bytes .../media-sharing-receiver-states.png | Bin 0 -> 19036 bytes chunk-map.json | 1 + commons-ceb25d5ebe4b77987b3b.js | 2 + commons-ceb25d5ebe4b77987b3b.js.map | 1 + ...-src-pages-404-tsx-06fe7db8f8c75ad21a4d.js | 2 + ...-pages-404-tsx-06fe7db8f8c75ad21a4d.js.map | 1 + ...rc-pages-index-tsx-eb4a3aa53617243254eb.js | 2 + ...ages-index-tsx-eb4a3aa53617243254eb.js.map | 1 + ...ates-book-book-tsx-f87c4cd85a9942002b2d.js | 2 + ...-book-book-tsx-f87c4cd85a9942002b2d.js.map | 1 + ...tocol-protocol-tsx-3391b2f00d0a4ae5a5c3.js | 2 + ...l-protocol-tsx-3391b2f00d0a4ae5a5c3.js.map | 1 + ...-search-search-tsx-e8abc6de2d7bc98ba3a7.js | 2 + ...rch-search-tsx-e8abc6de2d7bc98ba3a7.js.map | 1 + coordinate-mediation/1.0/index.html | 19 + coordinate-mediation/2.0/index.html | 190 ++++++ coordinate-mediation/3.0/index.html | 188 ++++++ .../1.0/index.html | 321 +++++++++ data-agreement-negotiation/1.0/index.html | 189 ++++++ data-agreement-proofs/1.0/index.html | 168 +++++ data-agreement-termination/1.0/index.html | 110 +++ data-disclosure-agreement/1.0/index.html | 636 ++++++++++++++++++ didexchange/1.0/index.html | 18 + didexchange/1.1/index.html | 18 + discover-features/1.0/index.html | 18 + discover-features/2.0/index.html | 95 +++ favicon-32x32.png | Bin 0 -> 2371 bytes favicon.svg | 16 + framework-0993f47ffebd3bbb5409.js | 3 + framework-0993f47ffebd3bbb5409.js.LICENSE.txt | 26 + framework-0993f47ffebd3bbb5409.js.map | 1 + icons/icon-144x144.png | Bin 0 -> 12386 bytes icons/icon-192x192.png | Bin 0 -> 16914 bytes icons/icon-256x256.png | Bin 0 -> 22273 bytes icons/icon-384x384.png | Bin 0 -> 33709 bytes icons/icon-48x48.png | Bin 0 -> 3964 bytes icons/icon-512x512.png | Bin 0 -> 45761 bytes icons/icon-72x72.png | Bin 0 -> 6151 bytes icons/icon-96x96.png | Bin 0 -> 8425 bytes index.html | 21 + issue-credential/1.1/index.html | 18 + issue-credential/2.0/index.html | 18 + issue-credential/3.0/index.html | 19 + manifest.webmanifest | 1 + media-sharing/1.0/index.html | 214 ++++++ messagepickup/1.0/index.html | 19 + messagepickup/2.0/index.html | 19 + messagepickup/3.0/index.html | 181 +++++ messaging/v2/index.json | 9 + out-of-band/2.0/index.html | 18 + page-data/404.html/page-data.json | 5 + page-data/404/page-data.json | 5 + page-data/action-menu/1.0/page-data.json | 6 + page-data/action-menu/2.0/page-data.json | 6 + page-data/app-data.json | 1 + page-data/basicmessage/1.0/page-data.json | 6 + page-data/basicmessage/2.0/page-data.json | 6 + .../book/v2/authentication/page-data.json | 5 + page-data/book/v2/didrotation/page-data.json | 5 + page-data/book/v2/extensions/page-data.json | 5 + page-data/book/v2/faq/page-data.json | 5 + page-data/book/v2/helloencrypt/page-data.json | 5 + .../book/v2/hellolibstools/page-data.json | 5 + page-data/book/v2/helloworldpy/page-data.json | 5 + page-data/book/v2/intro/page-data.json | 5 + .../book/v2/migratorscript/page-data.json | 5 + page-data/book/v2/mitm/page-data.json | 5 + page-data/book/v2/mobileagents/page-data.json | 5 + page-data/book/v2/oidc/page-data.json | 5 + page-data/book/v2/page-data.json | 5 + page-data/book/v2/pfs/page-data.json | 5 + page-data/book/v2/privacy/page-data.json | 5 + page-data/book/v2/problemcodes/page-data.json | 5 + page-data/book/v2/problems/page-data.json | 5 + page-data/book/v2/routing/page-data.json | 5 + page-data/book/v2/scrapbook/page-data.json | 5 + .../book/v2/startConnection/page-data.json | 5 + page-data/book/v2/threading/page-data.json | 5 + page-data/book/v2/timeouts/page-data.json | 5 + page-data/book/v2/whatsnew/page-data.json | 5 + page-data/book/v2/why/page-data.json | 5 + .../coordinate-mediation/1.0/page-data.json | 6 + .../coordinate-mediation/2.0/page-data.json | 6 + .../coordinate-mediation/3.0/page-data.json | 6 + .../1.0/page-data.json | 6 + .../1.0/page-data.json | 6 + .../data-agreement-proofs/1.0/page-data.json | 6 + .../1.0/page-data.json | 6 + .../1.0/page-data.json | 6 + page-data/didexchange/1.0/page-data.json | 6 + page-data/didexchange/1.1/page-data.json | 6 + .../discover-features/1.0/page-data.json | 6 + .../discover-features/2.0/page-data.json | 6 + page-data/index/page-data.json | 5 + page-data/issue-credential/1.1/page-data.json | 6 + page-data/issue-credential/2.0/page-data.json | 6 + page-data/issue-credential/3.0/page-data.json | 6 + page-data/media-sharing/1.0/page-data.json | 6 + page-data/messagepickup/1.0/page-data.json | 6 + page-data/messagepickup/2.0/page-data.json | 6 + page-data/messagepickup/3.0/page-data.json | 6 + page-data/out-of-band/2.0/page-data.json | 6 + page-data/present-proof/1.0/page-data.json | 6 + page-data/present-proof/2.0/page-data.json | 6 + page-data/present-proof/3.0/page-data.json | 6 + page-data/question-answer/1.0/page-data.json | 6 + page-data/receipts/1.0/page-data.json | 6 + page-data/report-problem/2.0/page-data.json | 6 + page-data/routing/2.0/page-data.json | 6 + page-data/search/page-data.json | 5 + page-data/shorten-url/1.0/page-data.json | 6 + page-data/sq/d/3000541721.json | 1 + page-data/sq/d/3766577012.json | 1 + page-data/trust-ping/2.0/page-data.json | 6 + page-data/user-profile/1.0/page-data.json | 6 + polyfill-5cf53654e1a73056adc6.js | 2 + polyfill-5cf53654e1a73056adc6.js.map | 1 + present-proof/1.0/index.html | 18 + present-proof/2.0/index.html | 18 + present-proof/3.0/index.html | 19 + question-answer/1.0/index.html | 143 ++++ receipts/1.0/index.html | 173 +++++ report-problem/2.0/index.html | 18 + routing/2.0/index.html | 18 + search/index.html | 17 + shorten-url/1.0/index.html | 273 ++++++++ .../icons.svg | 56 ++ styles.css | 1 + trust-ping/2.0/index.html | 18 + user-profile/1.0/index.html | 132 ++++ webpack-runtime-7b527356047a9787095f.js | 2 + webpack-runtime-7b527356047a9787095f.js.map | 1 + webpack.stats.json | 1 + 171 files changed, 5663 insertions(+) create mode 100644 25dfd2ef027a75c6a162497d43790690/media-sharing-basic-flow.png create mode 100644 35a98d39faaff19dd599432bdcb6446a/media-sharing-as-response.png create mode 100644 404.html create mode 100644 404/index.html create mode 100644 5de85979871e6386dacecbec0161b218/media-sharing-sender-states.png create mode 100644 88f2d750780e79891ad3b3f8dbc7939e/profile-exchange.png create mode 100644 CNAME create mode 100644 action-menu/1.0/index.html create mode 100644 action-menu/2.0/index.html create mode 100644 app-1359be652999c4132455.js create mode 100644 app-1359be652999c4132455.js.map create mode 100644 basicmessage/1.0/index.html create mode 100644 basicmessage/2.0/index.html create mode 100644 book/v2/authentication/index.html create mode 100644 book/v2/didrotation/index.html create mode 100644 book/v2/extensions/index.html create mode 100644 book/v2/faq/index.html create mode 100644 book/v2/helloencrypt/index.html create mode 100644 book/v2/hellolibstools/index.html create mode 100644 book/v2/helloworldpy/index.html create mode 100644 book/v2/index.html create mode 100644 book/v2/intro/index.html create mode 100644 book/v2/migratorscript/index.html create mode 100644 book/v2/mitm/index.html create mode 100644 book/v2/mobileagents/index.html create mode 100644 book/v2/oidc/index.html create mode 100644 book/v2/pfs/index.html create mode 100644 book/v2/privacy/index.html create mode 100644 book/v2/problemcodes/index.html create mode 100644 book/v2/problems/index.html create mode 100644 book/v2/routing/index.html create mode 100644 book/v2/scrapbook/index.html create mode 100644 book/v2/startConnection/index.html create mode 100644 book/v2/threading/index.html create mode 100644 book/v2/timeouts/index.html create mode 100644 book/v2/whatsnew/index.html create mode 100644 book/v2/why/index.html create mode 100644 c421904502786c9c0f42a2b11467abe4/receipts-flow.png create mode 100644 c4681702d1a5d591e9c1796982037ff7/media-sharing-receiver-states.png create mode 100644 chunk-map.json create mode 100644 commons-ceb25d5ebe4b77987b3b.js create mode 100644 commons-ceb25d5ebe4b77987b3b.js.map create mode 100644 component---src-pages-404-tsx-06fe7db8f8c75ad21a4d.js create mode 100644 component---src-pages-404-tsx-06fe7db8f8c75ad21a4d.js.map create mode 100644 component---src-pages-index-tsx-eb4a3aa53617243254eb.js create mode 100644 component---src-pages-index-tsx-eb4a3aa53617243254eb.js.map create mode 100644 component---src-templates-book-book-tsx-f87c4cd85a9942002b2d.js create mode 100644 component---src-templates-book-book-tsx-f87c4cd85a9942002b2d.js.map create mode 100644 component---src-templates-protocol-protocol-tsx-3391b2f00d0a4ae5a5c3.js create mode 100644 component---src-templates-protocol-protocol-tsx-3391b2f00d0a4ae5a5c3.js.map create mode 100644 component---src-templates-search-search-tsx-e8abc6de2d7bc98ba3a7.js create mode 100644 component---src-templates-search-search-tsx-e8abc6de2d7bc98ba3a7.js.map create mode 100644 coordinate-mediation/1.0/index.html create mode 100644 coordinate-mediation/2.0/index.html create mode 100644 coordinate-mediation/3.0/index.html create mode 100644 data-agreement-context-decorator/1.0/index.html create mode 100644 data-agreement-negotiation/1.0/index.html create mode 100644 data-agreement-proofs/1.0/index.html create mode 100644 data-agreement-termination/1.0/index.html create mode 100644 data-disclosure-agreement/1.0/index.html create mode 100644 didexchange/1.0/index.html create mode 100644 didexchange/1.1/index.html create mode 100644 discover-features/1.0/index.html create mode 100644 discover-features/2.0/index.html create mode 100644 favicon-32x32.png create mode 100644 favicon.svg create mode 100644 framework-0993f47ffebd3bbb5409.js create mode 100644 framework-0993f47ffebd3bbb5409.js.LICENSE.txt create mode 100644 framework-0993f47ffebd3bbb5409.js.map create mode 100644 icons/icon-144x144.png create mode 100644 icons/icon-192x192.png create mode 100644 icons/icon-256x256.png create mode 100644 icons/icon-384x384.png create mode 100644 icons/icon-48x48.png create mode 100644 icons/icon-512x512.png create mode 100644 icons/icon-72x72.png create mode 100644 icons/icon-96x96.png create mode 100644 index.html create mode 100644 issue-credential/1.1/index.html create mode 100644 issue-credential/2.0/index.html create mode 100644 issue-credential/3.0/index.html create mode 100644 manifest.webmanifest create mode 100644 media-sharing/1.0/index.html create mode 100644 messagepickup/1.0/index.html create mode 100644 messagepickup/2.0/index.html create mode 100644 messagepickup/3.0/index.html create mode 100644 messaging/v2/index.json create mode 100644 out-of-band/2.0/index.html create mode 100644 page-data/404.html/page-data.json create mode 100644 page-data/404/page-data.json create mode 100644 page-data/action-menu/1.0/page-data.json create mode 100644 page-data/action-menu/2.0/page-data.json create mode 100644 page-data/app-data.json create mode 100644 page-data/basicmessage/1.0/page-data.json create mode 100644 page-data/basicmessage/2.0/page-data.json create mode 100644 page-data/book/v2/authentication/page-data.json create mode 100644 page-data/book/v2/didrotation/page-data.json create mode 100644 page-data/book/v2/extensions/page-data.json create mode 100644 page-data/book/v2/faq/page-data.json create mode 100644 page-data/book/v2/helloencrypt/page-data.json create mode 100644 page-data/book/v2/hellolibstools/page-data.json create mode 100644 page-data/book/v2/helloworldpy/page-data.json create mode 100644 page-data/book/v2/intro/page-data.json create mode 100644 page-data/book/v2/migratorscript/page-data.json create mode 100644 page-data/book/v2/mitm/page-data.json create mode 100644 page-data/book/v2/mobileagents/page-data.json create mode 100644 page-data/book/v2/oidc/page-data.json create mode 100644 page-data/book/v2/page-data.json create mode 100644 page-data/book/v2/pfs/page-data.json create mode 100644 page-data/book/v2/privacy/page-data.json create mode 100644 page-data/book/v2/problemcodes/page-data.json create mode 100644 page-data/book/v2/problems/page-data.json create mode 100644 page-data/book/v2/routing/page-data.json create mode 100644 page-data/book/v2/scrapbook/page-data.json create mode 100644 page-data/book/v2/startConnection/page-data.json create mode 100644 page-data/book/v2/threading/page-data.json create mode 100644 page-data/book/v2/timeouts/page-data.json create mode 100644 page-data/book/v2/whatsnew/page-data.json create mode 100644 page-data/book/v2/why/page-data.json create mode 100644 page-data/coordinate-mediation/1.0/page-data.json create mode 100644 page-data/coordinate-mediation/2.0/page-data.json create mode 100644 page-data/coordinate-mediation/3.0/page-data.json create mode 100644 page-data/data-agreement-context-decorator/1.0/page-data.json create mode 100644 page-data/data-agreement-negotiation/1.0/page-data.json create mode 100644 page-data/data-agreement-proofs/1.0/page-data.json create mode 100644 page-data/data-agreement-termination/1.0/page-data.json create mode 100644 page-data/data-disclosure-agreement/1.0/page-data.json create mode 100644 page-data/didexchange/1.0/page-data.json create mode 100644 page-data/didexchange/1.1/page-data.json create mode 100644 page-data/discover-features/1.0/page-data.json create mode 100644 page-data/discover-features/2.0/page-data.json create mode 100644 page-data/index/page-data.json create mode 100644 page-data/issue-credential/1.1/page-data.json create mode 100644 page-data/issue-credential/2.0/page-data.json create mode 100644 page-data/issue-credential/3.0/page-data.json create mode 100644 page-data/media-sharing/1.0/page-data.json create mode 100644 page-data/messagepickup/1.0/page-data.json create mode 100644 page-data/messagepickup/2.0/page-data.json create mode 100644 page-data/messagepickup/3.0/page-data.json create mode 100644 page-data/out-of-band/2.0/page-data.json create mode 100644 page-data/present-proof/1.0/page-data.json create mode 100644 page-data/present-proof/2.0/page-data.json create mode 100644 page-data/present-proof/3.0/page-data.json create mode 100644 page-data/question-answer/1.0/page-data.json create mode 100644 page-data/receipts/1.0/page-data.json create mode 100644 page-data/report-problem/2.0/page-data.json create mode 100644 page-data/routing/2.0/page-data.json create mode 100644 page-data/search/page-data.json create mode 100644 page-data/shorten-url/1.0/page-data.json create mode 100644 page-data/sq/d/3000541721.json create mode 100644 page-data/sq/d/3766577012.json create mode 100644 page-data/trust-ping/2.0/page-data.json create mode 100644 page-data/user-profile/1.0/page-data.json create mode 100644 polyfill-5cf53654e1a73056adc6.js create mode 100644 polyfill-5cf53654e1a73056adc6.js.map create mode 100644 present-proof/1.0/index.html create mode 100644 present-proof/2.0/index.html create mode 100644 present-proof/3.0/index.html create mode 100644 question-answer/1.0/index.html create mode 100644 receipts/1.0/index.html create mode 100644 report-problem/2.0/index.html create mode 100644 routing/2.0/index.html create mode 100644 search/index.html create mode 100644 shorten-url/1.0/index.html create mode 100644 static/33a1b05c5807b13800487409ee2ac2cd/icons.svg create mode 100644 styles.css create mode 100644 trust-ping/2.0/index.html create mode 100644 user-profile/1.0/index.html create mode 100644 webpack-runtime-7b527356047a9787095f.js create mode 100644 webpack-runtime-7b527356047a9787095f.js.map create mode 100644 webpack.stats.json diff --git a/25dfd2ef027a75c6a162497d43790690/media-sharing-basic-flow.png b/25dfd2ef027a75c6a162497d43790690/media-sharing-basic-flow.png new file mode 100644 index 0000000000000000000000000000000000000000..733c50e0f1555450fd5978f85c72a1aa21e1669f GIT binary patch literal 24200 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 RfE@xzURwE0iKJ1${{Zo)DVP8N literal 0 HcmV?d00001 diff --git a/35a98d39faaff19dd599432bdcb6446a/media-sharing-as-response.png b/35a98d39faaff19dd599432bdcb6446a/media-sharing-as-response.png new file mode 100644 index 0000000000000000000000000000000000000000..3569eb617de7e5c961c1224556c6daa63f8e91a6 GIT binary patch literal 29260 zcmbrl1yG#bwk_INAV7d5xD!b5;O-vW-2w!6cMYz=8iyc_yE_DeySux)+x__W+2`JU zPra)5>U9-GSHri~>b2&YbIdX343U!&dxwaN2m*oLiGLGT0D+)^AE*ojXy6k((xM6A z7mU52xDo;a!or&DDhNaj5*HRwa!Ea0a(CFAb|t=zI<#6>APg~4XBgv*J-zPZ^tTxB zww>|kpA5&U6}X6~$f^9NY&L&~Vx z2SHnX!9EU>xFu#1F4oLhmF#RXf7TF$o=V&juy8ri-)CQ{%3H6h!p7DW)4gBH?JY!K zeIB5&P+32VLnDy*%NdxII)Q*UqksNX2cZe(`+lDnLLiysr#~X`M>8W%yham5U_p~| z2mS>YA(zJ=P4FG;1fd{8<{Lj#RN#4-|L>1kt2P&pPEJn#HEv;Py}bBjYG(Ff`q56( z&rdj54Pku6BEoW=**Gu2@~?vU$Du>RF{?o9PoX#`deOV>T{`j@?Bl{}Qyt0;Fp=FX z70E5fH<@YC6q3ooi8mlWzi+`x%PVXtSV!2oElc{?fej|O$Axs<1D8H}i9AIi{rA6f zZQNCsTi1VB%BkL(1^GIW)?Uozc@{=!7^#p=MQ*Ql)pnP7erpo*Abt3ILA=#n(kuw2 zCNSZs{Qag(5EcXqDk9*2G7yQjr|s+uQ!pG^O$rlV>d3M%vfGs9niVrR|+U zfj*K!7hyP!DeV)i5h_4ju_cweuJEG>_jz9({wYs8C7!>7H!pIb~~swqA*Kt>=Iwm;^JAiK^uRa=Bq09wWB zJWez<>NpMFX86Qg?vY7I%|MhV6DbltiT}n{_}&9t2-=+5H2Z)By6l~1@{7X1_FMZ?&D!ax7V(x@I15bG4!5C@_0Zk*@kIzm-jBi1UHmjs zkM6g{7W0HO

-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 literal 0 HcmV?d00001 diff --git a/404.html b/404.html new file mode 100644 index 00000000..1a1fb78c --- /dev/null +++ b/404.html @@ -0,0 +1,17 @@ +Page not Found | DIDComm

Oops!

We can't seem to find the page you're looking for.

404 error code
\ No newline at end of file diff --git a/404/index.html b/404/index.html new file mode 100644 index 00000000..14c58cde --- /dev/null +++ b/404/index.html @@ -0,0 +1,17 @@ +Page not Found | DIDComm
Oops!

We can't seem to find the page you're looking for.

404 error code
\ No newline at end of file diff --git a/5de85979871e6386dacecbec0161b218/media-sharing-sender-states.png b/5de85979871e6386dacecbec0161b218/media-sharing-sender-states.png new file mode 100644 index 0000000000000000000000000000000000000000..a36627d455fff3c947e2af3cca1dc6df3018d1d3 GIT binary patch literal 19073 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

Rgu!GiNd!o=H%LiPJ!hYc=$g}-r%NXzg zT~ZIwLi}szjN$(Yf&_j0B_(azv}yM2*(4jGFaSXQ%5T5@_Tt5h&z?Q2*XwDTmeL|+ z26X_V5)U|zYiMXN8jU0*q?bip(a~}`og+q!a5x+!DjJO@JTMCW3hIYZiFt*Eg%3XX z;OyD6rFaB`!J3+yqeqV(J9ccuh!G=3j2JX%ko5ew-+ud(Pd<75_1C4SgtssX{vv88 zqFDCUTW|gJr#}q_gMuLVd_J$&d*;lUU;XM=SNxS1Em~x^+nd@v@W2Cq``h1|o10r( zTfJVd&*u{a;ffJIx&pQ;v2FbL@tZeq&dA6hjmd=z7w)_7zN1HvUj58bqelJXAOA3$ z&7vs&@WT&9MMb-I?V>13(?)7rqW@dO1e`36VLZ=&`Q?{nzAG3E27|#DUU;G1oB+Vl zqeoY-Ud=F!R;wK{WXQpT2L(ZpUKk7prH{`j{}!R;$%&G@6{891Q|sEA>!`;jj^CgBWN4C8s;VzD@#PC*a^K{$2ll+9-A_$4(pHCC%N6bf-1 zck$vy03d^VilVe_NS31V8^jX)7l~myoh~mg@6@SN466x zxS|=s#mA1}SS5x@3y4WcN#A_)joEA_tM3fM)YjG>J9g~o(W5q-&1SQaeis1L*Vkud zWjUQr^1?tMKo%d#@n8(Ykf~&h&DAg}F-&Ybj@a#XXJlloS+i#L?AbI;hmX#~4}#ph zdGixbJaPW~d979(3WdmI09i|sUL_rCtmtp1M%V$1Z6pbLz24z)eDcXBKmYm9fB4~t zE6#Qdg+eD!o_z4Z2TMy!olYmoiSz{WCgH~yEB!mE6t*g{jqL8^$l_oyxNFz0*I$4A zz<~ofIXO0)jiM-WlKowG-Sxy1PmuA6)NLcnjwB}Pj$u?{o78TQsE~n&APD4S z6`H1Va&mHWbIH80bU>uEHV**O!NsJ{hG(r@3q~d8NxS|P#|XE3GVm3L592}j^5Mme z;sNPINdX83gV2_W4qhVV1VbVRMkVG+yLkA~C>O;AJSf1fvos!rK-SlB-WakrH*qr6({aa^SE&u8_ax6$jN{-KyXv^SS|} z5{JSAbFHxohNP=7DsfBt%U;o{T=4+Ogi%3A7CZ(FAz3gg2+4v`K}Z&i3PQ4AR1lH{ dqk@nu{~y56M~;@ViB#NiigG4>J||0l1EEMG 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 literal 0 HcmV?d00001 diff --git a/CNAME b/CNAME new file mode 100644 index 00000000..5bbc7f8d --- /dev/null +++ b/CNAME @@ -0,0 +1 @@ +didcomm.org \ No newline at end of file diff --git a/action-menu/1.0/index.html b/action-menu/1.0/index.html new file mode 100644 index 00000000..99c35fc2 --- /dev/null +++ b/action-menu/1.0/index.html @@ -0,0 +1,19 @@ +Action Menu | DIDComm

DIDComm

Action Menu 1.0

Summary

A protocol that allows one Agent to present a set of heirarchical menus and actions to another user-facing Agent in a human friendly way.

Details

+

This protocol is defined here: https://github.com/hyperledger/aries-rfcs/blob/main/features/0509-action-menu/README.md

+

Note: as pointed in the abovementioned link, the version of this protocol is 1.0 and was defined initially in Hyperledger Aries using DIDComm v1 headers/decorators. Readers should be aware that there’s a new 2.0 version of this protocol that complies with DIDComm v2 headers. Version 2.0 can be found here

PIURI
https://didcomm.org/action-menu/1.0
Status
Production
Hashtags
Authors
Version
1.0
License
MIT
Last modified
2024 Jun 24, 19:06 PM
\ No newline at end of file diff --git a/action-menu/2.0/index.html b/action-menu/2.0/index.html new file mode 100644 index 00000000..cb89f759 --- /dev/null +++ b/action-menu/2.0/index.html @@ -0,0 +1,215 @@ +Action Menu | DIDComm
DIDComm

Action Menu 2.0

Summary

A protocol that allows one Agent to present a set of heirarchical menus and actions to another user-facing Agent in a human friendly way.

Summary

+

The action-menu protocol allows one Agent to present a set of heirarchical menus and actions to another user-facing Agent in a human friendly way. The protocol allows limited service discovery as well as simple data entry. While less flexible than HTML forms or a chat bot, it should be relatively easy to implement and provides a user interface which can be adapted for various platforms, including mobile agents.

+

Motivation

+

Discovery of a peer Agent's capabilities or service offerings is currently reliant on knowledge obtained out-of-band. There is no in-band DIDComm supported protocol for querying a peer to obtain a human freindly menu of their capabilities or service offerings. Whilst this protocol doesn't offer ledger wide discovery capabilities, it will allow one User Agent connected to another, to present a navigable menu and request offered services. The protocol also provides an interface definition language to define action menu display, selection and request submission.

+

Roles

+

There are two roles in this protocol:

+
    +
  • requester: The requester asks the responder for menu definitions, presents them to a user, and initiates subsequent action items from the menu through further requests to the responder.
  • +
  • responder: The responder presents an initial menu definition containing actionable elements to a requester and then responds to subsequent action requests from the menu.
  • +
+

Basic Walkthrough

+

The action-menu protocol requires an active DIDComm connection before it can proceed. One Agent behaves as a requester in the protocol whilst the other Agent represents a responder. Conceptually the responder presents a list of actions which can be initiated by the requester. Actions are contained within a menu structure. Individual Actions may result in traversal to another menu or initiation of other protocols such as a presentation request, an introduction proposal, a credential offer, an acknowledgement, or a problem report.

+

The protocol can be initiated by either the requester asking for the root menu or the responder sending an unsolicited root menu. The protocol ends when the requester issues a perform operation or an internal timeout on the responder causes it to discard menu context. At any time a requester can reset the protocol by requesting the root menu from a responder.

+

Whilst the protocol is defined here as uni-directional (i.e requester to responder), both Agents may support both requester and responder roles simultaneously. Such cases would result in two instances of the action-menu protocol operating in parrallel.

+

States

+

state machines

+

States for Requester

+ + + + + + + + + + + + + + + + + + + + + + + + + +
State        Description
nullNo menu has been requested or received
awaiting-root-menumenu-request message has been sent and awaiting root menu response
preparing-selectionmenu message has been received and a user selection is pending
doneperform message has been sent and protocol has finished. Perform actions can include requesting a new menu which will re-enter the state machine with the receive-menu event from the null state.
+

States for Responder

+ + + + + + + + + + + + + + + + + + + + + + + + + +
State        Description
nullNo menu has been requested or sent
preparing-root-menumenu-request message has been received and preparing menu response for root menu
awaiting-selectionmenu message has been sent and are awaiting a perform request
doneperform message has been received and protocol has finished. Perform actions can include requesting a new menu which will re-enter the state machine with the send-menu event from the null state.
+

Design By Contract

+

No protocol specific errors exist. Any errors related to headers or other core features are documented in the appropriate places.

+

Security

+

This protocol expects messages to be encrypted during transmission, and repudiable.

+

Composition

+ + + + + + + +
Supported Goal CodeNotes
+

Message Reference

+ +

A requester is expected to display only one active menu per connection when action menus are employed by the responder. A newly received menu is not expected to interrupt a user, but rather be made available for the user to inspect possible actions related to the responder.

+

Message Type URI: https://didcomm.org/action-menu/2.0/menu

+
{
+  "type": "https://didcomm.org/action-menu/2.0/menu",
+  "id": "5678876542344",
+  "body": {
+    "title": "Welcome to IIWBook",
+    "description": "IIWBook facilitates connections between attendees by verifying attendance and distributing connection invitations.",
+    "errormsg": "No IIWBook names were found.",
+    "options": [
+        {
+        "name": "obtain-email-cred",
+        "title": "Obtain a verified email credential",
+        "description": "Connect with the BC email verification service to obtain a verified email credential"
+        },
+        {
+        "name": "verify-email-cred",
+        "title": "Verify your participation",
+        "description": "Present a verified email credential to identify yourself"
+        },
+        {
+        "name": "search-introductions",
+        "title": "Search introductions",
+        "description": "Your email address must be verified to perform a search",
+        "disabled": true
+        }
+    ]
+  }
+}
+
+

where:

+
    +
  • title: plain text string, should be displayed at the top of the menu
  • +
+

description -- plain text string, should be shown in smaller text below the title bar

+
    +
  • errormsg: optional plain text string sent to indicate that the last perform request did not work as expected. The text should be presented to the user in the title section
  • +
  • options: one or more available actions which the responder supports and may be requested in a perform message.
  • +
  • disabled: optional indication that an option is unavailable due to certain requirements not yet being met
  • +
+

Quick forms

+

Menu options may define a form property, which would direct the requester user to a client-generated form when the menu option is selected. The menu title should be shown at the top of the form, followed by the form description text if defined, followed by the list of form params in sequence. The form should also include a Cancel button to return to the menu, a Submit button (with an optional custom label defined by submit-label), and optionally a Clear button to reset the parameters to their default values.

+
{
+  "type": "https://didcomm.org/action-menu/2.0/menu",
+  "id": "5678876542347",
+  "thid": "5678876542344",
+  "title": "Attendance Verified",
+  "body": {
+    "description": "",
+    "options": [
+        {
+        "name": "submit-invitation",
+        "title": "Submit an invitation",
+        "description": "Send an invitation for IIWBook to share with another participant"
+        },
+        {
+        "name": "search-introductions",
+        "title": "Search introductions",
+        "form": {
+            "description": "Enter a participant name below to perform a search.",
+            "params": [
+            {
+                "name": "query",
+                "title": "Participant name",
+                "default": "",
+                "description": "",
+                "required": true,
+                "type": "text"
+            }
+            ],
+            "submit-label": "Search"
+        }
+        }
+    ]
+  }
+}
+
+

When the form is submitted, a perform message is generated containing values entered in the form. The form block may have an empty or missing params property in which case it acts as a simple confirmation dialog.

+

Each entry in the params list must define a name and title. The description is optional (should be displayed as help text below the field) and the type defaults to ‘text’ if not provided (only the ‘text’ type is supported at this time). Parameters should default to required true, if not specified. Parameters may also define a default value (used when rendering or clearing the form).

+ +

In addition to menus being pushed by the responder, the root menu can be re-requested at any time by the requester sending a menu-request.

+

Message Type URI: https://didcomm.org/action-menu/2.0/menu-request

+
{
+  "type": "https://didcomm.org/action-menu/2.0/menu-request",
+  "id": "5678876542347",
+}
+
+

Perform

+

When the requester user actions a menu option, a perform message is generated. It should be attached to the same thread as the menu. The active menu should close when an option is selected.

+

The response to a perform message can be any type of agent message, including another menu message, a presentation request, an introduction proposal, a credential offer, an acknowledgement, or a problem report. Whatever the message type, it should normally reference the same message thread as the perform message.

+

Message Type URI: https://didcomm.org/action-menu/2.0/perform

+
{
+  "type": "https://didcomm.org/action-menu/2.0/perform",
+  "id": "5678876542346",
+  "thid": "5678876542344"
+  "body":{
+    "name": "obtain-email-cred",
+    "params": {}
+  }
+}
+
+

where:

+
    +
  • name: the menu option being requested. This is taken from the name attribute of the options array elements in the menu
  • +
  • params: optional dictionary containing any input parameters requested in a menu option form section. The dictionary key values are taken from the name attributes of params array elements in the menu option form.
  • +
+

L10n

+

Localization may be implemented by means of L10n extension

+

Implementations

+

Endnotes

+

Future Considerations

+
    +
  • There needs to be some consideration around how the protocol may terminate due to responder side timeouts since maintaining menu context for connections consumes resources. Adoption of Report Problem Protocol 2.0 is a viable solution
  • +
PIURI
https://didcomm.org/action-menu/2.0
Status
Production
Hashtags
Authors
Version
2.0
License
MIT
Last modified
2024 Jun 24, 19:06 PM
\ No newline at end of file diff --git a/app-1359be652999c4132455.js b/app-1359be652999c4132455.js new file mode 100644 index 00000000..e171565d --- /dev/null +++ b/app-1359be652999c4132455.js @@ -0,0 +1,2 @@ +(self.webpackChunkdidcomm_website=self.webpackChunkdidcomm_website||[]).push([[143],{1506:function(t){t.exports=function(t){if(void 0===t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return t},t.exports.__esModule=!0,t.exports.default=t.exports},7154:function(t){function e(){return t.exports=e=Object.assign||function(t){for(var e=1;e=0||(o[n]=t[n]);return o},t.exports.__esModule=!0,t.exports.default=t.exports},9489:function(t){function e(n,r){return t.exports=e=Object.setPrototypeOf||function(t,e){return t.__proto__=e,t},t.exports.__esModule=!0,t.exports.default=t.exports,e(n,r)}t.exports=e,t.exports.__esModule=!0,t.exports.default=t.exports},2393:function(t,e){"use strict";var n=Object.assign||function(t){for(var e=1;e1&&void 0!==arguments[1]?arguments[1]:{},u=c.state,l=c.replace,p=void 0!==l&&l;if("number"==typeof e)t.history.go(e);else{u=n({},u,{key:Date.now()+""});try{i||p?t.history.replaceState(u,null,e):t.history.pushState(u,null,e)}catch(h){t.location[p?"replace":"assign"](e)}}a=r(t),i=!0;var f=new Promise((function(t){return s=t}));return o.forEach((function(t){return t({location:a,action:"PUSH"})})),f}}},a=function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"/",e=t.indexOf("?"),n={pathname:e>-1?t.substr(0,e):t,search:e>-1?t.substr(e):""},r=0,o=[n],a=[null];return{get location(){return o[r]},addEventListener:function(t,e){},removeEventListener:function(t,e){},history:{get entries(){return o},get index(){return r},get state(){return a[r]},pushState:function(t,e,n){var i=n.split("?"),s=i[0],c=i[1],u=void 0===c?"":c;r++,o.push({pathname:s,search:u.length?"?"+u:u}),a.push(t)},replaceState:function(t,e,n){var i=n.split("?"),s=i[0],c=i[1],u=void 0===c?"":c;o[r]={pathname:s,search:u},a[r]=t},go:function(t){var e=r+t;e<0||e>a.length-1||(r=e)}}}},i=!("undefined"==typeof window||!window.document||!window.document.createElement),s=o(i?window:a()),c=s.navigate;e.V5=s},2098:function(t,e,n){"use strict";e.__esModule=!0,e.shallowCompare=e.validateRedirect=e.insertParams=e.resolve=e.match=e.pick=e.startsWith=void 0;var r,o=n(1143),a=(r=o)&&r.__esModule?r:{default:r};var i=function(t,e){return t.substr(0,e.length)===e},s=function(t,e){for(var n=void 0,r=void 0,o=e.split("?")[0],i=h(o),s=""===i[0],u=f(t),p=0,d=u.length;pe.score?-1:t.index-e.index}))},h=function(t){return t.replace(/(^\/+|\/+$)/g,"").split("/")},d=function(t){for(var e=arguments.length,n=Array(e>1?e-1:0),r=1;r0})))&&n.length>0?"?"+n.join("&"):"")},m=["uri","path"];e.startsWith=i,e.pick=s,e.match=function(t,e){return s([{path:t}],e)},e.resolve=function(t,e){if(i(t,"/"))return t;var n=t.split("?"),r=n[0],o=n[1],a=e.split("?")[0],s=h(r),c=h(a);if(""===s[0])return d(a,o);if(!i(s[0],".")){var u=c.concat(s).join("/");return d(("/"===a?"":"/")+u,o)}for(var l=c.concat(s),p=[],f=0,m=l.length;fNumber(t)-Number(e))).map((e=>t[e])):t}function p(t){const e=t.indexOf("#");return-1!==e&&(t=t.slice(0,e)),t}function f(t){const e=(t=p(t)).indexOf("?");return-1===e?"":t.slice(e+1)}function h(t,e){return e.parseNumbers&&!Number.isNaN(Number(t))&&"string"==typeof t&&""!==t.trim()?t=Number(t):!e.parseBooleans||null===t||"true"!==t.toLowerCase()&&"false"!==t.toLowerCase()||(t="true"===t.toLowerCase()),t}function d(t,e){s((e=Object.assign({decode:!0,sort:!0,arrayFormat:"none",arrayFormatSeparator:",",parseNumbers:!1,parseBooleans:!1},e)).arrayFormatSeparator);const n=function(t){let e;switch(t.arrayFormat){case"index":return(t,n,r)=>{e=/\[(\d*)\]$/.exec(t),t=t.replace(/\[\d*\]$/,""),e?(void 0===r[t]&&(r[t]={}),r[t][e[1]]=n):r[t]=n};case"bracket":return(t,n,r)=>{e=/(\[\])$/.exec(t),t=t.replace(/\[\]$/,""),e?void 0!==r[t]?r[t]=[].concat(r[t],n):r[t]=[n]:r[t]=n};case"comma":case"separator":return(e,n,r)=>{const o="string"==typeof n&&n.includes(t.arrayFormatSeparator),a="string"==typeof n&&!o&&u(n,t).includes(t.arrayFormatSeparator);n=a?u(n,t):n;const i=o||a?n.split(t.arrayFormatSeparator).map((e=>u(e,t))):null===n?n:u(n,t);r[e]=i};default:return(t,e,n)=>{void 0!==n[t]?n[t]=[].concat(n[t],e):n[t]=e}}}(e),r=Object.create(null);if("string"!=typeof t)return r;if(!(t=t.trim().replace(/^[?#&]/,"")))return r;for(const o of t.split("&")){if(""===o)continue;let[t,i]=a(e.decode?o.replace(/\+/g," "):o,"=");i=void 0===i?null:["comma","separator"].includes(e.arrayFormat)?i:u(i,e),n(u(t,e),i,r)}for(const o of Object.keys(r)){const t=r[o];if("object"==typeof t&&null!==t)for(const n of Object.keys(t))t[n]=h(t[n],e);else r[o]=h(t,e)}return!1===e.sort?r:(!0===e.sort?Object.keys(r).sort():Object.keys(r).sort(e.sort)).reduce(((t,e)=>{const n=r[e];return Boolean(n)&&"object"==typeof n&&!Array.isArray(n)?t[e]=l(n):t[e]=n,t}),Object.create(null))}e.extract=f,e.parse=d,e.stringify=(t,e)=>{if(!t)return"";s((e=Object.assign({encode:!0,strict:!0,arrayFormat:"none",arrayFormatSeparator:","},e)).arrayFormatSeparator);const n=n=>e.skipNull&&null==t[n]||e.skipEmptyString&&""===t[n],r=function(t){switch(t.arrayFormat){case"index":return e=>(n,r)=>{const o=n.length;return void 0===r||t.skipNull&&null===r||t.skipEmptyString&&""===r?n:null===r?[...n,[c(e,t),"[",o,"]"].join("")]:[...n,[c(e,t),"[",c(o,t),"]=",c(r,t)].join("")]};case"bracket":return e=>(n,r)=>void 0===r||t.skipNull&&null===r||t.skipEmptyString&&""===r?n:null===r?[...n,[c(e,t),"[]"].join("")]:[...n,[c(e,t),"[]=",c(r,t)].join("")];case"comma":case"separator":return e=>(n,r)=>null==r||0===r.length?n:0===n.length?[[c(e,t),"=",c(r,t)].join("")]:[[n,c(r,t)].join(t.arrayFormatSeparator)];default:return e=>(n,r)=>void 0===r||t.skipNull&&null===r||t.skipEmptyString&&""===r?n:null===r?[...n,c(e,t)]:[...n,[c(e,t),"=",c(r,t)].join("")]}}(e),o={};for(const i of Object.keys(t))n(i)||(o[i]=t[i]);const a=Object.keys(o);return!1!==e.sort&&a.sort(e.sort),a.map((n=>{const o=t[n];return void 0===o?"":null===o?c(n,e):Array.isArray(o)?o.reduce(r(n),[]).join("&"):c(n,e)+"="+c(o,e)})).filter((t=>t.length>0)).join("&")},e.parseUrl=(t,e)=>{e=Object.assign({decode:!0},e);const[n,r]=a(t,"#");return Object.assign({url:n.split("?")[0]||"",query:d(f(t),e)},e&&e.parseFragmentIdentifier&&r?{fragmentIdentifier:u(r,e)}:{})},e.stringifyUrl=(t,n)=>{n=Object.assign({encode:!0,strict:!0},n);const r=p(t.url).split("?")[0]||"",o=e.extract(t.url),a=e.parse(o,{sort:!1}),i=Object.assign(a,t.query);let s=e.stringify(i,n);s&&(s="?".concat(s));let u=function(t){let e="";const n=t.indexOf("#");return-1!==n&&(e=t.slice(n)),e}(t.url);return t.fragmentIdentifier&&(u="#".concat(c(t.fragmentIdentifier,n))),"".concat(r).concat(s).concat(u)},e.pick=(t,n,r)=>{r=Object.assign({parseFragmentIdentifier:!0},r);const{url:o,query:a,fragmentIdentifier:s}=e.parseUrl(t,r);return e.stringifyUrl({url:o,query:i(a,n),fragmentIdentifier:s},r)},e.exclude=(t,n,r)=>{const o=Array.isArray(n)?t=>!n.includes(t):(t,e)=>!n(t,e);return e.pick(t,o,r)}},4734:function(t){"use strict";t.exports=(t,e)=>{if("string"!=typeof t||"string"!=typeof e)throw new TypeError("Expected the arguments to be of type `string`");if(""===e)return[t];const n=t.indexOf(e);return-1===n?[t]:[t.slice(0,n),t.slice(n+e.length)]}},8936:function(t){"use strict";t.exports=t=>encodeURIComponent(t).replace(/[!'()*]/g,(t=>"%".concat(t.charCodeAt(0).toString(16).toUpperCase())))},6633:function(t,e,n){"use strict";n.d(e,{V3:function(){return p},yz:function(){return l},Fz:function(){return W},Zp:function(){return u},Wd:function(){return D},Kx:function(){return F},Wc:function(){return o}});var r=function(){return(r=Object.assign||function(t){for(var e,n=1,r=arguments.length;n0)&&(r.unobserve(e),r.disconnect(),n())}))}))).observe(e),{instance:r,el:e}))},n.render=function(){var t=this,e=this.props,n=e.to,r=e.getProps,a=void 0===r?this.defaultGetProps:r,i=e.onClick,c=e.onMouseEnter,p=(e.activeClassName,e.activeStyle,e.innerRef,e.partiallyActive,e.state),d=e.replace,m=e._location,v=(0,o.default)(e,h);var g=w(n,m.pathname);return y(g)?u.default.createElement(l.Link,(0,s.default)({to:g,state:p,getProps:a,innerRef:this.handleRef,onMouseEnter:function(t){c&&c(t),___loader.hovering((0,f.parsePath)(g).pathname)},onClick:function(e){if(i&&i(e),!(0!==e.button||t.props.target||e.defaultPrevented||e.metaKey||e.altKey||e.ctrlKey||e.shiftKey)){e.preventDefault();var n=d,r=encodeURI(g)===m.pathname;"boolean"!=typeof d&&r&&(n=!0),window.___navigate(g,{state:p,replace:n})}return!0}},v)):u.default.createElement("a",(0,s.default)({href:g},v))},e}(u.default.Component);E.propTypes=(0,s.default)({},b,{onClick:c.default.func,to:c.default.string.isRequired,replace:c.default.bool,state:c.default.object});var R=u.default.forwardRef((function(t,e){return u.default.createElement(P,(0,s.default)({innerRef:e},t))}));e.ZP=R;e.c4=function(t,e){window.___navigate(w(t,window.location.pathname),e)}},1752:function(t,e){"use strict";e.__esModule=!0,e.parsePath=function(t){var e=t||"/",n="",r="",o=e.indexOf("#");-1!==o&&(r=e.substr(o),e=e.substr(0,o));var a=e.indexOf("?");-1!==a&&(n=e.substr(a),e=e.substr(0,a));return{pathname:e,search:"?"===n?"":n,hash:"#"===r?"":r}}},9679:function(t,e,n){"use strict";e.p2=e.$C=void 0;var r=n(1432);e.$C=r.ScrollHandler;var o=n(4855);e.p2=o.useScrollRestoration},1432:function(t,e,n){"use strict";var r=n(5318);e.__esModule=!0,e.ScrollHandler=e.ScrollContext=void 0;var o=r(n(1506)),a=r(n(5354)),i=function(t,e){if(!e&&t&&t.__esModule)return t;if(null===t||"object"!=typeof t&&"function"!=typeof t)return{default:t};var n=u(e);if(n&&n.has(t))return n.get(t);var r={},o=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var a in t)if("default"!==a&&Object.prototype.hasOwnProperty.call(t,a)){var i=o?Object.getOwnPropertyDescriptor(t,a):null;i&&(i.get||i.set)?Object.defineProperty(r,a,i):r[a]=t[a]}r.default=t,n&&n.set(t,r);return r}(n(7294)),s=r(n(5697)),c=n(1142);function u(t){if("function"!=typeof WeakMap)return null;var e=new WeakMap,n=new WeakMap;return(u=function(t){return t?n:e})(t)}var l=i.createContext(new c.SessionStorage);e.ScrollContext=l,l.displayName="GatsbyScrollContext";var p=function(t){function e(){for(var e,n=arguments.length,r=new Array(n),a=0;aPromise.all([n.e(532),n.e(351),n.e(218)]).then(n.bind(n,2847)),"component---src-pages-index-tsx":()=>Promise.all([n.e(532),n.e(351),n.e(691)]).then(n.bind(n,6126)),"component---src-templates-book-book-tsx":()=>Promise.all([n.e(532),n.e(351),n.e(536)]).then(n.bind(n,8579)),"component---src-templates-protocol-protocol-tsx":()=>Promise.all([n.e(532),n.e(351),n.e(255)]).then(n.bind(n,2559)),"component---src-templates-search-search-tsx":()=>Promise.all([n.e(532),n.e(351),n.e(504)]).then(n.bind(n,9170))}},5182:function(t,e,n){t.exports=[{plugin:n(7504),options:{plugins:[],icon:!1,maintainCase:!0,offsetY:0,className:"anchor"}},{plugin:n(7047),options:{plugins:[]}},{plugin:n(992),options:{plugins:[],name:"DIDComm",short_name:"DIDComm",start_url:"/",background_color:"#FFF",theme_color:"#FFF",display:"minimal-ui",icon:"src/images/didcomm-logo.svg",legacy:!0,theme_color_in_head:!0,cache_busting_mode:"query",crossOrigin:"anonymous",include_favicon:!0,cacheDigest:"b85920628d9d315a1905d4e53f7a73b6"}},{plugin:n(9037),options:{plugins:[]}}]},7343:function(t,e,n){const r=n(5182),{getResourceURLsForPathname:o,loadPage:a,loadPageSync:i}=n(8741).jN;e.h=function(t,e,n,s){void 0===e&&(e={});let c=r.map((n=>{if(!n.plugin[t])return;e.getResourceURLsForPathname=o,e.loadPage=a,e.loadPageSync=i;const r=n.plugin[t](e,n.options);return r&&s&&(e=s({args:e,result:r,plugin:n})),r}));return c=c.filter((t=>void 0!==t)),c.length>0?c:n?[n]:[]},e.I=(t,e,n)=>r.reduce(((n,r)=>r.plugin[t]?n.then((()=>r.plugin[t](e,r.options))):n),Promise.resolve())},8110:function(t,e,n){"use strict";n.d(e,{Z:function(){return r}});var r=function(t){return t=t||Object.create(null),{on:function(e,n){(t[e]||(t[e]=[])).push(n)},off:function(e,n){t[e]&&t[e].splice(t[e].indexOf(n)>>>0,1)},emit:function(e,n){(t[e]||[]).slice().map((function(t){t(n)})),(t["*"]||[]).slice().map((function(t){t(e,n)}))}}}()},2257:function(t,e,n){"use strict";n.d(e,{UD:function(){return f},Cj:function(){return d},GA:function(){return h},DS:function(){return p}});var r=n(2098),o=n(1578),a=t=>void 0===t?t:"/"===t?"/":"/"===t.charAt(t.length-1)?t.slice(0,-1):t,i=n(67);const s=new Map;let c=[];const u=t=>{const e=decodeURIComponent(t);return(0,o.Z)(e,decodeURIComponent("")).split("#")[0].split("?")[0]};function l(t){return t.startsWith("/")||t.startsWith("https://")||t.startsWith("http://")?t:new URL(t,window.location.href+(window.location.href.endsWith("/")?"":"/")).pathname}const p=t=>{c=t},f=t=>{const e=m(t),n=c.map((t=>{let{path:e,matchPath:n}=t;return{path:n,originalPath:e}})),o=(0,r.pick)(n,e);return o?a(o.route.originalPath):null},h=t=>{const e=m(t),n=c.map((t=>{let{path:e,matchPath:n}=t;return{path:n,originalPath:e}})),o=(0,r.pick)(n,e);return o?o.params:{}},d=t=>{const e=u(l(t));if(s.has(e))return s.get(e);const n=(0,i.J)(t);if(n)return d(n.toPath);let r=f(e);return r||(r=m(t)),s.set(e,r),r},m=t=>{let e=u(l(t));return"/index.html"===e&&(e="/"),e=a(e),e}},5444:function(t,e,n){"use strict";n.r(e),n.d(e,{Link:function(){return o.ZP},withAssetPrefix:function(){return o.mc},withPrefix:function(){return o.dq},graphql:function(){return h},parsePath:function(){return o.cP},navigate:function(){return o.c4},useScrollRestoration:function(){return a.p2},StaticQueryContext:function(){return u},StaticQuery:function(){return p},PageRenderer:function(){return s.a},useStaticQuery:function(){return f},prefetchPathname:function(){return c}});var r=n(7294),o=n(8037),a=n(9679),i=n(861),s=n.n(i);const c=n(8741).ZP.enqueue,u=r.createContext({});function l(t){let{staticQueryData:e,data:n,query:o,render:a}=t;const i=n?n.data:e[o]&&e[o].data;return r.createElement(r.Fragment,null,i&&a(i),!i&&r.createElement("div",null,"Loading (StaticQuery)"))}const p=t=>{const{data:e,query:n,render:o,children:a}=t;return r.createElement(u.Consumer,null,(t=>r.createElement(l,{data:e,query:n,render:o||a,staticQueryData:t})))},f=t=>{var e;r.useContext;const n=r.useContext(u);if(isNaN(Number(t)))throw new Error("useStaticQuery was called with a string but expects to be called using `graphql`. Try this:\n\nimport { useStaticQuery, graphql } from 'gatsby';\n\nuseStaticQuery(graphql`"+t+"`);\n");if(null!==(e=n[t])&&void 0!==e&&e.data)return n[t].data;throw new Error("The result of this StaticQuery could not be fetched.\n\nThis is likely a bug in Gatsby and if refreshing the page does not fix it, please open an issue in https://github.com/gatsbyjs/gatsby/issues")};function h(){throw new Error("It appears like Gatsby is misconfigured. Gatsby related `graphql` calls are supposed to only be evaluated at compile time, and then compiled away. Unfortunately, something went wrong and the query was left in the compiled code.\n\nUnless your site has a complex or custom babel/Gatsby configuration this is likely a bug in Gatsby.")}},8741:function(t,e,n){"use strict";n.d(e,{uQ:function(){return l},kL:function(){return y},ZP:function(){return P},hs:function(){return E},jN:function(){return b},N1:function(){return w}});var r=n(9652),o=n(7546);const a=function(t){if("undefined"==typeof document)return!1;const e=document.createElement("link");try{if(e.relList&&"function"==typeof e.relList.supports)return e.relList.supports(t)}catch(n){return!1}return!1}("prefetch")?function(t,e){return new Promise(((n,r)=>{if("undefined"==typeof document)return void r();const o=document.createElement("link");o.setAttribute("rel","prefetch"),o.setAttribute("href",t),Object.keys(e).forEach((t=>{o.setAttribute(t,e[t])})),o.onload=n,o.onerror=r;(document.getElementsByTagName("head")[0]||document.getElementsByName("script")[0].parentNode).appendChild(o)}))}:function(t){return new Promise(((e,n)=>{const r=new XMLHttpRequest;r.open("GET",t,!0),r.onload=()=>{200===r.status?e():n()},r.send(null)}))},i={};var s=function(t,e){return new Promise((n=>{i[t]?n():a(t,e).then((()=>{n(),i[t]=!0})).catch((()=>{}))}))},c=n(8110),u=n(2257);const l={Error:"error",Success:"success"},p=t=>t&&t.default||t,f=t=>{var e;return"/page-data/"+("/"===t?"index":(e="/"===(e=t)[0]?e.slice(1):e).endsWith("/")?e.slice(0,-1):e)+"/page-data.json"};function h(t,e){return void 0===e&&(e="GET"),new Promise(((n,r)=>{const o=new XMLHttpRequest;o.open(e,t,!0),o.onreadystatechange=()=>{4==o.readyState&&n(o)},o.send(null)}))}const d=function(t,e){void 0===e&&(e=null);const n={componentChunkName:t.componentChunkName,path:t.path,webpackCompilationHash:t.webpackCompilationHash,matchPath:t.matchPath,staticQueryHashes:t.staticQueryHashes};return{component:e,json:t.result,page:n}};let m=function(){function t(t,e){this.inFlightNetworkRequests=new Map,this.pageDb=new Map,this.inFlightDb=new Map,this.staticQueryDb={},this.pageDataDb=new Map,this.prefetchTriggered=new Set,this.prefetchCompleted=new Set,this.loadComponent=t,(0,u.DS)(e)}var e=t.prototype;return e.memoizedGet=function(t){let e=this.inFlightNetworkRequests.get(t);return e||(e=h(t,"GET"),this.inFlightNetworkRequests.set(t,e)),e.then((e=>(this.inFlightNetworkRequests.delete(t),e))).catch((e=>{throw this.inFlightNetworkRequests.delete(t),e}))},e.setApiRunner=function(t){this.apiRunner=t,this.prefetchDisabled=t("disableCorePrefetching").some((t=>t))},e.fetchPageDataJson=function(t){const{pagePath:e,retries:n=0}=t,r=f(e);return this.memoizedGet(r).then((r=>{const{status:o,responseText:a}=r;if(200===o)try{const e=JSON.parse(a);if(void 0===e.path)throw new Error("not a valid pageData response");return Object.assign(t,{status:l.Success,payload:e})}catch(i){}return 404===o||200===o?"/404.html"===e?Object.assign(t,{status:l.Error}):this.fetchPageDataJson(Object.assign(t,{pagePath:"/404.html",notFound:!0})):500===o?Object.assign(t,{status:l.Error}):n<3?this.fetchPageDataJson(Object.assign(t,{retries:n+1})):Object.assign(t,{status:l.Error})}))},e.loadPageDataJson=function(t){const e=(0,u.Cj)(t);if(this.pageDataDb.has(e)){const t=this.pageDataDb.get(e);return Promise.resolve(t)}return this.fetchPageDataJson({pagePath:e}).then((t=>(this.pageDataDb.set(e,t),t)))},e.findMatchPath=function(t){return(0,u.UD)(t)},e.loadPage=function(t){const e=(0,u.Cj)(t);if(this.pageDb.has(e)){const t=this.pageDb.get(e);return t.error?{error:t.error,status:t.status}:Promise.resolve(t.payload)}if(this.inFlightDb.has(e))return this.inFlightDb.get(e);const n=Promise.all([this.loadAppData(),this.loadPageDataJson(e)]).then((t=>{const n=t[1];if(n.status===l.Error)return{status:l.Error};let r=n.payload;const{componentChunkName:o,staticQueryHashes:a=[]}=r,i={},s=this.loadComponent(o).then((e=>{let o;return i.createdAt=new Date,!e||e instanceof Error?(i.status=l.Error,i.error=e):(i.status=l.Success,!0===n.notFound&&(i.notFound=!0),r=Object.assign(r,{webpackCompilationHash:t[0]?t[0].webpackCompilationHash:""}),o=d(r,e)),o})),u=Promise.all(a.map((t=>{if(this.staticQueryDb[t]){const e=this.staticQueryDb[t];return{staticQueryHash:t,jsonPayload:e}}return this.memoizedGet("/page-data/sq/d/"+t+".json").then((e=>{const n=JSON.parse(e.responseText);return{staticQueryHash:t,jsonPayload:n}})).catch((()=>{throw new Error("We couldn't load \"/page-data/sq/d/"+t+'.json"')}))}))).then((t=>{const e={};return t.forEach((t=>{let{staticQueryHash:n,jsonPayload:r}=t;e[n]=r,this.staticQueryDb[n]=r})),e}));return Promise.all([s,u]).then((t=>{let n,[r,o]=t;return r&&(n={...r,staticQueryResults:o},i.payload=n,c.Z.emit("onPostLoadPageResources",{page:n,pageResources:n})),this.pageDb.set(e,i),i.error?{error:i.error,status:i.status}:n})).catch((t=>({error:t,status:l.Error})))}));return n.then((()=>{this.inFlightDb.delete(e)})).catch((t=>{throw this.inFlightDb.delete(e),t})),this.inFlightDb.set(e,n),n},e.loadPageSync=function(t,e){void 0===e&&(e={});const n=(0,u.Cj)(t);if(this.pageDb.has(n)){var r;const t=this.pageDb.get(n);if(t.payload)return t.payload;if(null!==(r=e)&&void 0!==r&&r.withErrorDetails)return{error:t.error,status:t.status}}},e.shouldPrefetch=function(t){return!!(()=>{if("connection"in navigator&&void 0!==navigator.connection){if((navigator.connection.effectiveType||"").includes("2g"))return!1;if(navigator.connection.saveData)return!1}return!0})()&&!this.pageDb.has(t)},e.prefetch=function(t){if(!this.shouldPrefetch(t))return!1;if(this.prefetchTriggered.has(t)||(this.apiRunner("onPrefetchPathname",{pathname:t}),this.prefetchTriggered.add(t)),this.prefetchDisabled)return!1;const e=(0,u.Cj)(t);return this.doPrefetch(e).then((()=>{this.prefetchCompleted.has(t)||(this.apiRunner("onPostPrefetchPathname",{pathname:t}),this.prefetchCompleted.add(t))})),!0},e.doPrefetch=function(t){const e=f(t);return s(e,{crossOrigin:"anonymous",as:"fetch"}).then((()=>this.loadPageDataJson(t)))},e.hovering=function(t){this.loadPage(t)},e.getResourceURLsForPathname=function(t){const e=(0,u.Cj)(t),n=this.pageDataDb.get(e);if(n){const t=d(n.payload);return[].concat((0,o.Z)(v(t.page.componentChunkName)),[f(e)])}return null},e.isPageNotFound=function(t){const e=(0,u.Cj)(t),n=this.pageDb.get(e);return!n||n.notFound},e.loadAppData=function(t){return void 0===t&&(t=0),this.memoizedGet("/page-data/app-data.json").then((e=>{const{status:n,responseText:r}=e;let o;if(200!==n&&t<3)return this.loadAppData(t+1);if(200===n)try{const t=JSON.parse(r);if(void 0===t.webpackCompilationHash)throw new Error("not a valid app-data response");o=t}catch(a){}return o}))},t}();const v=t=>(window.___chunkMapping[t]||[]).map((t=>""+t));let g,y=function(t){function e(e,n,r){var o;return o=t.call(this,(t=>{if(!e.components[t])throw new Error("We couldn't find the correct component chunk with the name "+t);return e.components[t]().then(p).catch((t=>t))}),n)||this,r&&o.pageDataDb.set(r.path,{pagePath:r.path,payload:r,status:"success"}),o}(0,r.Z)(e,t);var n=e.prototype;return n.doPrefetch=function(e){return t.prototype.doPrefetch.call(this,e).then((t=>{if(t.status!==l.Success)return Promise.resolve();const e=t.payload,n=e.componentChunkName,r=v(n);return Promise.all(r.map(s)).then((()=>e))}))},n.loadPageDataJson=function(e){return t.prototype.loadPageDataJson.call(this,e).then((t=>t.notFound?h(e,"HEAD").then((e=>200===e.status?{status:l.Error}:t)):t))},e}(m);const w=t=>{g=t},b={enqueue:t=>g.prefetch(t),getResourceURLsForPathname:t=>g.getResourceURLsForPathname(t),loadPage:t=>g.loadPage(t),loadPageSync:function(t,e){return void 0===e&&(e={}),g.loadPageSync(t,e)},prefetch:t=>g.prefetch(t),isPageNotFound:t=>g.isPageNotFound(t),hovering:t=>g.hovering(t),loadAppData:()=>g.loadAppData()};var P=b;function E(){return g?g.staticQueryDb:{}}},804:function(t,e,n){"use strict";var r=n(9652),o=n(7294),a=n(7343),i=n(2257);let s=function(t){function e(){return t.apply(this,arguments)||this}return(0,r.Z)(e,t),e.prototype.render=function(){const t={...this.props,params:{...(0,i.GA)(this.props.location.pathname),...this.props.pageResources.json.pageContext.__params}},e=(0,o.createElement)(this.props.pageResources.component,{...t,key:this.props.path||this.props.pageResources.page.path});return(0,a.h)("wrapPageElement",{element:e,props:t},e,(e=>{let{result:n}=e;return{element:n,props:t}})).pop()},e}(o.Component);e.Z=s},253:function(t,e,n){"use strict";var r=n(9652),o=n(7343),a=n(7294),i=n(3935),s=n(9499),c=n(9679),u=n(5444),l=n(8741),p=n(67),f=n(8110);const h={id:"gatsby-announcer",style:{position:"absolute",top:0,width:1,height:1,padding:0,overflow:"hidden",clip:"rect(0, 0, 0, 0)",whiteSpace:"nowrap",border:0},"aria-live":"assertive","aria-atomic":"true"};var d=n(2393),m=n(8037);function v(t){const e=(0,p.J)(t),{hash:n,search:r}=window.location;return null!=e&&(window.___replace(e.toPath+r+n),!0)}let g="";window.addEventListener("unhandledrejection",(t=>{/loading chunk \d* failed./i.test(t.reason)&&g&&(window.location.pathname=g)}));const y=(t,e)=>{v(t.pathname)||(g=t.pathname,(0,o.h)("onPreRouteUpdate",{location:t,prevLocation:e}))},w=(t,e)=>{v(t.pathname)||(0,o.h)("onRouteUpdate",{location:t,prevLocation:e})},b=function(t,e){if(void 0===e&&(e={}),"number"==typeof t)return void d.V5.navigate(t);const{pathname:n,search:r,hash:a}=(0,m.cP)(t),i=(0,p.J)(n);if(i&&(t=i.toPath+r+a),window.___swUpdated)return void(window.location=n+r+a);const c=setTimeout((()=>{f.Z.emit("onDelayedLoadPageResources",{pathname:n}),(0,o.h)("onRouteUpdateDelayed",{location:window.location})}),1e3);l.ZP.loadPage(n).then((o=>{if(!o||o.status===l.uQ.Error)return window.history.replaceState({},"",location.href),window.location=n,void clearTimeout(c);o&&o.page.webpackCompilationHash!==window.___webpackCompilationHash&&("serviceWorker"in navigator&&null!==navigator.serviceWorker.controller&&"activated"===navigator.serviceWorker.controller.state&&navigator.serviceWorker.controller.postMessage({gatsbyApi:"clearPathResources"}),window.location=n+r+a),(0,s.navigate)(t,e),clearTimeout(c)}))};function P(t,e){let{location:n}=e;const{pathname:r,hash:a}=n,i=(0,o.h)("shouldUpdateScroll",{prevRouterProps:t,pathname:r,routerProps:{location:n},getSavedScrollPosition:t=>[0,this._stateStorage.read(t,t.key)]});if(i.length>0)return i[i.length-1];if(t){const{location:{pathname:e}}=t;if(e===r)return a?decodeURI(a.slice(1)):[0,0]}return!0}let E=function(t){function e(e){var n;return(n=t.call(this,e)||this).announcementRef=a.createRef(),n}(0,r.Z)(e,t);var n=e.prototype;return n.componentDidUpdate=function(t,e){requestAnimationFrame((()=>{let t="new page at "+this.props.location.pathname;document.title&&(t=document.title);const e=document.querySelectorAll("#gatsby-focus-wrapper h1");e&&e.length&&(t=e[0].textContent);const n="Navigated to "+t;if(this.announcementRef.current){this.announcementRef.current.innerText!==n&&(this.announcementRef.current.innerText=n)}}))},n.render=function(){return a.createElement("div",Object.assign({},h,{ref:this.announcementRef}))},e}(a.Component);const R=(t,e)=>{var n,r;return t.href!==e.href||(null==t||null===(n=t.state)||void 0===n?void 0:n.key)!==(null==e||null===(r=e.state)||void 0===r?void 0:r.key)};let k=function(t){function e(e){var n;return n=t.call(this,e)||this,y(e.location,null),n}(0,r.Z)(e,t);var n=e.prototype;return n.componentDidMount=function(){w(this.props.location,null)},n.shouldComponentUpdate=function(t){return!!R(t.location,this.props.location)&&(y(this.props.location,t.location),!0)},n.componentDidUpdate=function(t){R(t.location,this.props.location)&&w(this.props.location,t.location)},n.render=function(){return a.createElement(a.Fragment,null,this.props.children,a.createElement(E,{location:location}))},e}(a.Component);var C=n(804),S=n(4999);function x(t,e){for(var n in t)if(!(n in e))return!0;for(var r in e)if(t[r]!==e[r])return!0;return!1}var _=function(t){function e(e){var n;n=t.call(this)||this;const{location:r,pageResources:o}=e;return n.state={location:{...r},pageResources:o||l.ZP.loadPageSync(r.pathname,{withErrorDetails:!0})},n}(0,r.Z)(e,t),e.getDerivedStateFromProps=function(t,e){let{location:n}=t;if(e.location.href!==n.href){return{pageResources:l.ZP.loadPageSync(n.pathname,{withErrorDetails:!0}),location:{...n}}}return{location:{...n}}};var n=e.prototype;return n.loadResources=function(t){l.ZP.loadPage(t).then((e=>{e&&e.status!==l.uQ.Error?this.setState({location:{...window.location},pageResources:e}):(window.history.replaceState({},"",location.href),window.location=t)}))},n.shouldComponentUpdate=function(t,e){return e.pageResources?this.state.pageResources!==e.pageResources||(this.state.pageResources.component!==e.pageResources.component||(this.state.pageResources.json!==e.pageResources.json||(!(this.state.location.key===e.location.key||!e.pageResources.page||!e.pageResources.page.matchPath&&!e.pageResources.page.path)||function(t,e,n){return x(t.props,e)||x(t.state,n)}(this,t,e)))):(this.loadResources(t.location.pathname),!1)},n.render=function(){return this.props.children(this.state)},e}(a.Component),j=n(1578),O=JSON.parse('[{"path":"/action-menu/1.0/","matchPath":"action-menu/1.0/*"},{"path":"/action-menu/2.0/","matchPath":"action-menu/2.0/*"},{"path":"/basicmessage/1.0/","matchPath":"basicmessage/1.0/*"},{"path":"/basicmessage/2.0/","matchPath":"basicmessage/2.0/*"},{"path":"/coordinate-mediation/1.0/","matchPath":"coordinate-mediation/1.0/*"},{"path":"/coordinate-mediation/2.0/","matchPath":"coordinate-mediation/2.0/*"},{"path":"/coordinate-mediation/3.0/","matchPath":"coordinate-mediation/3.0/*"},{"path":"/data-agreement-context-decorator/1.0/","matchPath":"data-agreement-context-decorator/1.0/*"},{"path":"/data-agreement-negotiation/1.0/","matchPath":"data-agreement-negotiation/1.0/*"},{"path":"/data-agreement-proofs/1.0/","matchPath":"data-agreement-proofs/1.0/*"},{"path":"/data-agreement-termination/1.0/","matchPath":"data-agreement-termination/1.0/*"},{"path":"/data-disclosure-agreement/1.0/","matchPath":"data-disclosure-agreement/1.0/*"},{"path":"/didexchange/1.0/","matchPath":"didexchange/1.0/*"},{"path":"/didexchange/1.1/","matchPath":"didexchange/1.1/*"},{"path":"/discover-features/1.0/","matchPath":"discover-features/1.0/*"},{"path":"/discover-features/2.0/","matchPath":"discover-features/2.0/*"},{"path":"/issue-credential/1.1/","matchPath":"issue-credential/1.1/*"},{"path":"/issue-credential/2.0/","matchPath":"issue-credential/2.0/*"},{"path":"/issue-credential/3.0/","matchPath":"issue-credential/3.0/*"},{"path":"/media-sharing/1.0/","matchPath":"media-sharing/1.0/*"},{"path":"/messagepickup/1.0/","matchPath":"messagepickup/1.0/*"},{"path":"/messagepickup/2.0/","matchPath":"messagepickup/2.0/*"},{"path":"/messagepickup/3.0/","matchPath":"messagepickup/3.0/*"},{"path":"/out-of-band/2.0/","matchPath":"out-of-band/2.0/*"},{"path":"/present-proof/1.0/","matchPath":"present-proof/1.0/*"},{"path":"/present-proof/2.0/","matchPath":"present-proof/2.0/*"},{"path":"/present-proof/3.0/","matchPath":"present-proof/3.0/*"},{"path":"/question-answer/1.0/","matchPath":"question-answer/1.0/*"},{"path":"/receipts/1.0/","matchPath":"receipts/1.0/*"},{"path":"/report-problem/2.0/","matchPath":"report-problem/2.0/*"},{"path":"/routing/2.0/","matchPath":"routing/2.0/*"},{"path":"/shorten-url/1.0/","matchPath":"shorten-url/1.0/*"},{"path":"/trust-ping/2.0/","matchPath":"trust-ping/2.0/*"},{"path":"/user-profile/1.0/","matchPath":"user-profile/1.0/*"}]');const D=new l.kL(S,O,window.pageData);(0,l.N1)(D),D.setApiRunner(o.h),window.asyncRequires=S,window.___emitter=f.Z,window.___loader=l.jN,d.V5.listen((t=>{t.location.action=t.action})),window.___push=t=>b(t,{replace:!1}),window.___replace=t=>b(t,{replace:!0}),window.___navigate=(t,e)=>b(t,e),v(window.location.pathname),(0,o.I)("onClientEntry").then((()=>{(0,o.h)("registerServiceWorker").filter(Boolean).length>0&&n(154);const t=t=>a.createElement(s.BaseContext.Provider,{value:{baseuri:"/",basepath:"/"}},a.createElement(C.Z,t)),e=a.createContext({});let p=function(t){function n(){return t.apply(this,arguments)||this}return(0,r.Z)(n,t),n.prototype.render=function(){const{children:t}=this.props;return a.createElement(s.Location,null,(n=>{let{location:r}=n;return a.createElement(_,{location:r},(n=>{let{pageResources:r,location:o}=n;const i=(0,l.hs)();return a.createElement(u.StaticQueryContext.Provider,{value:i},a.createElement(e.Provider,{value:{pageResources:r,location:o}},t))}))}))},n}(a.Component),f=function(n){function o(){return n.apply(this,arguments)||this}return(0,r.Z)(o,n),o.prototype.render=function(){return a.createElement(e.Consumer,null,(e=>{let{pageResources:n,location:r}=e;return a.createElement(k,{location:r},a.createElement(c.$C,{location:r,shouldUpdateScroll:P},a.createElement(s.Router,{basepath:"",location:r,id:"gatsby-focus-wrapper"},a.createElement(t,Object.assign({path:"/404.html"===n.page.path?(0,j.Z)(r.pathname,""):encodeURI(n.page.matchPath||n.page.path)},this.props,{location:r,pageResources:n},n.json)))))}))},o}(a.Component);const{pagePath:h,location:d}=window;h&&""+h!==d.pathname&&!(D.findMatchPath((0,j.Z)(d.pathname,""))||"/404.html"===h||h.match(/^\/404\/?$/)||h.match(/^\/offline-plugin-app-shell-fallback\/?$/))&&(0,s.navigate)(""+h+d.search+d.hash,{replace:!0}),l.jN.loadPage(d.pathname).then((t=>{if(!t||t.status===l.uQ.Error){const e="page resources for "+d.pathname+" not found. Not rendering React";if(t&&t.error)throw console.error(e),t.error;throw new Error(e)}window.___webpackCompilationHash=t.page.webpackCompilationHash;const e=(0,o.h)("wrapRootElement",{element:a.createElement(f,null)},a.createElement(f,null),(t=>{let{result:e}=t;return{element:e}})).pop(),n=function(){const t=a.useRef(!1);return a.useEffect((()=>{t.current||(t.current=!0,performance.mark&&performance.mark("onInitialClientRender"),(0,o.h)("onInitialClientRender"))}),[]),a.createElement(p,null,e)},r=(0,o.h)("replaceHydrateFunction",void 0,i.hydrateRoot?i.hydrateRoot:i.hydrate)[0];function s(){const t="undefined"!=typeof window?document.getElementById("___gatsby"):null;r===i.hydrateRoot?r(t,a.createElement(n,null)):r(a.createElement(n,null),t)}const c=document;if("complete"===c.readyState||"loading"!==c.readyState&&!c.documentElement.doScroll)setTimeout((function(){s()}),0);else{const t=function(){c.removeEventListener("DOMContentLoaded",t,!1),window.removeEventListener("load",t,!1),s()};c.addEventListener("DOMContentLoaded",t,!1),window.addEventListener("load",t,!1)}}))}))},6947:function(t,e,n){"use strict";n.r(e);var r=n(7294),o=n(8741),a=n(804);e.default=t=>{let{location:e}=t;const n=o.ZP.loadPageSync(e.pathname);return n?r.createElement(a.Z,{location:e,pageResources:n,...n.json}):null}},861:function(t,e,n){var r;t.exports=(r=n(6947))&&r.default||r},3639:function(t,e){e.O=t=>t},67:function(t,e,n){"use strict";n.d(e,{J:function(){return a}});const r=new Map,o=new Map;function a(t){let e=r.get(t);return e||(e=o.get(t.toLowerCase())),e}[].forEach((t=>{t.ignoreCase?o.set(t.fromPath,t):r.set(t.fromPath,t)}))},154:function(t,e,n){"use strict";n.r(e);var r=n(7343);"https:"!==window.location.protocol&&"localhost"!==window.location.hostname?console.error("Service workers can only be used over HTTPS, or on localhost for development"):"serviceWorker"in navigator&&navigator.serviceWorker.register("/sw.js").then((function(t){t.addEventListener("updatefound",(()=>{(0,r.h)("onServiceWorkerUpdateFound",{serviceWorker:t});const e=t.installing;console.log("installingWorker",e),e.addEventListener("statechange",(()=>{switch(e.state){case"installed":navigator.serviceWorker.controller?(window.___swUpdated=!0,(0,r.h)("onServiceWorkerUpdateReady",{serviceWorker:t}),window.___failedResources&&(console.log("resources failed, SW updated - reloading"),window.location.reload())):(console.log("Content is now available offline!"),(0,r.h)("onServiceWorkerInstalled",{serviceWorker:t}));break;case"redundant":console.error("The installing service worker became redundant."),(0,r.h)("onServiceWorkerRedundant",{serviceWorker:t});break;case"activated":(0,r.h)("onServiceWorkerActive",{serviceWorker:t})}}))}))})).catch((function(t){console.error("Error during service worker registration:",t)}))},1578:function(t,e,n){"use strict";function r(t,e){return void 0===e&&(e=""),e?t===e?"/":t.startsWith(e+"/")?t.slice(e.length):t:t}n.d(e,{Z:function(){return r}})},9037:function(t,e,n){"use strict";n.r(e)},992:function(t,e,n){"use strict";var r=n(5318);n(5444),r(n(1632))},1632:function(t,e){"use strict";e.__esModule=!0,e.default=void 0;e.default=function(t,e){var n="manifest.webmanifest";if(!Array.isArray(e))return n;var r=e.find((function(e){return t.startsWith(e.start_url)}));return r?"manifest_"+r.lang+".webmanifest":n}},7047:function(t,e,n){"use strict";n.r(e),n.d(e,{wrapRootElement:function(){return s}});var r=n(7294),o=n(9499),a=n(6633),i=t=>{let{children:e}=t;return r.createElement(o.Location,null,(t=>{let{location:n}=t;return r.createElement(a.Fz,{location:n,reachHistory:o.globalHistory},e)}))};const s=t=>{let{element:e}=t;return r.createElement(i,null,e)}},7504:function(t,e){"use strict";var n=0,r=function(t){var e=window.decodeURI(t.replace("#",""));if(""!==e){var r=document.getElementById(e);if(r){var o=window.pageYOffset||document.documentElement.scrollTop||document.body.scrollTop,a=document.documentElement.clientTop||document.body.clientTop||0,i=window.getComputedStyle(r),s=i.getPropertyValue("scroll-margin-top")||i.getPropertyValue("scroll-snap-margin-top")||"0px";return r.getBoundingClientRect().top+o-parseInt(s,10)-a-n}}return null};e.onInitialClientRender=function(t,e){e.offsetY&&(n=e.offsetY),requestAnimationFrame((function(){var t=r(window.location.hash);null!==t&&window.scrollTo(0,t)}))},e.shouldUpdateScroll=function(t){var e=t.routerProps.location,n=r(e.hash);return null===n||[0,n]}},9499:function(t,e,n){"use strict";n.r(e),n.d(e,{BaseContext:function(){return N},Link:function(){return B},Location:function(){return U},LocationProvider:function(){return I},Match:function(){return X},Redirect:function(){return z},Router:function(){return T},ServerLocation:function(){return M},createHistory:function(){return E},createMemorySource:function(){return R},globalHistory:function(){return C},isRedirect:function(){return V},matchPath:function(){return u},navigate:function(){return S},redirectTo:function(){return $},useLocation:function(){return tt},useMatch:function(){return rt},useNavigate:function(){return et},useParams:function(){return nt}});var r=n(7294),o=n(1143),a=n.n(o),i=n(3639),s=function(t,e){return t.substr(0,e.length)===e},c=function(t,e){for(var n=void 0,r=void 0,o=e.split("?")[0],i=g(o),s=""===i[0],c=v(t),u=0,l=c.length;ue.score?-1:t.index-e.index}))},g=function(t){return t.replace(/(^\/+|\/+$)/g,"").split("/")},y=function(t){for(var e=arguments.length,n=Array(e>1?e-1:0),r=1;r0})))&&n.length>0?"?"+n.join("&"):"")},w=["uri","path"],b=Object.assign||function(t){for(var e=1;e1&&void 0!==arguments[1]?arguments[1]:{},s=i.state,c=i.replace,u=void 0!==c&&c;if("number"==typeof e)t.history.go(e);else{s=b({},s,{key:Date.now()+""});try{o||u?t.history.replaceState(s,null,e):t.history.pushState(s,null,e)}catch(p){t.location[u?"replace":"assign"](e)}}r=P(t),o=!0;var l=new Promise((function(t){return a=t}));return n.forEach((function(t){return t({location:r,action:"PUSH"})})),l}}},R=function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"/",e=t.indexOf("?"),n={pathname:e>-1?t.substr(0,e):t,search:e>-1?t.substr(e):""},r=0,o=[n],a=[null];return{get location(){return o[r]},addEventListener:function(t,e){},removeEventListener:function(t,e){},history:{get entries(){return o},get index(){return r},get state(){return a[r]},pushState:function(t,e,n){var i=n.split("?"),s=i[0],c=i[1],u=void 0===c?"":c;r++,o.push({pathname:s,search:u.length?"?"+u:u}),a.push(t)},replaceState:function(t,e,n){var i=n.split("?"),s=i[0],c=i[1],u=void 0===c?"":c;o[r]={pathname:s,search:u},a[r]=t},go:function(t){var e=r+t;e<0||e>a.length-1||(r=e)}}}},k=!("undefined"==typeof window||!window.document||!window.document.createElement),C=E(k?window:R()),S=C.navigate,x=Object.assign||function(t){for(var e=1;e=0||Object.prototype.hasOwnProperty.call(t,r)&&(n[r]=t[r]);return n}function j(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function O(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function D(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}var L=function(t,e){var n=(0,r.createContext)(e);return n.displayName=t,n},F=L("Location"),U=function(t){var e=t.children;return r.createElement(F.Consumer,null,(function(t){return t?e(t):r.createElement(I,null,e)}))},I=function(t){function e(){var n,r;j(this,e);for(var o=arguments.length,a=Array(o),i=0;i-1?(a=e.substring(0,o),i=e.substring(o)):a=e,r.createElement(F.Provider,{value:{location:{pathname:a,search:i,hash:""},navigate:function(){throw new Error("You can't call navigate on the server.")}}},n)},N=L("Base",{baseuri:"/",basepath:"/",navigate:C.navigate}),T=function(t){return r.createElement(N.Consumer,null,(function(e){return r.createElement(U,null,(function(n){return r.createElement(A,x({},e,n,t))}))}))},A=function(t){function e(){return j(this,e),O(this,t.apply(this,arguments))}return D(e,t),e.prototype.render=function(){var t=this.props,e=t.location,n=t.navigate,o=t.basepath,a=t.primary,i=t.children,s=(t.baseuri,t.component),u=void 0===s?"div":s,p=_(t,["location","navigate","basepath","primary","children","baseuri","component"]),f=r.Children.toArray(i).reduce((function(t,e){var n=at(o)(e);return t.concat(n)}),[]),h=e.pathname,d=c(f,h);if(d){var m=d.params,v=d.uri,g=d.route,y=d.route.value;o=g.default?o:g.path.replace(/\*$/,"");var w=x({},m,{uri:v,location:e,navigate:function(t,e){return n(l(t,v),e)}}),b=r.cloneElement(y,w,y.props.children?r.createElement(T,{location:e,primary:a},y.props.children):void 0),P=a?W:u,E=a?x({uri:v,location:e,component:u},p):p;return r.createElement(N.Provider,{value:{baseuri:v,basepath:o,navigate:w.navigate}},r.createElement(P,E,b))}return null},e}(r.PureComponent);A.defaultProps={primary:!0};var q=L("Focus"),W=function(t){var e=t.uri,n=t.location,o=t.component,a=_(t,["uri","location","component"]);return r.createElement(q.Consumer,null,(function(t){return r.createElement(Q,x({},a,{component:o,requestFocus:t,uri:e,location:n}))}))},H=!0,Z=0,Q=function(t){function e(){var n,r;j(this,e);for(var o=arguments.length,a=Array(o),i=0;it.length)&&(e=t.length);for(var n=0,r=new Array(e);n= 0) continue;\n target[key] = source[key];\n }\n\n return target;\n}\n\nmodule.exports = _objectWithoutPropertiesLoose, module.exports.__esModule = true, module.exports[\"default\"] = module.exports;","function _setPrototypeOf(o, p) {\n module.exports = _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) {\n o.__proto__ = p;\n return o;\n }, module.exports.__esModule = true, module.exports[\"default\"] = module.exports;\n return _setPrototypeOf(o, p);\n}\n\nmodule.exports = _setPrototypeOf, module.exports.__esModule = true, module.exports[\"default\"] = module.exports;","\"use strict\";\n\nexports.__esModule = true;\n\nvar _extends = Object.assign || function (target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = arguments[i];\n\n for (var key in source) {\n if (Object.prototype.hasOwnProperty.call(source, key)) {\n target[key] = source[key];\n }\n }\n }\n\n return target;\n};\n\nvar getLocation = function getLocation(source) {\n var _source$location = source.location,\n search = _source$location.search,\n hash = _source$location.hash,\n href = _source$location.href,\n origin = _source$location.origin,\n protocol = _source$location.protocol,\n host = _source$location.host,\n hostname = _source$location.hostname,\n port = _source$location.port;\n var pathname = source.location.pathname;\n\n if (!pathname && href && canUseDOM) {\n var url = new URL(href);\n pathname = url.pathname;\n }\n\n return {\n pathname: encodeURI(decodeURI(pathname)),\n search: search,\n hash: hash,\n href: href,\n origin: origin,\n protocol: protocol,\n host: host,\n hostname: hostname,\n port: port,\n state: source.history.state,\n key: source.history.state && source.history.state.key || \"initial\"\n };\n};\n\nvar createHistory = function createHistory(source, options) {\n var listeners = [];\n var location = getLocation(source);\n var transitioning = false;\n\n var resolveTransition = function resolveTransition() {};\n\n return {\n get location() {\n return location;\n },\n\n get transitioning() {\n return transitioning;\n },\n\n _onTransitionComplete: function _onTransitionComplete() {\n transitioning = false;\n resolveTransition();\n },\n listen: function listen(listener) {\n listeners.push(listener);\n\n var popstateListener = function popstateListener() {\n location = getLocation(source);\n listener({\n location: location,\n action: \"POP\"\n });\n };\n\n source.addEventListener(\"popstate\", popstateListener);\n return function () {\n source.removeEventListener(\"popstate\", popstateListener);\n listeners = listeners.filter(function (fn) {\n return fn !== listener;\n });\n };\n },\n navigate: function navigate(to) {\n var _ref = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {},\n state = _ref.state,\n _ref$replace = _ref.replace,\n replace = _ref$replace === undefined ? false : _ref$replace;\n\n if (typeof to === \"number\") {\n source.history.go(to);\n } else {\n state = _extends({}, state, {\n key: Date.now() + \"\"\n }); // try...catch iOS Safari limits to 100 pushState calls\n\n try {\n if (transitioning || replace) {\n source.history.replaceState(state, null, to);\n } else {\n source.history.pushState(state, null, to);\n }\n } catch (e) {\n source.location[replace ? \"replace\" : \"assign\"](to);\n }\n }\n\n location = getLocation(source);\n transitioning = true;\n var transition = new Promise(function (res) {\n return resolveTransition = res;\n });\n listeners.forEach(function (listener) {\n return listener({\n location: location,\n action: \"PUSH\"\n });\n });\n return transition;\n }\n };\n}; ////////////////////////////////////////////////////////////////////////////////\n// Stores history entries in memory for testing or other platforms like Native\n\n\nvar createMemorySource = function createMemorySource() {\n var initialPath = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : \"/\";\n var searchIndex = initialPath.indexOf(\"?\");\n var initialLocation = {\n pathname: searchIndex > -1 ? initialPath.substr(0, searchIndex) : initialPath,\n search: searchIndex > -1 ? initialPath.substr(searchIndex) : \"\"\n };\n var index = 0;\n var stack = [initialLocation];\n var states = [null];\n return {\n get location() {\n return stack[index];\n },\n\n addEventListener: function addEventListener(name, fn) {},\n removeEventListener: function removeEventListener(name, fn) {},\n history: {\n get entries() {\n return stack;\n },\n\n get index() {\n return index;\n },\n\n get state() {\n return states[index];\n },\n\n pushState: function pushState(state, _, uri) {\n var _uri$split = uri.split(\"?\"),\n pathname = _uri$split[0],\n _uri$split$ = _uri$split[1],\n search = _uri$split$ === undefined ? \"\" : _uri$split$;\n\n index++;\n stack.push({\n pathname: pathname,\n search: search.length ? \"?\" + search : search\n });\n states.push(state);\n },\n replaceState: function replaceState(state, _, uri) {\n var _uri$split2 = uri.split(\"?\"),\n pathname = _uri$split2[0],\n _uri$split2$ = _uri$split2[1],\n search = _uri$split2$ === undefined ? \"\" : _uri$split2$;\n\n stack[index] = {\n pathname: pathname,\n search: search\n };\n states[index] = state;\n },\n go: function go(to) {\n var newIndex = index + to;\n\n if (newIndex < 0 || newIndex > states.length - 1) {\n return;\n }\n\n index = newIndex;\n }\n }\n };\n}; ////////////////////////////////////////////////////////////////////////////////\n// global history - uses window.history as the source if available, otherwise a\n// memory history\n\n\nvar canUseDOM = !!(typeof window !== \"undefined\" && window.document && window.document.createElement);\n\nvar getSource = function getSource() {\n return canUseDOM ? window : createMemorySource();\n};\n\nvar globalHistory = createHistory(getSource());\nvar navigate = globalHistory.navigate; ////////////////////////////////////////////////////////////////////////////////\n\nexports.globalHistory = globalHistory;\nexports.navigate = navigate;\nexports.createHistory = createHistory;\nexports.createMemorySource = createMemorySource;","\"use strict\";\n\nexports.__esModule = true;\nexports.shallowCompare = exports.validateRedirect = exports.insertParams = exports.resolve = exports.match = exports.pick = exports.startsWith = undefined;\n\nvar _invariant = require(\"invariant\");\n\nvar _invariant2 = _interopRequireDefault(_invariant);\n\nfunction _interopRequireDefault(obj) {\n return obj && obj.__esModule ? obj : {\n default: obj\n };\n} ////////////////////////////////////////////////////////////////////////////////\n// startsWith(string, search) - Check if `string` starts with `search`\n\n\nvar startsWith = function startsWith(string, search) {\n return string.substr(0, search.length) === search;\n}; ////////////////////////////////////////////////////////////////////////////////\n// pick(routes, uri)\n//\n// Ranks and picks the best route to match. Each segment gets the highest\n// amount of points, then the type of segment gets an additional amount of\n// points where\n//\n// static > dynamic > splat > root\n//\n// This way we don't have to worry about the order of our routes, let the\n// computers do it.\n//\n// A route looks like this\n//\n// { path, default, value }\n//\n// And a returned match looks like:\n//\n// { route, params, uri }\n//\n// I know, I should use TypeScript not comments for these types.\n\n\nvar pick = function pick(routes, uri) {\n var match = void 0;\n var default_ = void 0;\n\n var _uri$split = uri.split(\"?\"),\n uriPathname = _uri$split[0];\n\n var uriSegments = segmentize(uriPathname);\n var isRootUri = uriSegments[0] === \"\";\n var ranked = rankRoutes(routes);\n\n for (var i = 0, l = ranked.length; i < l; i++) {\n var missed = false;\n var route = ranked[i].route;\n\n if (route.default) {\n default_ = {\n route: route,\n params: {},\n uri: uri\n };\n continue;\n }\n\n var routeSegments = segmentize(route.path);\n var params = {};\n var max = Math.max(uriSegments.length, routeSegments.length);\n var index = 0;\n\n for (; index < max; index++) {\n var routeSegment = routeSegments[index];\n var uriSegment = uriSegments[index];\n\n if (isSplat(routeSegment)) {\n // Hit a splat, just grab the rest, and return a match\n // uri: /files/documents/work\n // route: /files/*\n var param = routeSegment.slice(1) || \"*\";\n params[param] = uriSegments.slice(index).map(decodeURIComponent).join(\"/\");\n break;\n }\n\n if (uriSegment === undefined) {\n // URI is shorter than the route, no match\n // uri: /users\n // route: /users/:userId\n missed = true;\n break;\n }\n\n var dynamicMatch = paramRe.exec(routeSegment);\n\n if (dynamicMatch && !isRootUri) {\n var matchIsNotReserved = reservedNames.indexOf(dynamicMatch[1]) === -1;\n !matchIsNotReserved ? process.env.NODE_ENV !== \"production\" ? (0, _invariant2.default)(false, \" dynamic segment \\\"\" + dynamicMatch[1] + \"\\\" is a reserved name. Please use a different name in path \\\"\" + route.path + \"\\\".\") : (0, _invariant2.default)(false) : void 0;\n var value = decodeURIComponent(uriSegment);\n params[dynamicMatch[1]] = value;\n } else if (routeSegment !== uriSegment) {\n // Current segments don't match, not dynamic, not splat, so no match\n // uri: /users/123/settings\n // route: /users/:id/profile\n missed = true;\n break;\n }\n }\n\n if (!missed) {\n match = {\n route: route,\n params: params,\n uri: \"/\" + uriSegments.slice(0, index).join(\"/\")\n };\n break;\n }\n }\n\n return match || default_ || null;\n}; ////////////////////////////////////////////////////////////////////////////////\n// match(path, uri) - Matches just one path to a uri, also lol\n\n\nvar match = function match(path, uri) {\n return pick([{\n path: path\n }], uri);\n}; ////////////////////////////////////////////////////////////////////////////////\n// resolve(to, basepath)\n//\n// Resolves URIs as though every path is a directory, no files. Relative URIs\n// in the browser can feel awkward because not only can you be \"in a directory\"\n// you can be \"at a file\", too. For example\n//\n// browserSpecResolve('foo', '/bar/') => /bar/foo\n// browserSpecResolve('foo', '/bar') => /foo\n//\n// But on the command line of a file system, it's not as complicated, you can't\n// `cd` from a file, only directories. This way, links have to know less about\n// their current path. To go deeper you can do this:\n//\n// \n// // instead of\n// \n//\n// Just like `cd`, if you want to go deeper from the command line, you do this:\n//\n// cd deeper\n// # not\n// cd $(pwd)/deeper\n//\n// By treating every path as a directory, linking to relative paths should\n// require less contextual information and (fingers crossed) be more intuitive.\n\n\nvar resolve = function resolve(to, base) {\n // /foo/bar, /baz/qux => /foo/bar\n if (startsWith(to, \"/\")) {\n return to;\n }\n\n var _to$split = to.split(\"?\"),\n toPathname = _to$split[0],\n toQuery = _to$split[1];\n\n var _base$split = base.split(\"?\"),\n basePathname = _base$split[0];\n\n var toSegments = segmentize(toPathname);\n var baseSegments = segmentize(basePathname); // ?a=b, /users?b=c => /users?a=b\n\n if (toSegments[0] === \"\") {\n return addQuery(basePathname, toQuery);\n } // profile, /users/789 => /users/789/profile\n\n\n if (!startsWith(toSegments[0], \".\")) {\n var pathname = baseSegments.concat(toSegments).join(\"/\");\n return addQuery((basePathname === \"/\" ? \"\" : \"/\") + pathname, toQuery);\n } // ./ /users/123 => /users/123\n // ../ /users/123 => /users\n // ../.. /users/123 => /\n // ../../one /a/b/c/d => /a/b/one\n // .././one /a/b/c/d => /a/b/c/one\n\n\n var allSegments = baseSegments.concat(toSegments);\n var segments = [];\n\n for (var i = 0, l = allSegments.length; i < l; i++) {\n var segment = allSegments[i];\n if (segment === \"..\") segments.pop();else if (segment !== \".\") segments.push(segment);\n }\n\n return addQuery(\"/\" + segments.join(\"/\"), toQuery);\n}; ////////////////////////////////////////////////////////////////////////////////\n// insertParams(path, params)\n\n\nvar insertParams = function insertParams(path, params) {\n var _path$split = path.split(\"?\"),\n pathBase = _path$split[0],\n _path$split$ = _path$split[1],\n query = _path$split$ === undefined ? \"\" : _path$split$;\n\n var segments = segmentize(pathBase);\n var constructedPath = \"/\" + segments.map(function (segment) {\n var match = paramRe.exec(segment);\n return match ? params[match[1]] : segment;\n }).join(\"/\");\n var _params$location = params.location;\n _params$location = _params$location === undefined ? {} : _params$location;\n var _params$location$sear = _params$location.search,\n search = _params$location$sear === undefined ? \"\" : _params$location$sear;\n var searchSplit = search.split(\"?\")[1] || \"\";\n constructedPath = addQuery(constructedPath, query, searchSplit);\n return constructedPath;\n};\n\nvar validateRedirect = function validateRedirect(from, to) {\n var filter = function filter(segment) {\n return isDynamic(segment);\n };\n\n var fromString = segmentize(from).filter(filter).sort().join(\"/\");\n var toString = segmentize(to).filter(filter).sort().join(\"/\");\n return fromString === toString;\n}; ////////////////////////////////////////////////////////////////////////////////\n// Junk\n\n\nvar paramRe = /^:(.+)/;\nvar SEGMENT_POINTS = 4;\nvar STATIC_POINTS = 3;\nvar DYNAMIC_POINTS = 2;\nvar SPLAT_PENALTY = 1;\nvar ROOT_POINTS = 1;\n\nvar isRootSegment = function isRootSegment(segment) {\n return segment === \"\";\n};\n\nvar isDynamic = function isDynamic(segment) {\n return paramRe.test(segment);\n};\n\nvar isSplat = function isSplat(segment) {\n return segment && segment[0] === \"*\";\n};\n\nvar rankRoute = function rankRoute(route, index) {\n var score = route.default ? 0 : segmentize(route.path).reduce(function (score, segment) {\n score += SEGMENT_POINTS;\n if (isRootSegment(segment)) score += ROOT_POINTS;else if (isDynamic(segment)) score += DYNAMIC_POINTS;else if (isSplat(segment)) score -= SEGMENT_POINTS + SPLAT_PENALTY;else score += STATIC_POINTS;\n return score;\n }, 0);\n return {\n route: route,\n score: score,\n index: index\n };\n};\n\nvar rankRoutes = function rankRoutes(routes) {\n return routes.map(rankRoute).sort(function (a, b) {\n return a.score < b.score ? 1 : a.score > b.score ? -1 : a.index - b.index;\n });\n};\n\nvar segmentize = function segmentize(uri) {\n return uri // strip starting/ending slashes\n .replace(/(^\\/+|\\/+$)/g, \"\").split(\"/\");\n};\n\nvar addQuery = function addQuery(pathname) {\n for (var _len = arguments.length, query = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n query[_key - 1] = arguments[_key];\n }\n\n query = query.filter(function (q) {\n return q && q.length > 0;\n });\n return pathname + (query && query.length > 0 ? \"?\" + query.join(\"&\") : \"\");\n};\n\nvar reservedNames = [\"uri\", \"path\"];\n/**\n * Shallow compares two objects.\n * @param {Object} obj1 The first object to compare.\n * @param {Object} obj2 The second object to compare.\n */\n\nvar shallowCompare = function shallowCompare(obj1, obj2) {\n var obj1Keys = Object.keys(obj1);\n return obj1Keys.length === Object.keys(obj2).length && obj1Keys.every(function (key) {\n return obj2.hasOwnProperty(key) && obj1[key] === obj2[key];\n });\n}; ////////////////////////////////////////////////////////////////////////////////\n\n\nexports.startsWith = startsWith;\nexports.pick = pick;\nexports.match = match;\nexports.resolve = resolve;\nexports.insertParams = insertParams;\nexports.validateRedirect = validateRedirect;\nexports.shallowCompare = shallowCompare;","'use strict';\n\nvar token = '%[a-f0-9]{2}';\nvar singleMatcher = new RegExp(token, 'gi');\nvar multiMatcher = new RegExp('(' + token + ')+', 'gi');\n\nfunction decodeComponents(components, split) {\n try {\n // Try to decode the entire string first\n return decodeURIComponent(components.join(''));\n } catch (err) {// Do nothing\n }\n\n if (components.length === 1) {\n return components;\n }\n\n split = split || 1; // Split the array in 2 parts\n\n var left = components.slice(0, split);\n var right = components.slice(split);\n return Array.prototype.concat.call([], decodeComponents(left), decodeComponents(right));\n}\n\nfunction decode(input) {\n try {\n return decodeURIComponent(input);\n } catch (err) {\n var tokens = input.match(singleMatcher);\n\n for (var i = 1; i < tokens.length; i++) {\n input = decodeComponents(tokens, i).join('');\n tokens = input.match(singleMatcher);\n }\n\n return input;\n }\n}\n\nfunction customDecodeURIComponent(input) {\n // Keep track of all the replacements and prefill the map with the `BOM`\n var replaceMap = {\n '%FE%FF': '\\uFFFD\\uFFFD',\n '%FF%FE': '\\uFFFD\\uFFFD'\n };\n var match = multiMatcher.exec(input);\n\n while (match) {\n try {\n // Decode as big chunks as possible\n replaceMap[match[0]] = decodeURIComponent(match[0]);\n } catch (err) {\n var result = decode(match[0]);\n\n if (result !== match[0]) {\n replaceMap[match[0]] = result;\n }\n }\n\n match = multiMatcher.exec(input);\n } // Add `%C2` at the end of the map to make sure it does not replace the combinator before everything else\n\n\n replaceMap['%C2'] = '\\uFFFD';\n var entries = Object.keys(replaceMap);\n\n for (var i = 0; i < entries.length; i++) {\n // Replace all decoded components\n var key = entries[i];\n input = input.replace(new RegExp(key, 'g'), replaceMap[key]);\n }\n\n return input;\n}\n\nmodule.exports = function (encodedURI) {\n if (typeof encodedURI !== 'string') {\n throw new TypeError('Expected `encodedURI` to be of type `string`, got `' + typeof encodedURI + '`');\n }\n\n try {\n encodedURI = encodedURI.replace(/\\+/g, ' '); // Try the built in decoder first\n\n return decodeURIComponent(encodedURI);\n } catch (err) {\n // Fallback to a more advanced decoder\n return customDecodeURIComponent(encodedURI);\n }\n};","'use strict';\n\nmodule.exports = function (obj, predicate) {\n var ret = {};\n var keys = Object.keys(obj);\n var isArr = Array.isArray(predicate);\n\n for (var i = 0; i < keys.length; i++) {\n var key = keys[i];\n var val = obj[key];\n\n if (isArr ? predicate.indexOf(key) !== -1 : predicate(key, val, obj)) {\n ret[key] = val;\n }\n }\n\n return ret;\n};","\"use strict\";\n\nmodule.exports = Object.assign;","'use strict';\n\nconst strictUriEncode = require('strict-uri-encode');\n\nconst decodeComponent = require('decode-uri-component');\n\nconst splitOnFirst = require('split-on-first');\n\nconst filterObject = require('filter-obj');\n\nconst isNullOrUndefined = value => value === null || value === undefined;\n\nfunction encoderForArrayFormat(options) {\n switch (options.arrayFormat) {\n case 'index':\n return key => (result, value) => {\n const index = result.length;\n\n if (value === undefined || options.skipNull && value === null || options.skipEmptyString && value === '') {\n return result;\n }\n\n if (value === null) {\n return [...result, [encode(key, options), '[', index, ']'].join('')];\n }\n\n return [...result, [encode(key, options), '[', encode(index, options), ']=', encode(value, options)].join('')];\n };\n\n case 'bracket':\n return key => (result, value) => {\n if (value === undefined || options.skipNull && value === null || options.skipEmptyString && value === '') {\n return result;\n }\n\n if (value === null) {\n return [...result, [encode(key, options), '[]'].join('')];\n }\n\n return [...result, [encode(key, options), '[]=', encode(value, options)].join('')];\n };\n\n case 'comma':\n case 'separator':\n return key => (result, value) => {\n if (value === null || value === undefined || value.length === 0) {\n return result;\n }\n\n if (result.length === 0) {\n return [[encode(key, options), '=', encode(value, options)].join('')];\n }\n\n return [[result, encode(value, options)].join(options.arrayFormatSeparator)];\n };\n\n default:\n return key => (result, value) => {\n if (value === undefined || options.skipNull && value === null || options.skipEmptyString && value === '') {\n return result;\n }\n\n if (value === null) {\n return [...result, encode(key, options)];\n }\n\n return [...result, [encode(key, options), '=', encode(value, options)].join('')];\n };\n }\n}\n\nfunction parserForArrayFormat(options) {\n let result;\n\n switch (options.arrayFormat) {\n case 'index':\n return (key, value, accumulator) => {\n result = /\\[(\\d*)\\]$/.exec(key);\n key = key.replace(/\\[\\d*\\]$/, '');\n\n if (!result) {\n accumulator[key] = value;\n return;\n }\n\n if (accumulator[key] === undefined) {\n accumulator[key] = {};\n }\n\n accumulator[key][result[1]] = value;\n };\n\n case 'bracket':\n return (key, value, accumulator) => {\n result = /(\\[\\])$/.exec(key);\n key = key.replace(/\\[\\]$/, '');\n\n if (!result) {\n accumulator[key] = value;\n return;\n }\n\n if (accumulator[key] === undefined) {\n accumulator[key] = [value];\n return;\n }\n\n accumulator[key] = [].concat(accumulator[key], value);\n };\n\n case 'comma':\n case 'separator':\n return (key, value, accumulator) => {\n const isArray = typeof value === 'string' && value.includes(options.arrayFormatSeparator);\n const isEncodedArray = typeof value === 'string' && !isArray && decode(value, options).includes(options.arrayFormatSeparator);\n value = isEncodedArray ? decode(value, options) : value;\n const newValue = isArray || isEncodedArray ? value.split(options.arrayFormatSeparator).map(item => decode(item, options)) : value === null ? value : decode(value, options);\n accumulator[key] = newValue;\n };\n\n default:\n return (key, value, accumulator) => {\n if (accumulator[key] === undefined) {\n accumulator[key] = value;\n return;\n }\n\n accumulator[key] = [].concat(accumulator[key], value);\n };\n }\n}\n\nfunction validateArrayFormatSeparator(value) {\n if (typeof value !== 'string' || value.length !== 1) {\n throw new TypeError('arrayFormatSeparator must be single character string');\n }\n}\n\nfunction encode(value, options) {\n if (options.encode) {\n return options.strict ? strictUriEncode(value) : encodeURIComponent(value);\n }\n\n return value;\n}\n\nfunction decode(value, options) {\n if (options.decode) {\n return decodeComponent(value);\n }\n\n return value;\n}\n\nfunction keysSorter(input) {\n if (Array.isArray(input)) {\n return input.sort();\n }\n\n if (typeof input === 'object') {\n return keysSorter(Object.keys(input)).sort((a, b) => Number(a) - Number(b)).map(key => input[key]);\n }\n\n return input;\n}\n\nfunction removeHash(input) {\n const hashStart = input.indexOf('#');\n\n if (hashStart !== -1) {\n input = input.slice(0, hashStart);\n }\n\n return input;\n}\n\nfunction getHash(url) {\n let hash = '';\n const hashStart = url.indexOf('#');\n\n if (hashStart !== -1) {\n hash = url.slice(hashStart);\n }\n\n return hash;\n}\n\nfunction extract(input) {\n input = removeHash(input);\n const queryStart = input.indexOf('?');\n\n if (queryStart === -1) {\n return '';\n }\n\n return input.slice(queryStart + 1);\n}\n\nfunction parseValue(value, options) {\n if (options.parseNumbers && !Number.isNaN(Number(value)) && typeof value === 'string' && value.trim() !== '') {\n value = Number(value);\n } else if (options.parseBooleans && value !== null && (value.toLowerCase() === 'true' || value.toLowerCase() === 'false')) {\n value = value.toLowerCase() === 'true';\n }\n\n return value;\n}\n\nfunction parse(query, options) {\n options = Object.assign({\n decode: true,\n sort: true,\n arrayFormat: 'none',\n arrayFormatSeparator: ',',\n parseNumbers: false,\n parseBooleans: false\n }, options);\n validateArrayFormatSeparator(options.arrayFormatSeparator);\n const formatter = parserForArrayFormat(options); // Create an object with no prototype\n\n const ret = Object.create(null);\n\n if (typeof query !== 'string') {\n return ret;\n }\n\n query = query.trim().replace(/^[?#&]/, '');\n\n if (!query) {\n return ret;\n }\n\n for (const param of query.split('&')) {\n if (param === '') {\n continue;\n }\n\n let [key, value] = splitOnFirst(options.decode ? param.replace(/\\+/g, ' ') : param, '='); // Missing `=` should be `null`:\n // http://w3.org/TR/2012/WD-url-20120524/#collect-url-parameters\n\n value = value === undefined ? null : ['comma', 'separator'].includes(options.arrayFormat) ? value : decode(value, options);\n formatter(decode(key, options), value, ret);\n }\n\n for (const key of Object.keys(ret)) {\n const value = ret[key];\n\n if (typeof value === 'object' && value !== null) {\n for (const k of Object.keys(value)) {\n value[k] = parseValue(value[k], options);\n }\n } else {\n ret[key] = parseValue(value, options);\n }\n }\n\n if (options.sort === false) {\n return ret;\n }\n\n return (options.sort === true ? Object.keys(ret).sort() : Object.keys(ret).sort(options.sort)).reduce((result, key) => {\n const value = ret[key];\n\n if (Boolean(value) && typeof value === 'object' && !Array.isArray(value)) {\n // Sort object keys, not values\n result[key] = keysSorter(value);\n } else {\n result[key] = value;\n }\n\n return result;\n }, Object.create(null));\n}\n\nexports.extract = extract;\nexports.parse = parse;\n\nexports.stringify = (object, options) => {\n if (!object) {\n return '';\n }\n\n options = Object.assign({\n encode: true,\n strict: true,\n arrayFormat: 'none',\n arrayFormatSeparator: ','\n }, options);\n validateArrayFormatSeparator(options.arrayFormatSeparator);\n\n const shouldFilter = key => options.skipNull && isNullOrUndefined(object[key]) || options.skipEmptyString && object[key] === '';\n\n const formatter = encoderForArrayFormat(options);\n const objectCopy = {};\n\n for (const key of Object.keys(object)) {\n if (!shouldFilter(key)) {\n objectCopy[key] = object[key];\n }\n }\n\n const keys = Object.keys(objectCopy);\n\n if (options.sort !== false) {\n keys.sort(options.sort);\n }\n\n return keys.map(key => {\n const value = object[key];\n\n if (value === undefined) {\n return '';\n }\n\n if (value === null) {\n return encode(key, options);\n }\n\n if (Array.isArray(value)) {\n return value.reduce(formatter(key), []).join('&');\n }\n\n return encode(key, options) + '=' + encode(value, options);\n }).filter(x => x.length > 0).join('&');\n};\n\nexports.parseUrl = (url, options) => {\n options = Object.assign({\n decode: true\n }, options);\n const [url_, hash] = splitOnFirst(url, '#');\n return Object.assign({\n url: url_.split('?')[0] || '',\n query: parse(extract(url), options)\n }, options && options.parseFragmentIdentifier && hash ? {\n fragmentIdentifier: decode(hash, options)\n } : {});\n};\n\nexports.stringifyUrl = (object, options) => {\n options = Object.assign({\n encode: true,\n strict: true\n }, options);\n const url = removeHash(object.url).split('?')[0] || '';\n const queryFromUrl = exports.extract(object.url);\n const parsedQueryFromUrl = exports.parse(queryFromUrl, {\n sort: false\n });\n const query = Object.assign(parsedQueryFromUrl, object.query);\n let queryString = exports.stringify(query, options);\n\n if (queryString) {\n queryString = \"?\".concat(queryString);\n }\n\n let hash = getHash(object.url);\n\n if (object.fragmentIdentifier) {\n hash = \"#\".concat(encode(object.fragmentIdentifier, options));\n }\n\n return \"\".concat(url).concat(queryString).concat(hash);\n};\n\nexports.pick = (input, filter, options) => {\n options = Object.assign({\n parseFragmentIdentifier: true\n }, options);\n const {\n url,\n query,\n fragmentIdentifier\n } = exports.parseUrl(input, options);\n return exports.stringifyUrl({\n url,\n query: filterObject(query, filter),\n fragmentIdentifier\n }, options);\n};\n\nexports.exclude = (input, filter, options) => {\n const exclusionFilter = Array.isArray(filter) ? key => !filter.includes(key) : (key, value) => !filter(key, value);\n return exports.pick(input, exclusionFilter, options);\n};","'use strict';\n\nmodule.exports = (string, separator) => {\n if (!(typeof string === 'string' && typeof separator === 'string')) {\n throw new TypeError('Expected the arguments to be of type `string`');\n }\n\n if (separator === '') {\n return [string];\n }\n\n const separatorIndex = string.indexOf(separator);\n\n if (separatorIndex === -1) {\n return [string];\n }\n\n return [string.slice(0, separatorIndex), string.slice(separatorIndex + separator.length)];\n};","'use strict';\n\nmodule.exports = str => encodeURIComponent(str).replace(/[!'()*]/g, x => \"%\".concat(x.charCodeAt(0).toString(16).toUpperCase()));","var __assign = this && this.__assign || function () {\n __assign = Object.assign || function (t) {\n for (var s, i = 1, n = arguments.length; i < n; i++) {\n s = arguments[i];\n\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\n }\n\n return t;\n };\n\n return __assign.apply(this, arguments);\n};\n\nexport function withDefault(param, defaultValue, includeNull) {\n if (includeNull === void 0) {\n includeNull = true;\n }\n\n var decodeWithDefault = function () {\n var args = [];\n\n for (var _i = 0; _i < arguments.length; _i++) {\n args[_i] = arguments[_i];\n }\n\n var decodedValue = param.decode.apply(param, args);\n\n if (decodedValue === undefined) {\n return defaultValue;\n }\n\n if (includeNull) {\n if (decodedValue === null) {\n return defaultValue;\n } else {\n return decodedValue;\n }\n }\n\n return decodedValue;\n };\n\n return __assign(__assign({}, param), {\n decode: decodeWithDefault\n });\n}\nexport default withDefault;","var __spreadArray = this && this.__spreadArray || function (to, from) {\n for (var i = 0, il = from.length, j = to.length; i < il; i++, j++) to[j] = from[i];\n\n return to;\n};\n/**\n * Interprets an encoded string and returns either the string or null/undefined if not available.\n * Ignores array inputs (takes just first element in array)\n * @param input encoded string\n */\n\n\nfunction getEncodedValue(input, allowEmptyString) {\n if (input == null) {\n return input;\n } // '' or []\n\n\n if (input.length === 0 && (!allowEmptyString || allowEmptyString && input !== '')) {\n return null;\n }\n\n var str = input instanceof Array ? input[0] : input;\n\n if (str == null) {\n return str;\n }\n\n if (!allowEmptyString && str === '') {\n return null;\n }\n\n return str;\n}\n/**\n * Interprets an encoded string and return null/undefined or an array with\n * the encoded string contents\n * @param input encoded string\n */\n\n\nfunction getEncodedValueArray(input) {\n if (input == null) {\n return input;\n }\n\n return input instanceof Array ? input : input === '' ? [] : [input];\n}\n/**\n * Encodes a date as a string in YYYY-MM-DD format.\n *\n * @param {Date} date\n * @return {String} the encoded date\n */\n\n\nexport function encodeDate(date) {\n if (date == null) {\n return date;\n }\n\n var year = date.getFullYear();\n var month = date.getMonth() + 1;\n var day = date.getDate();\n return year + \"-\" + (month < 10 ? \"0\" + month : month) + \"-\" + (day < 10 ? \"0\" + day : day);\n}\n/**\n * Converts a date in the format 'YYYY-mm-dd...' into a proper date, because\n * new Date() does not do that correctly. The date can be as complete or incomplete\n * as necessary (aka, '2015', '2015-10', '2015-10-01').\n * It will not work for dates that have times included in them.\n *\n * If an array is provided, only the first entry is used.\n *\n * @param {String} input String date form like '2015-10-01'\n * @return {Date} parsed date\n */\n\nexport function decodeDate(input) {\n var dateString = getEncodedValue(input);\n if (dateString == null) return dateString;\n var parts = dateString.split('-'); // may only be a year so won't even have a month\n\n if (parts[1] != null) {\n parts[1] -= 1; // Note: months are 0-based\n } else {\n // just a year, set the month and day to the first\n parts[1] = 0;\n parts[2] = 1;\n }\n\n var decoded = new (Date.bind.apply(Date, __spreadArray([void 0], parts)))();\n\n if (isNaN(decoded.getTime())) {\n return null;\n }\n\n return decoded;\n}\n/**\n * Encodes a date as a string in ISO 8601 (\"2019-05-28T10:58:40Z\") format.\n *\n * @param {Date} date\n * @return {String} the encoded date\n */\n\nexport function encodeDateTime(date) {\n if (date == null) {\n return date;\n }\n\n return date.toISOString();\n}\n/**\n * Converts a date in the https://en.wikipedia.org/wiki/ISO_8601 format.\n * For allowed inputs see specs:\n * - https://tools.ietf.org/html/rfc2822#page-14\n * - http://www.ecma-international.org/ecma-262/5.1/#sec-15.9.1.15\n *\n * If an array is provided, only the first entry is used.\n *\n * @param {String} input String date form like '1995-12-17T03:24:00'\n * @return {Date} parsed date\n */\n\nexport function decodeDateTime(input) {\n var dateString = getEncodedValue(input);\n if (dateString == null) return dateString;\n var decoded = new Date(dateString);\n\n if (isNaN(decoded.getTime())) {\n return null;\n }\n\n return decoded;\n}\n/**\n * Encodes a boolean as a string. true -> \"1\", false -> \"0\".\n *\n * @param {Boolean} bool\n * @return {String} the encoded boolean\n */\n\nexport function encodeBoolean(bool) {\n if (bool == null) {\n return bool;\n }\n\n return bool ? '1' : '0';\n}\n/**\n * Decodes a boolean from a string. \"1\" -> true, \"0\" -> false.\n * Everything else maps to undefined.\n *\n * If an array is provided, only the first entry is used.\n *\n * @param {String} input the encoded boolean string\n * @return {Boolean} the boolean value\n */\n\nexport function decodeBoolean(input) {\n var boolStr = getEncodedValue(input);\n if (boolStr == null) return boolStr;\n\n if (boolStr === '1') {\n return true;\n } else if (boolStr === '0') {\n return false;\n }\n\n return null;\n}\n/**\n * Encodes a number as a string.\n *\n * @param {Number} num\n * @return {String} the encoded number\n */\n\nexport function encodeNumber(num) {\n if (num == null) {\n return num;\n }\n\n return String(num);\n}\n/**\n * Decodes a number from a string. If the number is invalid,\n * it returns undefined.\n *\n * If an array is provided, only the first entry is used.\n *\n * @param {String} input the encoded number string\n * @return {Number} the number value\n */\n\nexport function decodeNumber(input) {\n var numStr = getEncodedValue(input);\n if (numStr == null) return numStr;\n if (numStr === '') return null;\n var result = +numStr;\n return result;\n}\n/**\n * Encodes a string while safely handling null and undefined values.\n *\n * @param {String} str a string to encode\n * @return {String} the encoded string\n */\n\nexport function encodeString(str) {\n if (str == null) {\n return str;\n }\n\n return String(str);\n}\n/**\n * Decodes a string while safely handling null and undefined values.\n *\n * If an array is provided, only the first entry is used.\n *\n * @param {String} input the encoded string\n * @return {String} the string value\n */\n\nexport function decodeString(input) {\n var str = getEncodedValue(input, true);\n if (str == null) return str;\n return String(str);\n}\n/**\n * Decodes an enum value while safely handling null and undefined values.\n *\n * If an array is provided, only the first entry is used.\n *\n * @param {String} input the encoded string\n * @param {String[]} enumValues allowed enum values\n * @return {String} the string value from enumValues\n */\n\nexport function decodeEnum(input, enumValues) {\n var str = decodeString(input);\n if (str == null) return str;\n return enumValues.includes(str) ? str : undefined;\n}\n/**\n * Encodes anything as a JSON string.\n *\n * @param {Any} any The thing to be encoded\n * @return {String} The JSON string representation of any\n */\n\nexport function encodeJson(any) {\n if (any == null) {\n return any;\n }\n\n return JSON.stringify(any);\n}\n/**\n * Decodes a JSON string into javascript\n *\n * If an array is provided, only the first entry is used.\n *\n * @param {String} input The JSON string representation\n * @return {Any} The javascript representation\n */\n\nexport function decodeJson(input) {\n var jsonStr = getEncodedValue(input);\n if (jsonStr == null) return jsonStr;\n var result = null;\n\n try {\n result = JSON.parse(jsonStr);\n } catch (e) {\n /* ignore errors, returning undefined */\n }\n\n return result;\n}\n/**\n * Encodes an array as a JSON string.\n *\n * @param {Array} array The array to be encoded\n * @return {String[]} The array of strings to be put in the URL\n * as repeated query parameters\n */\n\nexport function encodeArray(array) {\n if (array == null) {\n return array;\n }\n\n return array;\n}\n/**\n * Decodes an array or singular value and returns it as an array\n * or undefined if falsy. Filters out undefined values.\n *\n * @param {String | Array} input The input value\n * @return {Array} The javascript representation\n */\n\nexport function decodeArray(input) {\n var arr = getEncodedValueArray(input);\n if (arr == null) return arr;\n return arr;\n}\n/**\n * Encodes a numeric array as a JSON string.\n *\n * @param {Array} array The array to be encoded\n * @return {String[]} The array of strings to be put in the URL\n * as repeated query parameters\n */\n\nexport function encodeNumericArray(array) {\n if (array == null) {\n return array;\n }\n\n return array.map(String);\n}\n/**\n * Decodes an array or singular value and returns it as an array\n * or undefined if falsy. Filters out undefined and NaN values.\n *\n * @param {String | Array} input The input value\n * @return {Array} The javascript representation\n */\n\nexport function decodeNumericArray(input) {\n var arr = decodeArray(input);\n if (arr == null) return arr;\n return arr.map(function (d) {\n return d === '' || d == null ? null : +d;\n });\n}\n/**\n * Encodes an array as a delimited string. For example,\n * ['a', 'b'] -> 'a_b' with entrySeparator='_'\n *\n * @param array The array to be encoded\n * @param entrySeparator The string used to delimit entries\n * @return The array as a string with elements joined by the\n * entry separator\n */\n\nexport function encodeDelimitedArray(array, entrySeparator) {\n if (entrySeparator === void 0) {\n entrySeparator = '_';\n }\n\n if (array == null) {\n return array;\n }\n\n return array.join(entrySeparator);\n}\n/**\n * Decodes a delimited string into javascript array. For example,\n * 'a_b' -> ['a', 'b'] with entrySeparator='_'\n *\n * If an array is provided as input, only the first entry is used.\n *\n * @param {String} input The JSON string representation\n * @param entrySeparator The array as a string with elements joined by the\n * entry separator\n * @return {Array} The javascript representation\n */\n\nexport function decodeDelimitedArray(input, entrySeparator) {\n if (entrySeparator === void 0) {\n entrySeparator = '_';\n }\n\n var arrayStr = getEncodedValue(input, true);\n if (arrayStr == null) return arrayStr;\n if (arrayStr === '') return [];\n return arrayStr.split(entrySeparator);\n}\n/**\n * Encodes a numeric array as a delimited string. (alias of encodeDelimitedArray)\n * For example, [1, 2] -> '1_2' with entrySeparator='_'\n *\n * @param {Array} array The array to be encoded\n * @return {String} The JSON string representation of array\n */\n\nexport var encodeDelimitedNumericArray = encodeDelimitedArray;\n/**\n * Decodes a delimited string into javascript array where all entries are numbers\n * For example, '1_2' -> [1, 2] with entrySeparator='_'\n *\n * If an array is provided as input, only the first entry is used.\n *\n * @param {String} jsonStr The JSON string representation\n * @return {Array} The javascript representation\n */\n\nexport function decodeDelimitedNumericArray(arrayStr, entrySeparator) {\n if (entrySeparator === void 0) {\n entrySeparator = '_';\n }\n\n var decoded = decodeDelimitedArray(arrayStr, entrySeparator);\n if (decoded == null) return decoded;\n return decoded.map(function (d) {\n return d === '' || d == null ? null : +d;\n });\n}\n/**\n * Encode simple objects as readable strings. Works only for simple,\n * flat objects where values are numbers, strings.\n *\n * For example { foo: bar, boo: baz } -> \"foo-bar_boo-baz\"\n *\n * @param {Object} object The object to encode\n * @param {String} keyValSeparator=\"-\" The separator between keys and values\n * @param {String} entrySeparator=\"_\" The separator between entries\n * @return {String} The encoded object\n */\n\nexport function encodeObject(obj, keyValSeparator, entrySeparator) {\n if (keyValSeparator === void 0) {\n keyValSeparator = '-';\n }\n\n if (entrySeparator === void 0) {\n entrySeparator = '_';\n }\n\n if (obj == null) return obj; // null or undefined\n\n if (!Object.keys(obj).length) return ''; // {} case\n\n return Object.keys(obj).map(function (key) {\n return \"\" + key + keyValSeparator + obj[key];\n }).join(entrySeparator);\n}\n/**\n * Decodes a simple object to javascript. Currently works only for simple,\n * flat objects where values are strings.\n *\n * For example \"foo-bar_boo-baz\" -> { foo: bar, boo: baz }\n *\n * If an array is provided as input, only the first entry is used.\n *\n * @param {String} input The object string to decode\n * @param {String} keyValSeparator=\"-\" The separator between keys and values\n * @param {String} entrySeparator=\"_\" The separator between entries\n * @return {Object} The javascript object\n */\n\nexport function decodeObject(input, keyValSeparator, entrySeparator) {\n if (keyValSeparator === void 0) {\n keyValSeparator = '-';\n }\n\n if (entrySeparator === void 0) {\n entrySeparator = '_';\n }\n\n var objStr = getEncodedValue(input, true);\n if (objStr == null) return objStr;\n if (objStr === '') return {};\n var obj = {};\n var keyValSeparatorRegExp = new RegExp(keyValSeparator + \"(.*)\");\n objStr.split(entrySeparator).forEach(function (entryStr) {\n var _a = entryStr.split(keyValSeparatorRegExp),\n key = _a[0],\n value = _a[1];\n\n obj[key] = value;\n });\n return obj;\n}\n/**\n * Encode simple objects as readable strings. Alias of encodeObject.\n *\n * For example { foo: 123, boo: 521 } -> \"foo-123_boo-521\"\n *\n * @param {Object} object The object to encode\n * @param {String} keyValSeparator=\"-\" The separator between keys and values\n * @param {String} entrySeparator=\"_\" The separator between entries\n * @return {String} The encoded object\n */\n\nexport var encodeNumericObject = encodeObject;\n/**\n * Decodes a simple object to javascript where all values are numbers.\n * Currently works only for simple, flat objects.\n *\n * For example \"foo-123_boo-521\" -> { foo: 123, boo: 521 }\n *\n * If an array is provided as input, only the first entry is used.\n *\n * @param {String} input The object string to decode\n * @param {String} keyValSeparator=\"-\" The separator between keys and values\n * @param {String} entrySeparator=\"_\" The separator between entries\n * @return {Object} The javascript object\n */\n\nexport function decodeNumericObject(input, keyValSeparator, entrySeparator) {\n if (keyValSeparator === void 0) {\n keyValSeparator = '-';\n }\n\n if (entrySeparator === void 0) {\n entrySeparator = '_';\n }\n\n var decoded = decodeObject(input, keyValSeparator, entrySeparator);\n if (decoded == null) return decoded; // convert to numbers\n\n var decodedNumberObj = {};\n\n for (var _i = 0, _a = Object.keys(decoded); _i < _a.length; _i++) {\n var key = _a[_i];\n decodedNumberObj[key] = decodeNumber(decoded[key]);\n }\n\n return decodedNumberObj;\n}","import * as Serialize from './serialize';\n/**\n * String values\n */\n\nexport var StringParam = {\n encode: Serialize.encodeString,\n decode: Serialize.decodeString\n};\n/**\n * String enum\n */\n\nexport var createEnumParam = function (enumValues) {\n return {\n encode: Serialize.encodeString,\n decode: function (input) {\n return Serialize.decodeEnum(input, enumValues);\n }\n };\n};\n/**\n * Numbers (integers or floats)\n */\n\nexport var NumberParam = {\n encode: Serialize.encodeNumber,\n decode: Serialize.decodeNumber\n};\n/**\n * For flat objects where values are strings\n */\n\nexport var ObjectParam = {\n encode: Serialize.encodeObject,\n decode: Serialize.decodeObject\n};\n/**\n * For flat arrays of strings, filters out undefined values during decode\n */\n\nexport var ArrayParam = {\n encode: Serialize.encodeArray,\n decode: Serialize.decodeArray\n};\n/**\n * For flat arrays of strings, filters out undefined values during decode\n */\n\nexport var NumericArrayParam = {\n encode: Serialize.encodeNumericArray,\n decode: Serialize.decodeNumericArray\n};\n/**\n * For any type of data, encoded via JSON.stringify\n */\n\nexport var JsonParam = {\n encode: Serialize.encodeJson,\n decode: Serialize.decodeJson\n};\n/**\n * For simple dates (YYYY-MM-DD)\n */\n\nexport var DateParam = {\n encode: Serialize.encodeDate,\n decode: Serialize.decodeDate,\n equals: function (valueA, valueB) {\n if (valueA === valueB) return true;\n if (valueA == null || valueB == null) return valueA === valueB; // ignore time of day\n\n return valueA.getFullYear() === valueB.getFullYear() && valueA.getMonth() === valueB.getMonth() && valueA.getDate() === valueB.getDate();\n }\n};\n/**\n * For dates in simplified extended ISO format (YYYY-MM-DDTHH:mm:ss.sssZ or ±YYYYYY-MM-DDTHH:mm:ss.sssZ)\n */\n\nexport var DateTimeParam = {\n encode: Serialize.encodeDateTime,\n decode: Serialize.decodeDateTime,\n equals: function (valueA, valueB) {\n if (valueA === valueB) return true;\n if (valueA == null || valueB == null) return valueA === valueB;\n return valueA.valueOf() === valueB.valueOf();\n }\n};\n/**\n * For boolean values: 1 = true, 0 = false\n */\n\nexport var BooleanParam = {\n encode: Serialize.encodeBoolean,\n decode: Serialize.decodeBoolean\n};\n/**\n * For flat objects where the values are numbers\n */\n\nexport var NumericObjectParam = {\n encode: Serialize.encodeNumericObject,\n decode: Serialize.decodeNumericObject\n};\n/**\n * For flat arrays of strings, filters out undefined values during decode\n */\n\nexport var DelimitedArrayParam = {\n encode: Serialize.encodeDelimitedArray,\n decode: Serialize.decodeDelimitedArray\n};\n/**\n * For flat arrays where the values are numbers, filters out undefined values during decode\n */\n\nexport var DelimitedNumericArrayParam = {\n encode: Serialize.encodeDelimitedNumericArray,\n decode: Serialize.decodeDelimitedNumericArray\n};","var __assign = this && this.__assign || function () {\n __assign = Object.assign || function (t) {\n for (var s, i = 1, n = arguments.length; i < n; i++) {\n s = arguments[i];\n\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\n }\n\n return t;\n };\n\n return __assign.apply(this, arguments);\n};\n\nimport { stringify, parse as parseQueryString, parseUrl } from 'query-string';\n/**\n * An example of a transformSearchString function that undoes encoding of\n * common JSON characters that are technically allowed in URLs.\n */\n\nvar JSON_SAFE_CHARS = \"{}[],\\\":\".split('').map(function (d) {\n return [d, encodeURIComponent(d)];\n});\nexport function transformSearchStringJsonSafe(searchString) {\n var str = searchString;\n\n for (var _i = 0, JSON_SAFE_CHARS_1 = JSON_SAFE_CHARS; _i < JSON_SAFE_CHARS_1.length; _i++) {\n var _a = JSON_SAFE_CHARS_1[_i],\n char = _a[0],\n code = _a[1];\n str = str.replace(new RegExp('\\\\' + code, 'g'), char);\n }\n\n return str;\n}\n/**\n * Update a location, wiping out parameters not included in encodedQuery\n * If a param is set to undefined it will be removed from the URL.\n */\n\nexport function updateLocation(encodedQuery, location, stringifyOptions) {\n var encodedSearchString = stringify(encodedQuery, stringifyOptions);\n\n if (stringifyOptions && stringifyOptions.transformSearchString) {\n encodedSearchString = stringifyOptions.transformSearchString(encodedSearchString);\n }\n\n var search = encodedSearchString.length ? \"?\" + encodedSearchString : '';\n var href = parseUrl(location.href || '').url + search;\n\n var newLocation = __assign(__assign({}, location), {\n key: \"\" + Date.now(),\n // needed for some routers (e.g. react-router)\n href: href,\n search: search,\n query: encodedQuery\n });\n\n return newLocation;\n}\n/**\n * Update a location while retaining existing parameters.\n * If a param is set to undefined it will be removed from the URL.\n */\n\nexport function updateInLocation(encodedQueryReplacements, location, stringifyOptions) {\n // explicitly avoid parsing numbers to ensure the\n // return type has the same shape as EncodeQuery\n var currQuery = parseQueryString(location.search, {\n parseNumbers: false\n });\n\n var newQuery = __assign(__assign({}, currQuery), encodedQueryReplacements);\n\n return updateLocation(newQuery, location, stringifyOptions);\n}","/**\n * Convert the values in query to strings via the encode functions configured\n * in paramConfigMap\n *\n * @param paramConfigMap Map from query name to { encode, decode } config\n * @param query Query updates mapping param name to decoded value\n */\nexport function encodeQueryParams(paramConfigMap, query) {\n var encodedQuery = {};\n var paramNames = Object.keys(query);\n\n for (var _i = 0, paramNames_1 = paramNames; _i < paramNames_1.length; _i++) {\n var paramName = paramNames_1[_i];\n var decodedValue = query[paramName];\n\n if (!paramConfigMap[paramName]) {\n if (process.env.NODE_ENV === 'development') {\n console.warn(\"Encoding parameter \" + paramName + \" as string since it was not configured.\");\n } // NOTE: we could just not encode it, but it is probably convenient to have\n // it be included by default as a string type.\n\n\n encodedQuery[paramName] = decodedValue == null ? decodedValue : String(decodedValue);\n } else {\n encodedQuery[paramName] = paramConfigMap[paramName].encode(query[paramName]);\n }\n }\n\n return encodedQuery;\n}\nexport default encodeQueryParams;","/**\n * Copyright (c) 2013-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license at\n * https://github.com/facebook/fbjs/blob/master/LICENSE\n */\n\n/*eslint-disable no-self-compare */\nvar hasOwnProperty = Object.prototype.hasOwnProperty;\n/**\n * inlined Object.is polyfill to avoid requiring consumers ship their own\n * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/is\n */\n\nfunction is(x, y) {\n // SameValue algorithm\n if (x === y) {\n // Steps 1-5, 7-10\n // Steps 6.b-6.e: +0 != -0\n // Added the nonzero y check to make Flow happy, but it is redundant\n return x !== 0 || y !== 0 || 1 / x === 1 / y;\n } else {\n // Step 6.a: NaN == NaN\n return x !== x && y !== y;\n }\n}\n/**\n * Performs equality by iterating through keys on an object and returning false\n * when any key has values which are not strictly equal between the arguments.\n * Returns true when the values of all keys are strictly equal.\n\n * @pbeshai modification of shallowEqual to take into consideration a map providing\n * equals functions\n */\n\n\nexport default function shallowEqual(objA, objB, equalMap) {\n var _a, _b;\n\n if (is(objA, objB)) {\n return true;\n }\n\n if (typeof objA !== 'object' || objA === null || typeof objB !== 'object' || objB === null) {\n return false;\n }\n\n var keysA = Object.keys(objA);\n var keysB = Object.keys(objB);\n\n if (keysA.length !== keysB.length) {\n return false;\n } // Test for A's keys different from B.\n\n\n for (var i = 0; i < keysA.length; i++) {\n var isEqual = (_b = (_a = equalMap === null || equalMap === void 0 ? void 0 : equalMap[keysA[i]]) === null || _a === void 0 ? void 0 : _a.equals) !== null && _b !== void 0 ? _b : is;\n\n if (!hasOwnProperty.call(objB, keysA[i]) || !isEqual(objA[keysA[i]], objB[keysA[i]])) {\n return false;\n }\n }\n\n return true;\n}","import * as React from 'react';\nimport { extract } from 'query-string';\nimport shallowEqual from './shallowEqual';\nexport function useUpdateRefIfShallowNew(ref, newValue, isEqual) {\n if (isEqual === void 0) {\n isEqual = shallowEqual;\n }\n\n var hasNew = (ref.current == null || newValue == null) && ref.current === newValue || !isEqual(ref.current, newValue);\n React.useEffect(function () {\n if (hasNew) {\n ref.current = newValue;\n }\n }, [ref, newValue, hasNew]);\n}\nexport function getSSRSafeSearchString(location) {\n // handle checking SSR (#13)\n if (typeof location === 'object') {\n // in browser\n if (typeof window !== 'undefined') {\n return location.search;\n } else {\n return extract(\"\" + location.pathname + (location.search ? location.search : ''));\n }\n }\n\n return '';\n}","import { updateLocation, updateInLocation } from 'serialize-query-params';\n/**\n * Creates a new location object containing the specified query changes.\n * If replaceIn or pushIn are used as the updateType, then parameters\n * not specified in queryReplacements are retained. If replace or push\n * are used, only the values in queryReplacements will be available.\n * The default is pushIn.\n */\n\nexport function createLocationWithChanges(queryReplacements, location, updateType, stringifyOptions) {\n if (updateType === void 0) {\n updateType = 'pushIn';\n }\n\n switch (updateType) {\n case 'replace':\n case 'push':\n return updateLocation(queryReplacements, location, stringifyOptions);\n\n case 'replaceIn':\n case 'pushIn':\n default:\n return updateInLocation(queryReplacements, location, stringifyOptions);\n }\n}\n/**\n * Updates the URL to the new location.\n */\n\nexport function updateUrlQuery(history, location, updateType) {\n if (updateType === void 0) {\n updateType = 'pushIn';\n }\n\n switch (updateType) {\n case 'pushIn':\n case 'push':\n history.push(location);\n break;\n\n case 'replaceIn':\n case 'replace':\n default:\n history.replace(location);\n break;\n }\n}","import * as React from 'react';\nimport { updateUrlQuery, createLocationWithChanges } from './updateUrlQuery';\nvar providerlessContextValue = {\n location: {},\n getLocation: function () {\n return {};\n },\n setLocation: function () {}\n};\nexport var LocationContext = React.createContext(providerlessContextValue);\nexport function useLocationContext() {\n var context = React.useContext(LocationContext);\n\n if (process.env.NODE_ENV !== 'production' && (context === undefined || context === providerlessContextValue)) {\n throw new Error('useQueryParams must be used within a QueryParamProvider');\n }\n\n return context;\n}\n/**\n * An internal-only context provider which provides down the most\n * recent location object and a callback to update the history.\n */\n\nexport function LocationProvider(_a) {\n var history = _a.history,\n location = _a.location,\n children = _a.children,\n stringifyOptions = _a.stringifyOptions;\n var locationRef = React.useRef(location);\n React.useEffect(function () {\n locationRef.current = location;\n }, [location]); // TODO: we can probably simplify this now that we are reading location from history\n\n var getLocation = React.useCallback(function () {\n return locationRef.current;\n }, [locationRef]);\n var setLocation = React.useCallback(function (queryReplacements, updateType) {\n // A ref is needed here to stop setLocation updating constantly (see #46)\n locationRef.current = createLocationWithChanges(queryReplacements, history == null || history.location == null ? locationRef.current : history.location, updateType, stringifyOptions);\n\n if (history) {\n updateUrlQuery(history, locationRef.current, updateType);\n }\n }, [history, stringifyOptions]);\n return React.createElement(LocationContext.Provider, {\n value: {\n location: location,\n getLocation: getLocation,\n setLocation: setLocation\n }\n }, children);\n}","import { parse as parseQueryString } from 'query-string';\nexport var makeMemoizedQueryParser = function (initialSearchString) {\n var cachedSearchString = initialSearchString;\n var cachedParsedQuery = parseQueryString(cachedSearchString || '');\n return function (newSearchString) {\n if (cachedSearchString !== newSearchString) {\n cachedSearchString = newSearchString;\n cachedParsedQuery = parseQueryString(cachedSearchString);\n }\n\n return cachedParsedQuery;\n };\n};\nexport var sharedMemoizedQueryParser = makeMemoizedQueryParser();","import * as React from 'react';\nimport { StringParam } from 'serialize-query-params';\nimport { getSSRSafeSearchString, useUpdateRefIfShallowNew } from './helpers';\nimport { useLocationContext } from './LocationProvider';\nimport { sharedMemoizedQueryParser } from './memoizedQueryParser';\nimport shallowEqual from './shallowEqual';\n/**\n * Helper to get the latest decoded value with smart caching.\n * Abstracted into its own function to allow re-use in a functional setter (#26)\n */\n\nfunction getLatestDecodedValue(location, name, paramConfig, paramConfigRef, encodedValueCacheRef, decodedValueCacheRef) {\n var _a; // check if we have a new param config\n\n\n var hasNewParamConfig = !shallowEqual(paramConfigRef.current, paramConfig);\n var isValueEqual = (_a = paramConfig.equals) !== null && _a !== void 0 ? _a : shallowEqual; // read in the parsed query\n\n var parsedQuery = sharedMemoizedQueryParser(getSSRSafeSearchString(location) // get the latest location object\n ); // read in the encoded string value (we have to check cache if available because\n // sometimes the query string changes so we get a new parsedQuery but this value\n // didn't change, so we should avoid generating a new array or whatever value)\n\n var hasNewEncodedValue = !shallowEqual(encodedValueCacheRef.current, parsedQuery[name]);\n var encodedValue = hasNewEncodedValue ? parsedQuery[name] : encodedValueCacheRef.current; // only decode if we have changes to encoded value or the config.\n // check for undefined to handle initial case\n\n if (!hasNewEncodedValue && !hasNewParamConfig && decodedValueCacheRef.current !== undefined) {\n return decodedValueCacheRef.current;\n }\n\n var newDecodedValue = paramConfig.decode(encodedValue);\n var hasNewDecodedValue = (decodedValueCacheRef.current == null || newDecodedValue == null) && decodedValueCacheRef.current === newDecodedValue || !isValueEqual(decodedValueCacheRef.current, newDecodedValue); // if we have a new decoded value use it, otherwise use cached\n\n return hasNewDecodedValue ? newDecodedValue : decodedValueCacheRef.current;\n}\n/**\n * Given a query param name and query parameter configuration ({ encode, decode })\n * return the decoded value and a setter for updating it.\n *\n * The setter takes two arguments (newValue, updateType) where updateType\n * is one of 'replace' | 'replaceIn' | 'push' | 'pushIn', defaulting to\n * 'pushIn'.\n *\n * You may optionally pass in a rawQuery object, otherwise the query is derived\n * from the location available in the context.\n *\n * D = decoded type\n * D2 = return value from decode (typically same as D)\n */\n\n\nexport var useQueryParam = function (name, paramConfig) {\n if (paramConfig === void 0) {\n paramConfig = StringParam;\n }\n\n var _a = useLocationContext(),\n location = _a.location,\n getLocation = _a.getLocation,\n setLocation = _a.setLocation; // read in the raw query\n\n\n var parsedQuery = sharedMemoizedQueryParser(getSSRSafeSearchString(location)); // make caches\n\n var encodedValueCacheRef = React.useRef();\n var paramConfigRef = React.useRef(paramConfig);\n var decodedValueCacheRef = React.useRef();\n var decodedValue = getLatestDecodedValue(location, name, paramConfig, paramConfigRef, encodedValueCacheRef, decodedValueCacheRef); // update cached values in a useEffect\n\n useUpdateRefIfShallowNew(encodedValueCacheRef, parsedQuery[name]);\n useUpdateRefIfShallowNew(paramConfigRef, paramConfig);\n useUpdateRefIfShallowNew(decodedValueCacheRef, decodedValue, paramConfig.equals); // create the setter, memoizing via useCallback\n\n var setValueDeps = {\n paramConfig: paramConfig,\n name: name,\n setLocation: setLocation,\n getLocation: getLocation\n };\n var setValueDepsRef = React.useRef(setValueDeps);\n setValueDepsRef.current = setValueDeps;\n var setValue = React.useCallback(function setValueCallback(newValue, updateType) {\n var _a;\n\n var deps = setValueDepsRef.current;\n var newEncodedValue; // allow functional updates #26\n\n if (typeof newValue === 'function') {\n // get latest decoded value to pass as a fresh arg to the setter fn\n var latestValue = getLatestDecodedValue(deps.getLocation(), deps.name, deps.paramConfig, paramConfigRef, encodedValueCacheRef, decodedValueCacheRef);\n decodedValueCacheRef.current = latestValue; // keep cache in sync\n\n newEncodedValue = deps.paramConfig.encode(newValue(latestValue));\n } else {\n newEncodedValue = deps.paramConfig.encode(newValue);\n } // update the URL\n\n\n deps.setLocation((_a = {}, _a[deps.name] = newEncodedValue, _a), updateType);\n }, []);\n return [decodedValue, setValue];\n};","import * as React from 'react';\nimport { encodeQueryParams } from 'serialize-query-params';\nimport { getSSRSafeSearchString, useUpdateRefIfShallowNew } from './helpers';\nimport { useLocationContext } from './LocationProvider';\nimport { sharedMemoizedQueryParser } from './memoizedQueryParser';\nimport shallowEqual from './shallowEqual';\n/**\n * Helper to get the latest decoded values with smart caching.\n * Abstracted into its own function to allow re-use in a functional setter (#26)\n */\n\nfunction getLatestDecodedValues(location, paramConfigMap, paramConfigMapRef, parsedQueryRef, encodedValuesCacheRef, decodedValuesCacheRef) {\n // check if we have a new param config\n var hasNewParamConfigMap = !shallowEqual(paramConfigMapRef.current, paramConfigMap); // read in the parsed query\n\n var parsedQuery = sharedMemoizedQueryParser(getSSRSafeSearchString(location) // get the latest location object\n ); // check if new encoded values are around (new parsed query).\n // can use triple equals since we already cache this value\n\n var hasNewParsedQuery = parsedQueryRef.current !== parsedQuery; // if nothing has changed, use existing.. so long as we have existing.\n\n if (!hasNewParsedQuery && !hasNewParamConfigMap && encodedValuesCacheRef.current !== undefined) {\n return {\n encodedValues: encodedValuesCacheRef.current,\n decodedValues: decodedValuesCacheRef.current\n };\n }\n\n var encodedValuesCache = encodedValuesCacheRef.current || {};\n var decodedValuesCache = decodedValuesCacheRef.current || {};\n var encodedValues = {}; // we have new encoded values, so let's get new decoded values.\n // recompute new values but only for those that changed\n\n var paramNames = Object.keys(paramConfigMap);\n var decodedValues = {};\n\n for (var _i = 0, paramNames_1 = paramNames; _i < paramNames_1.length; _i++) {\n var paramName = paramNames_1[_i]; // do we have a new encoded value?\n\n var paramConfig = paramConfigMap[paramName];\n var hasNewEncodedValue = !shallowEqual(encodedValuesCache[paramName], parsedQuery[paramName]); // if we have a new encoded value, re-decode. otherwise reuse cache\n\n var encodedValue = void 0;\n var decodedValue = void 0;\n\n if (hasNewEncodedValue || encodedValuesCache[paramName] === undefined && decodedValuesCache[paramName] === undefined) {\n encodedValue = parsedQuery[paramName];\n decodedValue = paramConfig.decode(encodedValue);\n } else {\n encodedValue = encodedValuesCache[paramName];\n decodedValue = decodedValuesCache[paramName];\n }\n\n encodedValues[paramName] = encodedValue;\n decodedValues[paramName] = decodedValue;\n } // keep referential equality for decoded valus if we didn't actually change anything\n\n\n var hasNewDecodedValues = !shallowEqual(decodedValuesCacheRef.current, decodedValues, paramConfigMap);\n return {\n encodedValues: encodedValues,\n decodedValues: hasNewDecodedValues ? decodedValues : decodedValuesCacheRef.current\n };\n}\n/**\n * Given a query parameter configuration (mapping query param name to { encode, decode }),\n * return an object with the decoded values and a setter for updating them.\n */\n\n\nexport var useQueryParams = function (paramConfigMap) {\n var _a = useLocationContext(),\n location = _a.location,\n getLocation = _a.getLocation,\n setLocation = _a.setLocation; // read in the raw query\n\n\n var parsedQuery = sharedMemoizedQueryParser(getSSRSafeSearchString(location)); // make caches\n\n var paramConfigMapRef = React.useRef(paramConfigMap);\n var parsedQueryRef = React.useRef(parsedQuery);\n var encodedValuesCacheRef = React.useRef(undefined); // undefined for initial check\n\n var decodedValuesCacheRef = React.useRef({}); // memoize paramConfigMap to make the API nicer for consumers.\n // otherwise we'd have to useQueryParams(useMemo(() => { foo: NumberParam }, []))\n\n paramConfigMap = shallowEqual(paramConfigMap, paramConfigMapRef.current) ? paramConfigMapRef.current : paramConfigMap; // decode all the values if we have changes\n\n var _b = getLatestDecodedValues(location, paramConfigMap, paramConfigMapRef, parsedQueryRef, encodedValuesCacheRef, decodedValuesCacheRef),\n encodedValues = _b.encodedValues,\n decodedValues = _b.decodedValues; // update cached values in useEffects\n\n\n useUpdateRefIfShallowNew(parsedQueryRef, parsedQuery);\n useUpdateRefIfShallowNew(paramConfigMapRef, paramConfigMap);\n useUpdateRefIfShallowNew(encodedValuesCacheRef, encodedValues);\n useUpdateRefIfShallowNew(decodedValuesCacheRef, decodedValues, function (a, b) {\n return shallowEqual(a, b, paramConfigMap);\n }); // create a setter for updating multiple query params at once\n\n var setQueryDeps = {\n paramConfigMap: paramConfigMap,\n setLocation: setLocation,\n getLocation: getLocation\n };\n var setQueryDepsRef = React.useRef(setQueryDeps);\n setQueryDepsRef.current = setQueryDeps;\n var setQuery = React.useCallback(function (changes, updateType) {\n var deps = setQueryDepsRef.current;\n var encodedChanges;\n\n if (typeof changes === 'function') {\n // get latest decoded value to pass as a fresh arg to the setter fn\n var latestValues = getLatestDecodedValues(deps.getLocation(), deps.paramConfigMap, paramConfigMapRef, parsedQueryRef, encodedValuesCacheRef, decodedValuesCacheRef).decodedValues;\n decodedValuesCacheRef.current = latestValues; // keep cache in sync\n\n encodedChanges = encodeQueryParams(deps.paramConfigMap, changes(latestValues));\n } else {\n // encode as strings for the URL\n encodedChanges = encodeQueryParams(deps.paramConfigMap, changes);\n } // update the URL\n\n\n deps.setLocation(encodedChanges, updateType);\n }, []); // no longer Partial\n\n return [decodedValues, setQuery];\n};\nexport default useQueryParams;","import useQueryParams from './useQueryParams';\nexport var QueryParams = function (_a) {\n var config = _a.config,\n children = _a.children;\n\n var _b = useQueryParams(config),\n query = _b[0],\n setQuery = _b[1];\n\n return children({\n query: query,\n setQuery: setQuery\n });\n};\nexport default QueryParams;","var __assign = this && this.__assign || function () {\n __assign = Object.assign || function (t) {\n for (var s, i = 1, n = arguments.length; i < n; i++) {\n s = arguments[i];\n\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\n }\n\n return t;\n };\n\n return __assign.apply(this, arguments);\n};\n\nimport * as React from 'react';\nimport { LocationProvider } from './LocationProvider';\nimport shallowEqual from './shallowEqual'; // we use a lazy caching solution to prevent #46 from happening\n\nvar cachedWindowHistory;\nvar cachedAdaptedWindowHistory;\n/**\n * Adapts standard DOM window history to work with our\n * { replace, push } interface.\n *\n * @param history Standard history provided by DOM\n */\n\nfunction adaptWindowHistory(history) {\n if (history === cachedWindowHistory && cachedAdaptedWindowHistory != null) {\n return cachedAdaptedWindowHistory;\n }\n\n var adaptedWindowHistory = {\n replace: function (location) {\n history.replaceState(location.state, '', location.protocol + \"//\" + location.host + location.pathname + location.search);\n },\n push: function (location) {\n history.pushState(location.state, '', location.protocol + \"//\" + location.host + location.pathname + location.search);\n },\n\n get location() {\n return window.location;\n }\n\n };\n cachedWindowHistory = history;\n cachedAdaptedWindowHistory = adaptedWindowHistory;\n return adaptedWindowHistory;\n} // we use a lazy caching solution to prevent #46 from happening\n\n\nvar cachedReachHistory;\nvar cachedAdaptedReachHistory;\n/**\n * Adapts @reach/router history to work with our\n * { replace, push } interface.\n *\n * @param history globalHistory from @reach/router\n */\n\nfunction adaptReachHistory(history) {\n if (history === cachedReachHistory && cachedAdaptedReachHistory != null) {\n return cachedAdaptedReachHistory;\n }\n\n var adaptedReachHistory = {\n replace: function (location) {\n history.navigate(location.protocol + \"//\" + location.host + location.pathname + location.search, {\n replace: true\n });\n },\n push: function (location) {\n history.navigate(location.protocol + \"//\" + location.host + location.pathname + location.search, {\n replace: false\n });\n },\n\n get location() {\n return history.location;\n }\n\n };\n cachedReachHistory = history;\n cachedAdaptedReachHistory = adaptedReachHistory;\n return adaptedReachHistory;\n}\n/**\n * Helper to produce the context value falling back to\n * window history and location if not provided.\n */\n\n\nexport function getLocationProps(_a) {\n var _b = _a === void 0 ? {} : _a,\n history = _b.history,\n location = _b.location;\n\n var hasWindow = typeof window !== 'undefined';\n\n if (hasWindow) {\n if (!history) {\n history = adaptWindowHistory(window.history);\n }\n\n if (!location) {\n location = window.location;\n }\n }\n\n if (!location) {\n throw new Error(\"\\n Could not read the location. Is the router wired up correctly?\\n \");\n }\n\n return {\n history: history,\n location: location\n };\n}\n/**\n * Context provider for query params to have access to the\n * active routing system, enabling updates to the URL.\n */\n\nexport function QueryParamProvider(_a) {\n var children = _a.children,\n ReactRouterRoute = _a.ReactRouterRoute,\n reachHistory = _a.reachHistory,\n history = _a.history,\n location = _a.location,\n stringifyOptions = _a.stringifyOptions; // cache the stringify options object so we users can just do\n // \n\n var stringifyOptionsRef = React.useRef(stringifyOptions);\n var hasNewStringifyOptions = !shallowEqual(stringifyOptionsRef.current, stringifyOptions);\n var stringifyOptionsCached = hasNewStringifyOptions ? stringifyOptions : stringifyOptionsRef.current;\n React.useEffect(function () {\n stringifyOptionsRef.current = stringifyOptionsCached;\n }, [stringifyOptionsCached]); // if we have React Router, use it to get the context value\n\n if (ReactRouterRoute) {\n return React.createElement(ReactRouterRoute, null, function (routeProps) {\n return React.createElement(LocationProvider, __assign({\n stringifyOptions: stringifyOptionsCached\n }, getLocationProps(routeProps)), children);\n });\n } // if we are using reach router, use its history\n\n\n if (reachHistory) {\n return React.createElement(LocationProvider, __assign({\n stringifyOptions: stringifyOptionsCached\n }, getLocationProps({\n history: adaptReachHistory(reachHistory),\n location: location\n })), children);\n } // neither reach nor react-router, so allow manual overrides\n\n\n return React.createElement(LocationProvider, __assign({\n stringifyOptions: stringifyOptionsCached\n }, getLocationProps({\n history: history,\n location: location\n })), children);\n}\nexport default QueryParamProvider;","\"use strict\";\n\nvar _interopRequireDefault = require(\"@babel/runtime/helpers/interopRequireDefault\");\n\nexports.__esModule = true;\nexports.withPrefix = withPrefix;\nexports.withAssetPrefix = withAssetPrefix;\nexports.navigate = exports.default = void 0;\n\nvar _objectWithoutPropertiesLoose2 = _interopRequireDefault(require(\"@babel/runtime/helpers/objectWithoutPropertiesLoose\"));\n\nvar _assertThisInitialized2 = _interopRequireDefault(require(\"@babel/runtime/helpers/assertThisInitialized\"));\n\nvar _inheritsLoose2 = _interopRequireDefault(require(\"@babel/runtime/helpers/inheritsLoose\"));\n\nvar _extends2 = _interopRequireDefault(require(\"@babel/runtime/helpers/extends\"));\n\nvar _propTypes = _interopRequireDefault(require(\"prop-types\"));\n\nvar _react = _interopRequireDefault(require(\"react\"));\n\nvar _reachRouter = require(\"@gatsbyjs/reach-router\");\n\nvar _utils = require(\"@gatsbyjs/reach-router/lib/utils\");\n\nvar _parsePath = require(\"./parse-path\");\n\nexports.parsePath = _parsePath.parsePath;\nvar _excluded = [\"to\", \"getProps\", \"onClick\", \"onMouseEnter\", \"activeClassName\", \"activeStyle\", \"innerRef\", \"partiallyActive\", \"state\", \"replace\", \"_location\"];\n\nvar isAbsolutePath = function isAbsolutePath(path) {\n return path === null || path === void 0 ? void 0 : path.startsWith(\"/\");\n};\n\nfunction withPrefix(path, prefix) {\n var _ref, _prefix;\n\n if (prefix === void 0) {\n prefix = getGlobalBasePrefix();\n }\n\n if (!isLocalLink(path)) {\n return path;\n }\n\n if (path.startsWith(\"./\") || path.startsWith(\"../\")) {\n return path;\n }\n\n var base = (_ref = (_prefix = prefix) !== null && _prefix !== void 0 ? _prefix : getGlobalPathPrefix()) !== null && _ref !== void 0 ? _ref : \"/\";\n return \"\" + (base !== null && base !== void 0 && base.endsWith(\"/\") ? base.slice(0, -1) : base) + (path.startsWith(\"/\") ? path : \"/\" + path);\n} // These global values are wrapped in typeof clauses to ensure the values exist.\n// This is especially problematic in unit testing of this component.\n\n\nvar getGlobalPathPrefix = function getGlobalPathPrefix() {\n return process.env.NODE_ENV !== \"production\" ? typeof __PATH_PREFIX__ !== \"undefined\" ? __PATH_PREFIX__ : undefined : __PATH_PREFIX__;\n};\n\nvar getGlobalBasePrefix = function getGlobalBasePrefix() {\n return process.env.NODE_ENV !== \"production\" ? typeof __BASE_PATH__ !== \"undefined\" ? __BASE_PATH__ : undefined : __BASE_PATH__;\n};\n\nvar isLocalLink = function isLocalLink(path) {\n return path && !path.startsWith(\"http://\") && !path.startsWith(\"https://\") && !path.startsWith(\"//\");\n};\n\nfunction withAssetPrefix(path) {\n return withPrefix(path, getGlobalPathPrefix());\n}\n\nfunction absolutify(path, current) {\n // If it's already absolute, return as-is\n if (isAbsolutePath(path)) {\n return path;\n }\n\n return (0, _utils.resolve)(path, current);\n}\n\nvar rewriteLinkPath = function rewriteLinkPath(path, relativeTo) {\n if (typeof path === \"number\") {\n return path;\n }\n\n if (!isLocalLink(path)) {\n return path;\n }\n\n return isAbsolutePath(path) ? withPrefix(path) : absolutify(path, relativeTo);\n};\n\nvar NavLinkPropTypes = {\n activeClassName: _propTypes.default.string,\n activeStyle: _propTypes.default.object,\n partiallyActive: _propTypes.default.bool\n}; // Set up IntersectionObserver\n\nvar createIntersectionObserver = function createIntersectionObserver(el, cb) {\n var io = new window.IntersectionObserver(function (entries) {\n entries.forEach(function (entry) {\n if (el === entry.target) {\n // Check if element is within viewport, remove listener, destroy observer, and run link callback.\n // MSEdge doesn't currently support isIntersecting, so also test for an intersectionRatio > 0\n if (entry.isIntersecting || entry.intersectionRatio > 0) {\n io.unobserve(el);\n io.disconnect();\n cb();\n }\n }\n });\n }); // Add element to the observer\n\n io.observe(el);\n return {\n instance: io,\n el: el\n };\n};\n\nfunction GatsbyLinkLocationWrapper(props) {\n return /*#__PURE__*/_react.default.createElement(_reachRouter.Location, null, function (_ref2) {\n var location = _ref2.location;\n return /*#__PURE__*/_react.default.createElement(GatsbyLink, (0, _extends2.default)({}, props, {\n _location: location\n }));\n });\n}\n\nvar GatsbyLink = /*#__PURE__*/function (_React$Component) {\n (0, _inheritsLoose2.default)(GatsbyLink, _React$Component);\n\n function GatsbyLink(props) {\n var _this;\n\n _this = _React$Component.call(this, props) || this; // Default to no support for IntersectionObserver\n\n _this.defaultGetProps = function (_ref3) {\n var isPartiallyCurrent = _ref3.isPartiallyCurrent,\n isCurrent = _ref3.isCurrent;\n\n if (_this.props.partiallyActive ? isPartiallyCurrent : isCurrent) {\n return {\n className: [_this.props.className, _this.props.activeClassName].filter(Boolean).join(\" \"),\n style: (0, _extends2.default)({}, _this.props.style, _this.props.activeStyle)\n };\n }\n\n return null;\n };\n\n var IOSupported = false;\n\n if (typeof window !== \"undefined\" && window.IntersectionObserver) {\n IOSupported = true;\n }\n\n _this.state = {\n IOSupported: IOSupported\n };\n _this.handleRef = _this.handleRef.bind((0, _assertThisInitialized2.default)(_this));\n return _this;\n }\n\n var _proto = GatsbyLink.prototype;\n\n _proto._prefetch = function _prefetch() {\n var currentPath = window.location.pathname; // reach router should have the correct state\n\n if (this.props._location && this.props._location.pathname) {\n currentPath = this.props._location.pathname;\n }\n\n var rewrittenPath = rewriteLinkPath(this.props.to, currentPath);\n var newPathName = (0, _parsePath.parsePath)(rewrittenPath).pathname; // Prefech is used to speed up next navigations. When you use it on the current navigation,\n // there could be a race-condition where Chrome uses the stale data instead of waiting for the network to complete\n\n if (currentPath !== newPathName) {\n ___loader.enqueue(newPathName);\n }\n };\n\n _proto.componentDidUpdate = function componentDidUpdate(prevProps, prevState) {\n // Preserve non IO functionality if no support\n if (this.props.to !== prevProps.to && !this.state.IOSupported) {\n this._prefetch();\n }\n };\n\n _proto.componentDidMount = function componentDidMount() {\n // Preserve non IO functionality if no support\n if (!this.state.IOSupported) {\n this._prefetch();\n }\n };\n\n _proto.componentWillUnmount = function componentWillUnmount() {\n if (!this.io) {\n return;\n }\n\n var _this$io = this.io,\n instance = _this$io.instance,\n el = _this$io.el;\n instance.unobserve(el);\n instance.disconnect();\n };\n\n _proto.handleRef = function handleRef(ref) {\n var _this2 = this;\n\n if (this.props.innerRef && this.props.innerRef.hasOwnProperty(\"current\")) {\n this.props.innerRef.current = ref;\n } else if (this.props.innerRef) {\n this.props.innerRef(ref);\n }\n\n if (this.state.IOSupported && ref) {\n // If IO supported and element reference found, setup Observer functionality\n this.io = createIntersectionObserver(ref, function () {\n _this2._prefetch();\n });\n }\n };\n\n _proto.render = function render() {\n var _this3 = this;\n\n var _this$props = this.props,\n to = _this$props.to,\n _this$props$getProps = _this$props.getProps,\n getProps = _this$props$getProps === void 0 ? this.defaultGetProps : _this$props$getProps,\n _onClick = _this$props.onClick,\n _onMouseEnter = _this$props.onMouseEnter,\n $activeClassName = _this$props.activeClassName,\n $activeStyle = _this$props.activeStyle,\n $innerRef = _this$props.innerRef,\n partiallyActive = _this$props.partiallyActive,\n state = _this$props.state,\n replace = _this$props.replace,\n _location = _this$props._location,\n rest = (0, _objectWithoutPropertiesLoose2.default)(_this$props, _excluded);\n\n if (process.env.NODE_ENV !== \"production\" && !isLocalLink(to)) {\n console.warn(\"External link \" + to + \" was detected in a Link component. Use the Link component only for internal links. See: https://gatsby.dev/internal-links\");\n }\n\n var prefixedTo = rewriteLinkPath(to, _location.pathname);\n\n if (!isLocalLink(prefixedTo)) {\n return /*#__PURE__*/_react.default.createElement(\"a\", (0, _extends2.default)({\n href: prefixedTo\n }, rest));\n }\n\n return /*#__PURE__*/_react.default.createElement(_reachRouter.Link, (0, _extends2.default)({\n to: prefixedTo,\n state: state,\n getProps: getProps,\n innerRef: this.handleRef,\n onMouseEnter: function onMouseEnter(e) {\n if (_onMouseEnter) {\n _onMouseEnter(e);\n }\n\n ___loader.hovering((0, _parsePath.parsePath)(prefixedTo).pathname);\n },\n onClick: function onClick(e) {\n if (_onClick) {\n _onClick(e);\n }\n\n if (e.button === 0 && // ignore right clicks\n !_this3.props.target && // let browser handle \"target=_blank\"\n !e.defaultPrevented && // onClick prevented default\n !e.metaKey && // ignore clicks with modifier keys...\n !e.altKey && !e.ctrlKey && !e.shiftKey) {\n e.preventDefault();\n var shouldReplace = replace;\n\n var isCurrent = encodeURI(prefixedTo) === _location.pathname;\n\n if (typeof replace !== \"boolean\" && isCurrent) {\n shouldReplace = true;\n } // Make sure the necessary scripts and data are\n // loaded before continuing.\n\n\n window.___navigate(prefixedTo, {\n state: state,\n replace: shouldReplace\n });\n }\n\n return true;\n }\n }, rest));\n };\n\n return GatsbyLink;\n}(_react.default.Component);\n\nGatsbyLink.propTypes = (0, _extends2.default)({}, NavLinkPropTypes, {\n onClick: _propTypes.default.func,\n to: _propTypes.default.string.isRequired,\n replace: _propTypes.default.bool,\n state: _propTypes.default.object\n});\n\nvar _default = /*#__PURE__*/_react.default.forwardRef(function (props, ref) {\n return /*#__PURE__*/_react.default.createElement(GatsbyLinkLocationWrapper, (0, _extends2.default)({\n innerRef: ref\n }, props));\n});\n\nexports.default = _default;\n\nvar navigate = function navigate(to, options) {\n window.___navigate(rewriteLinkPath(to, window.location.pathname), options);\n};\n\nexports.navigate = navigate;","\"use strict\";\n\nexports.__esModule = true;\nexports.parsePath = parsePath;\n\nfunction parsePath(path) {\n var pathname = path || \"/\";\n var search = \"\";\n var hash = \"\";\n var hashIndex = pathname.indexOf(\"#\");\n\n if (hashIndex !== -1) {\n hash = pathname.substr(hashIndex);\n pathname = pathname.substr(0, hashIndex);\n }\n\n var searchIndex = pathname.indexOf(\"?\");\n\n if (searchIndex !== -1) {\n search = pathname.substr(searchIndex);\n pathname = pathname.substr(0, searchIndex);\n }\n\n return {\n pathname: pathname,\n search: search === \"?\" ? \"\" : search,\n hash: hash === \"#\" ? \"\" : hash\n };\n}","\"use strict\";\n\nexports.__esModule = true;\nexports.useScrollRestoration = exports.ScrollContext = void 0;\n\nvar _scrollHandler = require(\"./scroll-handler\");\n\nexports.ScrollContext = _scrollHandler.ScrollHandler;\n\nvar _useScrollRestoration = require(\"./use-scroll-restoration\");\n\nexports.useScrollRestoration = _useScrollRestoration.useScrollRestoration;","\"use strict\";\n\nvar _interopRequireDefault = require(\"@babel/runtime/helpers/interopRequireDefault\");\n\nexports.__esModule = true;\nexports.ScrollHandler = exports.ScrollContext = void 0;\n\nvar _assertThisInitialized2 = _interopRequireDefault(require(\"@babel/runtime/helpers/assertThisInitialized\"));\n\nvar _inheritsLoose2 = _interopRequireDefault(require(\"@babel/runtime/helpers/inheritsLoose\"));\n\nvar React = _interopRequireWildcard(require(\"react\"));\n\nvar _propTypes = _interopRequireDefault(require(\"prop-types\"));\n\nvar _sessionStorage = require(\"./session-storage\");\n\nfunction _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== \"function\") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }\n\nfunction _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== \"object\" && typeof obj !== \"function\") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== \"default\" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }\n\nvar ScrollContext = /*#__PURE__*/React.createContext(new _sessionStorage.SessionStorage());\nexports.ScrollContext = ScrollContext;\nScrollContext.displayName = \"GatsbyScrollContext\";\n\nvar ScrollHandler = /*#__PURE__*/function (_React$Component) {\n (0, _inheritsLoose2.default)(ScrollHandler, _React$Component);\n\n function ScrollHandler() {\n var _this;\n\n for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n args[_key] = arguments[_key];\n }\n\n _this = _React$Component.call.apply(_React$Component, [this].concat(args)) || this;\n _this._stateStorage = new _sessionStorage.SessionStorage();\n _this._isTicking = false;\n _this._latestKnownScrollY = 0;\n\n _this.scrollListener = function () {\n _this._latestKnownScrollY = window.scrollY;\n\n if (!_this._isTicking) {\n _this._isTicking = true;\n requestAnimationFrame(_this._saveScroll.bind((0, _assertThisInitialized2.default)(_this)));\n }\n };\n\n _this.windowScroll = function (position, prevProps) {\n if (_this.shouldUpdateScroll(prevProps, _this.props)) {\n window.scrollTo(0, position);\n }\n };\n\n _this.scrollToHash = function (hash, prevProps) {\n var node = document.getElementById(hash.substring(1));\n\n if (node && _this.shouldUpdateScroll(prevProps, _this.props)) {\n node.scrollIntoView();\n }\n };\n\n _this.shouldUpdateScroll = function (prevRouterProps, routerProps) {\n var shouldUpdateScroll = _this.props.shouldUpdateScroll;\n\n if (!shouldUpdateScroll) {\n return true;\n } // Hack to allow accessing this._stateStorage.\n\n\n return shouldUpdateScroll.call((0, _assertThisInitialized2.default)(_this), prevRouterProps, routerProps);\n };\n\n return _this;\n }\n\n var _proto = ScrollHandler.prototype;\n\n _proto._saveScroll = function _saveScroll() {\n var key = this.props.location.key || null;\n\n if (key) {\n this._stateStorage.save(this.props.location, key, this._latestKnownScrollY);\n }\n\n this._isTicking = false;\n };\n\n _proto.componentDidMount = function componentDidMount() {\n window.addEventListener(\"scroll\", this.scrollListener);\n var scrollPosition;\n var _this$props$location = this.props.location,\n key = _this$props$location.key,\n hash = _this$props$location.hash;\n\n if (key) {\n scrollPosition = this._stateStorage.read(this.props.location, key);\n }\n\n if (scrollPosition) {\n this.windowScroll(scrollPosition, undefined);\n } else if (hash) {\n this.scrollToHash(decodeURI(hash), undefined);\n }\n };\n\n _proto.componentWillUnmount = function componentWillUnmount() {\n window.removeEventListener(\"scroll\", this.scrollListener);\n };\n\n _proto.componentDidUpdate = function componentDidUpdate(prevProps) {\n var _this$props$location2 = this.props.location,\n hash = _this$props$location2.hash,\n key = _this$props$location2.key;\n var scrollPosition;\n\n if (key) {\n scrollPosition = this._stateStorage.read(this.props.location, key);\n }\n /** There are two pieces of state: the browser url and\n * history state which keeps track of scroll position\n * Native behaviour prescribes that we ought to restore scroll position\n * when a user navigates back in their browser (this is the `POP` action)\n * Currently, reach router has a bug that prevents this at https://github.com/reach/router/issues/228\n * So we _always_ stick to the url as a source of truth — if the url\n * contains a hash, we scroll to it\n */\n\n\n if (hash) {\n this.scrollToHash(decodeURI(hash), prevProps);\n } else {\n this.windowScroll(scrollPosition, prevProps);\n }\n };\n\n _proto.render = function render() {\n return /*#__PURE__*/React.createElement(ScrollContext.Provider, {\n value: this._stateStorage\n }, this.props.children);\n };\n\n return ScrollHandler;\n}(React.Component);\n\nexports.ScrollHandler = ScrollHandler;\nScrollHandler.propTypes = {\n shouldUpdateScroll: _propTypes.default.func,\n children: _propTypes.default.element.isRequired,\n location: _propTypes.default.object.isRequired\n};","\"use strict\";\n\nexports.__esModule = true;\nexports.SessionStorage = void 0;\nvar STATE_KEY_PREFIX = \"@@scroll|\";\nvar GATSBY_ROUTER_SCROLL_STATE = \"___GATSBY_REACT_ROUTER_SCROLL\";\n\nvar SessionStorage = /*#__PURE__*/function () {\n function SessionStorage() {}\n\n var _proto = SessionStorage.prototype;\n\n _proto.read = function read(location, key) {\n var stateKey = this.getStateKey(location, key);\n\n try {\n var value = window.sessionStorage.getItem(stateKey);\n return value ? JSON.parse(value) : 0;\n } catch (e) {\n if (process.env.NODE_ENV !== \"production\") {\n console.warn(\"[gatsby-react-router-scroll] Unable to access sessionStorage; sessionStorage is not available.\");\n }\n\n if (window && window[GATSBY_ROUTER_SCROLL_STATE] && window[GATSBY_ROUTER_SCROLL_STATE][stateKey]) {\n return window[GATSBY_ROUTER_SCROLL_STATE][stateKey];\n }\n\n return 0;\n }\n };\n\n _proto.save = function save(location, key, value) {\n var stateKey = this.getStateKey(location, key);\n var storedValue = JSON.stringify(value);\n\n try {\n window.sessionStorage.setItem(stateKey, storedValue);\n } catch (e) {\n if (window && window[GATSBY_ROUTER_SCROLL_STATE]) {\n window[GATSBY_ROUTER_SCROLL_STATE][stateKey] = JSON.parse(storedValue);\n } else {\n window[GATSBY_ROUTER_SCROLL_STATE] = {};\n window[GATSBY_ROUTER_SCROLL_STATE][stateKey] = JSON.parse(storedValue);\n }\n\n if (process.env.NODE_ENV !== \"production\") {\n console.warn(\"[gatsby-react-router-scroll] Unable to save state in sessionStorage; sessionStorage is not available.\");\n }\n }\n };\n\n _proto.getStateKey = function getStateKey(location, key) {\n var stateKeyBase = \"\" + STATE_KEY_PREFIX + location.pathname;\n return key === null || typeof key === \"undefined\" ? stateKeyBase : stateKeyBase + \"|\" + key;\n };\n\n return SessionStorage;\n}();\n\nexports.SessionStorage = SessionStorage;","\"use strict\";\n\nexports.__esModule = true;\nexports.useScrollRestoration = useScrollRestoration;\n\nvar _scrollHandler = require(\"./scroll-handler\");\n\nvar _react = require(\"react\");\n\nvar _reachRouter = require(\"@gatsbyjs/reach-router\");\n\nfunction useScrollRestoration(identifier) {\n var location = (0, _reachRouter.useLocation)();\n var state = (0, _react.useContext)(_scrollHandler.ScrollContext);\n var ref = (0, _react.useRef)(null);\n (0, _react.useLayoutEffect)(function () {\n if (ref.current) {\n var position = state.read(location, identifier);\n ref.current.scrollTo(0, position || 0);\n }\n }, [location.key]);\n return {\n ref: ref,\n onScroll: function onScroll() {\n if (ref.current) {\n state.save(location, identifier, ref.current.scrollTop);\n }\n }\n };\n}","// prefer default export if available\nconst preferDefault = m => (m && m.default) || m\n\nexports.components = {\n \"component---src-pages-404-tsx\": () => import(\"./../../../src/pages/404.tsx\" /* webpackChunkName: \"component---src-pages-404-tsx\" */),\n \"component---src-pages-index-tsx\": () => import(\"./../../../src/pages/index.tsx\" /* webpackChunkName: \"component---src-pages-index-tsx\" */),\n \"component---src-templates-book-book-tsx\": () => import(\"./../../../src/templates/Book/Book.tsx\" /* webpackChunkName: \"component---src-templates-book-book-tsx\" */),\n \"component---src-templates-protocol-protocol-tsx\": () => import(\"./../../../src/templates/Protocol/Protocol.tsx\" /* webpackChunkName: \"component---src-templates-protocol-protocol-tsx\" */),\n \"component---src-templates-search-search-tsx\": () => import(\"./../../../src/templates/Search/Search.tsx\" /* webpackChunkName: \"component---src-templates-search-search-tsx\" */)\n}\n\n","module.exports = [{\n plugin: require('../node_modules/gatsby-remark-autolink-headers/gatsby-browser.js'),\n options: {\"plugins\":[],\"icon\":false,\"maintainCase\":true,\"offsetY\":0,\"className\":\"anchor\"},\n },{\n plugin: require('../node_modules/gatsby-plugin-use-query-params/gatsby-browser.js'),\n options: {\"plugins\":[]},\n },{\n plugin: require('../node_modules/gatsby-plugin-manifest/gatsby-browser.js'),\n options: {\"plugins\":[],\"name\":\"DIDComm\",\"short_name\":\"DIDComm\",\"start_url\":\"/\",\"background_color\":\"#FFF\",\"theme_color\":\"#FFF\",\"display\":\"minimal-ui\",\"icon\":\"src/images/didcomm-logo.svg\",\"legacy\":true,\"theme_color_in_head\":true,\"cache_busting_mode\":\"query\",\"crossOrigin\":\"anonymous\",\"include_favicon\":true,\"cacheDigest\":\"b85920628d9d315a1905d4e53f7a73b6\"},\n },{\n plugin: require('../gatsby-browser.js'),\n options: {\"plugins\":[]},\n }]\n","const plugins = require(`./api-runner-browser-plugins`)\nconst { getResourceURLsForPathname, loadPage, loadPageSync } =\n require(`./loader`).publicLoader\n\nexports.apiRunner = (api, args = {}, defaultReturn, argTransform) => {\n // Hooks for gatsby-cypress's API handler\n if (process.env.CYPRESS_SUPPORT) {\n if (window.___apiHandler) {\n window.___apiHandler(api)\n } else if (window.___resolvedAPIs) {\n window.___resolvedAPIs.push(api)\n } else {\n window.___resolvedAPIs = [api]\n }\n }\n\n let results = plugins.map(plugin => {\n if (!plugin.plugin[api]) {\n return undefined\n }\n\n args.getResourceURLsForPathname = getResourceURLsForPathname\n args.loadPage = loadPage\n args.loadPageSync = loadPageSync\n\n const result = plugin.plugin[api](args, plugin.options)\n if (result && argTransform) {\n args = argTransform({ args, result, plugin })\n }\n return result\n })\n\n // Filter out undefined results.\n results = results.filter(result => typeof result !== `undefined`)\n\n if (results.length > 0) {\n return results\n } else if (defaultReturn) {\n return [defaultReturn]\n } else {\n return []\n }\n}\n\nexports.apiRunnerAsync = (api, args, defaultReturn) =>\n plugins.reduce(\n (previous, next) =>\n next.plugin[api]\n ? previous.then(() => next.plugin[api](args, next.options))\n : previous,\n Promise.resolve()\n )\n","import mitt from \"mitt\"\n\nconst emitter = mitt()\nexport default emitter\n","// \n// An event handler can take an optional event argument\n// and should not return a value\n \n \n\n// An array of all currently registered event handlers for a type\n \n \n// A map of event types and their corresponding event handlers.\n \n \n \n \n\n/** Mitt: Tiny (~200b) functional event emitter / pubsub.\n * @name mitt\n * @returns {Mitt}\n */\nfunction mitt(all ) {\n\tall = all || Object.create(null);\n\n\treturn {\n\t\t/**\n\t\t * Register an event handler for the given type.\n\t\t *\n\t\t * @param {String} type\tType of event to listen for, or `\"*\"` for all events\n\t\t * @param {Function} handler Function to call in response to given event\n\t\t * @memberOf mitt\n\t\t */\n\t\ton: function on(type , handler ) {\n\t\t\t(all[type] || (all[type] = [])).push(handler);\n\t\t},\n\n\t\t/**\n\t\t * Remove an event handler for the given type.\n\t\t *\n\t\t * @param {String} type\tType of event to unregister `handler` from, or `\"*\"`\n\t\t * @param {Function} handler Handler function to remove\n\t\t * @memberOf mitt\n\t\t */\n\t\toff: function off(type , handler ) {\n\t\t\tif (all[type]) {\n\t\t\t\tall[type].splice(all[type].indexOf(handler) >>> 0, 1);\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Invoke all handlers for the given type.\n\t\t * If present, `\"*\"` handlers are invoked after type-matched handlers.\n\t\t *\n\t\t * @param {String} type The event type to invoke\n\t\t * @param {Any} [evt] Any value (object is recommended and powerful), passed to each handler\n\t\t * @memberOf mitt\n\t\t */\n\t\temit: function emit(type , evt ) {\n\t\t\t(all[type] || []).slice().map(function (handler) { handler(evt); });\n\t\t\t(all['*'] || []).slice().map(function (handler) { handler(type, evt); });\n\t\t}\n\t};\n}\n\nexport default mitt;\n//# sourceMappingURL=mitt.es.js.map\n","export default path => {\n if (path === undefined) {\n return path\n }\n if (path === `/`) {\n return `/`\n }\n if (path.charAt(path.length - 1) === `/`) {\n return path.slice(0, -1)\n }\n return path\n}\n","import { pick } from \"@gatsbyjs/reach-router/lib/utils\"\nimport stripPrefix from \"./strip-prefix\"\nimport normalizePagePath from \"./normalize-page-path\"\nimport { maybeGetBrowserRedirect } from \"./redirect-utils.js\"\n\nconst pathCache = new Map()\nlet matchPaths = []\n\nconst trimPathname = rawPathname => {\n const pathname = decodeURIComponent(rawPathname)\n // Remove the pathPrefix from the pathname.\n const trimmedPathname = stripPrefix(\n pathname,\n decodeURIComponent(__BASE_PATH__)\n )\n // Remove any hashfragment\n .split(`#`)[0]\n // Remove search query\n .split(`?`)[0]\n\n return trimmedPathname\n}\n\nfunction absolutify(path) {\n // If it's already absolute, return as-is\n if (\n path.startsWith(`/`) ||\n path.startsWith(`https://`) ||\n path.startsWith(`http://`)\n ) {\n return path\n }\n // Calculate path relative to current location, adding a trailing slash to\n // match behavior of @reach/router\n return new URL(\n path,\n window.location.href + (window.location.href.endsWith(`/`) ? `` : `/`)\n ).pathname\n}\n\n/**\n * Set list of matchPaths\n *\n * @param {Array<{path: string, matchPath: string}>} value collection of matchPaths\n */\nexport const setMatchPaths = value => {\n matchPaths = value\n}\n\n/**\n * Return a matchpath url\n * if `match-paths.json` contains `{ \"/foo*\": \"/page1\", ...}`, then\n * `/foo?bar=far` => `/page1`\n *\n * @param {string} rawPathname A raw pathname\n * @return {string|null}\n */\nexport const findMatchPath = rawPathname => {\n const trimmedPathname = cleanPath(rawPathname)\n\n const pickPaths = matchPaths.map(({ path, matchPath }) => {\n return {\n path: matchPath,\n originalPath: path,\n }\n })\n\n const path = pick(pickPaths, trimmedPathname)\n\n if (path) {\n return normalizePagePath(path.route.originalPath)\n }\n\n return null\n}\n\n/**\n * Return a matchpath params from reach/router rules\n * if `match-paths.json` contains `{ \":bar/*foo\" }`, and the path is /baz/zaz/zoo\n * then it returns\n * { bar: baz, foo: zaz/zoo }\n *\n * @param {string} rawPathname A raw pathname\n * @return {object}\n */\nexport const grabMatchParams = rawPathname => {\n const trimmedPathname = cleanPath(rawPathname)\n\n const pickPaths = matchPaths.map(({ path, matchPath }) => {\n return {\n path: matchPath,\n originalPath: path,\n }\n })\n\n const path = pick(pickPaths, trimmedPathname)\n\n if (path) {\n return path.params\n }\n\n return {}\n}\n\n// Given a raw URL path, returns the cleaned version of it (trim off\n// `#` and query params), or if it matches an entry in\n// `match-paths.json`, its matched path is returned\n//\n// E.g. `/foo?bar=far` => `/foo`\n//\n// Or if `match-paths.json` contains `{ \"/foo*\": \"/page1\", ...}`, then\n// `/foo?bar=far` => `/page1`\nexport const findPath = rawPathname => {\n const trimmedPathname = trimPathname(absolutify(rawPathname))\n if (pathCache.has(trimmedPathname)) {\n return pathCache.get(trimmedPathname)\n }\n\n const redirect = maybeGetBrowserRedirect(rawPathname)\n if (redirect) {\n return findPath(redirect.toPath)\n }\n\n let foundPath = findMatchPath(trimmedPathname)\n\n if (!foundPath) {\n foundPath = cleanPath(rawPathname)\n }\n\n pathCache.set(trimmedPathname, foundPath)\n\n return foundPath\n}\n\n/**\n * Clean a url and converts /index.html => /\n * E.g. `/foo?bar=far` => `/foo`\n *\n * @param {string} rawPathname A raw pathname\n * @return {string}\n */\nexport const cleanPath = rawPathname => {\n const trimmedPathname = trimPathname(absolutify(rawPathname))\n\n let foundPath = trimmedPathname\n if (foundPath === `/index.html`) {\n foundPath = `/`\n }\n\n foundPath = normalizePagePath(foundPath)\n\n return foundPath\n}\n","import React from \"react\"\nimport PropTypes from \"prop-types\"\nimport Link, {\n withPrefix,\n withAssetPrefix,\n navigate,\n push,\n replace,\n navigateTo,\n parsePath,\n} from \"gatsby-link\"\nimport { useScrollRestoration } from \"gatsby-react-router-scroll\"\nimport PageRenderer from \"./public-page-renderer\"\nimport loader from \"./loader\"\n\nconst prefetchPathname = loader.enqueue\n\nconst StaticQueryContext = React.createContext({})\n\nfunction StaticQueryDataRenderer({ staticQueryData, data, query, render }) {\n const finalData = data\n ? data.data\n : staticQueryData[query] && staticQueryData[query].data\n\n return (\n \n {finalData && render(finalData)}\n {!finalData &&
Loading (StaticQuery)
}\n
\n )\n}\n\nconst StaticQuery = props => {\n const { data, query, render, children } = props\n\n return (\n \n {staticQueryData => (\n \n )}\n \n )\n}\n\nconst useStaticQuery = query => {\n if (\n typeof React.useContext !== `function` &&\n process.env.NODE_ENV === `development`\n ) {\n throw new Error(\n `You're likely using a version of React that doesn't support Hooks\\n` +\n `Please update React and ReactDOM to 16.8.0 or later to use the useStaticQuery hook.`\n )\n }\n const context = React.useContext(StaticQueryContext)\n\n // query is a stringified number like `3303882` when wrapped with graphql, If a user forgets\n // to wrap the query in a grqphql, then casting it to a Number results in `NaN` allowing us to\n // catch the misuse of the API and give proper direction\n if (isNaN(Number(query))) {\n throw new Error(`useStaticQuery was called with a string but expects to be called using \\`graphql\\`. Try this:\n\nimport { useStaticQuery, graphql } from 'gatsby';\n\nuseStaticQuery(graphql\\`${query}\\`);\n`)\n }\n\n if (context[query]?.data) {\n return context[query].data\n } else {\n throw new Error(\n `The result of this StaticQuery could not be fetched.\\n\\n` +\n `This is likely a bug in Gatsby and if refreshing the page does not fix it, ` +\n `please open an issue in https://github.com/gatsbyjs/gatsby/issues`\n )\n }\n}\n\nStaticQuery.propTypes = {\n data: PropTypes.object,\n query: PropTypes.string.isRequired,\n render: PropTypes.func,\n children: PropTypes.func,\n}\n\nfunction graphql() {\n throw new Error(\n `It appears like Gatsby is misconfigured. Gatsby related \\`graphql\\` calls ` +\n `are supposed to only be evaluated at compile time, and then compiled away. ` +\n `Unfortunately, something went wrong and the query was left in the compiled code.\\n\\n` +\n `Unless your site has a complex or custom babel/Gatsby configuration this is likely a bug in Gatsby.`\n )\n}\n\nexport {\n Link,\n withAssetPrefix,\n withPrefix,\n graphql,\n parsePath,\n navigate,\n useScrollRestoration,\n StaticQueryContext,\n StaticQuery,\n PageRenderer,\n useStaticQuery,\n prefetchPathname,\n}\n","const support = function (feature) {\n if (typeof document === `undefined`) {\n return false\n }\n const fakeLink = document.createElement(`link`)\n try {\n if (fakeLink.relList && typeof fakeLink.relList.supports === `function`) {\n return fakeLink.relList.supports(feature)\n }\n } catch (err) {\n return false\n }\n return false\n}\n\nconst linkPrefetchStrategy = function (url, options) {\n return new Promise((resolve, reject) => {\n if (typeof document === `undefined`) {\n reject()\n return\n }\n\n const link = document.createElement(`link`)\n link.setAttribute(`rel`, `prefetch`)\n link.setAttribute(`href`, url)\n\n Object.keys(options).forEach(key => {\n link.setAttribute(key, options[key])\n })\n\n link.onload = resolve\n link.onerror = reject\n\n const parentElement =\n document.getElementsByTagName(`head`)[0] ||\n document.getElementsByName(`script`)[0].parentNode\n parentElement.appendChild(link)\n })\n}\n\nconst xhrPrefetchStrategy = function (url) {\n return new Promise((resolve, reject) => {\n const req = new XMLHttpRequest()\n req.open(`GET`, url, true)\n\n req.onload = () => {\n if (req.status === 200) {\n resolve()\n } else {\n reject()\n }\n }\n\n req.send(null)\n })\n}\n\nconst supportedPrefetchStrategy = support(`prefetch`)\n ? linkPrefetchStrategy\n : xhrPrefetchStrategy\n\nconst preFetched = {}\n\nconst prefetch = function (url, options) {\n return new Promise(resolve => {\n if (preFetched[url]) {\n resolve()\n return\n }\n\n supportedPrefetchStrategy(url, options)\n .then(() => {\n resolve()\n preFetched[url] = true\n })\n .catch(() => {}) // 404s are logged to the console anyway\n })\n}\n\nexport default prefetch\n","import prefetchHelper from \"./prefetch\"\nimport emitter from \"./emitter\"\nimport { setMatchPaths, findPath, findMatchPath } from \"./find-path\"\n\n/**\n * Available resource loading statuses\n */\nexport const PageResourceStatus = {\n /**\n * At least one of critical resources failed to load\n */\n Error: `error`,\n /**\n * Resources loaded successfully\n */\n Success: `success`,\n}\n\nconst preferDefault = m => (m && m.default) || m\n\nconst stripSurroundingSlashes = s => {\n s = s[0] === `/` ? s.slice(1) : s\n s = s.endsWith(`/`) ? s.slice(0, -1) : s\n return s\n}\n\nconst createPageDataUrl = path => {\n const fixedPath = path === `/` ? `index` : stripSurroundingSlashes(path)\n return `${__PATH_PREFIX__}/page-data/${fixedPath}/page-data.json`\n}\n\nfunction doFetch(url, method = `GET`) {\n return new Promise((resolve, reject) => {\n const req = new XMLHttpRequest()\n req.open(method, url, true)\n req.onreadystatechange = () => {\n if (req.readyState == 4) {\n resolve(req)\n }\n }\n req.send(null)\n })\n}\n\nconst doesConnectionSupportPrefetch = () => {\n if (\n `connection` in navigator &&\n typeof navigator.connection !== `undefined`\n ) {\n if ((navigator.connection.effectiveType || ``).includes(`2g`)) {\n return false\n }\n if (navigator.connection.saveData) {\n return false\n }\n }\n return true\n}\n\nconst toPageResources = (pageData, component = null) => {\n const page = {\n componentChunkName: pageData.componentChunkName,\n path: pageData.path,\n webpackCompilationHash: pageData.webpackCompilationHash,\n matchPath: pageData.matchPath,\n staticQueryHashes: pageData.staticQueryHashes,\n }\n\n return {\n component,\n json: pageData.result,\n page,\n }\n}\n\nexport class BaseLoader {\n constructor(loadComponent, matchPaths) {\n // Map of pagePath -> Page. Where Page is an object with: {\n // status: PageResourceStatus.Success || PageResourceStatus.Error,\n // payload: PageResources, // undefined if PageResourceStatus.Error\n // }\n // PageResources is {\n // component,\n // json: pageData.result,\n // page: {\n // componentChunkName,\n // path,\n // webpackCompilationHash,\n // staticQueryHashes\n // },\n // staticQueryResults\n // }\n this.pageDb = new Map()\n this.inFlightDb = new Map()\n this.staticQueryDb = {}\n this.pageDataDb = new Map()\n this.prefetchTriggered = new Set()\n this.prefetchCompleted = new Set()\n this.loadComponent = loadComponent\n setMatchPaths(matchPaths)\n }\n\n inFlightNetworkRequests = new Map()\n\n memoizedGet(url) {\n let inFlightPromise = this.inFlightNetworkRequests.get(url)\n\n if (!inFlightPromise) {\n inFlightPromise = doFetch(url, `GET`)\n this.inFlightNetworkRequests.set(url, inFlightPromise)\n }\n\n // Prefer duplication with then + catch over .finally to prevent problems in ie11 + firefox\n return inFlightPromise\n .then(response => {\n this.inFlightNetworkRequests.delete(url)\n return response\n })\n .catch(err => {\n this.inFlightNetworkRequests.delete(url)\n throw err\n })\n }\n\n setApiRunner(apiRunner) {\n this.apiRunner = apiRunner\n this.prefetchDisabled = apiRunner(`disableCorePrefetching`).some(a => a)\n }\n\n fetchPageDataJson(loadObj) {\n const { pagePath, retries = 0 } = loadObj\n const url = createPageDataUrl(pagePath)\n return this.memoizedGet(url).then(req => {\n const { status, responseText } = req\n\n // Handle 200\n if (status === 200) {\n try {\n const jsonPayload = JSON.parse(responseText)\n if (jsonPayload.path === undefined) {\n throw new Error(`not a valid pageData response`)\n }\n\n return Object.assign(loadObj, {\n status: PageResourceStatus.Success,\n payload: jsonPayload,\n })\n } catch (err) {\n // continue regardless of error\n }\n }\n\n // Handle 404\n if (status === 404 || status === 200) {\n // If the request was for a 404 page and it doesn't exist, we're done\n if (pagePath === `/404.html`) {\n return Object.assign(loadObj, {\n status: PageResourceStatus.Error,\n })\n }\n\n // Need some code here to cache the 404 request. In case\n // multiple loadPageDataJsons result in 404s\n return this.fetchPageDataJson(\n Object.assign(loadObj, { pagePath: `/404.html`, notFound: true })\n )\n }\n\n // handle 500 response (Unrecoverable)\n if (status === 500) {\n return Object.assign(loadObj, {\n status: PageResourceStatus.Error,\n })\n }\n\n // Handle everything else, including status === 0, and 503s. Should retry\n if (retries < 3) {\n return this.fetchPageDataJson(\n Object.assign(loadObj, { retries: retries + 1 })\n )\n }\n\n // Retried 3 times already, result is an error.\n return Object.assign(loadObj, {\n status: PageResourceStatus.Error,\n })\n })\n }\n\n loadPageDataJson(rawPath) {\n const pagePath = findPath(rawPath)\n if (this.pageDataDb.has(pagePath)) {\n const pageData = this.pageDataDb.get(pagePath)\n if (process.env.BUILD_STAGE !== `develop` || !pageData.stale) {\n return Promise.resolve(pageData)\n }\n }\n\n return this.fetchPageDataJson({ pagePath }).then(pageData => {\n this.pageDataDb.set(pagePath, pageData)\n\n return pageData\n })\n }\n\n findMatchPath(rawPath) {\n return findMatchPath(rawPath)\n }\n\n // TODO check all uses of this and whether they use undefined for page resources not exist\n loadPage(rawPath) {\n const pagePath = findPath(rawPath)\n if (this.pageDb.has(pagePath)) {\n const page = this.pageDb.get(pagePath)\n if (process.env.BUILD_STAGE !== `develop` || !page.payload.stale) {\n if (page.error) {\n return {\n error: page.error,\n status: page.status,\n }\n }\n\n return Promise.resolve(page.payload)\n }\n }\n\n if (this.inFlightDb.has(pagePath)) {\n return this.inFlightDb.get(pagePath)\n }\n\n const inFlightPromise = Promise.all([\n this.loadAppData(),\n this.loadPageDataJson(pagePath),\n ]).then(allData => {\n const result = allData[1]\n if (result.status === PageResourceStatus.Error) {\n return {\n status: PageResourceStatus.Error,\n }\n }\n\n let pageData = result.payload\n const { componentChunkName, staticQueryHashes = [] } = pageData\n\n const finalResult = {}\n\n const componentChunkPromise = this.loadComponent(componentChunkName).then(\n component => {\n finalResult.createdAt = new Date()\n let pageResources\n if (!component || component instanceof Error) {\n finalResult.status = PageResourceStatus.Error\n finalResult.error = component\n } else {\n finalResult.status = PageResourceStatus.Success\n if (result.notFound === true) {\n finalResult.notFound = true\n }\n pageData = Object.assign(pageData, {\n webpackCompilationHash: allData[0]\n ? allData[0].webpackCompilationHash\n : ``,\n })\n pageResources = toPageResources(pageData, component)\n }\n // undefined if final result is an error\n return pageResources\n }\n )\n\n const staticQueryBatchPromise = Promise.all(\n staticQueryHashes.map(staticQueryHash => {\n // Check for cache in case this static query result has already been loaded\n if (this.staticQueryDb[staticQueryHash]) {\n const jsonPayload = this.staticQueryDb[staticQueryHash]\n return { staticQueryHash, jsonPayload }\n }\n\n return this.memoizedGet(\n `${__PATH_PREFIX__}/page-data/sq/d/${staticQueryHash}.json`\n )\n .then(req => {\n const jsonPayload = JSON.parse(req.responseText)\n return { staticQueryHash, jsonPayload }\n })\n .catch(() => {\n throw new Error(\n `We couldn't load \"${__PATH_PREFIX__}/page-data/sq/d/${staticQueryHash}.json\"`\n )\n })\n })\n ).then(staticQueryResults => {\n const staticQueryResultsMap = {}\n\n staticQueryResults.forEach(({ staticQueryHash, jsonPayload }) => {\n staticQueryResultsMap[staticQueryHash] = jsonPayload\n this.staticQueryDb[staticQueryHash] = jsonPayload\n })\n\n return staticQueryResultsMap\n })\n\n return (\n Promise.all([componentChunkPromise, staticQueryBatchPromise])\n .then(([pageResources, staticQueryResults]) => {\n let payload\n if (pageResources) {\n payload = { ...pageResources, staticQueryResults }\n finalResult.payload = payload\n emitter.emit(`onPostLoadPageResources`, {\n page: payload,\n pageResources: payload,\n })\n }\n\n this.pageDb.set(pagePath, finalResult)\n\n if (finalResult.error) {\n return {\n error: finalResult.error,\n status: finalResult.status,\n }\n }\n\n return payload\n })\n // when static-query fail to load we throw a better error\n .catch(err => {\n return {\n error: err,\n status: PageResourceStatus.Error,\n }\n })\n )\n })\n\n inFlightPromise\n .then(() => {\n this.inFlightDb.delete(pagePath)\n })\n .catch(error => {\n this.inFlightDb.delete(pagePath)\n throw error\n })\n\n this.inFlightDb.set(pagePath, inFlightPromise)\n\n return inFlightPromise\n }\n\n // returns undefined if the page does not exists in cache\n loadPageSync(rawPath, options = {}) {\n const pagePath = findPath(rawPath)\n if (this.pageDb.has(pagePath)) {\n const pageData = this.pageDb.get(pagePath)\n\n if (pageData.payload) {\n return pageData.payload\n }\n\n if (options?.withErrorDetails) {\n return {\n error: pageData.error,\n status: pageData.status,\n }\n }\n }\n return undefined\n }\n\n shouldPrefetch(pagePath) {\n // Skip prefetching if we know user is on slow or constrained connection\n if (!doesConnectionSupportPrefetch()) {\n return false\n }\n\n // Check if the page exists.\n if (this.pageDb.has(pagePath)) {\n return false\n }\n\n return true\n }\n\n prefetch(pagePath) {\n if (!this.shouldPrefetch(pagePath)) {\n return false\n }\n\n // Tell plugins with custom prefetching logic that they should start\n // prefetching this path.\n if (!this.prefetchTriggered.has(pagePath)) {\n this.apiRunner(`onPrefetchPathname`, { pathname: pagePath })\n this.prefetchTriggered.add(pagePath)\n }\n\n // If a plugin has disabled core prefetching, stop now.\n if (this.prefetchDisabled) {\n return false\n }\n\n const realPath = findPath(pagePath)\n // Todo make doPrefetch logic cacheable\n // eslint-disable-next-line consistent-return\n this.doPrefetch(realPath).then(() => {\n if (!this.prefetchCompleted.has(pagePath)) {\n this.apiRunner(`onPostPrefetchPathname`, { pathname: pagePath })\n this.prefetchCompleted.add(pagePath)\n }\n })\n\n return true\n }\n\n doPrefetch(pagePath) {\n const pageDataUrl = createPageDataUrl(pagePath)\n return prefetchHelper(pageDataUrl, {\n crossOrigin: `anonymous`,\n as: `fetch`,\n }).then(() =>\n // This was just prefetched, so will return a response from\n // the cache instead of making another request to the server\n this.loadPageDataJson(pagePath)\n )\n }\n\n hovering(rawPath) {\n this.loadPage(rawPath)\n }\n\n getResourceURLsForPathname(rawPath) {\n const pagePath = findPath(rawPath)\n const page = this.pageDataDb.get(pagePath)\n if (page) {\n const pageResources = toPageResources(page.payload)\n\n return [\n ...createComponentUrls(pageResources.page.componentChunkName),\n createPageDataUrl(pagePath),\n ]\n } else {\n return null\n }\n }\n\n isPageNotFound(rawPath) {\n const pagePath = findPath(rawPath)\n const page = this.pageDb.get(pagePath)\n return !page || page.notFound\n }\n\n loadAppData(retries = 0) {\n return this.memoizedGet(`${__PATH_PREFIX__}/page-data/app-data.json`).then(\n req => {\n const { status, responseText } = req\n\n let appData\n\n if (status !== 200 && retries < 3) {\n // Retry 3 times incase of non-200 responses\n return this.loadAppData(retries + 1)\n }\n\n // Handle 200\n if (status === 200) {\n try {\n const jsonPayload = JSON.parse(responseText)\n if (jsonPayload.webpackCompilationHash === undefined) {\n throw new Error(`not a valid app-data response`)\n }\n\n appData = jsonPayload\n } catch (err) {\n // continue regardless of error\n }\n }\n\n return appData\n }\n )\n }\n}\n\nconst createComponentUrls = componentChunkName =>\n (window.___chunkMapping[componentChunkName] || []).map(\n chunk => __PATH_PREFIX__ + chunk\n )\n\nexport class ProdLoader extends BaseLoader {\n constructor(asyncRequires, matchPaths, pageData) {\n const loadComponent = chunkName => {\n if (!asyncRequires.components[chunkName]) {\n throw new Error(\n `We couldn't find the correct component chunk with the name ${chunkName}`\n )\n }\n\n return (\n asyncRequires.components[chunkName]()\n .then(preferDefault)\n // loader will handle the case when component is error\n .catch(err => err)\n )\n }\n\n super(loadComponent, matchPaths)\n\n if (pageData) {\n this.pageDataDb.set(pageData.path, {\n pagePath: pageData.path,\n payload: pageData,\n status: `success`,\n })\n }\n }\n\n doPrefetch(pagePath) {\n return super.doPrefetch(pagePath).then(result => {\n if (result.status !== PageResourceStatus.Success) {\n return Promise.resolve()\n }\n const pageData = result.payload\n const chunkName = pageData.componentChunkName\n const componentUrls = createComponentUrls(chunkName)\n return Promise.all(componentUrls.map(prefetchHelper)).then(() => pageData)\n })\n }\n\n loadPageDataJson(rawPath) {\n return super.loadPageDataJson(rawPath).then(data => {\n if (data.notFound) {\n // check if html file exist using HEAD request:\n // if it does we should navigate to it instead of showing 404\n return doFetch(rawPath, `HEAD`).then(req => {\n if (req.status === 200) {\n // page (.html file) actually exist (or we asked for 404 )\n // returning page resources status as errored to trigger\n // regular browser navigation to given page\n return {\n status: PageResourceStatus.Error,\n }\n }\n\n // if HEAD request wasn't 200, return notFound result\n // and show 404 page\n return data\n })\n }\n return data\n })\n }\n}\n\nlet instance\n\nexport const setLoader = _loader => {\n instance = _loader\n}\n\nexport const publicLoader = {\n enqueue: rawPath => instance.prefetch(rawPath),\n\n // Real methods\n getResourceURLsForPathname: rawPath =>\n instance.getResourceURLsForPathname(rawPath),\n loadPage: rawPath => instance.loadPage(rawPath),\n // TODO add deprecation to v4 so people use withErrorDetails and then we can remove in v5 and change default behaviour\n loadPageSync: (rawPath, options = {}) =>\n instance.loadPageSync(rawPath, options),\n prefetch: rawPath => instance.prefetch(rawPath),\n isPageNotFound: rawPath => instance.isPageNotFound(rawPath),\n hovering: rawPath => instance.hovering(rawPath),\n loadAppData: () => instance.loadAppData(),\n}\n\nexport default publicLoader\n\nexport function getStaticQueryResults() {\n if (instance) {\n return instance.staticQueryDb\n } else {\n return {}\n }\n}\n","import React, { createElement } from \"react\"\nimport PropTypes from \"prop-types\"\nimport { apiRunner } from \"./api-runner-browser\"\nimport { grabMatchParams } from \"./find-path\"\n\n// Renders page\nclass PageRenderer extends React.Component {\n render() {\n const props = {\n ...this.props,\n params: {\n ...grabMatchParams(this.props.location.pathname),\n ...this.props.pageResources.json.pageContext.__params,\n },\n }\n\n const pageElement = createElement(this.props.pageResources.component, {\n ...props,\n key: this.props.path || this.props.pageResources.page.path,\n })\n\n const wrappedPage = apiRunner(\n `wrapPageElement`,\n { element: pageElement, props },\n pageElement,\n ({ result }) => {\n return { element: result, props }\n }\n ).pop()\n\n return wrappedPage\n }\n}\n\nPageRenderer.propTypes = {\n location: PropTypes.object.isRequired,\n pageResources: PropTypes.object.isRequired,\n data: PropTypes.object,\n pageContext: PropTypes.object.isRequired,\n}\n\nexport default PageRenderer\n","// This is extracted to separate module because it's shared\n// between browser and SSR code\nexport const RouteAnnouncerProps = {\n id: `gatsby-announcer`,\n style: {\n position: `absolute`,\n top: 0,\n width: 1,\n height: 1,\n padding: 0,\n overflow: `hidden`,\n clip: `rect(0, 0, 0, 0)`,\n whiteSpace: `nowrap`,\n border: 0,\n },\n \"aria-live\": `assertive`,\n \"aria-atomic\": `true`,\n}\n","import React from \"react\"\nimport PropTypes from \"prop-types\"\nimport loader, { PageResourceStatus } from \"./loader\"\nimport { maybeGetBrowserRedirect } from \"./redirect-utils.js\"\nimport { apiRunner } from \"./api-runner-browser\"\nimport emitter from \"./emitter\"\nimport { RouteAnnouncerProps } from \"./route-announcer-props\"\nimport { navigate as reachNavigate } from \"@gatsbyjs/reach-router\"\nimport { globalHistory } from \"@gatsbyjs/reach-router/lib/history\"\nimport { parsePath } from \"gatsby-link\"\n\nfunction maybeRedirect(pathname) {\n const redirect = maybeGetBrowserRedirect(pathname)\n const { hash, search } = window.location\n\n if (redirect != null) {\n window.___replace(redirect.toPath + search + hash)\n return true\n } else {\n return false\n }\n}\n\n// Catch unhandled chunk loading errors and force a restart of the app.\nlet nextRoute = ``\n\nwindow.addEventListener(`unhandledrejection`, event => {\n if (/loading chunk \\d* failed./i.test(event.reason)) {\n if (nextRoute) {\n window.location.pathname = nextRoute\n }\n }\n})\n\nconst onPreRouteUpdate = (location, prevLocation) => {\n if (!maybeRedirect(location.pathname)) {\n nextRoute = location.pathname\n apiRunner(`onPreRouteUpdate`, { location, prevLocation })\n }\n}\n\nconst onRouteUpdate = (location, prevLocation) => {\n if (!maybeRedirect(location.pathname)) {\n apiRunner(`onRouteUpdate`, { location, prevLocation })\n if (\n process.env.GATSBY_EXPERIMENTAL_QUERY_ON_DEMAND &&\n process.env.GATSBY_QUERY_ON_DEMAND_LOADING_INDICATOR === `true`\n ) {\n emitter.emit(`onRouteUpdate`, { location, prevLocation })\n }\n }\n}\n\nconst navigate = (to, options = {}) => {\n // Support forward/backward navigation with numbers\n // navigate(-2) (jumps back 2 history steps)\n // navigate(2) (jumps forward 2 history steps)\n if (typeof to === `number`) {\n globalHistory.navigate(to)\n return\n }\n\n const { pathname, search, hash } = parsePath(to)\n const redirect = maybeGetBrowserRedirect(pathname)\n\n // If we're redirecting, just replace the passed in pathname\n // to the one we want to redirect to.\n if (redirect) {\n to = redirect.toPath + search + hash\n }\n\n // If we had a service worker update, no matter the path, reload window and\n // reset the pathname whitelist\n if (window.___swUpdated) {\n window.location = pathname + search + hash\n return\n }\n\n // Start a timer to wait for a second before transitioning and showing a\n // loader in case resources aren't around yet.\n const timeoutId = setTimeout(() => {\n emitter.emit(`onDelayedLoadPageResources`, { pathname })\n apiRunner(`onRouteUpdateDelayed`, {\n location: window.location,\n })\n }, 1000)\n\n loader.loadPage(pathname).then(pageResources => {\n // If no page resources, then refresh the page\n // Do this, rather than simply `window.location.reload()`, so that\n // pressing the back/forward buttons work - otherwise when pressing\n // back, the browser will just change the URL and expect JS to handle\n // the change, which won't always work since it might not be a Gatsby\n // page.\n if (!pageResources || pageResources.status === PageResourceStatus.Error) {\n window.history.replaceState({}, ``, location.href)\n window.location = pathname\n clearTimeout(timeoutId)\n return\n }\n\n // If the loaded page has a different compilation hash to the\n // window, then a rebuild has occurred on the server. Reload.\n if (process.env.NODE_ENV === `production` && pageResources) {\n // window.___webpackCompilationHash gets set in production-app.js after navigationInit() is called\n // So on a direct visit of a page with a browser redirect this check is truthy and thus the codepath is hit\n // While the resource actually exists, but only too late\n // TODO: This should probably be fixed by setting ___webpackCompilationHash before navigationInit() is called\n if (\n pageResources.page.webpackCompilationHash !==\n window.___webpackCompilationHash\n ) {\n // Purge plugin-offline cache\n if (\n `serviceWorker` in navigator &&\n navigator.serviceWorker.controller !== null &&\n navigator.serviceWorker.controller.state === `activated`\n ) {\n navigator.serviceWorker.controller.postMessage({\n gatsbyApi: `clearPathResources`,\n })\n }\n\n window.location = pathname + search + hash\n }\n }\n reachNavigate(to, options)\n clearTimeout(timeoutId)\n })\n}\n\nfunction shouldUpdateScroll(prevRouterProps, { location }) {\n const { pathname, hash } = location\n const results = apiRunner(`shouldUpdateScroll`, {\n prevRouterProps,\n // `pathname` for backwards compatibility\n pathname,\n routerProps: { location },\n getSavedScrollPosition: args => [\n 0,\n // FIXME this is actually a big code smell, we should fix this\n // eslint-disable-next-line @babel/no-invalid-this\n this._stateStorage.read(args, args.key),\n ],\n })\n if (results.length > 0) {\n // Use the latest registered shouldUpdateScroll result, this allows users to override plugin's configuration\n // @see https://github.com/gatsbyjs/gatsby/issues/12038\n return results[results.length - 1]\n }\n\n if (prevRouterProps) {\n const {\n location: { pathname: oldPathname },\n } = prevRouterProps\n if (oldPathname === pathname) {\n // Scroll to element if it exists, if it doesn't, or no hash is provided,\n // scroll to top.\n return hash ? decodeURI(hash.slice(1)) : [0, 0]\n }\n }\n return true\n}\n\nfunction init() {\n // The \"scroll-behavior\" package expects the \"action\" to be on the location\n // object so let's copy it over.\n globalHistory.listen(args => {\n args.location.action = args.action\n })\n\n window.___push = to => navigate(to, { replace: false })\n window.___replace = to => navigate(to, { replace: true })\n window.___navigate = (to, options) => navigate(to, options)\n\n // Check for initial page-load redirect\n maybeRedirect(window.location.pathname)\n}\n\nclass RouteAnnouncer extends React.Component {\n constructor(props) {\n super(props)\n this.announcementRef = React.createRef()\n }\n\n componentDidUpdate(prevProps, nextProps) {\n requestAnimationFrame(() => {\n let pageName = `new page at ${this.props.location.pathname}`\n if (document.title) {\n pageName = document.title\n }\n const pageHeadings = document.querySelectorAll(`#gatsby-focus-wrapper h1`)\n if (pageHeadings && pageHeadings.length) {\n pageName = pageHeadings[0].textContent\n }\n const newAnnouncement = `Navigated to ${pageName}`\n if (this.announcementRef.current) {\n const oldAnnouncement = this.announcementRef.current.innerText\n if (oldAnnouncement !== newAnnouncement) {\n this.announcementRef.current.innerText = newAnnouncement\n }\n }\n })\n }\n\n render() {\n return
\n }\n}\n\nconst compareLocationProps = (prevLocation, nextLocation) => {\n if (prevLocation.href !== nextLocation.href) {\n return true\n }\n\n if (prevLocation?.state?.key !== nextLocation?.state?.key) {\n return true\n }\n\n return false\n}\n\n// Fire on(Pre)RouteUpdate APIs\nclass RouteUpdates extends React.Component {\n constructor(props) {\n super(props)\n onPreRouteUpdate(props.location, null)\n }\n\n componentDidMount() {\n onRouteUpdate(this.props.location, null)\n }\n\n shouldComponentUpdate(prevProps) {\n if (compareLocationProps(prevProps.location, this.props.location)) {\n onPreRouteUpdate(this.props.location, prevProps.location)\n return true\n }\n return false\n }\n\n componentDidUpdate(prevProps) {\n if (compareLocationProps(prevProps.location, this.props.location)) {\n onRouteUpdate(this.props.location, prevProps.location)\n }\n }\n\n render() {\n return (\n \n {this.props.children}\n \n \n )\n }\n}\n\nRouteUpdates.propTypes = {\n location: PropTypes.object.isRequired,\n}\n\nexport { init, shouldUpdateScroll, RouteUpdates, maybeGetBrowserRedirect }\n","// Pulled from react-compat\n// https://github.com/developit/preact-compat/blob/7c5de00e7c85e2ffd011bf3af02899b63f699d3a/src/index.js#L349\nfunction shallowDiffers(a, b) {\n for (var i in a) {\n if (!(i in b)) return true;\n }for (var _i in b) {\n if (a[_i] !== b[_i]) return true;\n }return false;\n}\n\nexport default (function (instance, nextProps, nextState) {\n return shallowDiffers(instance.props, nextProps) || shallowDiffers(instance.state, nextState);\n});","import React from \"react\"\nimport loader, { PageResourceStatus } from \"./loader\"\nimport shallowCompare from \"shallow-compare\"\n\nclass EnsureResources extends React.Component {\n constructor(props) {\n super()\n const { location, pageResources } = props\n this.state = {\n location: { ...location },\n pageResources:\n pageResources ||\n loader.loadPageSync(location.pathname, { withErrorDetails: true }),\n }\n }\n\n static getDerivedStateFromProps({ location }, prevState) {\n if (prevState.location.href !== location.href) {\n const pageResources = loader.loadPageSync(location.pathname, {\n withErrorDetails: true,\n })\n\n return {\n pageResources,\n location: { ...location },\n }\n }\n\n return {\n location: { ...location },\n }\n }\n\n loadResources(rawPath) {\n loader.loadPage(rawPath).then(pageResources => {\n if (pageResources && pageResources.status !== PageResourceStatus.Error) {\n this.setState({\n location: { ...window.location },\n pageResources,\n })\n } else {\n window.history.replaceState({}, ``, location.href)\n window.location = rawPath\n }\n })\n }\n\n shouldComponentUpdate(nextProps, nextState) {\n // Always return false if we're missing resources.\n if (!nextState.pageResources) {\n this.loadResources(nextProps.location.pathname)\n return false\n }\n\n if (\n process.env.BUILD_STAGE === `develop` &&\n nextState.pageResources.stale\n ) {\n this.loadResources(nextProps.location.pathname)\n return false\n }\n\n // Check if the component or json have changed.\n if (this.state.pageResources !== nextState.pageResources) {\n return true\n }\n if (\n this.state.pageResources.component !== nextState.pageResources.component\n ) {\n return true\n }\n\n if (this.state.pageResources.json !== nextState.pageResources.json) {\n return true\n }\n // Check if location has changed on a page using internal routing\n // via matchPath configuration.\n if (\n this.state.location.key !== nextState.location.key &&\n nextState.pageResources.page &&\n (nextState.pageResources.page.matchPath ||\n nextState.pageResources.page.path)\n ) {\n return true\n }\n return shallowCompare(this, nextProps, nextState)\n }\n\n render() {\n if (\n process.env.NODE_ENV !== `production` &&\n (!this.state.pageResources ||\n this.state.pageResources.status === PageResourceStatus.Error)\n ) {\n const message = `EnsureResources was not able to find resources for path: \"${this.props.location.pathname}\"\nThis typically means that an issue occurred building components for that path.\nRun \\`gatsby clean\\` to remove any cached elements.`\n if (this.state.pageResources?.error) {\n console.error(message)\n throw this.state.pageResources.error\n }\n\n throw new Error(message)\n }\n\n return this.props.children(this.state)\n }\n}\n\nexport default EnsureResources\n","import { apiRunner, apiRunnerAsync } from \"./api-runner-browser\"\nimport React from \"react\"\nimport ReactDOM from \"react-dom\"\nimport { Router, navigate, Location, BaseContext } from \"@gatsbyjs/reach-router\"\nimport { ScrollContext } from \"gatsby-react-router-scroll\"\nimport { StaticQueryContext } from \"gatsby\"\nimport {\n shouldUpdateScroll,\n init as navigationInit,\n RouteUpdates,\n} from \"./navigation\"\nimport emitter from \"./emitter\"\nimport PageRenderer from \"./page-renderer\"\nimport asyncRequires from \"$virtual/async-requires\"\nimport {\n setLoader,\n ProdLoader,\n publicLoader,\n PageResourceStatus,\n getStaticQueryResults,\n} from \"./loader\"\nimport EnsureResources from \"./ensure-resources\"\nimport stripPrefix from \"./strip-prefix\"\n\n// Generated during bootstrap\nimport matchPaths from \"$virtual/match-paths.json\"\n\nconst loader = new ProdLoader(asyncRequires, matchPaths, window.pageData)\nsetLoader(loader)\nloader.setApiRunner(apiRunner)\n\nwindow.asyncRequires = asyncRequires\nwindow.___emitter = emitter\nwindow.___loader = publicLoader\n\nnavigationInit()\n\napiRunnerAsync(`onClientEntry`).then(() => {\n // Let plugins register a service worker. The plugin just needs\n // to return true.\n if (apiRunner(`registerServiceWorker`).filter(Boolean).length > 0) {\n require(`./register-service-worker`)\n }\n\n // In gatsby v2 if Router is used in page using matchPaths\n // paths need to contain full path.\n // For example:\n // - page have `/app/*` matchPath\n // - inside template user needs to use `/app/xyz` as path\n // Resetting `basepath`/`baseuri` keeps current behaviour\n // to not introduce breaking change.\n // Remove this in v3\n const RouteHandler = props => (\n \n \n \n )\n\n const DataContext = React.createContext({})\n\n class GatsbyRoot extends React.Component {\n render() {\n const { children } = this.props\n return (\n \n {({ location }) => (\n \n {({ pageResources, location }) => {\n const staticQueryResults = getStaticQueryResults()\n return (\n \n \n {children}\n \n \n )\n }}\n \n )}\n \n )\n }\n }\n\n class LocationHandler extends React.Component {\n render() {\n return (\n \n {({ pageResources, location }) => (\n \n \n \n \n
\n \n \n )}\n \n )\n }\n }\n\n const { pagePath, location: browserLoc } = window\n\n // Explicitly call navigate if the canonical path (window.pagePath)\n // is different to the browser path (window.location.pathname). But\n // only if NONE of the following conditions hold:\n //\n // - The url matches a client side route (page.matchPath)\n // - it's a 404 page\n // - it's the offline plugin shell (/offline-plugin-app-shell-fallback/)\n if (\n pagePath &&\n __BASE_PATH__ + pagePath !== browserLoc.pathname &&\n !(\n loader.findMatchPath(stripPrefix(browserLoc.pathname, __BASE_PATH__)) ||\n pagePath === `/404.html` ||\n pagePath.match(/^\\/404\\/?$/) ||\n pagePath.match(/^\\/offline-plugin-app-shell-fallback\\/?$/)\n )\n ) {\n navigate(__BASE_PATH__ + pagePath + browserLoc.search + browserLoc.hash, {\n replace: true,\n })\n }\n\n publicLoader.loadPage(browserLoc.pathname).then(page => {\n if (!page || page.status === PageResourceStatus.Error) {\n const message = `page resources for ${browserLoc.pathname} not found. Not rendering React`\n\n // if the chunk throws an error we want to capture the real error\n // This should help with https://github.com/gatsbyjs/gatsby/issues/19618\n if (page && page.error) {\n console.error(message)\n throw page.error\n }\n\n throw new Error(message)\n }\n\n window.___webpackCompilationHash = page.page.webpackCompilationHash\n\n const SiteRoot = apiRunner(\n `wrapRootElement`,\n { element: },\n ,\n ({ result }) => {\n return { element: result }\n }\n ).pop()\n\n const App = function App() {\n const onClientEntryRanRef = React.useRef(false)\n\n React.useEffect(() => {\n if (!onClientEntryRanRef.current) {\n onClientEntryRanRef.current = true\n if (performance.mark) {\n performance.mark(`onInitialClientRender`)\n }\n\n apiRunner(`onInitialClientRender`)\n }\n }, [])\n\n return {SiteRoot}\n }\n\n const renderer = apiRunner(\n `replaceHydrateFunction`,\n undefined,\n ReactDOM.hydrateRoot ? ReactDOM.hydrateRoot : ReactDOM.hydrate\n )[0]\n\n function runRender() {\n const rootElement =\n typeof window !== `undefined`\n ? document.getElementById(`___gatsby`)\n : null\n\n if (renderer === ReactDOM.hydrateRoot) {\n renderer(rootElement, )\n } else {\n renderer(, rootElement)\n }\n }\n\n // https://github.com/madrobby/zepto/blob/b5ed8d607f67724788ec9ff492be297f64d47dfc/src/zepto.js#L439-L450\n // TODO remove IE 10 support\n const doc = document\n if (\n doc.readyState === `complete` ||\n (doc.readyState !== `loading` && !doc.documentElement.doScroll)\n ) {\n setTimeout(function () {\n runRender()\n }, 0)\n } else {\n const handler = function () {\n doc.removeEventListener(`DOMContentLoaded`, handler, false)\n window.removeEventListener(`load`, handler, false)\n\n runRender()\n }\n\n doc.addEventListener(`DOMContentLoaded`, handler, false)\n window.addEventListener(`load`, handler, false)\n }\n })\n})\n","import React from \"react\"\nimport PropTypes from \"prop-types\"\n\nimport loader from \"./loader\"\nimport InternalPageRenderer from \"./page-renderer\"\n\nconst ProdPageRenderer = ({ location }) => {\n const pageResources = loader.loadPageSync(location.pathname)\n if (!pageResources) {\n return null\n }\n return React.createElement(InternalPageRenderer, {\n location,\n pageResources,\n ...pageResources.json,\n })\n}\n\nProdPageRenderer.propTypes = {\n location: PropTypes.shape({\n pathname: PropTypes.string.isRequired,\n }).isRequired,\n}\n\nexport default ProdPageRenderer\n","const preferDefault = m => (m && m.default) || m\n\nif (process.env.BUILD_STAGE === `develop`) {\n module.exports = preferDefault(require(`./public-page-renderer-dev`))\n} else if (process.env.BUILD_STAGE === `build-javascript`) {\n module.exports = preferDefault(require(`./public-page-renderer-prod`))\n} else {\n module.exports = () => null\n}\n","exports.polyfill = Component => Component\n","import redirects from \"./redirects.json\"\n\n// Convert to a map for faster lookup in maybeRedirect()\n\nconst redirectMap = new Map()\nconst redirectIgnoreCaseMap = new Map()\n\nredirects.forEach(redirect => {\n if (redirect.ignoreCase) {\n redirectIgnoreCaseMap.set(redirect.fromPath, redirect)\n } else {\n redirectMap.set(redirect.fromPath, redirect)\n }\n})\n\nexport function maybeGetBrowserRedirect(pathname) {\n let redirect = redirectMap.get(pathname)\n if (!redirect) {\n redirect = redirectIgnoreCaseMap.get(pathname.toLowerCase())\n }\n return redirect\n}\n","import { apiRunner } from \"./api-runner-browser\"\n\nif (\n window.location.protocol !== `https:` &&\n window.location.hostname !== `localhost`\n) {\n console.error(\n `Service workers can only be used over HTTPS, or on localhost for development`\n )\n} else if (`serviceWorker` in navigator) {\n navigator.serviceWorker\n .register(`${__BASE_PATH__}/sw.js`)\n .then(function (reg) {\n reg.addEventListener(`updatefound`, () => {\n apiRunner(`onServiceWorkerUpdateFound`, { serviceWorker: reg })\n // The updatefound event implies that reg.installing is set; see\n // https://w3c.github.io/ServiceWorker/#service-worker-registration-updatefound-event\n const installingWorker = reg.installing\n console.log(`installingWorker`, installingWorker)\n installingWorker.addEventListener(`statechange`, () => {\n switch (installingWorker.state) {\n case `installed`:\n if (navigator.serviceWorker.controller) {\n // At this point, the old content will have been purged and the fresh content will\n // have been added to the cache.\n\n // We set a flag so Gatsby Link knows to refresh the page on next navigation attempt\n window.___swUpdated = true\n // We call the onServiceWorkerUpdateReady API so users can show update prompts.\n apiRunner(`onServiceWorkerUpdateReady`, { serviceWorker: reg })\n\n // If resources failed for the current page, reload.\n if (window.___failedResources) {\n console.log(`resources failed, SW updated - reloading`)\n window.location.reload()\n }\n } else {\n // At this point, everything has been precached.\n // It's the perfect time to display a \"Content is cached for offline use.\" message.\n console.log(`Content is now available offline!`)\n\n // Post to service worker that install is complete.\n // Delay to allow time for the event listener to be added --\n // otherwise fetch is called too soon and resources aren't cached.\n apiRunner(`onServiceWorkerInstalled`, { serviceWorker: reg })\n }\n break\n\n case `redundant`:\n console.error(`The installing service worker became redundant.`)\n apiRunner(`onServiceWorkerRedundant`, { serviceWorker: reg })\n break\n\n case `activated`:\n apiRunner(`onServiceWorkerActive`, { serviceWorker: reg })\n break\n }\n })\n })\n })\n .catch(function (e) {\n console.error(`Error during service worker registration:`, e)\n })\n}\n","/**\n * Remove a prefix from a string. Return the input string if the given prefix\n * isn't found.\n */\n\nexport default function stripPrefix(str, prefix = ``) {\n if (!prefix) {\n return str\n }\n\n if (str === prefix) {\n return `/`\n }\n\n if (str.startsWith(`${prefix}/`)) {\n return str.slice(prefix.length)\n }\n\n return str\n}\n","\"use strict\";\n\nvar _interopRequireDefault = require(\"@babel/runtime/helpers/interopRequireDefault\");\n\nvar _gatsby = require(\"gatsby\");\n\nvar _getManifestPathname = _interopRequireDefault(require(\"./get-manifest-pathname\"));\n\n/* global __MANIFEST_PLUGIN_HAS_LOCALISATION__ */\n// when we don't have localisation in our manifest, we tree shake everything away\nif (__MANIFEST_PLUGIN_HAS_LOCALISATION__) {\n exports.onRouteUpdate = function (_ref, pluginOptions) {\n var location = _ref.location;\n var localize = pluginOptions.localize;\n var manifestFilename = (0, _getManifestPathname.default)(location.pathname, localize);\n var manifestEl = document.head.querySelector(\"link[rel=\\\"manifest\\\"]\");\n\n if (manifestEl) {\n manifestEl.setAttribute(\"href\", (0, _gatsby.withPrefix)(manifestFilename));\n }\n };\n}","\"use strict\";\n\nexports.__esModule = true;\nexports.default = void 0;\n\n/**\n * Get a manifest filename depending on localized pathname\n *\n * @param {string} pathname\n * @param {Array<{start_url: string, lang: string}>} localizedManifests\n * @return string\n */\nvar _default = function _default(pathname, localizedManifests) {\n var defaultFilename = \"manifest.webmanifest\";\n\n if (!Array.isArray(localizedManifests)) {\n return defaultFilename;\n }\n\n var localizedManifest = localizedManifests.find(function (app) {\n return pathname.startsWith(app.start_url);\n });\n\n if (!localizedManifest) {\n return defaultFilename;\n }\n\n return \"manifest_\" + localizedManifest.lang + \".webmanifest\";\n};\n\nexports.default = _default;","import React from \"react\";\nimport { Location, globalHistory } from \"@reach/router\";\nimport { QueryParamProvider } from \"use-query-params\";\n\nexport default ({ children }) => (\n \n {({ location }) => (\n \n {children}\n \n )}\n \n);\n","import React from \"react\";\nimport Root from \"./root\";\n\nexport const wrapRootElement = ({ element }) => {element};\n","\"use strict\";\n\nvar offsetY = 0;\n\nvar getTargetOffset = function getTargetOffset(hash) {\n var id = window.decodeURI(hash.replace(\"#\", \"\"));\n\n if (id !== \"\") {\n var element = document.getElementById(id);\n\n if (element) {\n var scrollTop = window.pageYOffset || document.documentElement.scrollTop || document.body.scrollTop;\n var clientTop = document.documentElement.clientTop || document.body.clientTop || 0;\n var computedStyles = window.getComputedStyle(element);\n var scrollMarginTop = computedStyles.getPropertyValue(\"scroll-margin-top\") || computedStyles.getPropertyValue(\"scroll-snap-margin-top\") || \"0px\";\n return element.getBoundingClientRect().top + scrollTop - parseInt(scrollMarginTop, 10) - clientTop - offsetY;\n }\n }\n\n return null;\n};\n\nexports.onInitialClientRender = function (_, pluginOptions) {\n if (pluginOptions.offsetY) {\n offsetY = pluginOptions.offsetY;\n }\n\n requestAnimationFrame(function () {\n var offset = getTargetOffset(window.location.hash);\n\n if (offset !== null) {\n window.scrollTo(0, offset);\n }\n });\n};\n\nexports.shouldUpdateScroll = function (_ref) {\n var location = _ref.routerProps.location;\n var offset = getTargetOffset(location.hash);\n return offset !== null ? [0, offset] : true;\n};","import invariant from \"invariant\"; ////////////////////////////////////////////////////////////////////////////////\n// startsWith(string, search) - Check if `string` starts with `search`\n\nvar startsWith = function startsWith(string, search) {\n return string.substr(0, search.length) === search;\n}; ////////////////////////////////////////////////////////////////////////////////\n// pick(routes, uri)\n//\n// Ranks and picks the best route to match. Each segment gets the highest\n// amount of points, then the type of segment gets an additional amount of\n// points where\n//\n// static > dynamic > splat > root\n//\n// This way we don't have to worry about the order of our routes, let the\n// computers do it.\n//\n// A route looks like this\n//\n// { path, default, value }\n//\n// And a returned match looks like:\n//\n// { route, params, uri }\n//\n// I know, I should use TypeScript not comments for these types.\n\n\nvar pick = function pick(routes, uri) {\n var match = void 0;\n var default_ = void 0;\n\n var _uri$split = uri.split(\"?\"),\n uriPathname = _uri$split[0];\n\n var uriSegments = segmentize(uriPathname);\n var isRootUri = uriSegments[0] === \"\";\n var ranked = rankRoutes(routes);\n\n for (var i = 0, l = ranked.length; i < l; i++) {\n var missed = false;\n var route = ranked[i].route;\n\n if (route.default) {\n default_ = {\n route: route,\n params: {},\n uri: uri\n };\n continue;\n }\n\n var routeSegments = segmentize(route.path);\n var params = {};\n var max = Math.max(uriSegments.length, routeSegments.length);\n var index = 0;\n\n for (; index < max; index++) {\n var routeSegment = routeSegments[index];\n var uriSegment = uriSegments[index];\n\n if (isSplat(routeSegment)) {\n // Hit a splat, just grab the rest, and return a match\n // uri: /files/documents/work\n // route: /files/*\n var param = routeSegment.slice(1) || \"*\";\n params[param] = uriSegments.slice(index).map(decodeURIComponent).join(\"/\");\n break;\n }\n\n if (uriSegment === undefined) {\n // URI is shorter than the route, no match\n // uri: /users\n // route: /users/:userId\n missed = true;\n break;\n }\n\n var dynamicMatch = paramRe.exec(routeSegment);\n\n if (dynamicMatch && !isRootUri) {\n var matchIsNotReserved = reservedNames.indexOf(dynamicMatch[1]) === -1;\n !matchIsNotReserved ? process.env.NODE_ENV !== \"production\" ? invariant(false, \" dynamic segment \\\"\" + dynamicMatch[1] + \"\\\" is a reserved name. Please use a different name in path \\\"\" + route.path + \"\\\".\") : invariant(false) : void 0;\n var value = decodeURIComponent(uriSegment);\n params[dynamicMatch[1]] = value;\n } else if (routeSegment !== uriSegment) {\n // Current segments don't match, not dynamic, not splat, so no match\n // uri: /users/123/settings\n // route: /users/:id/profile\n missed = true;\n break;\n }\n }\n\n if (!missed) {\n match = {\n route: route,\n params: params,\n uri: \"/\" + uriSegments.slice(0, index).join(\"/\")\n };\n break;\n }\n }\n\n return match || default_ || null;\n}; ////////////////////////////////////////////////////////////////////////////////\n// match(path, uri) - Matches just one path to a uri, also lol\n\n\nvar match = function match(path, uri) {\n return pick([{\n path: path\n }], uri);\n}; ////////////////////////////////////////////////////////////////////////////////\n// resolve(to, basepath)\n//\n// Resolves URIs as though every path is a directory, no files. Relative URIs\n// in the browser can feel awkward because not only can you be \"in a directory\"\n// you can be \"at a file\", too. For example\n//\n// browserSpecResolve('foo', '/bar/') => /bar/foo\n// browserSpecResolve('foo', '/bar') => /foo\n//\n// But on the command line of a file system, it's not as complicated, you can't\n// `cd` from a file, only directories. This way, links have to know less about\n// their current path. To go deeper you can do this:\n//\n// \n// // instead of\n// \n//\n// Just like `cd`, if you want to go deeper from the command line, you do this:\n//\n// cd deeper\n// # not\n// cd $(pwd)/deeper\n//\n// By treating every path as a directory, linking to relative paths should\n// require less contextual information and (fingers crossed) be more intuitive.\n\n\nvar resolve = function resolve(to, base) {\n // /foo/bar, /baz/qux => /foo/bar\n if (startsWith(to, \"/\")) {\n return to;\n }\n\n var _to$split = to.split(\"?\"),\n toPathname = _to$split[0],\n toQuery = _to$split[1];\n\n var _base$split = base.split(\"?\"),\n basePathname = _base$split[0];\n\n var toSegments = segmentize(toPathname);\n var baseSegments = segmentize(basePathname); // ?a=b, /users?b=c => /users?a=b\n\n if (toSegments[0] === \"\") {\n return addQuery(basePathname, toQuery);\n } // profile, /users/789 => /users/789/profile\n\n\n if (!startsWith(toSegments[0], \".\")) {\n var pathname = baseSegments.concat(toSegments).join(\"/\");\n return addQuery((basePathname === \"/\" ? \"\" : \"/\") + pathname, toQuery);\n } // ./ /users/123 => /users/123\n // ../ /users/123 => /users\n // ../.. /users/123 => /\n // ../../one /a/b/c/d => /a/b/one\n // .././one /a/b/c/d => /a/b/c/one\n\n\n var allSegments = baseSegments.concat(toSegments);\n var segments = [];\n\n for (var i = 0, l = allSegments.length; i < l; i++) {\n var segment = allSegments[i];\n if (segment === \"..\") segments.pop();else if (segment !== \".\") segments.push(segment);\n }\n\n return addQuery(\"/\" + segments.join(\"/\"), toQuery);\n}; ////////////////////////////////////////////////////////////////////////////////\n// insertParams(path, params)\n\n\nvar insertParams = function insertParams(path, params) {\n var _path$split = path.split(\"?\"),\n pathBase = _path$split[0],\n _path$split$ = _path$split[1],\n query = _path$split$ === undefined ? \"\" : _path$split$;\n\n var segments = segmentize(pathBase);\n var constructedPath = \"/\" + segments.map(function (segment) {\n var match = paramRe.exec(segment);\n return match ? params[match[1]] : segment;\n }).join(\"/\");\n var _params$location = params.location;\n _params$location = _params$location === undefined ? {} : _params$location;\n var _params$location$sear = _params$location.search,\n search = _params$location$sear === undefined ? \"\" : _params$location$sear;\n var searchSplit = search.split(\"?\")[1] || \"\";\n constructedPath = addQuery(constructedPath, query, searchSplit);\n return constructedPath;\n};\n\nvar validateRedirect = function validateRedirect(from, to) {\n var filter = function filter(segment) {\n return isDynamic(segment);\n };\n\n var fromString = segmentize(from).filter(filter).sort().join(\"/\");\n var toString = segmentize(to).filter(filter).sort().join(\"/\");\n return fromString === toString;\n}; ////////////////////////////////////////////////////////////////////////////////\n// Junk\n\n\nvar paramRe = /^:(.+)/;\nvar SEGMENT_POINTS = 4;\nvar STATIC_POINTS = 3;\nvar DYNAMIC_POINTS = 2;\nvar SPLAT_PENALTY = 1;\nvar ROOT_POINTS = 1;\n\nvar isRootSegment = function isRootSegment(segment) {\n return segment === \"\";\n};\n\nvar isDynamic = function isDynamic(segment) {\n return paramRe.test(segment);\n};\n\nvar isSplat = function isSplat(segment) {\n return segment && segment[0] === \"*\";\n};\n\nvar rankRoute = function rankRoute(route, index) {\n var score = route.default ? 0 : segmentize(route.path).reduce(function (score, segment) {\n score += SEGMENT_POINTS;\n if (isRootSegment(segment)) score += ROOT_POINTS;else if (isDynamic(segment)) score += DYNAMIC_POINTS;else if (isSplat(segment)) score -= SEGMENT_POINTS + SPLAT_PENALTY;else score += STATIC_POINTS;\n return score;\n }, 0);\n return {\n route: route,\n score: score,\n index: index\n };\n};\n\nvar rankRoutes = function rankRoutes(routes) {\n return routes.map(rankRoute).sort(function (a, b) {\n return a.score < b.score ? 1 : a.score > b.score ? -1 : a.index - b.index;\n });\n};\n\nvar segmentize = function segmentize(uri) {\n return uri // strip starting/ending slashes\n .replace(/(^\\/+|\\/+$)/g, \"\").split(\"/\");\n};\n\nvar addQuery = function addQuery(pathname) {\n for (var _len = arguments.length, query = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n query[_key - 1] = arguments[_key];\n }\n\n query = query.filter(function (q) {\n return q && q.length > 0;\n });\n return pathname + (query && query.length > 0 ? \"?\" + query.join(\"&\") : \"\");\n};\n\nvar reservedNames = [\"uri\", \"path\"];\n/**\n * Shallow compares two objects.\n * @param {Object} obj1 The first object to compare.\n * @param {Object} obj2 The second object to compare.\n */\n\nvar shallowCompare = function shallowCompare(obj1, obj2) {\n var obj1Keys = Object.keys(obj1);\n return obj1Keys.length === Object.keys(obj2).length && obj1Keys.every(function (key) {\n return obj2.hasOwnProperty(key) && obj1[key] === obj2[key];\n });\n}; ////////////////////////////////////////////////////////////////////////////////\n\n\nexport { startsWith, pick, match, resolve, insertParams, validateRedirect, shallowCompare };","var _extends = Object.assign || function (target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = arguments[i];\n\n for (var key in source) {\n if (Object.prototype.hasOwnProperty.call(source, key)) {\n target[key] = source[key];\n }\n }\n }\n\n return target;\n};\n\nvar getLocation = function getLocation(source) {\n var _source$location = source.location,\n search = _source$location.search,\n hash = _source$location.hash,\n href = _source$location.href,\n origin = _source$location.origin,\n protocol = _source$location.protocol,\n host = _source$location.host,\n hostname = _source$location.hostname,\n port = _source$location.port;\n var pathname = source.location.pathname;\n\n if (!pathname && href && canUseDOM) {\n var url = new URL(href);\n pathname = url.pathname;\n }\n\n return {\n pathname: encodeURI(decodeURI(pathname)),\n search: search,\n hash: hash,\n href: href,\n origin: origin,\n protocol: protocol,\n host: host,\n hostname: hostname,\n port: port,\n state: source.history.state,\n key: source.history.state && source.history.state.key || \"initial\"\n };\n};\n\nvar createHistory = function createHistory(source, options) {\n var listeners = [];\n var location = getLocation(source);\n var transitioning = false;\n\n var resolveTransition = function resolveTransition() {};\n\n return {\n get location() {\n return location;\n },\n\n get transitioning() {\n return transitioning;\n },\n\n _onTransitionComplete: function _onTransitionComplete() {\n transitioning = false;\n resolveTransition();\n },\n listen: function listen(listener) {\n listeners.push(listener);\n\n var popstateListener = function popstateListener() {\n location = getLocation(source);\n listener({\n location: location,\n action: \"POP\"\n });\n };\n\n source.addEventListener(\"popstate\", popstateListener);\n return function () {\n source.removeEventListener(\"popstate\", popstateListener);\n listeners = listeners.filter(function (fn) {\n return fn !== listener;\n });\n };\n },\n navigate: function navigate(to) {\n var _ref = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {},\n state = _ref.state,\n _ref$replace = _ref.replace,\n replace = _ref$replace === undefined ? false : _ref$replace;\n\n if (typeof to === \"number\") {\n source.history.go(to);\n } else {\n state = _extends({}, state, {\n key: Date.now() + \"\"\n }); // try...catch iOS Safari limits to 100 pushState calls\n\n try {\n if (transitioning || replace) {\n source.history.replaceState(state, null, to);\n } else {\n source.history.pushState(state, null, to);\n }\n } catch (e) {\n source.location[replace ? \"replace\" : \"assign\"](to);\n }\n }\n\n location = getLocation(source);\n transitioning = true;\n var transition = new Promise(function (res) {\n return resolveTransition = res;\n });\n listeners.forEach(function (listener) {\n return listener({\n location: location,\n action: \"PUSH\"\n });\n });\n return transition;\n }\n };\n}; ////////////////////////////////////////////////////////////////////////////////\n// Stores history entries in memory for testing or other platforms like Native\n\n\nvar createMemorySource = function createMemorySource() {\n var initialPath = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : \"/\";\n var searchIndex = initialPath.indexOf(\"?\");\n var initialLocation = {\n pathname: searchIndex > -1 ? initialPath.substr(0, searchIndex) : initialPath,\n search: searchIndex > -1 ? initialPath.substr(searchIndex) : \"\"\n };\n var index = 0;\n var stack = [initialLocation];\n var states = [null];\n return {\n get location() {\n return stack[index];\n },\n\n addEventListener: function addEventListener(name, fn) {},\n removeEventListener: function removeEventListener(name, fn) {},\n history: {\n get entries() {\n return stack;\n },\n\n get index() {\n return index;\n },\n\n get state() {\n return states[index];\n },\n\n pushState: function pushState(state, _, uri) {\n var _uri$split = uri.split(\"?\"),\n pathname = _uri$split[0],\n _uri$split$ = _uri$split[1],\n search = _uri$split$ === undefined ? \"\" : _uri$split$;\n\n index++;\n stack.push({\n pathname: pathname,\n search: search.length ? \"?\" + search : search\n });\n states.push(state);\n },\n replaceState: function replaceState(state, _, uri) {\n var _uri$split2 = uri.split(\"?\"),\n pathname = _uri$split2[0],\n _uri$split2$ = _uri$split2[1],\n search = _uri$split2$ === undefined ? \"\" : _uri$split2$;\n\n stack[index] = {\n pathname: pathname,\n search: search\n };\n states[index] = state;\n },\n go: function go(to) {\n var newIndex = index + to;\n\n if (newIndex < 0 || newIndex > states.length - 1) {\n return;\n }\n\n index = newIndex;\n }\n }\n };\n}; ////////////////////////////////////////////////////////////////////////////////\n// global history - uses window.history as the source if available, otherwise a\n// memory history\n\n\nvar canUseDOM = !!(typeof window !== \"undefined\" && window.document && window.document.createElement);\n\nvar getSource = function getSource() {\n return canUseDOM ? window : createMemorySource();\n};\n\nvar globalHistory = createHistory(getSource());\nvar navigate = globalHistory.navigate; ////////////////////////////////////////////////////////////////////////////////\n\nexport { globalHistory, navigate, createHistory, createMemorySource };","var _extends = Object.assign || function (target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = arguments[i];\n\n for (var key in source) {\n if (Object.prototype.hasOwnProperty.call(source, key)) {\n target[key] = source[key];\n }\n }\n }\n\n return target;\n};\n\nfunction _objectWithoutProperties(obj, keys) {\n var target = {};\n\n for (var i in obj) {\n if (keys.indexOf(i) >= 0) continue;\n if (!Object.prototype.hasOwnProperty.call(obj, i)) continue;\n target[i] = obj[i];\n }\n\n return target;\n}\n\nfunction _classCallCheck(instance, Constructor) {\n if (!(instance instanceof Constructor)) {\n throw new TypeError(\"Cannot call a class as a function\");\n }\n}\n\nfunction _possibleConstructorReturn(self, call) {\n if (!self) {\n throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");\n }\n\n return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self;\n}\n\nfunction _inherits(subClass, superClass) {\n if (typeof superClass !== \"function\" && superClass !== null) {\n throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass);\n }\n\n subClass.prototype = Object.create(superClass && superClass.prototype, {\n constructor: {\n value: subClass,\n enumerable: false,\n writable: true,\n configurable: true\n }\n });\n if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass;\n}\n/* eslint-disable jsx-a11y/anchor-has-content */\n\n\nimport React, { useContext, createContext } from \"react\";\nimport invariant from \"invariant\";\nimport { polyfill } from \"react-lifecycles-compat\";\nimport { startsWith, pick, resolve, match, insertParams, validateRedirect, shallowCompare } from \"./lib/utils\";\nimport { globalHistory, navigate, createHistory, createMemorySource } from \"./lib/history\"; ////////////////////////////////////////////////////////////////////////////////\n\nvar createNamedContext = function createNamedContext(name, defaultValue) {\n var Ctx = createContext(defaultValue);\n Ctx.displayName = name;\n return Ctx;\n}; ////////////////////////////////////////////////////////////////////////////////\n// Location Context/Provider\n\n\nvar LocationContext = createNamedContext(\"Location\"); // sets up a listener if there isn't one already so apps don't need to be\n// wrapped in some top level provider\n\nvar Location = function Location(_ref) {\n var children = _ref.children;\n return React.createElement(LocationContext.Consumer, null, function (context) {\n return context ? children(context) : React.createElement(LocationProvider, null, children);\n });\n};\n\nvar LocationProvider = function (_React$Component) {\n _inherits(LocationProvider, _React$Component);\n\n function LocationProvider() {\n var _temp, _this, _ret;\n\n _classCallCheck(this, LocationProvider);\n\n for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {\n args[_key] = arguments[_key];\n }\n\n return _ret = (_temp = (_this = _possibleConstructorReturn(this, _React$Component.call.apply(_React$Component, [this].concat(args))), _this), _this.state = {\n context: _this.getContext(),\n refs: {\n unlisten: null\n }\n }, _temp), _possibleConstructorReturn(_this, _ret);\n }\n\n LocationProvider.prototype.getContext = function getContext() {\n var _props$history = this.props.history,\n navigate = _props$history.navigate,\n location = _props$history.location;\n return {\n navigate: navigate,\n location: location\n };\n };\n\n LocationProvider.prototype.componentDidCatch = function componentDidCatch(error, info) {\n if (isRedirect(error)) {\n var _navigate = this.props.history.navigate;\n\n _navigate(error.uri, {\n replace: true\n });\n } else {\n throw error;\n }\n };\n\n LocationProvider.prototype.componentDidUpdate = function componentDidUpdate(prevProps, prevState) {\n if (prevState.context.location !== this.state.context.location) {\n this.props.history._onTransitionComplete();\n }\n };\n\n LocationProvider.prototype.componentDidMount = function componentDidMount() {\n var _this2 = this;\n\n var refs = this.state.refs,\n history = this.props.history;\n\n history._onTransitionComplete();\n\n refs.unlisten = history.listen(function () {\n Promise.resolve().then(function () {\n // TODO: replace rAF with react deferred update API when it's ready https://github.com/facebook/react/issues/13306\n requestAnimationFrame(function () {\n if (!_this2.unmounted) {\n _this2.setState(function () {\n return {\n context: _this2.getContext()\n };\n });\n }\n });\n });\n });\n };\n\n LocationProvider.prototype.componentWillUnmount = function componentWillUnmount() {\n var refs = this.state.refs;\n this.unmounted = true;\n refs.unlisten();\n };\n\n LocationProvider.prototype.render = function render() {\n var context = this.state.context,\n children = this.props.children;\n return React.createElement(LocationContext.Provider, {\n value: context\n }, typeof children === \"function\" ? children(context) : children || null);\n };\n\n return LocationProvider;\n}(React.Component); ////////////////////////////////////////////////////////////////////////////////\n\n\nLocationProvider.defaultProps = {\n history: globalHistory\n};\nprocess.env.NODE_ENV !== \"production\" ? void 0 : void 0;\n\nvar ServerLocation = function ServerLocation(_ref2) {\n var url = _ref2.url,\n children = _ref2.children;\n var searchIndex = url.indexOf(\"?\");\n var searchExists = searchIndex > -1;\n var pathname = void 0;\n var search = \"\";\n var hash = \"\";\n\n if (searchExists) {\n pathname = url.substring(0, searchIndex);\n search = url.substring(searchIndex);\n } else {\n pathname = url;\n }\n\n return React.createElement(LocationContext.Provider, {\n value: {\n location: {\n pathname: pathname,\n search: search,\n hash: hash\n },\n navigate: function navigate() {\n throw new Error(\"You can't call navigate on the server.\");\n }\n }\n }, children);\n}; ////////////////////////////////////////////////////////////////////////////////\n// Sets baseuri and basepath for nested routers and links\n\n\nvar BaseContext = createNamedContext(\"Base\", {\n baseuri: \"/\",\n basepath: \"/\",\n navigate: globalHistory.navigate\n}); ////////////////////////////////////////////////////////////////////////////////\n// The main event, welcome to the show everybody.\n\nvar Router = function Router(props) {\n return React.createElement(BaseContext.Consumer, null, function (baseContext) {\n return React.createElement(Location, null, function (locationContext) {\n return React.createElement(RouterImpl, _extends({}, baseContext, locationContext, props));\n });\n });\n};\n\nvar RouterImpl = function (_React$PureComponent) {\n _inherits(RouterImpl, _React$PureComponent);\n\n function RouterImpl() {\n _classCallCheck(this, RouterImpl);\n\n return _possibleConstructorReturn(this, _React$PureComponent.apply(this, arguments));\n }\n\n RouterImpl.prototype.render = function render() {\n var _props = this.props,\n location = _props.location,\n _navigate2 = _props.navigate,\n basepath = _props.basepath,\n primary = _props.primary,\n children = _props.children,\n baseuri = _props.baseuri,\n _props$component = _props.component,\n component = _props$component === undefined ? \"div\" : _props$component,\n domProps = _objectWithoutProperties(_props, [\"location\", \"navigate\", \"basepath\", \"primary\", \"children\", \"baseuri\", \"component\"]);\n\n var routes = React.Children.toArray(children).reduce(function (array, child) {\n var routes = createRoute(basepath)(child);\n return array.concat(routes);\n }, []);\n var pathname = location.pathname;\n var match = pick(routes, pathname);\n\n if (match) {\n var params = match.params,\n uri = match.uri,\n route = match.route,\n element = match.route.value; // remove the /* from the end for child routes relative paths\n\n basepath = route.default ? basepath : route.path.replace(/\\*$/, \"\");\n\n var props = _extends({}, params, {\n uri: uri,\n location: location,\n navigate: function navigate(to, options) {\n return _navigate2(resolve(to, uri), options);\n }\n });\n\n var clone = React.cloneElement(element, props, element.props.children ? React.createElement(Router, {\n location: location,\n primary: primary\n }, element.props.children) : undefined); // using 'div' for < 16.3 support\n\n var FocusWrapper = primary ? FocusHandler : component; // don't pass any props to 'div'\n\n var wrapperProps = primary ? _extends({\n uri: uri,\n location: location,\n component: component\n }, domProps) : domProps;\n return React.createElement(BaseContext.Provider, {\n value: {\n baseuri: uri,\n basepath: basepath,\n navigate: props.navigate\n }\n }, React.createElement(FocusWrapper, wrapperProps, clone));\n } else {\n // Not sure if we want this, would require index routes at every level\n // warning(\n // false,\n // `\\n\\nNothing matched:\\n\\t${\n // location.pathname\n // }\\n\\nPaths checked: \\n\\t${routes\n // .map(route => route.path)\n // .join(\n // \"\\n\\t\"\n // )}\\n\\nTo get rid of this warning, add a default NotFound component as child of Router:\n // \\n\\tlet NotFound = () =>
Not Found!
\n // \\n\\t\\n\\t \\n\\t {/* ... */}\\n\\t`\n // );\n return null;\n }\n };\n\n return RouterImpl;\n}(React.PureComponent);\n\nRouterImpl.defaultProps = {\n primary: true\n};\nvar FocusContext = createNamedContext(\"Focus\");\n\nvar FocusHandler = function FocusHandler(_ref3) {\n var uri = _ref3.uri,\n location = _ref3.location,\n component = _ref3.component,\n domProps = _objectWithoutProperties(_ref3, [\"uri\", \"location\", \"component\"]);\n\n return React.createElement(FocusContext.Consumer, null, function (requestFocus) {\n return React.createElement(FocusHandlerImpl, _extends({}, domProps, {\n component: component,\n requestFocus: requestFocus,\n uri: uri,\n location: location\n }));\n });\n}; // don't focus on initial render\n\n\nvar initialRender = true;\nvar focusHandlerCount = 0;\n\nvar FocusHandlerImpl = function (_React$Component2) {\n _inherits(FocusHandlerImpl, _React$Component2);\n\n function FocusHandlerImpl() {\n var _temp2, _this4, _ret2;\n\n _classCallCheck(this, FocusHandlerImpl);\n\n for (var _len2 = arguments.length, args = Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {\n args[_key2] = arguments[_key2];\n }\n\n return _ret2 = (_temp2 = (_this4 = _possibleConstructorReturn(this, _React$Component2.call.apply(_React$Component2, [this].concat(args))), _this4), _this4.state = {}, _this4.requestFocus = function (node) {\n if (!_this4.state.shouldFocus && node) {\n node.focus();\n }\n }, _temp2), _possibleConstructorReturn(_this4, _ret2);\n }\n\n FocusHandlerImpl.getDerivedStateFromProps = function getDerivedStateFromProps(nextProps, prevState) {\n var initial = prevState.uri == null;\n\n if (initial) {\n return _extends({\n shouldFocus: true\n }, nextProps);\n } else {\n var myURIChanged = nextProps.uri !== prevState.uri;\n var navigatedUpToMe = prevState.location.pathname !== nextProps.location.pathname && nextProps.location.pathname === nextProps.uri;\n return _extends({\n shouldFocus: myURIChanged || navigatedUpToMe\n }, nextProps);\n }\n };\n\n FocusHandlerImpl.prototype.componentDidMount = function componentDidMount() {\n focusHandlerCount++;\n this.focus();\n };\n\n FocusHandlerImpl.prototype.componentWillUnmount = function componentWillUnmount() {\n focusHandlerCount--;\n\n if (focusHandlerCount === 0) {\n initialRender = true;\n }\n };\n\n FocusHandlerImpl.prototype.componentDidUpdate = function componentDidUpdate(prevProps, prevState) {\n if (prevProps.location !== this.props.location && this.state.shouldFocus) {\n this.focus();\n }\n };\n\n FocusHandlerImpl.prototype.focus = function focus() {\n if (process.env.NODE_ENV === \"test\") {\n // getting cannot read property focus of null in the tests\n // and that bit of global `initialRender` state causes problems\n // should probably figure it out!\n return;\n }\n\n var requestFocus = this.props.requestFocus;\n\n if (requestFocus) {\n requestFocus(this.node);\n } else {\n if (initialRender) {\n initialRender = false;\n } else if (this.node) {\n // React polyfills [autofocus] and it fires earlier than cDM,\n // so we were stealing focus away, this line prevents that.\n if (!this.node.contains(document.activeElement)) {\n this.node.focus();\n }\n }\n }\n };\n\n FocusHandlerImpl.prototype.render = function render() {\n var _this5 = this;\n\n var _props2 = this.props,\n children = _props2.children,\n style = _props2.style,\n requestFocus = _props2.requestFocus,\n _props2$component = _props2.component,\n Comp = _props2$component === undefined ? \"div\" : _props2$component,\n uri = _props2.uri,\n location = _props2.location,\n domProps = _objectWithoutProperties(_props2, [\"children\", \"style\", \"requestFocus\", \"component\", \"uri\", \"location\"]);\n\n return React.createElement(Comp, _extends({\n style: _extends({\n outline: \"none\"\n }, style),\n tabIndex: \"-1\",\n ref: function ref(n) {\n return _this5.node = n;\n }\n }, domProps), React.createElement(FocusContext.Provider, {\n value: this.requestFocus\n }, this.props.children));\n };\n\n return FocusHandlerImpl;\n}(React.Component);\n\npolyfill(FocusHandlerImpl);\n\nvar k = function k() {}; ////////////////////////////////////////////////////////////////////////////////\n\n\nvar forwardRef = React.forwardRef;\n\nif (typeof forwardRef === \"undefined\") {\n forwardRef = function forwardRef(C) {\n return C;\n };\n}\n\nvar Link = forwardRef(function (_ref4, ref) {\n var innerRef = _ref4.innerRef,\n props = _objectWithoutProperties(_ref4, [\"innerRef\"]);\n\n return React.createElement(BaseContext.Consumer, null, function (_ref5) {\n var basepath = _ref5.basepath,\n baseuri = _ref5.baseuri;\n return React.createElement(Location, null, function (_ref6) {\n var location = _ref6.location,\n navigate = _ref6.navigate;\n\n var to = props.to,\n state = props.state,\n replace = props.replace,\n _props$getProps = props.getProps,\n getProps = _props$getProps === undefined ? k : _props$getProps,\n anchorProps = _objectWithoutProperties(props, [\"to\", \"state\", \"replace\", \"getProps\"]);\n\n var href = resolve(to, baseuri);\n var encodedHref = encodeURI(href);\n var isCurrent = location.pathname === encodedHref;\n var isPartiallyCurrent = startsWith(location.pathname, encodedHref);\n return React.createElement(\"a\", _extends({\n ref: ref || innerRef,\n \"aria-current\": isCurrent ? \"page\" : undefined\n }, anchorProps, getProps({\n isCurrent: isCurrent,\n isPartiallyCurrent: isPartiallyCurrent,\n href: href,\n location: location\n }), {\n href: href,\n onClick: function onClick(event) {\n if (anchorProps.onClick) anchorProps.onClick(event);\n\n if (shouldNavigate(event)) {\n event.preventDefault();\n var shouldReplace = replace;\n\n if (typeof replace !== \"boolean\" && isCurrent) {\n var _location$state = _extends({}, location.state),\n key = _location$state.key,\n restState = _objectWithoutProperties(_location$state, [\"key\"]);\n\n shouldReplace = shallowCompare(_extends({}, state), restState);\n }\n\n navigate(href, {\n state: state,\n replace: shouldReplace\n });\n }\n }\n }));\n });\n });\n});\nLink.displayName = \"Link\";\nprocess.env.NODE_ENV !== \"production\" ? void 0 : void 0; ////////////////////////////////////////////////////////////////////////////////\n\nfunction RedirectRequest(uri) {\n this.uri = uri;\n}\n\nvar isRedirect = function isRedirect(o) {\n return o instanceof RedirectRequest;\n};\n\nvar redirectTo = function redirectTo(to) {\n throw new RedirectRequest(to);\n};\n\nvar RedirectImpl = function (_React$Component3) {\n _inherits(RedirectImpl, _React$Component3);\n\n function RedirectImpl() {\n _classCallCheck(this, RedirectImpl);\n\n return _possibleConstructorReturn(this, _React$Component3.apply(this, arguments));\n } // Support React < 16 with this hook\n\n\n RedirectImpl.prototype.componentDidMount = function componentDidMount() {\n var _props3 = this.props,\n navigate = _props3.navigate,\n to = _props3.to,\n from = _props3.from,\n _props3$replace = _props3.replace,\n replace = _props3$replace === undefined ? true : _props3$replace,\n state = _props3.state,\n noThrow = _props3.noThrow,\n baseuri = _props3.baseuri,\n props = _objectWithoutProperties(_props3, [\"navigate\", \"to\", \"from\", \"replace\", \"state\", \"noThrow\", \"baseuri\"]);\n\n Promise.resolve().then(function () {\n var resolvedTo = resolve(to, baseuri);\n navigate(insertParams(resolvedTo, props), {\n replace: replace,\n state: state\n });\n });\n };\n\n RedirectImpl.prototype.render = function render() {\n var _props4 = this.props,\n navigate = _props4.navigate,\n to = _props4.to,\n from = _props4.from,\n replace = _props4.replace,\n state = _props4.state,\n noThrow = _props4.noThrow,\n baseuri = _props4.baseuri,\n props = _objectWithoutProperties(_props4, [\"navigate\", \"to\", \"from\", \"replace\", \"state\", \"noThrow\", \"baseuri\"]);\n\n var resolvedTo = resolve(to, baseuri);\n if (!noThrow) redirectTo(insertParams(resolvedTo, props));\n return null;\n };\n\n return RedirectImpl;\n}(React.Component);\n\nvar Redirect = function Redirect(props) {\n return React.createElement(BaseContext.Consumer, null, function (_ref7) {\n var baseuri = _ref7.baseuri;\n return React.createElement(Location, null, function (locationContext) {\n return React.createElement(RedirectImpl, _extends({}, locationContext, {\n baseuri: baseuri\n }, props));\n });\n });\n};\n\nprocess.env.NODE_ENV !== \"production\" ? void 0 : void 0; ////////////////////////////////////////////////////////////////////////////////\n\nvar Match = function Match(_ref8) {\n var path = _ref8.path,\n children = _ref8.children;\n return React.createElement(BaseContext.Consumer, null, function (_ref9) {\n var baseuri = _ref9.baseuri;\n return React.createElement(Location, null, function (_ref10) {\n var navigate = _ref10.navigate,\n location = _ref10.location;\n var resolvedPath = resolve(path, baseuri);\n var result = match(resolvedPath, location.pathname);\n return children({\n navigate: navigate,\n location: location,\n match: result ? _extends({}, result.params, {\n uri: result.uri,\n path: path\n }) : null\n });\n });\n });\n}; ////////////////////////////////////////////////////////////////////////////////\n// Hooks\n\n\nvar useLocation = function useLocation() {\n var context = useContext(LocationContext);\n\n if (!context) {\n throw new Error(\"useLocation hook was used but a LocationContext.Provider was not found in the parent tree. Make sure this is used in a component that is a child of Router\");\n }\n\n return context.location;\n};\n\nvar useNavigate = function useNavigate() {\n var context = useContext(BaseContext);\n\n if (!context) {\n throw new Error(\"useNavigate hook was used but a BaseContext.Provider was not found in the parent tree. Make sure this is used in a component that is a child of Router\");\n }\n\n return context.navigate;\n};\n\nvar useParams = function useParams() {\n var context = useContext(BaseContext);\n\n if (!context) {\n throw new Error(\"useParams hook was used but a LocationContext.Provider was not found in the parent tree. Make sure this is used in a component that is a child of Router\");\n }\n\n var location = useLocation();\n var results = match(context.basepath, location.pathname);\n return results ? results.params : null;\n};\n\nvar useMatch = function useMatch(path) {\n if (!path) {\n throw new Error(\"useMatch(path: string) requires an argument of a string to match against\");\n }\n\n var context = useContext(BaseContext);\n\n if (!context) {\n throw new Error(\"useMatch hook was used but a LocationContext.Provider was not found in the parent tree. Make sure this is used in a component that is a child of Router\");\n }\n\n var location = useLocation();\n var resolvedPath = resolve(path, context.baseuri);\n var result = match(resolvedPath, location.pathname);\n return result ? _extends({}, result.params, {\n uri: result.uri,\n path: path\n }) : null;\n}; ////////////////////////////////////////////////////////////////////////////////\n// Junk\n\n\nvar stripSlashes = function stripSlashes(str) {\n return str.replace(/(^\\/+|\\/+$)/g, \"\");\n};\n\nvar createRoute = function createRoute(basepath) {\n return function (element) {\n if (!element) {\n return null;\n }\n\n if (element.type === React.Fragment && element.props.children) {\n return React.Children.map(element.props.children, createRoute(basepath));\n }\n\n !(element.props.path || element.props.default || element.type === Redirect) ? process.env.NODE_ENV !== \"production\" ? invariant(false, \": Children of must have a `path` or `default` prop, or be a ``. None found on element type `\" + element.type + \"`\") : invariant(false) : void 0;\n !!(element.type === Redirect && (!element.props.from || !element.props.to)) ? process.env.NODE_ENV !== \"production\" ? invariant(false, \" requires both \\\"from\\\" and \\\"to\\\" props when inside a .\") : invariant(false) : void 0;\n !!(element.type === Redirect && !validateRedirect(element.props.from, element.props.to)) ? process.env.NODE_ENV !== \"production\" ? invariant(false, \" has mismatched dynamic segments, ensure both paths have the exact same dynamic segments.\") : invariant(false) : void 0;\n\n if (element.props.default) {\n return {\n value: element,\n default: true\n };\n }\n\n var elementPath = element.type === Redirect ? element.props.from : element.props.path;\n var path = elementPath === \"/\" ? basepath : stripSlashes(basepath) + \"/\" + stripSlashes(elementPath);\n return {\n value: element,\n default: element.props.default,\n path: element.props.children ? stripSlashes(path) + \"/*\" : path\n };\n };\n};\n\nvar shouldNavigate = function shouldNavigate(event) {\n return !event.defaultPrevented && event.button === 0 && !(event.metaKey || event.altKey || event.ctrlKey || event.shiftKey);\n}; ////////////////////////////////////////////////////////////////////////\n\n\nexport { Link, Location, LocationProvider, Match, Redirect, Router, ServerLocation, createHistory, createMemorySource, isRedirect, navigate, redirectTo, globalHistory, match as matchPath, useLocation, useNavigate, useParams, useMatch , BaseContext };","/**\n * Copyright (c) 2013-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n'use strict';\n\n/**\n * Use invariant() to assert state which your program assumes to be true.\n *\n * Provide sprintf-style format (only %s is supported) and arguments\n * to provide information about what broke and what you were\n * expecting.\n *\n * The invariant message will be stripped in production, but the invariant\n * will remain to ensure logic does not differ in production.\n */\n\nvar invariant = function(condition, format, a, b, c, d, e, f) {\n if (process.env.NODE_ENV !== 'production') {\n if (format === undefined) {\n throw new Error('invariant requires an error message argument');\n }\n }\n\n if (!condition) {\n var error;\n if (format === undefined) {\n error = new Error(\n 'Minified exception occurred; use the non-minified dev environment ' +\n 'for the full error message and additional helpful warnings.'\n );\n } else {\n var args = [a, b, c, d, e, f];\n var argIndex = 0;\n error = new Error(\n format.replace(/%s/g, function() { return args[argIndex++]; })\n );\n error.name = 'Invariant Violation';\n }\n\n error.framesToPop = 1; // we don't care about invariant's own frame\n throw error;\n }\n};\n\nmodule.exports = invariant;\n","export default function _setPrototypeOf(o, p) {\n _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) {\n o.__proto__ = p;\n return o;\n };\n\n return _setPrototypeOf(o, p);\n}","import setPrototypeOf from \"./setPrototypeOf.js\";\nexport default function _inheritsLoose(subClass, superClass) {\n subClass.prototype = Object.create(superClass.prototype);\n subClass.prototype.constructor = subClass;\n setPrototypeOf(subClass, superClass);\n}","export default function _arrayLikeToArray(arr, len) {\n if (len == null || len > arr.length) len = arr.length;\n\n for (var i = 0, arr2 = new Array(len); i < len; i++) {\n arr2[i] = arr[i];\n }\n\n return arr2;\n}","import arrayWithoutHoles from \"./arrayWithoutHoles.js\";\nimport iterableToArray from \"./iterableToArray.js\";\nimport unsupportedIterableToArray from \"./unsupportedIterableToArray.js\";\nimport nonIterableSpread from \"./nonIterableSpread.js\";\nexport default function _toConsumableArray(arr) {\n return arrayWithoutHoles(arr) || iterableToArray(arr) || unsupportedIterableToArray(arr) || nonIterableSpread();\n}","import arrayLikeToArray from \"./arrayLikeToArray.js\";\nexport default function _arrayWithoutHoles(arr) {\n if (Array.isArray(arr)) return arrayLikeToArray(arr);\n}","export default function _iterableToArray(iter) {\n if (typeof Symbol !== \"undefined\" && iter[Symbol.iterator] != null || iter[\"@@iterator\"] != null) return Array.from(iter);\n}","import arrayLikeToArray from \"./arrayLikeToArray.js\";\nexport default function _unsupportedIterableToArray(o, minLen) {\n if (!o) return;\n if (typeof o === \"string\") return arrayLikeToArray(o, minLen);\n var n = Object.prototype.toString.call(o).slice(8, -1);\n if (n === \"Object\" && o.constructor) n = o.constructor.name;\n if (n === \"Map\" || n === \"Set\") return Array.from(o);\n if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return arrayLikeToArray(o, minLen);\n}","export default function _nonIterableSpread() {\n throw new TypeError(\"Invalid attempt to spread non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n}"],"names":["module","exports","self","ReferenceError","__esModule","_extends","Object","assign","target","i","arguments","length","source","key","prototype","hasOwnProperty","call","apply","this","setPrototypeOf","subClass","superClass","create","constructor","obj","excluded","sourceKeys","keys","indexOf","_setPrototypeOf","o","p","__proto__","getLocation","_source$location","location","search","hash","href","origin","protocol","host","hostname","port","pathname","canUseDOM","URL","encodeURI","decodeURI","state","history","createHistory","options","listeners","transitioning","resolveTransition","_onTransitionComplete","listen","listener","push","popstateListener","action","addEventListener","removeEventListener","filter","fn","navigate","to","_ref","undefined","_ref$replace","replace","go","Date","now","replaceState","pushState","e","transition","Promise","res","forEach","createMemorySource","initialPath","searchIndex","initialLocation","substr","index","stack","states","name","_","uri","_uri$split","split","_uri$split$","_uri$split2","_uri$split2$","newIndex","window","document","createElement","globalHistory","shallowCompare","validateRedirect","insertParams","resolve","match","pick","startsWith","_invariant","_invariant2","default","string","routes","default_","uriPathname","uriSegments","segmentize","isRootUri","ranked","rankRoutes","l","missed","route","params","routeSegments","path","max","Math","routeSegment","uriSegment","isSplat","slice","map","decodeURIComponent","join","dynamicMatch","paramRe","exec","reservedNames","value","isDynamic","segment","test","rankRoute","score","reduce","isRootSegment","SEGMENT_POINTS","sort","a","b","addQuery","_len","query","Array","_key","q","base","_to$split","toPathname","toQuery","basePathname","toSegments","baseSegments","concat","allSegments","segments","pop","_path$split","pathBase","_path$split$","constructedPath","_params$location","_params$location$sear","searchSplit","from","obj1","obj2","obj1Keys","every","token","singleMatcher","RegExp","multiMatcher","decodeComponents","components","err","left","right","decode","input","tokens","encodedURI","TypeError","replaceMap","result","entries","customDecodeURIComponent","predicate","ret","isArr","isArray","val","strictUriEncode","decodeComponent","splitOnFirst","filterObject","validateArrayFormatSeparator","encode","strict","encodeURIComponent","keysSorter","Number","removeHash","hashStart","extract","queryStart","parseValue","parseNumbers","isNaN","trim","parseBooleans","toLowerCase","parse","arrayFormat","arrayFormatSeparator","formatter","accumulator","includes","isEncodedArray","newValue","item","parserForArrayFormat","param","k","Boolean","stringify","object","shouldFilter","skipNull","skipEmptyString","encoderForArrayFormat","objectCopy","x","parseUrl","url","url_","parseFragmentIdentifier","fragmentIdentifier","stringifyUrl","queryFromUrl","parsedQueryFromUrl","queryString","getHash","exclude","exclusionFilter","separator","separatorIndex","str","charCodeAt","toString","toUpperCase","__assign","t","s","n","withDefault","defaultValue","includeNull","args","_i","decodedValue","getEncodedValue","allowEmptyString","decodeNumber","numStr","decodeString","String","decodeArray","arr","getEncodedValueArray","StringParam","NumberParam","num","ArrayParam","array","d","updateLocation","encodedQuery","stringifyOptions","encodedSearchString","transformSearchString","encodeQueryParams","paramConfigMap","paramNames_1","paramName","is","y","shallowEqual","objA","objB","equalMap","_a","_b","keysA","keysB","isEqual","equals","useUpdateRefIfShallowNew","ref","hasNew","current","getSSRSafeSearchString","createLocationWithChanges","queryReplacements","updateType","encodedQueryReplacements","currQuery","updateInLocation","LocationContext","setLocation","useLocationContext","LocationProvider","children","locationRef","updateUrlQuery","Provider","initialSearchString","cachedSearchString","cachedParsedQuery","sharedMemoizedQueryParser","newSearchString","getLatestDecodedValue","paramConfig","paramConfigRef","encodedValueCacheRef","decodedValueCacheRef","hasNewParamConfig","isValueEqual","parsedQuery","hasNewEncodedValue","encodedValue","newDecodedValue","useQueryParam","setValueDeps","setValueDepsRef","newEncodedValue","deps","latestValue","getLatestDecodedValues","paramConfigMapRef","parsedQueryRef","encodedValuesCacheRef","decodedValuesCacheRef","hasNewParamConfigMap","encodedValues","decodedValues","encodedValuesCache","decodedValuesCache","setQueryDeps","setQueryDepsRef","changes","encodedChanges","latestValues","cachedWindowHistory","cachedAdaptedWindowHistory","cachedReachHistory","cachedAdaptedReachHistory","adaptReachHistory","adaptedReachHistory","getLocationProps","adaptedWindowHistory","adaptWindowHistory","Error","QueryParamProvider","ReactRouterRoute","reachHistory","stringifyOptionsRef","stringifyOptionsCached","routeProps","_interopRequireDefault","withPrefix","getGlobalPathPrefix","_objectWithoutPropertiesLoose2","_assertThisInitialized2","_inheritsLoose2","_extends2","_propTypes","_react","_reachRouter","_utils","_parsePath","parsePath","_excluded","isAbsolutePath","prefix","_prefix","getGlobalBasePrefix","isLocalLink","endsWith","rewriteLinkPath","relativeTo","absolutify","NavLinkPropTypes","activeClassName","activeStyle","partiallyActive","bool","GatsbyLinkLocationWrapper","props","Location","_ref2","GatsbyLink","_location","_React$Component","_this","defaultGetProps","_ref3","isPartiallyCurrent","isCurrent","className","style","IOSupported","IntersectionObserver","handleRef","bind","_proto","_prefetch","currentPath","rewrittenPath","newPathName","___loader","enqueue","componentDidUpdate","prevProps","prevState","componentDidMount","componentWillUnmount","io","_this$io","instance","el","unobserve","disconnect","cb","_this2","innerRef","entry","isIntersecting","intersectionRatio","observe","render","_this3","_this$props","_this$props$getProps","getProps","_onClick","onClick","_onMouseEnter","onMouseEnter","rest","prefixedTo","Link","hovering","button","defaultPrevented","metaKey","altKey","ctrlKey","shiftKey","preventDefault","shouldReplace","___navigate","Component","propTypes","func","isRequired","_default","forwardRef","hashIndex","_scrollHandler","ScrollHandler","_useScrollRestoration","useScrollRestoration","ScrollContext","React","nodeInterop","cache","_getRequireWildcardCache","has","get","newObj","hasPropertyDescriptor","defineProperty","getOwnPropertyDescriptor","desc","set","_interopRequireWildcard","_sessionStorage","WeakMap","cacheBabelInterop","cacheNodeInterop","createContext","SessionStorage","displayName","_stateStorage","_isTicking","_latestKnownScrollY","scrollListener","scrollY","requestAnimationFrame","_saveScroll","windowScroll","position","shouldUpdateScroll","scrollTo","scrollToHash","node","getElementById","substring","scrollIntoView","prevRouterProps","routerProps","save","scrollPosition","_this$props$location","read","_this$props$location2","element","GATSBY_ROUTER_SCROLL_STATE","stateKey","getStateKey","sessionStorage","getItem","JSON","storedValue","setItem","stateKeyBase","identifier","useLocation","useContext","useRef","useLayoutEffect","onScroll","scrollTop","plugin","require","plugins","getResourceURLsForPathname","loadPage","loadPageSync","api","defaultReturn","argTransform","results","previous","next","then","all","on","type","handler","off","splice","emit","evt","mitt","charAt","pathCache","Map","matchPaths","trimPathname","rawPathname","stripPrefix","__BASE_PATH__","setMatchPaths","findMatchPath","trimmedPathname","cleanPath","pickPaths","matchPath","originalPath","normalizePagePath","grabMatchParams","findPath","redirect","maybeGetBrowserRedirect","toPath","foundPath","prefetchPathname","loader","StaticQueryContext","StaticQueryDataRenderer","staticQueryData","data","finalData","StaticQuery","Consumer","useStaticQuery","context","graphql","supportedPrefetchStrategy","feature","fakeLink","relList","supports","support","reject","link","setAttribute","onload","onerror","getElementsByTagName","getElementsByName","parentNode","appendChild","req","XMLHttpRequest","open","status","send","preFetched","catch","PageResourceStatus","Success","preferDefault","m","createPageDataUrl","doFetch","method","onreadystatechange","readyState","toPageResources","pageData","component","page","componentChunkName","webpackCompilationHash","staticQueryHashes","json","BaseLoader","loadComponent","inFlightNetworkRequests","pageDb","inFlightDb","staticQueryDb","pageDataDb","prefetchTriggered","Set","prefetchCompleted","memoizedGet","inFlightPromise","response","delete","setApiRunner","apiRunner","prefetchDisabled","some","fetchPageDataJson","loadObj","pagePath","retries","responseText","jsonPayload","payload","notFound","loadPageDataJson","rawPath","error","loadAppData","allData","finalResult","componentChunkPromise","pageResources","createdAt","staticQueryBatchPromise","staticQueryHash","staticQueryResults","staticQueryResultsMap","emitter","withErrorDetails","shouldPrefetch","navigator","connection","effectiveType","saveData","doesConnectionSupportPrefetch","prefetch","add","realPath","doPrefetch","pageDataUrl","prefetchHelper","crossOrigin","as","createComponentUrls","isPageNotFound","appData","___chunkMapping","chunk","__PATH_PREFIX__","ProdLoader","asyncRequires","chunkName","componentUrls","setLoader","_loader","publicLoader","getStaticQueryResults","PageRenderer","pageContext","__params","pageElement","RouteAnnouncerProps","id","top","width","height","padding","overflow","clip","whiteSpace","border","maybeRedirect","___replace","nextRoute","event","reason","onPreRouteUpdate","prevLocation","onRouteUpdate","___swUpdated","timeoutId","setTimeout","clearTimeout","___webpackCompilationHash","serviceWorker","controller","postMessage","gatsbyApi","reachNavigate","getSavedScrollPosition","oldPathname","RouteAnnouncer","announcementRef","nextProps","pageName","title","pageHeadings","querySelectorAll","textContent","newAnnouncement","innerText","compareLocationProps","nextLocation","RouteUpdates","shouldComponentUpdate","shallowDiffers","EnsureResources","getDerivedStateFromProps","loadResources","setState","nextState","___emitter","___push","apiRunnerAsync","RouteHandler","BaseContext","baseuri","basepath","DataContext","GatsbyRoot","LocationHandler","Router","browserLoc","message","console","SiteRoot","App","onClientEntryRanRef","performance","mark","renderer","ReactDOM","runRender","rootElement","doc","documentElement","doScroll","InternalPageRenderer","redirectMap","redirectIgnoreCaseMap","redirects","ignoreCase","fromPath","register","reg","installingWorker","installing","log","___failedResources","reload","localizedManifests","defaultFilename","localizedManifest","find","app","start_url","lang","wrapRootElement","offsetY","getTargetOffset","pageYOffset","body","clientTop","computedStyles","getComputedStyle","scrollMarginTop","getPropertyValue","getBoundingClientRect","parseInt","onInitialClientRender","pluginOptions","offset","_objectWithoutProperties","_classCallCheck","Constructor","_possibleConstructorReturn","_inherits","enumerable","writable","configurable","createNamedContext","Ctx","_temp","getContext","refs","unlisten","_props$history","componentDidCatch","info","isRedirect","_navigate","unmounted","defaultProps","ServerLocation","baseContext","locationContext","RouterImpl","_React$PureComponent","_props","_navigate2","primary","_props$component","domProps","child","createRoute","clone","FocusWrapper","FocusHandler","wrapperProps","FocusContext","requestFocus","FocusHandlerImpl","initialRender","focusHandlerCount","_React$Component2","_temp2","_this4","_len2","_key2","shouldFocus","focus","myURIChanged","navigatedUpToMe","contains","activeElement","_this5","_props2","_props2$component","Comp","outline","tabIndex","C","_ref4","_ref5","_ref6","_props$getProps","anchorProps","encodedHref","shouldNavigate","_location$state","restState","RedirectRequest","redirectTo","RedirectImpl","_React$Component3","_props3","_props3$replace","noThrow","resolvedTo","_props4","Redirect","_ref7","Match","_ref8","_ref9","_ref10","resolvedPath","useNavigate","useParams","useMatch","stripSlashes","elementPath","condition","format","c","f","argIndex","framesToPop","_inheritsLoose","_arrayLikeToArray","len","arr2","_toConsumableArray","iter","Symbol","iterator","minLen"],"sourceRoot":""} \ No newline at end of file diff --git a/basicmessage/1.0/index.html b/basicmessage/1.0/index.html new file mode 100644 index 00000000..18f6dd44 --- /dev/null +++ b/basicmessage/1.0/index.html @@ -0,0 +1,19 @@ +Basic Message | DIDComm
DIDComm

Basic Message 1.0

Summary

The BasicMessage protocol describes a stateless, easy to support user message protocol. It has a single message type used to communicate.

Details

+

This protocol is defined here: https://github.com/hyperledger/aries-rfcs/tree/main/features/0095-basic-message

+

Note: as pointed in the abovementioned link, the version of this protocol is 1.0 and was defined initially in Hyperledger Aries using DIDComm v1 headers/decorators. Readers should be aware that there’s a new 2.0 version of this protocol that also complies with DIDComm v2 headers. Version 2.0 can be found here

PIURI
https://didcomm.org/basicmessage/1.0
Status
Production
Hashtags
Publisher
@TelegramSam
Authors
Version
1.0
License
MIT
Last modified
2024 Jun 24, 19:06 PM
\ No newline at end of file diff --git a/basicmessage/2.0/index.html b/basicmessage/2.0/index.html new file mode 100644 index 00000000..777d201f --- /dev/null +++ b/basicmessage/2.0/index.html @@ -0,0 +1,83 @@ +BasicMessage | DIDComm
DIDComm

BasicMessage 2.0

Summary

The BasicMessage protocol describes a stateless, easy to support user message protocol. It has a single message type used to communicate.

Roles

+

There are two roles in this protocol: sender and receiver. It is anticipated that both roles are supported by agents that provide an interface for humans, but it is possible for an agent to only act as a sender (do not process received messages) or a receiver (will never send messages).

+

Connectivity

+

There are no assumptions about this protocol. It can be used to send a message, and there is no protocol level expectation of a response.

+

States

+

There are not really states in this protocol, as sending a message leaves both parties in the same state they were before.

+

Basic Walkthrough

+

Using this protocol, either party can send a message to the other at any time. There are no rules about taking turns or requiring a response.

+

Messages are assumed to be made visible to the recipient or evaluated by automated processes.

+

Design By Contract

+

No protocol specific errors exist. Any errors related to headers or other core features are documented in the appropriate places.

+

Security

+

This protocol expects messages to be encrypted during transmission, and repudiable.

+

Composition

+ + + + + + + +
Supported Goal CodeNotes
+

Message Reference

+

message

+

Message Type URI: https://didcomm.org/basicmessage/2.0/message

+

The message message is sent by the sender to the recipient. Note that the role is only specific to the creation of messages, and that both parties may play both roles.

+

Attributes:

+

content - content of the user intended message.

+

Supported decorators/headers:

+
    +
  • The message should indicate the language used in the message. DIDComm V1 and DIDComm V2 have different methods for this. See examples below.
  • +
  • The time the message is sent must be included. DIDComm V2 uses the created_time header. DIDComm V1 must include a sent_time as a message attribute containing the timestamp in ISO 8601 UTC format.
  • +
+

DIDComm V1 Example:

+
{
+    "@id": "123456780",
+    "@type": "https://didcomm.org/basicmessage/2.0/message",
+    "~l10n": { "locale": "en" },
+    "sent_time": "2019-01-15 18:42:01Z",
+    "content": "Your hovercraft is full of eels."
+}
+
+

DIDComm V2 Example:

+
{
+    "id": "123456780",
+    "type": "https://didcomm.org/basicmessage/2.0/message",
+    "lang": "en",
+    "created_time": 1547577721,
+    "body": {
+        "content": "Your hovercraft is full of eels."
+    }
+}
+
+

L10n

+

The language SHOULD be specified according to the method used in the DIDComm base protocol version.

+

Implementations

+

Endnotes

+

1 Out of Scope

+

There are many useful features of user messaging systems that we will not be adding to this protocol. We anticipate the development of more advanced and full-featured message protocols to fill these needs. Features that are considered out of scope for this protocol include:

+
    +
  • read receipts
  • +
  • emojii responses
  • +
  • typing indicators
  • +
  • message replies (threading)
  • +
  • multi-party (group) messages
  • +
  • attachments
  • +
PIURI
https://didcomm.org/basicmessage/2.0
Status
Production
Hashtags
Publisher
@TelegramSam
Authors
Version
2.0
License
MIT
Last modified
2024 Jun 24, 19:06 PM
\ No newline at end of file diff --git a/book/v2/authentication/index.html b/book/v2/authentication/index.html new file mode 100644 index 00000000..98dc4661 --- /dev/null +++ b/book/v2/authentication/index.html @@ -0,0 +1,18 @@ +DIDComm

Message Authentication

+

TODO: Add details about authenticated encryption.

\ No newline at end of file diff --git a/book/v2/didrotation/index.html b/book/v2/didrotation/index.html new file mode 100644 index 00000000..9d4896c7 --- /dev/null +++ b/book/v2/didrotation/index.html @@ -0,0 +1,58 @@ +DIDComm

DID Rotation

+

DIDComm Messaging relies on the DIDs, and associated DID Documents, of the two peers involved in the communication. Those parties are responsible to secure their keys by performing rutinely key rotations, even if they are not compromised, and to make other changes in the DID Documents as needed, such as service endpoints. DIDComm has no involvement in that procedure that is particular to each DID method; nevertheless and provided that the DID does not change, the communication can keep flowing normally.

+

However there are cases when the DID (not the DID Document) need to be rotated by one of the parties, such as in the following three cases:

+
    +
  1. At the beginning of a connection: its common that the initial message is in the form of an Out of Band message that it is unencrypted per definition, and may be observed by another party or transmitted in an unsecure channel such as a QR code or a URL posted in an email or webpage. The DID used in the OOB should be considered as a temporal DID just to start the conversation, but it is highly recommended that it is rotated afterwards to improve privacy.
  2. +
  3. When keys inside a DID Document need to be rotated and the DID method does not allow updating the DID Document with new rotated keys, as is the case for did:key.
  4. +
  5. If there is a need to move to a different DID method for whatever reason (security, flexibility, interoperability, etc)
  6. +
+

DIDComm defines a specific header to handle DID rotation. This header is called from_prior and can be used in any message sent to the other party. That message must include the from_prior header that is a standard JWT token conformed with:

+
    +
  • Header: +
      +
    • typ: jwt
    • +
    • alg: verification algorithm such as EdDSA
    • +
    • crv: curve name
    • +
    • kid: key id from previous DID that is used in the signature of this JWT
    • +
    +
  • +
  • Payload: +
      +
    • sub: the new DID
    • +
    • iss: the previous DID
    • +
    • iat: datetime in seconds
    • +
    +
  • +
  • Signature: from the previous DID and key defined in the kid
  • +
+

Once a DIDComm agent receives a message from an unknown DID, it must:

+
    +
  1. check if there’s a from_prior header
  2. +
  3. if exists, extract the DID from the iss and validate if it matches a known DID
  4. +
  5. validate JWT signatures using the key defined in kid and extracted from previous DID defined in iss
  6. +
  7. if all validations are successful, the new DID should be stored for future communications with the previously known agent
  8. +
+

The sender, who's doing the rotation, should continue to send the rotation header until they receive a message from the other party using the new DID. This allows for continuity even if one party is offline or not processing messages for a while.

+

Example code showing a DID Rotation after an Out of Band message can be found in the section Starting, using and ending a DIDComm connection from this Guidebook.

+

Since DIDComm is asynchronous in nature, messages can arrive in different order. Sender and receiver should take care to:

+
    +
  • Sender: avoid starting a DID rotation in the middle of multiple message conversations. If DID rotation arrives out of order, some messages may be discarded by the recipient.
  • +
  • Receiver: messages received from the old DID but after the message that performs the DID rotation must be discarded to reduce the risk of potentially compromised keys.
  • +
+

Finally, DID rotation allows a special case when rotating to nothing that denotes the end of the relationship. In this case the DID should be omitted from the from header and from the sub field of the from_prior header.

\ No newline at end of file diff --git a/book/v2/extensions/index.html b/book/v2/extensions/index.html new file mode 100644 index 00000000..bbf060c6 --- /dev/null +++ b/book/v2/extensions/index.html @@ -0,0 +1,25 @@ +DIDComm

Extensions

+

Extension adds a self-contained set of conventions or features. Support for them is optional. +The following is a list of available extensions. Note that we are in the process of formalizing the status of each extension specification, they should be treated as DRAFT for the moment:

+
\ No newline at end of file diff --git a/book/v2/faq/index.html b/book/v2/faq/index.html new file mode 100644 index 00000000..385787c0 --- /dev/null +++ b/book/v2/faq/index.html @@ -0,0 +1,37 @@ +DIDComm

Intro

+

This file will work as a lightweight frequently asked questions before it grows into something unmanagable and needs to have better structure on it. For now this will offer a simple content adressing list an link to each question. +We have sections of questions and questions underneath each section. They link directly to each question.

+

Cryptography

+
    +
  1. How kosher is it to do non encrypted messages?
  2. +
+
+

How kosher is it to do non encrypted messages?

+

Since it is an option to not encrypt DIDComm messages, and we want to be clear on how you can reason about it

+

The answer to "how kosher" depends on two subquestions:

+
    +
  1. +

    Are you uninterested in confidentiality because the message is intended to be public anyway (e.g., it's a message inviting anyone in the general public to send you a message)?

    +
  2. +
  3. +

    Will the message stay within trust domain boundaries? (That is, Alice sends an encrypted message to Bob; Bob decrypts and wants to send it as plaintext to 5 of his agents, but all of them are within his own sphere of control, and Bob trusts himself.)

    +
  4. +
+

If the answer to either of these questions is "Yes", then we think non encrypted messages are completely fine.

+

If the answer to both of these questions is "No", then we think messages should be encrypted, because it means confidentiality should matter. It might be tempting to say, "True. But I'm using https, which gives confidentiality anyway." This is a fallacy, because by design a sender in DIDComm doesn't actually know the full route to the target. A sender might be using HTTPS, but perhaps part of the route is not. Using channel-oriented encryption (e.g., TLS) on the part of the channel you can see is not actually secure, if someone somewhere has to take plaintext off that channel and put it somewhere else that you don't know about. The guarantee is supposed to be end-to-end. (In our question #2 above, "Bob" is the end; what he does after it gets to him is his business, not DIDComm's. That's why we are comfortable with him using plaintext in a context wholly under his own control.)

\ No newline at end of file diff --git a/book/v2/helloencrypt/index.html b/book/v2/helloencrypt/index.html new file mode 100644 index 00000000..0fa38759 --- /dev/null +++ b/book/v2/helloencrypt/index.html @@ -0,0 +1,35 @@ +DIDComm
\ No newline at end of file diff --git a/book/v2/hellolibstools/index.html b/book/v2/hellolibstools/index.html new file mode 100644 index 00000000..866ac81a --- /dev/null +++ b/book/v2/hellolibstools/index.html @@ -0,0 +1,93 @@ +DIDComm

Choosing libraries and tools

+

This is a list of libraries and tools available to DIDComm developers.

+

Much of this information comes from this IIW presentation and slides.

+

Available Releases

+ +

Reference Implementations

+

These reference implementations provide a demonstration and examples in several programming languages.

+ +

Tools

+

DIDComm v2 developers are contributing to projects that provide important tools for DIDComm v2.

+
\ No newline at end of file diff --git a/book/v2/helloworldpy/index.html b/book/v2/helloworldpy/index.html new file mode 100644 index 00000000..478fda8d --- /dev/null +++ b/book/v2/helloworldpy/index.html @@ -0,0 +1,107 @@ +DIDComm

"Hello World" in Python

+

This simple "Hello World" example shows how Alice can create an encrypted message to Bob. In that case, we are using DIDComm Python and Peerdid Python libraries from SICPA.

+

Step 1: Install packages

+

Once you set up your python environment, you need to install the following packages:

+
pip install didcomm
+pip install peerdid
+pip install json
+
+

The code in the following sections can be executed in a single python file or executed online in this Binder interactive Jupyter notebook.

+

Step 2: Imports

+

First, we need to import all required functions, clases and types from didcomm and peerdid libraries as follows:

+
from didcomm.common.types import DID, VerificationMethodType, VerificationMaterial, VerificationMaterialFormat
+from didcomm.did_doc.did_doc import DIDDoc, VerificationMethod, DIDCommService
+from didcomm.did_doc.did_resolver import DIDResolver
+from didcomm.message import Message
+from didcomm.secrets.secrets_resolver_demo import SecretsResolverDemo
+from didcomm.unpack import unpack, UnpackResult
+from didcomm.common.resolvers import ResolversConfig
+from didcomm.pack_encrypted import pack_encrypted, PackEncryptedConfig, PackEncryptedResult
+from didcomm.secrets.secrets_util import generate_x25519_keys_as_jwk_dict, generate_ed25519_keys_as_jwk_dict, jwk_to_secret
+from peerdid import peer_did
+from peerdid.did_doc import DIDDocPeerDID
+from peerdid.types import VerificationMaterialAuthentication, VerificationMethodTypeAuthentication, VerificationMaterialAgreement, VerificationMethodTypeAgreement, VerificationMaterialFormatPeerDID
+import json
+
+

Step 3: Resolvers

+

In this step we add two Resolvers needed by DIDComm and the libraries:

+

Secret resolver:

+

This sample code needs a storage to keep the generated key pair secrets. It will then be referenced by the library as a secrets_resolver. We can instantiate it as follows: +secrets_resolver = SecretsResolverDemo() +Note that the SecretsResolverDemo simply stores the keys in a text file named secrets.json. As you've just realized, this secret storage is anything but secure. Keep in mind that securing keys is of utmost importance for a self-sovereign identity; never use it in production.

+

DID Resolver:

+

DIDComm only works if your code knows how to resolve DIDs to DID documents. There are various libraries that provide that feature. For example, the Universal Resolver can be used. In this walk-through, we'll provide a simple stub that minimizes dependencies and keeps things as simple as possible. Click here for full example where you'll find the code that do the trick.

+

Step 4: Create DIDs

+

Using create_simple_peer_did helper function, Alice and Bob can create their DID Peer that they will share and use when communicating privately between each other. This function creates a basic DID Peer with only one Agreement key, one Authentication key, and no Service part. You can find the helper function and the full code here.

+
alice_did = await create_simple_peer_did()
+print("Alice's DID:", alice_did)
+bob_did = await create_simple_peer_did()
+print("Bob's DID:", bob_did)
+
+

You should get something similar to:

+
Alice's DID: did:peer:2.Ez6LSt4Jscr227NFyuzKHT85haVE4AFVXm1tDwYeZ5xenxMmW.Vz6MkfvwnoNS6Cto38MEMbqdnypVDN7gS4oAMaHFkjAUse5JE
+Bob's DID: did:peer:2.Ez6LSetXDUvD8rBSei5TU5ew7VRdWyNBr5mAsxr6EoHFTxt9f.Vz6Mkty3Nu98rnrHfk1GBCurF7EFKY5Vb34FAJNJCMhwzduk3
+
+

Remember that while creating these simple DIDs, our helper function also stores the private keys in the secrets_resolver. In a real implementation, Alice will have her own secure store in her own wallet, and Bob will have a separated secure store in his own wallet. +Also, those Peer DIDs can be resolved into DID documents that contain the Authentication and Agreement public keys.

+

Step 5: Encrypt and pack the message

+

Alice can create a simple "Hello World" message with:

+
message = Message(
+    body = {"msg": "Hello World"},
+    id = "unique-id-24160d23ed1d",
+    type = "my-protocol/1.0",
+    frm = alice_did,
+    to = [bob_did]
+)
+
+

Note that the message includes an id that is mandatory and has to be unique to Alice. Also includes a type, also mandatory, that points to the protocol identifier that we've just invented. The body contains the actual message in an structured way associated by our my-protocol/1.0. Attributes from and to are optional. Beware that in the code above the property from was replaced by frm due to a conflict of reserved words in Python; the conversion to the correct property (from) is handled internally by the library.

+

DIDComm defines three message formats: plaintext, signed, and encrypted. We are going to use the latter since it is the most common for most applications. In that case, the message will be encrypted so only Bob can see it. +The final packed message can be generated with this code:

+
packed_msg = await pack_encrypted(
+    resolvers_config = ResolversConfig(
+        secrets_resolver = secrets_resolver,
+        did_resolver = DIDResolverPeerDID()
+    ),
+    message = message,
+    frm = alice_did,
+    to = bob_did,
+    sign_frm = None,
+    pack_config = PackEncryptedConfig(protect_sender_id=False)
+)
+
+

This library also offers the option of anonymous encryption, encryption with no repudation, and message signing. Note also that we pass a resolver configuration pointing to our secrets store and the DID resolver. +If you take a look at the packed message, you'll see that the content was hidden in the encryption:

+
print(packed_msg.packed_msg[:200]+"...")
+
+

{"protected":"eyJ0eXAiOiJhcHBsaWNhdGlvbi9kaWRjb21tLWVuY3J5cHRlZCtqc29uIiwiYWxnIjoiRUNESC0xUFUrQTI1NktXIiwiZW5jIjoiQTI1NkNCQy1IUzUxMiIsImFwdSI6IlpHbGtPbkJsWlhJNk1pNUZlalpNVTNJM1pWaFlObXBxYjI0MFpFVmFWaz...

+

Step 6: Receive and unpack the message

+

Alice will send the packed message to Bob using a transport. Once received, Bob can unpack it with the following code:

+
unpack_msg = await unpack(
+    resolvers_config=ResolversConfig(
+        secrets_resolver=secrets_resolver,
+        did_resolver=DIDResolverPeerDID()
+    ),
+    packed_msg=packed_msg.packed_msg
+)
+
+

Note that we also passed the resolver config as before. +Finally, Bob can see Alice's message by:

+
print(unpack_msg.message.body["msg"])
+
+

Hello World

\ No newline at end of file diff --git a/book/v2/index.html b/book/v2/index.html new file mode 100644 index 00000000..eb375564 --- /dev/null +++ b/book/v2/index.html @@ -0,0 +1,92 @@ +DIDComm

DIDComm V2 Guidebook

+

If you're a developer who wants to learn the practicalities of DIDComm -- getting started, common recipes, libraries and tools, the theory behind the spec, or how your peers are solving interesting problems -- this is the place.

+

This is a living doc, updated and expanded regularly by the DIDComm User Group. If you have suggestions for the book, we welcome your contributions; reach out to us on Discord or email for help.

+
+

This version of the book focuses on DIDComm v2 (the one incubated by DIF, finalized in early 2022). For info about migration from DIDComm v1, see Appendix: Migration from DIDComm v1. A new version of DIDComm, v3, is imagined. This would be an IETF standard that builds on v2 with a session construct, improved binary support, leaner messages for IoT, and so forth. When we have links for that work, we'll add them here.

+
+

Contents

+
    +
  1. Why DIDComm?
  2. +
  3. Latest DIDComm community activity
  4. +
  5. Hello World +
      +
    1. Choosing libraries and tools
    2. +
    3. Putting a message in an encrypted envelope
    4. +
    5. Hello World in Python
    6. +
    7. Starting, using and ending a DIDComm connection
    8. +
    +
  6. +
  7. Threading
  8. +
  9. Protocols +
      +
    1. Implementing a protocol
    2. +
    3. Designing your own protocol +
        +
      1. When this makes sense
      2. +
      3. Conventions
      4. +
      5. Best practices
      6. +
      +
    4. +
    5. Sharing your protocol
    6. +
    7. Co-protocols
    8. +
    +
  10. +
  11. Recipes +
      +
    1. Debugging
    2. +
    3. Timeouts
    4. +
    5. Retries
    6. +
    7. Localization
    8. +
    9. N-wise
    10. +
    11. Bootstrapping
    12. +
    13. Using DIDComm security outside DIDComm
    14. +
    15. Dealing with mobile agents
    16. +
    17. Problem Codes
    18. +
    +
  12. +
  13. Safety +
      +
    1. Privacy
    2. +
    3. Security +
        +
      1. Authcrypt vs. Anoncrypt
      2. +
      3. Choosing curves
      4. +
      5. Choosing DID methods
      6. +
      +
    4. +
    5. Message security contexts
    6. +
    7. DID rotation
    8. +
    9. Perfect forward secrecy
    10. +
    11. Man in the middle
    12. +
    +
  14. +
  15. Routing
  16. +
  17. Extensions
  18. +
  19. Frequently Asked Questions +
      +
    1. OpenID4VC
    2. +
    +
  20. +
  21. Appendix: Migration from DIDComm v1 +
      +
    1. What's new
    2. +
    3. Migrator script
    4. +
    +
  22. +
\ No newline at end of file diff --git a/book/v2/intro/index.html b/book/v2/intro/index.html new file mode 100644 index 00000000..e88c07b0 --- /dev/null +++ b/book/v2/intro/index.html @@ -0,0 +1,18 @@ +DIDComm

Implementers Guide

+

This guide contains concepts, explanations, and important considerations for those building DIDComm capable systems.

\ No newline at end of file diff --git a/book/v2/migratorscript/index.html b/book/v2/migratorscript/index.html new file mode 100644 index 00000000..fec7c3d0 --- /dev/null +++ b/book/v2/migratorscript/index.html @@ -0,0 +1,184 @@ +DIDComm

V1 --> v2 migrator script

+

Header and decorator mappings

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
v1v2Notes
@idid
@typetype
~thread.thidthid
~thread.pthidpthid
~thread.sender_ordersender_ordersee Advanced Sequencing Extension
~thread.received_ordersreceived_ordersee Advanced Sequencing Extension
~thread.goal_codebody.goal_code
goal_codebody.goal_code
goalbody.goal
~l10nl10nsee L10n Extension
~transport.return_routereturn_routesee Return-Route Extension
~timing.expires_timeexpires_timev1 use timestamp format as "2019-01-25 18:25Z", v2 use unixtime seconds since 1970-01-01T00:00:00Z
sent_timecreated_timev1 use timestamp format as "2019-01-25 18:25Z", v2 use unixtime seconds since 1970-01-01T00:00:00Z
handlerhandler
~tracetrace
~attachattachmentsan array of attachments
~attach[n].@idattachments[n].id
~attach[n].mime_typeattachments[n].media_type
~attach[n].filenameattachments[n].filename
~attach[n].descriptionattachments[n].description
~attach[n].lastmod_timeattachments[n].lastmod_time
~attach[n].byte_countattachments[n].byte_count
~attach[n].filenameattachments[n].filename
~attach[n].dataattachments[n].data
~attach[n].data.jwsattachments[n].data.jws
~attach[n].data.sha256attachments[n].data.hash
~attach[n].data.linksattachments[n].data.links
~attach[n].data.base64attachments[n].data.base64
~attach[n].data.jsonattachments[n].data.json
problem_codebody.codein Problem Report Protocol
commentbody.commentin Problem Report Protocol
\ No newline at end of file diff --git a/book/v2/mitm/index.html b/book/v2/mitm/index.html new file mode 100644 index 00000000..1282c518 --- /dev/null +++ b/book/v2/mitm/index.html @@ -0,0 +1,18 @@ +DIDComm
\ No newline at end of file diff --git a/book/v2/mobileagents/index.html b/book/v2/mobileagents/index.html new file mode 100644 index 00000000..8cc462a5 --- /dev/null +++ b/book/v2/mobileagents/index.html @@ -0,0 +1,41 @@ +DIDComm

Dealing with mobile agents

+

Mobile agents are a key component in many decentralized identity solutions. Individuals holding Identity Wallets on their mobile phones, and IoT devices transmitting secure information from remote locations are some common examples of mobile agents. The ability to roam from different networks and change connectivity seamlessly is a great feature. However it comes at the expense that agents are unable to declare a unique network address where to be reached. Also, that obstacle becomes more complex when agents are hidden inside network firewalls.

+

Additionally, DIDComm Messaging specifies that:

+
    +
  • Transports are simplex, they only transfer messages from sender to receiver. No information about the effects or results from a message is transmitted over the same connection.
  • +
  • Parties may declare a serviceEndpoint in their DID Document. However DID Documents are mainly static and updating them, if possible, is not an instant process.
  • +
+

Given the above mentioned situation, the question is how a mobile agent can receive a DIDComm message

+

The answer is Routing Protocol 2.0, that can be also complemented by the Return-Route extension.

+

Routing Protocol

+

The Routing Protocol defines a partially trusted party called Mediator to facilitate message delivery. Senders can pass messages to a mediator, so next, the mediator can forward them to the final destination. Of course, the final message to the receiver is encrypted and obscured to the intermediate mediator or mediators.

+

routing image

+

Message from the sender to the mediator is of type forward and contains the encrypted messages to the receiver as attachments . Also, by this means, recipients can declare a mediator's serviceEndpoint as its own serviceEndpoint to receive messages.

+

Return Route

+

Althougt not fully necessary to solve the mobile agent problem, the Return-Route extension facilitates the communication by enabling bi-directional communication on the same transport, even when one party has no public endpoint. Messages can flow back in response to inbound messages over the same connection. +That means that if the return-route header is present in a message with a value different to none, the receiver of a message can reply back in the same channel that was already established without the need to expose an endpoint.

+

Solution via Mediator

+

With those two elements a solution can be developed to cope with our problem. The process can be described as follow:

+
    +
  1. The mobile agent sends a message to register to a Mediator following a predefined protocol called Coordinate Mediation Protocol. The message must contain the return-route header.
  2. +
  3. The Mediator responds back to the mobile agent in the same channel that was already opened in the first step. In the response, the mediator assigns a own serviceEndpoint to the mobile agent, that later can be used in when sending messages to other parties.
  4. +
  5. Those third parties, when receiving a message from the mobile agent, can respond using the Routing Protocol by sending a forward message to the Mediator that contains the encrypted response to the mobile agent as an attachment.
  6. +
  7. The Mediator should hold the message, since there is no way to pass it to the mobile agent directly.
  8. +
  9. Using a predefined protocol called Pickup Protocol, the mobile agent contacts the Mediator who can respond back in the same channel forwarding all held messages from third parties.
  10. +
\ No newline at end of file diff --git a/book/v2/oidc/index.html b/book/v2/oidc/index.html new file mode 100644 index 00000000..b1c89254 --- /dev/null +++ b/book/v2/oidc/index.html @@ -0,0 +1,30 @@ +DIDComm

OID4VC

+

DIDComm is often compared with OpenID for Verifiable Credentials (OID4VC).

+

These protocols do have overlapping concerns as related to Verifiable Credentials, but approach the exchange of them differently. In addition to the similarities, the each have some unique and useful properties.

+

Password Friendly Security Model

+

The flow of OID4VC allows for an iframe to be used for the verification of a password or other secrets. This allows the user to authenticate to the Identity Provider (IdP) without the Relying Party (RP) being able to observe the exchange. This is really the sweet spot for OpenID, and has been carried to the VC exchange protocols as well. DIDComm does not currently have a direct replacement for this flow.

+

Different Connection Model

+

The OpenID based flow doesn't allow for very effective communication without the user in the loop. This is sometimes desirable, but limits it's applicability for more automated flows.

+

DIDComm has the ability to transfer messages without involvement of the user, when applicable.

+

Message Types

+

DIDComm has the built-in ability to transfer protocol messages of any type, not only those concerned with the issuance or verification of Verifiable Credentials. This allows for richer interaction beyond the uses focused on Verifable Credentials.

+

Combined Use

+

The different properties of the protocols make them very useful to each other.

+

When exchanging a credential with OID4VC, a DID is often passed. If that DID resolves to a DID Document with a DIDComm Service Endpoint, then future, rich interactions can be continued via DIDComm.

+

If the parties in a DIDComm relationship need to verify identity via secret checking with an RP, they can lean on OID4VC (or OpenID, if a credential is not involved) for that interaction.

\ No newline at end of file diff --git a/book/v2/pfs/index.html b/book/v2/pfs/index.html new file mode 100644 index 00000000..b4de46c7 --- /dev/null +++ b/book/v2/pfs/index.html @@ -0,0 +1,41 @@ +DIDComm

Perfect Forward Secrecy

+

A cryptographic method exhibits perfect forward secrecy (PFS) if the compromise of long-term keys does not allow an attacker to read old messages. The secrecy of the old messages persists forward in time. See the Wikipedia article, and also section 6.2 of this academic article. This property is valuable to the extent that comm channels are long-lasting and carry many interactions.

+

DIDComm does not achieve this property under the familiar definition, because it lacks a session construct that defines how to interpret a phrase like "long-term keys" and "session keys." Whether DIDComm achieves comparable goals is perhaps more interesting.

+

In TLS, session keys are symmetric keys negotiated during a Diffie-Hellman handshake at the beginning of a series of request-response interactions that cluster together. Browsers running HTTPS — the most familiar embodiment of TLS — typically do a new DH exchange each time a tab is opened to a site's initial page, but not for subsequent requests to fetch graphics, scripts, CSS files, or the content and collateral of subsequent pages. Cryptographic sessions (not to be confused with cookie-based login sessions) may be re-established whenever a socket is re-opened (possibly at intervals only a few seconds apart), or may use techniques like TLS Session Resumption to last for hours or even days.

+

A simple analysis of DIDComm might map PFS "session keys" to the ephemeral symmetric keys negotiated by the ECDH-1PU key agreement algorithm; this might imply that the static keys in Alice's DID doc would be the "long-term keys" from the PFS definition. In this framing, DIDComm does NOT exhibit PFS, because an attacker that possesses a key from Alice's DID doc can decrypt any old messages sent to that key.

+

But this analysis misses two important insights:

+
    +
  1. +

    The ephemeral symmetric keys in TLS are two-way and reusable. It makes sense to call them "session" keys. In contrast, the ephemeral symmetric keys negotiated by ECDH-1PU in DIDComm are one-way and single-use only. Calling a one-way delivery of a single message a "session" seems a bit odd. The natural unit of clustered interaction in DIDComm — what we use "sessions" for in TLS, and what lasts seconds to minutes or hours — is a single protocol or group of protocols that accomplish one goal for the parties. This is a higher level of abstraction that a single DIDComm message.

    +
  2. +
  3. +

    Only one compromise is contemplated by normal PFS — the compromise of a single long-term key. But DIDComm is more dynamic. It supports two types of rotation — rotation of DID doc keys and rotation of DIDs themselves. Moreover, DIDComm supports multiple devices per party, and it encourages the use of pairwise DIDs with a limited lifespan, often not exceeding a single interaction. It is the value of historic communication that makes PFS valuable. If DIDComm throws away DIDs after a single brief interaction, then PFS is irrelevant. If DIDComm rotates DIDs on the same time scales as static key rotation in TLS, then it is a DID's comm history, not Alice's (DID-spanning) comm history, that's endangered by a compromise. And if Alice has a stable DID but updates her DID doc regularly to track an evolving collection of devices, then her vulnerability to long-term key compromise doesn't map very well to the simpler PFS model.

    +
  4. +
+

Here are two alternate analyses that suggest DIDComm accomplishes the goals of PFS, even if its approach is unfamiliar. We do NOT advocate these analyses as objectively "true" — they are mutually incompatible, and unless/until formal definitions are satisfied, it is clearly unwise to rely on loose assertions about cryptographic guarantees. Rather, the point of including them here is to illustrate the importance of assumptions.

+

PFS Reframe 1

+

In some DIDComm usages, "sessions" might have the same scope as DIDs, and "long-term keys" might have the same scope as a multi-DID-spanning connection between two parties. A compromise of the second "long-term key" (DID and associated keys for all her devices) used by Alice in her relationship with Bob would allow an attacker to read everything sent to Alice in that session (while she was using DID #2). However, it wouldn't let the attacker read anything sent to Alice in the previous sessions (with previous DID values). DIDComm would thus accomplish the same goals as perfect forward secrecy.

+

PFS Reframe 2

+

In other DIDComm usages, "sessions" might have the same scope as a single snapshot of the key agreement keys in a DID doc, and "long-term keys" would be the signing keys that authorize updates to a new set of key agreement keys. A compromise of long-term keys would not allow the attacker to decrypt any historical communication at all. DIDComm would thus accomplish the same goals as perfect forward secrecy.

+

Thus, the guidance on perfect forward secrecy with respect to DIDComm is simple:

+
+

Understand your goals and your assumptions.

+
+

Consider questions like these: What is the intended lifespan of a DID in your DIDComm usage patterns? How often are its keys (both encryption and signing) rotated — and with what purposes?

+

DIDComm allows various answers to these questions; depending on the answers, it may or may not provide enough built-in protection of old communication at the point of a future compromise.

\ No newline at end of file diff --git a/book/v2/privacy/index.html b/book/v2/privacy/index.html new file mode 100644 index 00000000..184de4fe --- /dev/null +++ b/book/v2/privacy/index.html @@ -0,0 +1,21 @@ +DIDComm

Privacy

+

This section discusses best practices and the implications of DIDComm Protocols on the privacy of the communicating parties.

+

Public Fingerprinting

+

Users should avoid disclosing supported protocols until sufficient trust has been established. The broad disclosure of supported protocols may provide a unique fingerprint that can be used to correlate multiple identifiers in use by a single party.

+

DIDComm's use of the Discover Features Protocol allows selective disclosure of features to mitigate this problem. Leveraging this protocol as a better substitute for Verifiable Data Registry (VDR) published DID Document endpoints will prevent the disclosure of unique protocols.

\ No newline at end of file diff --git a/book/v2/problemcodes/index.html b/book/v2/problemcodes/index.html new file mode 100644 index 00000000..beb108c3 --- /dev/null +++ b/book/v2/problemcodes/index.html @@ -0,0 +1,105 @@ +DIDComm

Problem Codes

+

Problems are reported by a specific message defined in the Problem Report 2.0 protocol. That message looks like this:

+
{
+  "type": "https://didcomm.org/report-problem/2.0/problem-report",
+  "id": "7c9de639-c51c-4d60-ab95-103fa613c805",
+  "pthid": "1e513ad4-48c9-444e-9e7e-5b8b45c5e325",
+  "ack": ["1e513ad4-48c9-444e-9e7e-5b8b45c5e325"],
+  "body": {
+    "code": "e.p.xfer.cant-use-endpoint",
+    "comment": "Unable to use the {1} endpoint for {2}.",
+    "args": [
+      "https://agents.r.us/inbox",
+      "did:sov:C805sNYhMrjHiqZDTUASHg"
+    ],
+    "escalate_to": "mailto:admin@foo.org"
+  }
+}
+
+

One of the most importan headers of that message is the code header that categorizes, in a machine readable format, what went wrong. +code follows a structured format defined in Problem Codes on the specification.

+

In short, the code is contructed as a sequence like: +{sorter}.{scope}.{general_descriptor}.{specific_descriptor}.{more_specific_descriptor}..

+
    +
  • {sorter} can be either e it is an error, or w id it is a warning.
  • +
  • {scope} can be either p if belongs to a protocol, or m if it was triggered by a previous message.
  • +
  • {descriptors} is a kebab-case sequence of descriptors separated by . where the semantics get progressively more detailed reading left to right.
  • +
+

In this section we are listing a list of predefined codes that can be used by themselves, or as prefixes to more specific descriptors:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
TokenValue of comment stringNotes
trustFailed to achieve required trust.Typically this code indicates incorrect or suboptimal behavior by the sender of a previous message in a protocol. For example, a protocol required a known sender but a message arrived anoncrypted instead — or the encryption is well formed and usable, but is considered weak. Problems with this descriptor are similar to those reported by HTTP's 401, 403, or 407 status codes.
trust.cryptoCryptographic operation failed.A cryptographic operation cannot be performed, or it gives results that indicate tampering or incorrectness. For example, a key is invalid — or the key types used by another party are not supported — or a signature doesn't verify — or a message won't decrypt with the specified key.
xferUnable to transport data.The problem is with the mechanics of moving messages or associated data over a transport. For example, the sender failed to download an external attachment — or attempted to contact an endpoint, but found nobody listening on the specified port.
didDID is unusable.A DID is unusable because its method is unsupported — or because its DID doc cannot be parsed — or because its DID doc lacks required data.
msgBad message.Something is wrong with content as seen by application-level protocols (i.e., in a plaintext message). For example, the message might lack a required field, use an unsupported version, or hold data with logical contradictions. Problems in this category resemble HTTP's 400 status code.
meInternal error.The problem is with conditions inside the problem sender's system. For example, the sender is too busy to do the work entailed by the next step in the active protocol. Problems in this category resemble HTTP's 5xx status codes.
me.resA required resource is inadequate or unavailable.The following subdescriptors are also defined: me.res.net, me.res.memory, me.res.storage, me.res.compute, me.res.money
reqCircumstances don't satisfy requirements.A behavior occurred out of order or without satisfying certain preconditions — or circumstances changed in a way that violates constraints. For example, a protocol that books plane tickets fails because, halfway through, it is discovered that all tickets on the flight have been sold.
req.timeFailed to satisfy timing constraints.A message has expired — or a protocol has timed out — or it is the wrong time of day/day of week.
legalFailed for legal reasons.An injunction or a regulatory requirement prevents progress on the workflow. Compare HTTP status code 451.
\ No newline at end of file diff --git a/book/v2/problems/index.html b/book/v2/problems/index.html new file mode 100644 index 00000000..f02644b8 --- /dev/null +++ b/book/v2/problems/index.html @@ -0,0 +1,29 @@ +DIDComm

Timeouts

+

It is a best practice to ponder appropriate timeout settings when designing application-level protocols atop DIDComm. A protocol for conducting live music over the internet should probably time out its messages to cue musicians within milliseconds, whereas a protocol to apply for college may need timeouts that are days or weeks long. A protocol definition should communicate timeout assumptions like these.

+

Individual implementers of a protocol should also ponder whether they need timeouts more aggressive than those of the general community. Perhaps a college application protocol allows the process to unfold over weeks -- but an app that promises it can help someone apply to college in 5 minutes shouldn't use default timeouts in the messages it sends.

+

Cybersecurity considerations for problem reports

+

Ethical and unethical hackers deliberately trigger errors on systems to understand what exploits are possible. We expect this to happen with DIDComm. Therefore, the troubleshooting and transparency that comes from problem reports needs to be weighed against the risk of disclosing too much information. The following considerations are recommended.

+
    +
  1. Problem reports do not have to be sent (only) to the party who triggers a problem. Sometimes, a different (or additional) audience may be appropriate.
  2. +
  3. The problem-report message type is deliberately decoupled from the versioning and release status of other protocols, so it cannot be used for feature sniffing.
  4. +
  5. Fields that encourage careless, recursive information dumping (e.g., Java's Throwable.cause) do not appear in problem-report.
  6. +
  7. The comment and args properties of a problem-report are separated, with comment mapping consistently to a code. This means that the risk of disclosing too much information is concentrated in the value of args, not comment. Values placed in args should be scrubbed of anything sensitive.
  8. +
  9. Sending problem reports to an unknown party is more risky than sending them to someone with known characteristics. (Because DIDComm's normal mode is mutual authentication via DIDs, and because DIDComm connections may accumulate credential-based context, this is a manageable risk.)
  10. +
  11. Sending problem reports immediately may be more risky than sending them with a modest, random delay. This makes denial-of-service attacks and temporal correlation harder, and is the same principle that motivates login dialogs to pause before reporting an incorrect password.
  12. +
\ No newline at end of file diff --git a/book/v2/routing/index.html b/book/v2/routing/index.html new file mode 100644 index 00000000..894358b3 --- /dev/null +++ b/book/v2/routing/index.html @@ -0,0 +1,124 @@ +DIDComm

Routing

+

Routing is the process of managing the delivery of messages from sender to recipient, possibly adapting the packaging and transfer to intermediate nodes. A route is a map or plan that specifies enough to achieve delivery in at least one direction; it may omit uninteresting details.

+

A sender emits a message hoping that a recipient eventually receives it. As a message moves toward the recipient, we say it is moving destward; the opposite direction is sourceward. Note that sender and recipient flip if a request-like message is followed by a response-like message in the opposite direction; the context that defines a sender is a single message, not a paired interaction. (DIDComm supports request-response but does not require it.)

+

We tend to conceive of senders and recipients as simple — "Alice" and "Bob" sound like unitary individuals. This can be a useful simplification. However, it's important to remember that it may hide important detail; if Bob uses a laptop, a mobile device, and a cloud service to receive messages, and if each of them follows the cryptographic best practice of not sharing keys, then it is impossible to ignore this complexity in some parts of routing design. We call the set of things that Bob controls his sovereign domain (or domain for short). Note that this usage is notably different from the meaning of "domain" in DNS and many web contexts. We also use the loose cover term agent to refer to individual devices or pieces of software inside a given domain. The boundary of a domain is an important construct for trust analysis and for routing. We will explore this in greater detail below.

+

Routing Requirements

+

All messaging technologies must address routing in some way. However, DIDComm has unusual requirements:

+
    +
  • +

    Because of security and privacy goals, DIDComm routing must impose careful limits on how and to what degree intermediate nodes are trusted.

    +
  • +
  • +

    Because DIDComm aims to be transport-independent, its routing model must be carefully decoupled from strong assumptions about networking. In particular, DIDComm routing cannot make broad-brush assumptions that:

    +
      +
    • A given route will use only a single transport.
    • +
    • Transport mechanisms will provide any security benefits.
    • +
    • The identity and connectivity for every hop in a route will be known by any party at the time a message is sent.
    • +
    • The route from sender to recipient will be similar in hop identity, hop count, or transport mix to a complementary route from recipient back to sender.
    • +
    • All the nodes in a route are ever online at the same time.
    • +
    +
  • +
  • +

    Because of decentralization and multiple-peer-friendly goals, DIDComm routing cannot orient itself around servers or simple request—response patterns as mandatory components.

    +
  • +
  • +

    Because of privacy goals, DIDComm must offer fine distinctions in how repudiation and authentication are handled.

    +
  • +
+

These requirements are very demanding. They do NOT necessarily make DIDComm hard to implement. They do NOT prevent DIDComm from using common web infrastructure — indeed, DIDComm routes quite simply and elegantly over HTTP. However, they DO force the routing model to be described in a very generic, flexible way, and they DO mean that existing routing solutions are an imperfect fit. DIDComm learns as much as it can, and borrows as much as it can, from clever and battle-tested routing work done in other contexts, but it does have some unique twists.

+

Overview

+

Let's focus on a simple case where A wants to send a message to B, and the route involves one intermediate hop at C. Suppressing a few details, DIDComm routing works like this:

+
    +
  1. A prepares a plaintext message of any type, M[0], and encrypts it for the recipient, B. This produces M[1].
  2. +
  3. A prepares another plaintext message of type forward, and adds M[1] to it as an attachment. This new message, M[2], asks C to to deliver the attached payload to B. A encrypts M[2] for C, producing M[3].
  4. +
  5. A hands M[3] to C.
  6. +
  7. C decrypts M[3], producing M[2]. Reading the plaintext, C sees that it's been asked to deliver the encrypted attachment to B.
  8. +
  9. C hands the attachment from M[2] — which is the encrypted message M[1] — to B.
  10. +
  11. B decrypts M[1], reproducing the plaintext M[0].
  12. +
+

diagram of simple routing scenario

+

This is not the simplest possible scenario; DIDComm could be direct from A to C, which would eliminate steps 2-5. Some DIDComm+HTTP interactions are that simple. And it is not the most complex DIDComm routing scenario, either. Much more elaborate routes could be described by introducing additional hops with additional forward messages. However, the above sequence is a good rough model to carry through the discussion that follows.

+

The forward message

+

The forward message created in step 2 in our overview is a DIDComm application-level protocol message. Routing, as described here, is just one of many protocols that can be built atop DIDComm primitives. A and C are "speaking" this protocol when they communicate. The routing protocol can use the same features as any other application-level protocol; this includes attachments, message threading, message timing, message tracing, ACKs, problem reports, and so forth. However, before we describe the structure and semantics of the forward message in detail, it's important to understand some additional routing concepts.

+

Two Dimensions

+

Two dimensions of routing are relevant to DIDComm. Sometimes they are confused or conflated:

+
    +
  • Network routing deals with how packets flow across a digital landscape. This is the "routing" familiar to most technical people, and the one that will inform most assumptions they bring to the routing topic when reading the DIDComm spec for the first time.
  • +
  • Cryptographic routing concerns itself with how packaging hides or reveals plaintext to participants in a delivery chain. In other words, it's about the routing of secrets rather than the routing of packets.
  • +
+

The overview immediately above collapsed these two dimensions, assuming that a node relaying data is also a node decrypting. This makes for simple explanations, but it's not always a true or helpful assumption. The correspondence between these two routing dimensions can be non-trivial; a route may have ten network hops but only three cryptographic hops, and a single network hop may decrypt twice as it passes data between distinct software entities. However, simple principles explain the dynamics for each situation.

+

Mediators and Relays

+

DIDComm routing uses two important constructs to model all varieties of network and cryptographic routing: mediators and relays.

+

A mediator is a participant in routing that must be accounted for by the sender's cryptography. In other words, it is visible in the cryptographic routing dimension. It has its own keys and will deliver messages only after decrypting an outer envelope to reveal a forward request. It must understand DIDComm routing to do this. Many types of mediators may exist, but two important ones should be widely understood, as they commonly manifest in DID Docs:

+
    +
  1. A service that receives messages for many agents at a single endpoint to provide herd privacy (sometimes called an "agency") is a mediator.
  2. +
  3. A cloud-based agent that forwards messages to mobile devices is a mediator.
  4. +
+

In contrast, a relay is an entity that passes along encrypted messages without understanding or decrypting them. It's focused on network routing only.

+

Like mediators, relays can be used to change the transport for a message (e.g., accept an HTTP POST, then turn around and emit an email; accept a Bluetooth transmission, then turn around and emit something in a message queue). But unlike mediators, relays can do this without understanding DIDComm. Load balancers and mix networks like TOR are important types of relay.

+

Let's define mediators and relays by exploring how they manifest in a series of communication scenarios between Alice and Bob.

+

Scenario 1: direct

+

Alice and Bob are both employees of a large corporation. They work in the same office, but have never met. The office has a rule that all messages between employees must be encrypted. They use paper messages and physical delivery as the transport. Alice writes a note, encrypts it so only Bob can read it, puts it in an envelope addressed to Bob, and drops the envelope on a desk that she has been told belongs to Bob. This desk is in fact Bob's, and he later picks up the message, decrypts it, and reads it.

+

routing scenario 1: direct

+

In this scenario, there is no mediator, and no relay.

+

Scenario 2: a gatekeeper

+

Imagine that Bob hires an executive assistant, Carl, to filter his mail. Bob won't open any mail unless Carl looks at it and decides that it's worthy of Bob's attention.

+

Alice has to change her behavior. She continues to package a message for Bob, but now she must account for Carl as well. She take the envelope for Bob, and places it inside a new envelope addressed to Carl. Inside the outer envelope, and next to the envelope destined for Bob, Alice writes Carl an encrypted note: "This inner envelope is for Bob. Please forward."

+

routing scenario 2: mediator

+

Here, Carl is acting as a mediator. He is mostly just passing messages along. But because he is processing a message himself, and because Carl is interposed between Alice and Bob, he affects the behavior of the sender. He is a known entity in the route.

+

You may recognize this as similar to our overview example with A, B, and C. A and B correspond to Alice and Bob; C is Carl, the mediator.

+

Scenario 3: transparent indirection

+

All is the same as the base scenario (Carl has been fired, and is thus out of the picture), except that Bob is working from home when Alice's message lands on his desk. Bob has previously arranged with his friend Darla, who lives near him, to pick up any mail that's on his desk and drop it off at his house at the end of the work day. Darla sees Alice's note and takes it home to Bob.

+

routing scenario 3: relay

+

In this scenario, Darla is acting as a relay. Note that Bob arranges for Darla to do this without notifying Alice, and that Alice does not need to adjust her behavior in any way for the relay to work.

+

Scenario 4: more indirection

+

Like scenario 3, Darla brings Bob his mail at home. However, Bob isn't at home when his mail arrives. He's had to rush out on an errand, but he's left instructions with his son, Emil, to open any work mail, take a photo of the letter, and text him the photo. Emil intends to do this, but the camera on his phone misfires, so he convinces his sister, Francis, to take the picture on her phone and email it to him. Then he texts the photo to Bob, as arranged.

+

routing scenario 4: many relays

+

Here, Emil and Francis are also acting as relays. Note that nobody knows about the full route. Alice thinks she's delivering directly to Bob. So does Darla. Bob knows about Darla and Emil, but not about Francis.

+

Note, too, how the transport is changing from physical mail to email to text.

+

To the party immediately upstream (closer to the sender), a relay is indistinguishable from the next party downstream (closer to the recipient). A party anywhere in the chain can insert one or more relays upstream from themselves, as long as those relays are not upstream of another named party (sender or mediator).

+
More Scenarios
+

Mediators and relays can be combined in any order and any amount in variations on our fictional scenario. Bob could employ Carl as a mediator, and Carl could work from home and arrange delivery via George, then have his daughter Hannah run messages back to Bob's desk at work. Carl could hire his own mediator. Darla could arrange for Ivan to substitute for her when she goes on vacation. And so forth.

+

More Traditional Usage

+

The scenarios used above are somewhat artificial. Our most familiar routing scenarios involve edge agents running on mobile devices and accessible through bluetooth or push notification, and cloud agents that use electronic protocols as their transport. Let's see how relays and mediators apply there.

+

Scenario 5: direct

+

Alice's cloud wants to talk to Bob's cloud. Bob's cloud is listening at http://bob.com/api. Alice encrypts a message for Bob and posts it to that URL.

+

scenario 5: cloud to cloud

+

In this scenario, we are using a direct transport with neither a mediator nor a relay. This is how Alice and Bob operate in Scenario 1, and it's also equivalent to our Overview minus steps 2-5.

+

When DIDComm involves only two parties, and when HTTP is convenient for both of them, this sort of direct delivery may be used. (Note that if you need n-wise, or if you need a reciprocal return route but Alice's cloud exposes no public API, this delivery scenario can present problems. More on this later.)

+

Virtually the same diagram could be used for a Bluetooth or NFC or sneakernet conversation that happens offline:

+

scenario 5b: Bluetooth or offline

+

Scenario 6: herd hosting

+

Let's tweak Scenario 5 slightly by saying that Bob's agent is one of thousands that are hosted at the same URL. Maybe the URL is now http://agents-r-us.com/inbox. Now if Alice wants to talk to Bob's cloud agent, she has to cope with a mediator. She wraps the encrypted message for Bob's cloud agent inside a forward message that's addressed to and encrypted for the agent of agents-r-us that functions as a gatekeeper.

+

scenario 6: herd hosting

+

This scenario is one that highlights an external mediator--so-called because the mediator lives outside the sovereign domain of the final recipient.

+

Scenario 7: intra-domain dispatch

+

Now let's subtract agents-r-us. We're back to Bob's cloud agent listening directly at http://bob.com/agent. However, let's say that Alice has a different goal--now she wants to talk to the edge agent running on Bob's mobile device. This agent doesn't have a permanent IP address, so Bob uses his own cloud agent as a mediator. He tells Alice that his mobile device agent can only be reached via his cloud agent.

+

routing scenario 7: intra-domain dispatch

+

Once again, this causes Alice to modify her behavior. Again, she wraps her encrypted message. The inner message is enclosed in an outer envelope, and the outer envelope is passed to the mediator.

+

This scenario highlights an internal mediator. Internal and external mediators introduce similar features and similar constraints; the relevant difference is that internal mediators live within the sovereign domain of the recipient, and may thus be worthy of greater trust.

+

Scenario 8: double mediation

+

Now let's combine. Bob's cloud agent is hosted at agents-r-us, AND Alice wants to reach Bob's mobile:

+

routing scenario 8: double mediation

+

This is a common pattern with HTTP-based cloud agents plus mobile edge agents, which is the most common deployment pattern we expect for many users of self-sovereign identity. Note that the properties of the agency and the routing agent are not particularly special--they are just an external and an internal mediator, respectively.

+

Remember Routes are One-Way (not Duplex)

+

In all of this discussion, note that we are analyzing only a flow from Alice to Bob. How Bob gets a message back to Alice is a completely separate question. Just because Carl, Darla, Emil, Francis, and Agents-R-Us may be involved in how messages flow from Alice to Bob, does not mean they are involved in flow the opposite direction.

+

Note how this breaks the simple assumptions of pure request-response technologies like HTTP, that assume the channel in (request) is also the channel out (response). Duplex request-response can be modeled with DIDComm, but doing so requires support that may not always be available, plus cooperative behavior governed by the ~thread decorator.

+

Routing Protocol

+

Now that we understand mediators and relays, how and why they might be combined in various ways, and how their presence influences delivery semantics, we can describe the actual application-level routing protocol that any DIDComm sender speaks with a destward mediator. See [Routing Protocol] in the spec.

\ No newline at end of file diff --git a/book/v2/scrapbook/index.html b/book/v2/scrapbook/index.html new file mode 100644 index 00000000..7bfad8e3 --- /dev/null +++ b/book/v2/scrapbook/index.html @@ -0,0 +1,31 @@ +DIDComm

DIDComm v2 scrapbook

+

Here is a chronological list of DIDComm v2 presentations, products, services, efforts, and more. Feel free to submit new links or updates here.

+

DIDComm v2 libs

+

You can find the known DIDComm v2 libs in the Hello World libraries section

+

Chronological scrapbook of DIDComm v2 presentations, usage, efforts, and more

+
\ No newline at end of file diff --git a/book/v2/startConnection/index.html b/book/v2/startConnection/index.html new file mode 100644 index 00000000..d4477cd6 --- /dev/null +++ b/book/v2/startConnection/index.html @@ -0,0 +1,236 @@ +DIDComm

Starting, using and ending a DIDComm connection

+

This tutorial shows how Alice can invite Bob to start a connection, send and receive encrypted messages using an https transport, and end the relationship.

+

The code relies on DIDComm Python and Peerdid Python libraries from SICPA.

+

The code in the following sections can be executed in a single python file or executed online in this Binder interactive Jupyter notebook

+

Step 1: Imports

+

First, we need to import all required functions, clases and types from didcomm and peerdid libraries.

+
import json
+import base64
+import qrcode
+import requests
+import matplotlib.pyplot as plt
+from typing import Optional, List
+from didcomm.common.types import DID, VerificationMethodType, VerificationMaterial, VerificationMaterialFormat
+from didcomm.did_doc.did_doc import DIDDoc, VerificationMethod, DIDCommService
+from didcomm.did_doc.did_resolver import DIDResolver
+from didcomm.message import Message, FromPrior
+from didcomm.secrets.secrets_resolver_demo import SecretsResolverDemo
+from didcomm.unpack import unpack, UnpackResult
+from didcomm.common.resolvers import ResolversConfig
+from didcomm.pack_encrypted import pack_encrypted, PackEncryptedConfig, PackEncryptedResult
+from peerdid.core.did_doc_types import DIDCommServicePeerDID
+from didcomm.secrets.secrets_util import generate_x25519_keys_as_jwk_dict, generate_ed25519_keys_as_jwk_dict, jwk_to_secret
+from peerdid import peer_did
+from peerdid.did_doc import DIDDocPeerDID
+from peerdid.types import VerificationMaterialAuthentication, VerificationMethodTypeAuthentication, VerificationMaterialAgreement, VerificationMethodTypeAgreement, VerificationMaterialFormatPeerDID
+
+

Step 3: Resolvers

+

In this step we add two Resolvers needed by DIDComm and the libraries:

+

Secret resolver:

+

This sample code needs a storage to keep the generated key pair secrets. It will then be referenced by the library as a secrets_resolver. We can instantiate it as follows: +secrets_resolver = SecretsResolverDemo() +Note that the SecretsResolverDemo simply stores the keys in a text file named secrets.json. As you've just realized, this secret storage is anything but secure. Keep in mind that securing keys is of utmost importance for a self-sovereign identity; never use it in production.

+

DID Resolver:

+

DIDComm only works if your code knows how to resolve DIDs to DID documents. There are various libraries that provide that feature. For example, the Universal Resolver can be used. In this walk-through, we'll provide a simple stub that minimizes dependencies and keeps things as simple as possible. Click here for full example where you'll find the code that do the trick.

+

Step 3: Out of Band Invitation

+

Using our create_peer_did helper function, Alice will create a DID Peer to be shared in the OOB invitation. Since an OOB invitation is unencrypted and may be observed by another party, this DID should not be considered private and must be rotated later for privacy. +Alice DID also contains a service part that tells Bob the serviceEndpoint where she accepts messages. In this case Alice provides an https endpoint. For other cases additional Routing may be required.

+
alice_did_oob = await create_peer_did(1, 1, service_endpoint="https://www.example.com/alice")
+print("Alice's OOB DID:", alice_did_oob)
+
+
Alice's OOB DID: did:peer:2.Ez6LSh6rmgWhAsvyYRo5mnKTuZtSkMb9keidqDGUygrPD9kgK.Vz6MksqtdXuTar4gjPTMG6tEePL9dFHBc6s7mJxQk8cL98hoj.SeyJpZCI6Im5ldy1pZCIsInQiOiJkbSIsInMiOiJodHRwczovL3d3dy5leGFtcGxlLmNvbS9hbGljZSIsImEiOlsiZGlkY29tbS92MiJdfQ
+
+

Remember that while creating this DID, our helper function also stores the private keys in the secrets_resolver. In a real implementation, Alice will have her own secure store in her own wallet, and Bob will have a separated secure store in his own wallet.

+

Also, those Peer DIDs can be resolved into DID documents that contain the Authentication, Agreement public keys, and the Service details.

+

With this DID Peer, Alice can create an Out Of Band invitation message as follows:

+
oob_mesage = {
+  "type": "https://didcomm.org/out-of-band/2.0/invitation",
+  "id": "unique-id-24160d23ed1d",
+  "from": alice_did_oob,
+  "body": {
+    "goal_code": "connect",
+    "goal": "Start relationship",
+    "accept": [
+      "didcomm/v2",
+      "didcomm/aip2;env=rfc587"
+    ],
+  }  
+}
+
+

You can see that the type of the massage was declared as "https://didcomm.org/out-of-band/2.0/invitation" and Alice OOB DID was included in the from header. Also, remember that the unique id declared in the message must be used in the parent thread ID pthid in Bob's following response.

+

The message has to be whitespaced removed and encoded using URL Base 64.

+
plaintext_ws_removed = json.dumps(oob_mesage).replace(" ", "")
+encoded_plaintextjwm = base64.urlsafe_b64encode(plaintext_ws_removed.encode("utf-8"))
+encoded_text = str(encoded_plaintextjwm, "utf-8").replace("=","")
+
+

Finally, we put the encoded message in a URL that can be emailed to Bob:

+
oob_url = "https://example.com/path?_oob="+encoded_text
+print(oob_url)
+
+

https://example.com/path?_oob=eyJ0eXBlIjoiaHR0cHM6Ly9kaWRjb21tLm9yZy9vdXQtb2YtYmFuZC8yLjAvaW52aXRhdGlvbiIsImlkIjoidW5pcXVlLWlkLTI0MTYwZDIzZWQxZCIsImZyb20iOiJkaWQ6cGVlcjoyLkV6NkxTaDZybWdXaEFzdnlZUm81bW5LVHVadFNrTWI5a2VpZHFER1V5Z3JQRDlrZ0suVno2TWtzcXRkWHVUYXI0Z2pQVE1HNnRFZVBMOWRGSEJjNnM3bUp4UWs4Y0w5OGhvai5TZXlKcFpDSTZJbTVsZHkxcFpDSXNJblFpT2lKa2JTSXNJbk1pT2lKb2RIUndjem92TDNkM2R5NWxlR0Z0Y0d4bExtTnZiUzloYkdsalpTSXNJbUVpT2xzaVpHbGtZMjl0YlM5Mk1pSmRmUSIsImJvZHkiOnsiZ29hbF9jb2RlIjoiY29ubmVjdCIsImdvYWwiOiJFc3RhYmxpc2hjb25uZWN0aW9uIiwiYWNjZXB0IjpbImRpZGNvbW0vdjIiLCJkaWRjb21tL2FpcDI7ZW52PXJmYzU4NyJdfX0

+

Other common option to share the OOB message is by creating a QR code that Bob can scan:

+
image = qrcode.make(oob_url)
+plt.imshow(image , cmap = 'gray')
+
+

-- INSERT_QR_CODE_IMAGE_HERE --

+

Step 4: Receiving the OOB message

+

Once Bob receives the email or scan the QR code, he can easily decod it and read Alice's message:

+
received_msg_encoded = oob_url.split("=")[1]
+received_msg_decoded = json.loads(str(base64.urlsafe_b64decode(received_msg_encoded + "=="), "utf-8"))
+print(received_msg_decoded)
+
+
{'type': 'https://didcomm.org/out-of-band/2.0/invitation', 'id': 'unique-id-24160d23ed1d', 'from': 'did:peer:2.Ez6LSh6rmgWhAsvyYRo5mnKTuZtSkMb9keidqDGUygrPD9kgK.Vz6MksqtdXuTar4gjPTMG6tEePL9dFHBc6s7mJxQk8cL98hoj.SeyJpZCI6Im5ldy1pZCIsInQiOiJkbSIsInMiOiJodHRwczovL3d3dy5leGFtcGxlLmNvbS9hbGljZSIsImEiOlsiZGlkY29tbS92MiJdfQ', 'body': {'goal_code': 'connect', 'goal': 'Establishconnection', 'accept': ['didcomm/v2', 'didcomm/aip2;env=rfc587']}}
+
+

After Bob checks the invitation, he is able to prepare a response back. Since Bob has not established a connection with Alice before, he needs to create a DID peer to be used in all communications with Alice. This DID Peer will be dedicated to Alice and only Alice. If Bob needs to comunicate with someone else, he should create a new DID Peer.

+
bob_did = await create_peer_did(1,1, service_endpoint="https://www.example.com/bob")
+print("Bob's DID:", bob_did)
+
+
Bob's DID: did:peer:2.Ez6LSfHCNnrXfs6mPio69GbvoL6szGxCXcL3tf8kLDQDYsncm.Vz6MkiDnmWvdnKoFrn7fDfXVykbRmW7MuEyMp1ZcnZu1KvUZL.SeyJpZCI6Im5ldy1pZCIsInQiOiJkbSIsInMiOiJodHRwczovL3d3dy5leGFtcGxlLmNvbS9ib2IiLCJhIjpbImRpZGNvbW0vdjIiXX0
+
+

Bob's response will depends on the goal code of the invitation received. Here is a response message as an example:

+
bob_response_message = Message(
+    body = {"msg": "Hi Alice"},
+    id = "unique-id-263e24a422e",
+    pthid = received_msg_decoded["id"],
+    type = "my-protocol/1.0",
+    frm = bob_did,
+    to = [received_msg_decoded["from"]]
+)
+
+

Note that the message includes an id that is mandatory and has to be unique to Bob, but also includes the parent thread ID pthid matching Alice's message id.

+

Also includes a type, also mandatory, that points to the protocol identifier in conformance with the goal of the invitation. The body contains the actual message in a structured way associated by our my-protocol/1.0. Attributes from and to are optional. Beware that in the code above the property from was replaced by frm due to a conflict of reserved words in Python; the conversion to the correct property (from) is handled internally by the library.

+

The final encrypted and packed message can be generated with this code:

+
bob_packed_msg = await pack_encrypted(
+    resolvers_config = ResolversConfig(
+        secrets_resolver = secrets_resolver,
+        did_resolver = DIDResolverPeerDID()
+    ),
+    message = bob_response_message,
+    frm = bob_did,
+    to = alice_did_oob,
+    sign_frm = None,
+    pack_config = PackEncryptedConfig(protect_sender_id=False)
+)
+
+

Step 5: Sending the message to Alice

+

From the received message, Bob can get and resolve Alice's DID into a DID Document. He can use a Universal Resolver or just our helper class as we use in the following lines:

+
alice_did_doc = json.loads(peer_did.resolve_peer_did(received_msg_decoded["from"]))
+print(alice_did_doc)
+
+
{'id': 'did:peer:2.Ez6LSh6rmgWhAsvyYRo5mnKTuZtSkMb9keidqDGUygrPD9kgK.Vz6MksqtdXuTar4gjPTMG6tEePL9dFHBc6s7mJxQk8cL98hoj.SeyJpZCI6Im5ldy1pZCIsInQiOiJkbSIsInMiOiJodHRwczovL3d3dy5leGFtcGxlLmNvbS9hbGljZSIsImEiOlsiZGlkY29tbS92MiJdfQ', 'authentication': [{'id': 'did:peer:2.Ez6LSh6rmgWhAsvyYRo5mnKTuZtSkMb9keidqDGUygrPD9kgK.Vz6MksqtdXuTar4gjPTMG6tEePL9dFHBc6s7mJxQk8cL98hoj.SeyJpZCI6Im5ldy1pZCIsInQiOiJkbSIsInMiOiJodHRwczovL3d3dy5leGFtcGxlLmNvbS9hbGljZSIsImEiOlsiZGlkY29tbS92MiJdfQ#6MksqtdXuTar4gjPTMG6tEePL9dFHBc6s7mJxQk8cL98hoj', 'type': 'Ed25519VerificationKey2020', 'controller': 'did:peer:2.Ez6LSh6rmgWhAsvyYRo5mnKTuZtSkMb9keidqDGUygrPD9kgK.Vz6MksqtdXuTar4gjPTMG6tEePL9dFHBc6s7mJxQk8cL98hoj.SeyJpZCI6Im5ldy1pZCIsInQiOiJkbSIsInMiOiJodHRwczovL3d3dy5leGFtcGxlLmNvbS9hbGljZSIsImEiOlsiZGlkY29tbS92MiJdfQ', 'publicKeyMultibase': 'z6MksqtdXuTar4gjPTMG6tEePL9dFHBc6s7mJxQk8cL98hoj'}], 'keyAgreement': [{'id': 'did:peer:2.Ez6LSh6rmgWhAsvyYRo5mnKTuZtSkMb9keidqDGUygrPD9kgK.Vz6MksqtdXuTar4gjPTMG6tEePL9dFHBc6s7mJxQk8cL98hoj.SeyJpZCI6Im5ldy1pZCIsInQiOiJkbSIsInMiOiJodHRwczovL3d3dy5leGFtcGxlLmNvbS9hbGljZSIsImEiOlsiZGlkY29tbS92MiJdfQ#6LSh6rmgWhAsvyYRo5mnKTuZtSkMb9keidqDGUygrPD9kgK', 'type': 'X25519KeyAgreementKey2020', 'controller': 'did:peer:2.Ez6LSh6rmgWhAsvyYRo5mnKTuZtSkMb9keidqDGUygrPD9kgK.Vz6MksqtdXuTar4gjPTMG6tEePL9dFHBc6s7mJxQk8cL98hoj.SeyJpZCI6Im5ldy1pZCIsInQiOiJkbSIsInMiOiJodHRwczovL3d3dy5leGFtcGxlLmNvbS9hbGljZSIsImEiOlsiZGlkY29tbS92MiJdfQ', 'publicKeyMultibase': 'z6LSh6rmgWhAsvyYRo5mnKTuZtSkMb9keidqDGUygrPD9kgK'}], 'service': [{'id': 'did:peer:2.Ez6LSh6rmgWhAsvyYRo5mnKTuZtSkMb9keidqDGUygrPD9kgK.Vz6MksqtdXuTar4gjPTMG6tEePL9dFHBc6s7mJxQk8cL98hoj.SeyJpZCI6Im5ldy1pZCIsInQiOiJkbSIsInMiOiJodHRwczovL3d3dy5leGFtcGxlLmNvbS9hbGljZSIsImEiOlsiZGlkY29tbS92MiJdfQ#didcommmessaging-0', 'type': 'DIDCommMessaging', 'serviceEndpoint': 'https://www.example.com/alice', 'accept': ['didcomm/v2']}]}
+
+

From the DID Document, Bob can understand how Alice is expecting to receive messages. In this case, he gets Alice's endpoint:

+
alice_endpoint = alice_did_doc["service"][0]["serviceEndpoint"]
+print(alice_endpoint)
+
+

https://www.example.com/alice

+

Using an https transport Bob can simply POST the message to the endpoint with the message in the body and the media type header set to application/didcomm-encrypted+json.

+
headers = {"Content-Type": "application/didcomm-encrypted+json"}
+resp = requests.post(alice_endpoint, headers=headers, data = bob_packed_msg.packed_msg)
+
+

In a real scenario, you will receive a success http response code in the range of 2XX such as a 202. This case will fail since it's not a real endpoint.

+

Step 5: Alice responding back to Bob with a rotated DID

+

Alice has finally received a response back from Bob at her endpoint. The encrypted message is in the body of the POST request that can be unpacked and decrypted with the following code:

+
bob_unpack_msg = await unpack(
+    resolvers_config=ResolversConfig(
+        secrets_resolver=secrets_resolver,
+        did_resolver=DIDResolverPeerDID()
+    ),
+    packed_msg=bob_packed_msg.packed_msg
+)
+
+

Note that we also passed the resolver config as before.

+

Finally, Alice can see Bob's response message:

+
print(bob_unpack_msg.message.body["msg"])
+
+
Hi Alice
+
+

And also she can get Bob's DID Peer:

+
print(bob_unpack_msg.message.frm)
+
+
did:peer:2.Ez6LSmYH5Lttu3WFRCJuVyg8RXBD7ncvL5S93ojKUhan2Mhgs.Vz6MkmbHcPTycTGg23jsJK3diDnp4v5tt8hNnvbGWCzs3Trsv.SeyJpZCI6Im5ldy1pZCIsInQiOiJkbSIsInMiOiJodHRwczovL3d3dy5leGFtcGxlLmNvbS9ib2IiLCJhIjpbImRpZGNvbW0vdjIiXX0
+
+

and from Bob's DID, she can resolve the DID Document and get Bob's service endpoint:

+
bob_did_doc = json.loads(peer_did.resolve_peer_did(bob_unpack_msg.message.frm))
+bob_endpoint = bob_did_doc["service"][0]["serviceEndpoint"]
+print(bob_endpoint)
+
+

https://www.example.com/bob

+

Now Alice is able to respond back to Bob's. However, in order to keep DID Peers private between them, Alice must replace the DID used in the Out of Band message by a new one. That process is call DID rotation.

+

A DID is rotated by sending a message to Bob including the from_prior header containng a JWT with the new DID in the sub and the prior DID in the iss fields. +First, she need to create the new DID Peer:

+
alice_did_new = await create_peer_did(1, 1, service_endpoint="https://www.example.com/alice")
+print("Alice's NEW DID:", alice_did_new)
+
+
Alice's NEW DID: did:peer:2.Ez6LSnn1bdY7Zy5WLuXxMQWEpDb2o9L9g8fW9Z2NWdASTAAKd.Vz6MkqFwmMSecezdhHHGMQJPEpjkoSFNVBQRnQG15P1VbgJsN.SeyJpZCI6Im5ldy1pZCIsInQiOiJkbSIsInMiOiJodHRwczovL3d3dy5leGFtcGxlLmNvbS9hbGljZSIsImEiOlsiZGlkY29tbS92MiJdfQ
+
+

Then, with the help of the library she can easily creat the from_prior header. More details on how to make the JWT can be found in Chapter 5.3 of DIDComm Messaging Specification

+
from_prior = FromPrior(iss=alice_did_oob, sub=alice_did_new)
+
+alice_rotate_did_message = Message(
+    body = {"msg": "I'm rotating my peer DID"},
+    id = "unique-id-293e9a922e",
+    type = "my-protocol/1.0",
+    frm = alice_did_new,
+    to = [bob_unpack_msg.message.frm],
+    from_prior = from_prior
+)
+
+

As in previous steps, Alice will encrypt and pack the message, and POST it to Bob's endpoint:

+
alice_packed_msg = await pack_encrypted(
+    resolvers_config = ResolversConfig(
+        secrets_resolver = secrets_resolver,
+        did_resolver = DIDResolverPeerDID()
+    ),
+    message = alice_rotate_did_message,
+    frm = alice_did_new,
+    to = bob_unpack_msg.message.frm,
+    sign_frm = None,
+    pack_config = PackEncryptedConfig(protect_sender_id=False)
+)
+
+headers = {"Content-Type": "application/didcomm-encrypted+json"}
+resp = requests.post(bob_endpoint, headers=headers, data = alice_packed_msg.packed_msg)
+
+

Bob will receive the message in his endpoint, unpack and decrypt, and get the new Alice's DID. He must store Alice's new DID and use it in subsequent communications.

+

Step 6: What's next --> Protocols

+

Now Alice and Bob have a private way to communicate. This communication channel can be used whenever they need. Normally, messages passed back and forth will follow a protocol that can be understood by both. We won't cover protocols in this tutorial. You can read more about protocols in Chapter 9 of the DIDComm Messaging specification

+

Step 7: Ending a relationship

+

Alice and Bob can use the channel forever. They know how to pass messages and even how to rotate a DID if needed. If for any reason, Alice (or Bob) need to end the relationship, she can simply send a message rotating the DID to nothing. That is achieved by ommiting the sub in the from_prior and sending the message without a from attribute of the message as it's shown below:

+
from_prior_end = FromPrior(iss=alice_did_new, sub=None)
+
+alice_end_message = Message(
+    body = {"msg": "I'm finishing this relationship :("},
+    id = "unique-id-25359a955e",
+    type = "my-protocol/1.0",
+    to = [bob_unpack_msg.message.frm],
+    from_prior = from_prior_end
+)
+
+alice_end_packed_msg = await pack_encrypted(
+    resolvers_config = ResolversConfig(
+        secrets_resolver = secrets_resolver,
+        did_resolver = DIDResolverPeerDID()
+    ),
+    message = alice_end_message,
+    to = bob_unpack_msg.message.frm,
+   sign_frm = None,
+    pack_config = PackEncryptedConfig(protect_sender_id=False)
+)
+
\ No newline at end of file diff --git a/book/v2/threading/index.html b/book/v2/threading/index.html new file mode 100644 index 00000000..db3b0852 --- /dev/null +++ b/book/v2/threading/index.html @@ -0,0 +1,33 @@ +DIDComm

Threading

+

DIDComm's threading mechanism enables referencing individual messages, the sets of messages that constitute a logically independent interaction (a "run" or "instance" of a protocol), or even the hierarchies of messages that model nested and recursive workflows. This helps with troubleshooting, debugging, error reporting, resend logic, interactions across more than two parties, and patterns of communication that are more flexible or asynchronous than simple request+response.

+

Some context about the intent and best practices for these features may be helpful:

+
    +
  • For cybersecurity reasons, the id properties of related messages are intended not to bear any resemblance to one another; id values are expected to be opaque and will likely cause additional issues if they include overloaded semantics that are unique to a particular implementation. This lack of a detectable relationship should be characteristic of id values for messages that stand in sequence to one another, as well as the id properties of forward messages seen by mediators vis-a-vis the id of the innermost plaintext messages they carry.
  • +
+

Threads

+

Like threads in email, a thread in DIDComm intends to model a discrete interaction. For protocols that have a beginning and end (e.g., exchanging credentials, playing a game of chess, making a payment), a DIDComm thread maps exactly onto the sequence of messages that embody one such interaction; when a new interaction like this starts, the parties are expected to impute a new thread to the context.

+

However, some DIDComm protocols are not obviously discrete. An example of this might be a human-friendly chat; humans don't necessarily perceive crisp interaction boundaries around any given subset of the messages they trade back and forth. In such cases, a thread might map to a topic, a unit of time, or something else. Applications can structure the thread construct in whatever way makes sense to the implementers, but MUST describe the threading assumptions of the protocol in the protocol's documentation.

+

Parent Threads

+

Parent threads and child threads do not necessarily represent threads of execution or concurrency; they only represent logically separable sequences of messages. A parent thread can trigger multiple child threads, whuch could cascade to multiple levels of nested message threads (for example, issuing a credential triggers payment, which in turn triggers feature discovery). Parent threads and child threads do not have a simple containment or ownership relationship. By definition, a parent is only a trigger — not necessarily a controller or stakeholder. A parent thread has no guarantees about its lifecycle and could end before or after any of its child threads. Parent and child threads also can interact or share data, but are not required to do so. (How they do so is out of scope in this spec, but see Coprotocols for one way to approach this.)

+

Parent and Child Examples

+

Creating a connection is a classic interaction that lends itself to a parent-child paradigm. Alice and Bob rarely connect just to connect; usually they connect so they can conduct some type of business. In such situations, the connection protocol is a parent thread, and whatever business they then conduct becomes a child.

+

Reporting and resolving errors and warnings is also a good use case for parent and child threads. It is true that problems can be communicated in specialized messages of an individual protocol; some protocols may make this choice. However, problems are often the gateway to deeper troubleshooting or even support tickets, which are complex workflows in their own right. Also, robust mechanisms for logging, analyzing, and reacting to problems may be reusable in many workflows. For this reason, it is recommended to model problem reporting as a child protocol, with an arbitrarily complex thread of messages as child to the parent workflow that triggered them. See Reporting and Handling Problems for more info.

+

Sometimes the parent of a thread is not known, or is so independent of its child as to be irrelevant. If Alice and Bob connected three years ago, each new interaction that they begin doesn't need to declare a pthid that references the original interaction that connected them. Declare a parent relationship for a thread when it is likely to be useful.

+

Message URIs

+

It's generally considered this functionality will be combined with JSPath or JS Pointer so individual elements of messages may also be hyperlinked. For a good idea of the concepts that we'd like to enable with this capability, see Linkable Message Paths.

\ No newline at end of file diff --git a/book/v2/timeouts/index.html b/book/v2/timeouts/index.html new file mode 100644 index 00000000..77f9eba5 --- /dev/null +++ b/book/v2/timeouts/index.html @@ -0,0 +1,17 @@ +DIDComm
\ No newline at end of file diff --git a/book/v2/whatsnew/index.html b/book/v2/whatsnew/index.html new file mode 100644 index 00000000..bdfd8664 --- /dev/null +++ b/book/v2/whatsnew/index.html @@ -0,0 +1,48 @@ +DIDComm

What's New?

+

The version of DIDComm incubated in the Hyperledger Aries community is referred to as Version 1 (V1). This spec describes the next version, referred to as Version 2 (V2). This section will describe the changes between V1 and V2, useful to members of the Aries community.

+

Summary of Changes

+
    +
  • Formalization of methods used in V1 +
      +
    • JWM based envelope
    • +
    • ECDH-1PU standardized form of AuthCrypt
    • +
    +
  • +
  • Both DID and key in each message
  • +
  • Special Handling of Peer DIDs eliminated
  • +
  • Message structure split between 'headers' and body.
  • +
  • No AnonCrypt encryption method.
  • +
+

Practical Changes

+

The list of changes above leads to practical changes in how DIDComm is used.

+

DID Exchange not needed

+

Each message contains both the sender key (used in the encryption layer), and the sender's DID. The exchange of DIDs that occurs via the DID Exchange Protocol used in V1 occurs in each message that is transferred. The important step of rotating DIDs is accomplished via the from_prior header that travels alongside any protocol message. These features make the DID Exchange Protocol redundant.

+

One side effect of the DID Exchange Protocol in V1 was that you confirmed the validity of the DID with a round trip to the other party. Many protocols will provide this assurance via the flow of the protocol prior to the point where round-trip testing is required. When this round-trip is desired prior to the beginning of a protocol, a round trip with another protocol (such as Trust Ping or Feature Discovery) can provide the same assurance.

+

Special Handling of Peer DIDs eliminated

+

DIDComm V1 defined special handling of Peer DIDs, making it very optimized for usage with Peer DIDs. However this made it less obvious how other DID methods could be used with DIDComm. DIDComm V2 eliminated special handling of Peer DIDs, making handling of all DIDs equal from the perspective of the DIDComm spec. This creates a more distinct separation between how DIDs are used (defined by DID Core and specific DID method) and how to securely communicate using DIDs (defined by DIDComm spec).

+

The new to and from attributes inside a DIDComm message allow for query parameters to be included on a DID. Using the query parameters you can exchange additional information without using custom fields. DID methods indicate how query parameters can be used to pass state information. For example, the Peer DID method defines the usage of the initial-state query parameter to pass all information needed to construct a DIDDoc in a single field.

+

Process From Headers prior to Protocol Processing

+

Relationship changes in V1 were handled inside the DID Exchange Protocol. In V2, relationship changes including discovery and rotation are handled in message headers.

+

In V2, messages must evaluate the from and from_prior headers of every message prior to beginning the protocol message processing.

+

No technical difference between Ephemeral Mode and Full Mode

+

Ephemeral mode in V1 was a method of passing messages without first performing an exchange of DIDs. Given that we no longer have a need to perform an exchange of DIDs prior to passing messages of another protocol, we no longer need to designate a mode for ephemeral interactions.

+

Message Level Decorators now represented as Headers

+

The adjusted structure of DIDComm messages now represents message level decorators as message headers. An example includes thid.

+

Return-Route Moved to Extension

+

The return-route mechanism has been moved to an extension due to it's limited application. This mechanism is useful in last-mile message delivery for mobile devices and agents without a public endpoint.

\ No newline at end of file diff --git a/book/v2/why/index.html b/book/v2/why/index.html new file mode 100644 index 00000000..3cbde0d9 --- /dev/null +++ b/book/v2/why/index.html @@ -0,0 +1,18 @@ +DIDComm

Why DIDComm?

+

This guide contains concepts, explanations, and important considerations for those building DIDComm capable systems.

\ No newline at end of file diff --git a/c421904502786c9c0f42a2b11467abe4/receipts-flow.png b/c421904502786c9c0f42a2b11467abe4/receipts-flow.png new file mode 100644 index 0000000000000000000000000000000000000000..5d9359a7a4280e59ab8fc237fba6529249191d35 GIT binary patch literal 33890 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:""+Array(e+1-r.length).join(n)+t},b={s:g,z:function(t){var e=-t.utcOffset(),n=Math.abs(e),r=Math.floor(n/60),i=n%60;return(e<=0?"+":"-")+g(r,2,"0")+":"+g(i,2,"0")},m:function t(e,n){if(e.date()t.reduce(((t,e)=>(t[e[0]]=e[1],t)),{});let u;!function(t){t.year="Last year",t.month="Last month",t.week="Last week",t.day="Last 24 hours"}(u||(u={}));const s=t=>t?document.body.classList.add("no-scroll"):document.body.classList.remove("no-scroll"),c=(t,e)=>t.filter((t=>{let n=!0;return 0!==e.status.length&&(n=e.status.includes(t.status)),n&&0!==e.license.length&&(n=e.license.includes(t.license)),n&&e.dateUnit&&(n=i()().subtract(1,e.dateUnit).isBefore(t.modifiedDate)),n&&0!==e.tag.length&&(n=e.tag.some((e=>t.tags.includes(e)))),n}))},1937:function(t,e,n){"use strict";n.d(e,{A:function(){return vt}});var r,i,o,a,u=n(7294),s=n(5697),c=n.n(s),f=n(4839),l=n.n(f),d=n(2993),h=n.n(d),p=n(6494),y=n.n(p),m="bodyAttributes",g="htmlAttributes",b="titleAttributes",v={BASE:"base",BODY:"body",HEAD:"head",HTML:"html",LINK:"link",META:"meta",NOSCRIPT:"noscript",SCRIPT:"script",STYLE:"style",TITLE:"title"},T=(Object.keys(v).map((function(t){return v[t]})),"charset"),w="cssText",S="href",O="http-equiv",A="innerHTML",$="itemprop",C="name",M="property",E="rel",k="src",D="target",L={accesskey:"accessKey",charset:"charSet",class:"className",contenteditable:"contentEditable",contextmenu:"contextMenu","http-equiv":"httpEquiv",itemprop:"itemProp",tabindex:"tabIndex"},j="defaultTitle",P="defer",I="encodeSpecialCharacters",x="onChangeClientState",_="titleTemplate",N=Object.keys(L).reduce((function(t,e){return t[L[e]]=e,t}),{}),H=[v.NOSCRIPT,v.SCRIPT,v.STYLE],Y="data-react-helmet",R="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},B=function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")},U=function(){function t(t,e){for(var n=0;n=0||Object.prototype.hasOwnProperty.call(t,r)&&(n[r]=t[r]);return n},W=function(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e},z=function(t){var e=!(arguments.length>1&&void 0!==arguments[1])||arguments[1];return!1===e?String(t):String(t).replace(/&/g,"&").replace(//g,">").replace(/"/g,""").replace(/'/g,"'")},K=function(t){var e=G(t,v.TITLE),n=G(t,_);if(n&&e)return n.replace(/%s/g,(function(){return Array.isArray(e)?e.join(""):e}));var r=G(t,j);return e||r||void 0},V=function(t){return G(t,x)||function(){}},J=function(t,e){return e.filter((function(e){return void 0!==e[t]})).map((function(e){return e[t]})).reduce((function(t,e){return F({},t,e)}),{})},Z=function(t,e){return e.filter((function(t){return void 0!==t[v.BASE]})).map((function(t){return t[v.BASE]})).reverse().reduce((function(e,n){if(!e.length)for(var r=Object.keys(n),i=0;i=0;n--){var r=t[n];if(r.hasOwnProperty(e))return r[e]}return null},X=(r=Date.now(),function(t){var e=Date.now();e-r>16?(r=e,t(e)):setTimeout((function(){X(t)}),0)}),tt=function(t){return clearTimeout(t)},et="undefined"!=typeof window?window.requestAnimationFrame&&window.requestAnimationFrame.bind(window)||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||X:n.g.requestAnimationFrame||X,nt="undefined"!=typeof window?window.cancelAnimationFrame||window.webkitCancelAnimationFrame||window.mozCancelAnimationFrame||tt:n.g.cancelAnimationFrame||tt,rt=function(t){return console&&"function"==typeof console.warn&&console.warn(t)},it=null,ot=function(t,e){var n=t.baseTag,r=t.bodyAttributes,i=t.htmlAttributes,o=t.linkTags,a=t.metaTags,u=t.noscriptTags,s=t.onChangeClientState,c=t.scriptTags,f=t.styleTags,l=t.title,d=t.titleAttributes;st(v.BODY,r),st(v.HTML,i),ut(l,d);var h={baseTag:ct(v.BASE,n),linkTags:ct(v.LINK,o),metaTags:ct(v.META,a),noscriptTags:ct(v.NOSCRIPT,u),scriptTags:ct(v.SCRIPT,c),styleTags:ct(v.STYLE,f)},p={},y={};Object.keys(h).forEach((function(t){var e=h[t],n=e.newTags,r=e.oldTags;n.length&&(p[t]=n),r.length&&(y[t]=h[t].oldTags)})),e&&e(),s(t,p,y)},at=function(t){return Array.isArray(t)?t.join(""):t},ut=function(t,e){void 0!==t&&document.title!==t&&(document.title=at(t)),st(v.TITLE,e)},st=function(t,e){var n=document.getElementsByTagName(t)[0];if(n){for(var r=n.getAttribute(Y),i=r?r.split(","):[],o=[].concat(i),a=Object.keys(e),u=0;u=0;l--)n.removeAttribute(o[l]);i.length===o.length?n.removeAttribute(Y):n.getAttribute(Y)!==a.join(",")&&n.setAttribute(Y,a.join(","))}},ct=function(t,e){var n=document.head||document.querySelector(v.HEAD),r=n.querySelectorAll(t+"["+"data-react-helmet]"),i=Array.prototype.slice.call(r),o=[],a=void 0;return e&&e.length&&e.forEach((function(e){var n=document.createElement(t);for(var r in e)if(e.hasOwnProperty(r))if(r===A)n.innerHTML=e.innerHTML;else if(r===w)n.styleSheet?n.styleSheet.cssText=e.cssText:n.appendChild(document.createTextNode(e.cssText));else{var u=void 0===e[r]?"":e[r];n.setAttribute(r,u)}n.setAttribute(Y,"true"),i.some((function(t,e){return a=e,n.isEqualNode(t)}))?i.splice(a,1):o.push(n)})),i.forEach((function(t){return t.parentNode.removeChild(t)})),o.forEach((function(t){return n.appendChild(t)})),{oldTags:i,newTags:o}},ft=function(t){return Object.keys(t).reduce((function(e,n){var r=void 0!==t[n]?n+'="'+t[n]+'"':""+n;return e?e+" "+r:r}),"")},lt=function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};return Object.keys(t).reduce((function(e,n){return e[L[n]||n]=t[n],e}),e)},dt=function(t,e,n){switch(t){case v.TITLE:return{toComponent:function(){return t=e.title,n=e.titleAttributes,(r={key:t})[Y]=!0,i=lt(n,r),[u.createElement(v.TITLE,i,t)];var t,n,r,i},toString:function(){return function(t,e,n,r){var i=ft(n),o=at(e);return i?"<"+t+' data-react-helmet="true" '+i+">"+z(o,r)+"":"<"+t+' data-react-helmet="true">'+z(o,r)+""}(t,e.title,e.titleAttributes,n)}};case m:case g:return{toComponent:function(){return lt(e)},toString:function(){return ft(e)}};default:return{toComponent:function(){return function(t,e){return e.map((function(e,n){var r,i=((r={key:n})[Y]=!0,r);return Object.keys(e).forEach((function(t){var n=L[t]||t;if(n===A||n===w){var r=e.innerHTML||e.cssText;i.dangerouslySetInnerHTML={__html:r}}else i[n]=e[t]})),u.createElement(t,i)}))}(t,e)},toString:function(){return function(t,e,n){return e.reduce((function(e,r){var i=Object.keys(r).filter((function(t){return!(t===A||t===w)})).reduce((function(t,e){var i=void 0===r[e]?e:e+'="'+z(r[e],n)+'"';return t?t+" "+i:i}),""),o=r.innerHTML||r.cssText||"",a=-1===H.indexOf(t);return e+"<"+t+' data-react-helmet="true" '+i+(a?"/>":">"+o+"")}),"")}(t,e,n)}}}},ht=function(t){var e=t.baseTag,n=t.bodyAttributes,r=t.encode,i=t.htmlAttributes,o=t.linkTags,a=t.metaTags,u=t.noscriptTags,s=t.scriptTags,c=t.styleTags,f=t.title,l=void 0===f?"":f,d=t.titleAttributes;return{base:dt(v.BASE,e,r),bodyAttributes:dt(m,n,r),htmlAttributes:dt(g,i,r),link:dt(v.LINK,o,r),meta:dt(v.META,a,r),noscript:dt(v.NOSCRIPT,u,r),script:dt(v.SCRIPT,s,r),style:dt(v.STYLE,c,r),title:dt(v.TITLE,{title:l,titleAttributes:d},r)}},pt=l()((function(t){return{baseTag:Z([S,D],t),bodyAttributes:J(m,t),defer:G(t,P),encode:G(t,I),htmlAttributes:J(g,t),linkTags:Q(v.LINK,[E,S],t),metaTags:Q(v.META,[C,T,O,M,$],t),noscriptTags:Q(v.NOSCRIPT,[A],t),onChangeClientState:V(t),scriptTags:Q(v.SCRIPT,[k,A],t),styleTags:Q(v.STYLE,[w],t),title:K(t),titleAttributes:J(b,t)}}),(function(t){it&&nt(it),t.defer?it=et((function(){ot(t,(function(){it=null}))})):(ot(t),it=null)}),ht)((function(){return null})),yt=(i=pt,a=o=function(t){function e(){return B(this,e),W(this,t.apply(this,arguments))}return function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}(e,t),e.prototype.shouldComponentUpdate=function(t){return!h()(this.props,t)},e.prototype.mapNestedChildrenToProps=function(t,e){if(!e)return null;switch(t.type){case v.SCRIPT:case v.NOSCRIPT:return{innerHTML:e};case v.STYLE:return{cssText:e}}throw new Error("<"+t.type+" /> elements are self-closing and can not contain children. Refer to our API for more information.")},e.prototype.flattenArrayTypeChildren=function(t){var e,n=t.child,r=t.arrayTypeChildren,i=t.newChildProps,o=t.nestedChildren;return F({},r,((e={})[n.type]=[].concat(r[n.type]||[],[F({},i,this.mapNestedChildrenToProps(n,o))]),e))},e.prototype.mapObjectTypeChildren=function(t){var e,n,r=t.child,i=t.newProps,o=t.newChildProps,a=t.nestedChildren;switch(r.type){case v.TITLE:return F({},i,((e={})[r.type]=a,e.titleAttributes=F({},o),e));case v.BODY:return F({},i,{bodyAttributes:F({},o)});case v.HTML:return F({},i,{htmlAttributes:F({},o)})}return F({},i,((n={})[r.type]=F({},o),n))},e.prototype.mapArrayTypeChildrenToProps=function(t,e){var n=F({},e);return Object.keys(t).forEach((function(e){var r;n=F({},n,((r={})[e]=t[e],r))})),n},e.prototype.warnOnInvalidChildren=function(t,e){return!0},e.prototype.mapChildrenToProps=function(t,e){var n=this,r={};return u.Children.forEach(t,(function(t){if(t&&t.props){var i=t.props,o=i.children,a=function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};return Object.keys(t).reduce((function(e,n){return e[N[n]||n]=t[n],e}),e)}(q(i,["children"]));switch(n.warnOnInvalidChildren(t,o),t.type){case v.LINK:case v.META:case v.NOSCRIPT:case v.SCRIPT:case v.STYLE:r=n.flattenArrayTypeChildren({child:t,arrayTypeChildren:r,newChildProps:a,nestedChildren:o});break;default:e=n.mapObjectTypeChildren({child:t,newProps:e,newChildProps:a,nestedChildren:o})}}})),e=this.mapArrayTypeChildrenToProps(r,e)},e.prototype.render=function(){var t=this.props,e=t.children,n=q(t,["children"]),r=F({},n);return e&&(r=this.mapChildrenToProps(e,r)),u.createElement(i,r)},U(e,null,[{key:"canUseDOM",set:function(t){i.canUseDOM=t}}]),e}(u.Component),o.propTypes={base:c().object,bodyAttributes:c().object,children:c().oneOfType([c().arrayOf(c().node),c().node]),defaultTitle:c().string,defer:c().bool,encodeSpecialCharacters:c().bool,htmlAttributes:c().object,link:c().arrayOf(c().object),meta:c().arrayOf(c().object),noscript:c().arrayOf(c().object),onChangeClientState:c().func,script:c().arrayOf(c().object),style:c().arrayOf(c().object),title:c().string,titleAttributes:c().object,titleTemplate:c().string},o.defaultProps={defer:!0,encodeSpecialCharacters:!0},o.peek=i.peek,o.rewind=function(){var t=i.rewind();return t||(t=ht({baseTag:[],bodyAttributes:{},encodeSpecialCharacters:!0,htmlAttributes:{},linkTags:[],metaTags:[],noscriptTags:[],scriptTags:[],styleTags:[],title:"",titleAttributes:{}})),t},a);yt.renderStatic=yt.rewind;var mt=n(5444);const gt=t=>{let{description:e,meta:n=[],title:r}=t;const{site:i}=(0,mt.useStaticQuery)("3000541721"),o=e||i.siteMetadata.description;return u.createElement(yt,{htmlAttributes:{lang:"en"},title:r,defaultTitle:i.siteMetadata.title,titleTemplate:"%s | "+i.siteMetadata.title,meta:[{name:"description",content:o},{property:"og:title",content:r},{property:"og:description",content:o},{property:"og:type",content:"website"}].concat(n)},u.createElement("link",{rel:"preconnect",href:"https://fonts.googleapis.com"}),u.createElement("link",{rel:"preconnect",href:"https://fonts.gstatic.com",crossOrigin:""}),u.createElement("link",{href:"https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700;800;900&display=swap",rel:"stylesheet"}))};var bt=n(6786);const vt=t=>{let{title:e,primary:n,accent:r,children:i}=t;return u.createElement(u.Fragment,null,u.createElement(gt,{title:e}),u.createElement("div",{className:(0,bt.yI)("Layout-module--layout--36KWw",n&&"Layout-module--primary--3dHHh",r&&"Layout-module--accent--3cy0V")},i))}}}]); +//# sourceMappingURL=commons-ceb25d5ebe4b77987b3b.js.map \ No newline at end of file diff --git a/commons-ceb25d5ebe4b77987b3b.js.map b/commons-ceb25d5ebe4b77987b3b.js.map new file mode 100644 index 00000000..c946daf1 --- /dev/null +++ b/commons-ceb25d5ebe4b77987b3b.js.map @@ -0,0 +1 @@ +{"version":3,"file":"commons-ceb25d5ebe4b77987b3b.js","mappings":"sGAC+DA,EAAOC,QAC9D,WACN,aAEA,IAAIC,EAAI,IACJC,EAAI,IACJC,EAAI,KACJC,EAAI,cACJC,EAAI,SACJC,EAAI,SACJC,EAAI,OACJC,EAAI,MACJC,EAAI,OACJC,EAAI,QACJC,EAAI,UACJC,EAAI,OACJC,EAAI,OACJC,EAAI,eACJC,EAAI,6FACJC,EAAI,sFACJC,EAAI,CACNC,KAAM,KACNC,SAAU,2DAA2DC,MAAM,KAC3EC,OAAQ,wFAAwFD,MAAM,MAEpGE,EAAI,SAAUrB,EAAGC,EAAGC,GACtB,IAAIC,EAAImB,OAAOtB,GACf,OAAQG,GAAKA,EAAEoB,QAAUtB,EAAID,EAAI,GAAKwB,MAAMvB,EAAI,EAAIE,EAAEoB,QAAQE,KAAKvB,GAAKF,GAEtE0B,EAAI,CACNrB,EAAGgB,EACHM,EAAG,SAAU3B,GACX,IAAIC,GAAKD,EAAE4B,YACP1B,EAAI2B,KAAKC,IAAI7B,GACbE,EAAI0B,KAAKE,MAAM7B,EAAI,IACnBE,EAAIF,EAAI,GACZ,OAAQD,GAAK,EAAI,IAAM,KAAOoB,EAAElB,EAAG,EAAG,KAAO,IAAMkB,EAAEjB,EAAG,EAAG,MAE7DiB,EAAG,SAASrB,EAAEC,EAAGC,GACf,GAAID,EAAE+B,OAAS9B,EAAE8B,OAAQ,OAAQhC,EAAEE,EAAGD,GACtC,IAAIE,EAAI,IAAMD,EAAE+B,OAAShC,EAAEgC,SAAW/B,EAAEgC,QAAUjC,EAAEiC,SAChD9B,EAAIH,EAAEkC,QAAQC,IAAIjC,EAAGM,GACrBJ,EAAIH,EAAIE,EAAI,EACZE,EAAIL,EAAEkC,QAAQC,IAAIjC,GAAKE,GAAK,EAAI,GAAII,GACxC,UAAWN,GAAKD,EAAIE,IAAMC,EAAID,EAAIE,EAAIA,EAAIF,KAAO,IAEnDG,EAAG,SAAUP,GACX,OAAOA,EAAI,EAAI6B,KAAKQ,KAAKrC,IAAM,EAAI6B,KAAKE,MAAM/B,IAEhDsC,EAAG,SAAUtC,GACX,MAAO,CACLgB,EAAGP,EACHM,EAAGJ,EACH4B,EAAG/B,EACHI,EAAGL,EACHiC,EAAG5B,EACHF,EAAGJ,EACHe,EAAGhB,EACHA,EAAGD,EACHqC,GAAItC,EACJuC,EAAGhC,GACHV,IAAMsB,OAAOtB,GAAK,IAAI2C,cAAcC,QAAQ,KAAM,KAEtDtC,EAAG,SAAUN,GACX,YAAO,IAAWA,IAGlBwC,EAAI,KACJK,EAAI,GAERA,EAAEL,GAAKxB,EAEP,IAAIsB,EAAI,SAAUtC,GAChB,OAAOA,aAAa8C,GAElBC,EAAI,SAAU/C,EAAGC,EAAGC,GACtB,IAAIC,EACJ,IAAKH,EAAG,OAAOwC,EACf,GAAI,iBAAmBxC,EAAG6C,EAAE7C,KAAOG,EAAIH,GAAIC,IAAM4C,EAAE7C,GAAKC,EAAGE,EAAIH,OAAQ,CACrE,IAAII,EAAIJ,EAAEiB,KACV4B,EAAEzC,GAAKJ,EAAGG,EAAIC,EAEhB,OAAQF,GAAKC,IAAMqC,EAAIrC,GAAIA,IAAMD,GAAKsC,GAEpCD,EAAI,SAAUvC,EAAGC,GACnB,GAAIqC,EAAEtC,GAAI,OAAOA,EAAEmC,QACnB,IAAIjC,EAAI,iBAAmBD,EAAIA,EAAI,GACnC,OAAOC,EAAE8B,KAAOhC,EAAGE,EAAE8C,KAAOC,UAAW,IAAIH,EAAE5C,IAE3CgD,EAAIxB,EAERwB,EAAEpC,EAAIiC,EAAGG,EAAE9C,EAAIkC,EAAGY,EAAEX,EAAI,SAAUvC,EAAGC,GACnC,OAAOsC,EAAEvC,EAAG,CACVmD,OAAQlD,EAAEmD,GACVC,IAAKpD,EAAEqD,GACPC,EAAGtD,EAAEuD,GACLC,QAASxD,EAAEwD,WAIf,IAAIX,EAAI,WACN,SAAS9B,EAAEhB,GACT0D,KAAKN,GAAKL,EAAE/C,EAAEmD,OAAQ,MAAM,GAAKO,KAAKC,MAAM3D,GAG9C,IAAIqB,EAAIL,EAAE4C,UACV,OAAOvC,EAAEsC,MAAQ,SAAU3D,GACzB0D,KAAKG,GAAK,SAAU7D,GAClB,IAAIC,EAAID,EAAEgC,KACN9B,EAAIF,EAAEqD,IACV,GAAI,OAASpD,EAAG,OAAO,IAAI6D,KAAKC,KAChC,GAAIb,EAAE5C,EAAEL,GAAI,OAAO,IAAI6D,KACvB,GAAI7D,aAAa6D,KAAM,OAAO,IAAIA,KAAK7D,GAEvC,GAAI,iBAAmBA,IAAM,MAAM+D,KAAK/D,GAAI,CAC1C,IAAIE,EAAIF,EAAEgE,MAAMnD,GAEhB,GAAIX,EAAG,CACL,IAAIC,EAAID,EAAE,GAAK,GAAK,EAChBE,GAAKF,EAAE,IAAM,KAAK+D,UAAU,EAAG,GACnC,OAAOhE,EAAI,IAAI4D,KAAKA,KAAKK,IAAIhE,EAAE,GAAIC,EAAGD,EAAE,IAAM,EAAGA,EAAE,IAAM,EAAGA,EAAE,IAAM,EAAGA,EAAE,IAAM,EAAGE,IAAM,IAAIyD,KAAK3D,EAAE,GAAIC,EAAGD,EAAE,IAAM,EAAGA,EAAE,IAAM,EAAGA,EAAE,IAAM,EAAGA,EAAE,IAAM,EAAGE,IAI1J,OAAO,IAAIyD,KAAK7D,GAjBR,CAkBRD,GAAI0D,KAAKF,GAAKxD,EAAEuD,GAAK,GAAIG,KAAKU,QAC/B/C,EAAE+C,KAAO,WACV,IAAIpE,EAAI0D,KAAKG,GACbH,KAAKW,GAAKrE,EAAEsE,cAAeZ,KAAKa,GAAKvE,EAAEwE,WAAYd,KAAKe,GAAKzE,EAAE0E,UAAWhB,KAAKiB,GAAK3E,EAAE4E,SAAUlB,KAAKmB,GAAK7E,EAAE8E,WAAYpB,KAAKqB,GAAK/E,EAAEgF,aAActB,KAAKuB,GAAKjF,EAAEkF,aAAcxB,KAAKyB,IAAMnF,EAAEoF,mBACxL/D,EAAEgE,OAAS,WACZ,OAAOnC,GACN7B,EAAEiE,QAAU,WACb,QAAS5B,KAAKG,GAAG0B,aAAe1E,IAC/BQ,EAAEmE,OAAS,SAAUxF,EAAGC,GACzB,IAAIC,EAAIqC,EAAEvC,GACV,OAAO0D,KAAK+B,QAAQxF,IAAMC,GAAKA,GAAKwD,KAAKgC,MAAMzF,IAC9CoB,EAAEsE,QAAU,SAAU3F,EAAGC,GAC1B,OAAOsC,EAAEvC,GAAK0D,KAAK+B,QAAQxF,IAC1BoB,EAAEuE,SAAW,SAAU5F,EAAGC,GAC3B,OAAOyD,KAAKgC,MAAMzF,GAAKsC,EAAEvC,IACxBqB,EAAEwE,GAAK,SAAU7F,EAAGC,EAAGC,GACxB,OAAOgD,EAAE5C,EAAEN,GAAK0D,KAAKzD,GAAKyD,KAAKoC,IAAI5F,EAAGF,IACrCqB,EAAE0E,KAAO,WACV,OAAOlE,KAAKE,MAAM2B,KAAKsC,UAAY,MAClC3E,EAAE2E,QAAU,WACb,OAAOtC,KAAKG,GAAGoC,WACd5E,EAAEoE,QAAU,SAAUzF,EAAGC,GAC1B,IAAIC,EAAIwD,KACJvD,IAAM+C,EAAE5C,EAAEL,IAAMA,EAChBS,EAAIwC,EAAEZ,EAAEtC,GACRa,EAAI,SAAUb,EAAGC,GACnB,IAAIG,EAAI8C,EAAEX,EAAErC,EAAEoD,GAAKQ,KAAKK,IAAIjE,EAAEmE,GAAIpE,EAAGD,GAAK,IAAI8D,KAAK5D,EAAEmE,GAAIpE,EAAGD,GAAIE,GAChE,OAAOC,EAAIC,EAAIA,EAAEsF,MAAMnF,IAErBO,EAAI,SAAUd,EAAGC,GACnB,OAAOiD,EAAEX,EAAErC,EAAEgG,SAASlG,GAAGmG,MAAMjG,EAAEgG,OAAO,MAAO/F,EAAI,CAAC,EAAG,EAAG,EAAG,GAAK,CAAC,GAAI,GAAI,GAAI,MAAMiG,MAAMnG,IAAKC,IAE9Fa,EAAI2C,KAAKiB,GACT3D,EAAI0C,KAAKa,GACTlD,EAAIqC,KAAKe,GACT/C,EAAI,OAASgC,KAAKJ,GAAK,MAAQ,IAEnC,OAAQ5C,GACN,KAAKC,EACH,OAAOR,EAAIU,EAAE,EAAG,GAAKA,EAAE,GAAI,IAE7B,KAAKJ,EACH,OAAON,EAAIU,EAAE,EAAGG,GAAKH,EAAE,EAAGG,EAAI,GAEhC,KAAKR,EACH,IAAIgC,EAAIkB,KAAK2C,UAAUC,WAAa,EAChCzD,GAAK9B,EAAIyB,EAAIzB,EAAI,EAAIA,GAAKyB,EAC9B,OAAO3B,EAAEV,EAAIkB,EAAIwB,EAAIxB,GAAK,EAAIwB,GAAI7B,GAEpC,KAAKT,EACL,KAAKK,EACH,OAAOE,EAAEY,EAAI,QAAS,GAExB,KAAKpB,EACH,OAAOQ,EAAEY,EAAI,UAAW,GAE1B,KAAKrB,EACH,OAAOS,EAAEY,EAAI,UAAW,GAE1B,KAAKtB,EACH,OAAOU,EAAEY,EAAI,eAAgB,GAE/B,QACE,OAAOgC,KAAKvB,UAEfd,EAAEqE,MAAQ,SAAU1F,GACrB,OAAO0D,KAAK+B,QAAQzF,GAAG,IACtBqB,EAAEkF,KAAO,SAAUvG,EAAGC,GACvB,IAAIC,EACAM,EAAI0C,EAAEZ,EAAEtC,GACRU,EAAI,OAASgD,KAAKJ,GAAK,MAAQ,IAC/BzC,GAAKX,EAAI,GAAIA,EAAEK,GAAKG,EAAI,OAAQR,EAAEU,GAAKF,EAAI,OAAQR,EAAEO,GAAKC,EAAI,QAASR,EAAES,GAAKD,EAAI,WAAYR,EAAEI,GAAKI,EAAI,QAASR,EAAEG,GAAKK,EAAI,UAAWR,EAAEE,GAAKM,EAAI,UAAWR,EAAEC,GAAKO,EAAI,eAAgBR,GAAGM,GAC5LM,EAAIN,IAAMD,EAAImD,KAAKe,IAAMxE,EAAIyD,KAAKiB,IAAM1E,EAE5C,GAAIO,IAAMC,GAAKD,IAAMG,EAAG,CACtB,IAAII,EAAI2C,KAAKvB,QAAQ2D,IAAIlF,EAAG,GAC5BG,EAAE8C,GAAGhD,GAAGC,GAAIC,EAAEqD,OAAQV,KAAKG,GAAK9C,EAAE+E,IAAIlF,EAAGiB,KAAK2E,IAAI9C,KAAKe,GAAI1D,EAAE0F,gBAAgB5C,QACxEhD,GAAK6C,KAAKG,GAAGhD,GAAGC,GAEvB,OAAO4C,KAAKU,OAAQV,MACnBrC,EAAEyE,IAAM,SAAU9F,EAAGC,GACtB,OAAOyD,KAAKvB,QAAQoE,KAAKvG,EAAGC,IAC3BoB,EAAEqF,IAAM,SAAU1G,GACnB,OAAO0D,KAAKR,EAAEZ,EAAEtC,OACfqB,EAAEe,IAAM,SAAUjC,EAAGO,GACtB,IAAIE,EACAC,EAAI6C,KACRvD,EAAIwG,OAAOxG,GAEX,IAAIW,EAAIoC,EAAEZ,EAAE5B,GACRK,EAAI,SAAUf,GAChB,IAAIC,EAAIsC,EAAE1B,GACV,OAAOqC,EAAEX,EAAEtC,EAAE+B,KAAK/B,EAAE+B,OAASH,KAAK+E,MAAM5G,EAAIG,IAAKU,IAGnD,GAAIC,IAAML,EAAG,OAAOiD,KAAKoC,IAAIrF,EAAGiD,KAAKa,GAAKpE,GAC1C,GAAIW,IAAMH,EAAG,OAAO+C,KAAKoC,IAAInF,EAAG+C,KAAKW,GAAKlE,GAC1C,GAAIW,IAAMP,EAAG,OAAOQ,EAAE,GACtB,GAAID,IAAMN,EAAG,OAAOO,EAAE,GACtB,IAAIC,GAAKJ,EAAI,GAAIA,EAAEP,GAAKJ,EAAGW,EAAEN,GAAKJ,EAAGU,EAAER,GAAKJ,EAAGY,GAAGE,IAAM,EACpDO,EAAIqC,KAAKG,GAAGoC,UAAY9F,EAAIa,EAChC,OAAOkC,EAAEX,EAAElB,EAAGqC,OACbrC,EAAEwF,SAAW,SAAU7G,EAAGC,GAC3B,OAAOyD,KAAKtB,KAAK,EAAIpC,EAAGC,IACvBoB,EAAEyF,OAAS,SAAU9G,GACtB,IAAIC,EAAIyD,KACJxD,EAAIwD,KAAK2C,UACb,IAAK3C,KAAK4B,UAAW,OAAOpF,EAAE6G,aAAelG,EAE7C,IAAIV,EAAIH,GAAK,uBACTI,EAAI8C,EAAEvB,EAAE+B,MACRrD,EAAIqD,KAAKmB,GACTvE,EAAIoD,KAAKqB,GACTxE,EAAImD,KAAKa,GACT/D,EAAIN,EAAEgB,SACNT,EAAIP,EAAEkB,OACNV,EAAI,SAAUV,EAAGE,EAAGE,EAAGC,GACzB,OAAOL,IAAMA,EAAEE,IAAMF,EAAEC,EAAGE,KAAOC,EAAEF,GAAG8G,OAAO,EAAG3G,IAE9CM,EAAI,SAAUX,GAChB,OAAOkD,EAAE7C,EAAEA,EAAI,IAAM,GAAIL,EAAG,MAE1BY,EAAIV,EAAE+G,UAAY,SAAUjH,EAAGC,EAAGC,GACpC,IAAIC,EAAIH,EAAI,GAAK,KAAO,KACxB,OAAOE,EAAIC,EAAEwC,cAAgBxC,GAE3BW,EAAI,CACNoG,GAAI5F,OAAOoC,KAAKW,IAAI+B,OAAO,GAC3Be,KAAMzD,KAAKW,GACXrD,EAAGT,EAAI,EACP6G,GAAIlE,EAAE7C,EAAEE,EAAI,EAAG,EAAG,KAClB8G,IAAK3G,EAAER,EAAEoH,YAAa/G,EAAGE,EAAG,GAC5B8G,KAAM7G,EAAED,EAAGF,GACXiC,EAAGkB,KAAKe,GACR+C,GAAItE,EAAE7C,EAAEqD,KAAKe,GAAI,EAAG,KACpB7D,EAAGU,OAAOoC,KAAKiB,IACf8C,GAAI/G,EAAER,EAAEwH,YAAahE,KAAKiB,GAAInE,EAAG,GACjCmH,IAAKjH,EAAER,EAAE0H,cAAelE,KAAKiB,GAAInE,EAAG,GACpCqH,KAAMrH,EAAEkD,KAAKiB,IACbmD,EAAGxG,OAAOjB,GACV0H,GAAI7E,EAAE7C,EAAEA,EAAG,EAAG,KACdK,EAAGC,EAAE,GACLqH,GAAIrH,EAAE,GACNJ,EAAGK,EAAEP,EAAGC,GAAG,GACX2H,EAAGrH,EAAEP,EAAGC,GAAG,GACXe,EAAGC,OAAOhB,GACV4H,GAAIhF,EAAE7C,EAAEC,EAAG,EAAG,KACdD,EAAGiB,OAAOoC,KAAKuB,IACfkD,GAAIjF,EAAE7C,EAAEqD,KAAKuB,GAAI,EAAG,KACpBmD,IAAKlF,EAAE7C,EAAEqD,KAAKyB,IAAK,EAAG,KACtBkD,EAAGjI,GAGL,OAAOD,EAAEyC,QAAQ7B,GAAG,SAAUf,EAAGC,GAC/B,OAAOA,GAAKa,EAAEd,IAAMI,EAAEwC,QAAQ,IAAK,QAEpCvB,EAAEO,UAAY,WACf,OAAO,IAAMC,KAAK+E,MAAMlD,KAAKG,GAAGyE,oBAAsB,KACrDjH,EAAEkH,KAAO,SAAUpI,EAAGS,EAAGC,GAC1B,IAAIC,EACAC,EAAImC,EAAEZ,EAAE1B,GACRI,EAAIuB,EAAEpC,GACNkB,GAAKL,EAAEY,YAAc8B,KAAK9B,aAAe3B,EACzCyB,EAAIgC,KAAO1C,EACXwB,EAAIU,EAAE7B,EAAEqC,KAAM1C,GAClB,OAAOwB,GAAK1B,EAAI,GAAIA,EAAEH,GAAK6B,EAAI,GAAI1B,EAAEL,GAAK+B,EAAG1B,EAAEJ,GAAK8B,EAAI,EAAG1B,EAAEN,IAAMkB,EAAIL,GAAK,OAAQP,EAAEP,IAAMmB,EAAIL,GAAK,MAAOP,EAAER,GAAKoB,EAAIxB,EAAGY,EAAET,GAAKqB,EAAIzB,EAAGa,EAAEV,GAAKsB,EAAI1B,EAAGc,GAAGC,IAAMW,EAAGb,EAAI2B,EAAIU,EAAE3C,EAAEiC,IAC7KnB,EAAEoF,YAAc,WACjB,OAAO/C,KAAKgC,MAAMjF,GAAGgE,IACpBpD,EAAEgF,QAAU,WACb,OAAOxD,EAAEa,KAAKN,KACb/B,EAAE8B,OAAS,SAAUnD,EAAGC,GACzB,IAAKD,EAAG,OAAO0D,KAAKN,GACpB,IAAIlD,EAAIwD,KAAKvB,QACThC,EAAI4C,EAAE/C,EAAGC,GAAG,GAChB,OAAOE,IAAMD,EAAEkD,GAAKjD,GAAID,GACvBmB,EAAEc,MAAQ,WACX,OAAOe,EAAEX,EAAEmB,KAAKG,GAAIH,OACnBrC,EAAE6E,OAAS,WACZ,OAAO,IAAIpC,KAAKJ,KAAKsC,YACpB3E,EAAEmH,OAAS,WACZ,OAAO9E,KAAK4B,UAAY5B,KAAK+E,cAAgB,MAC5CpH,EAAEoH,YAAc,WACjB,OAAO/E,KAAKG,GAAG4E,eACdpH,EAAEkE,SAAW,WACd,OAAO7B,KAAKG,GAAG6E,eACd1H,EAlNG,GAoNJ2H,EAAI7F,EAAEc,UAEV,OAAOrB,EAAEqB,UAAY+E,EAAG,CAAC,CAAC,MAAOxI,GAAI,CAAC,KAAMC,GAAI,CAAC,KAAMC,GAAI,CAAC,KAAMC,GAAI,CAAC,KAAMC,GAAI,CAAC,KAAME,GAAI,CAAC,KAAME,GAAI,CAAC,KAAMC,IAAIgI,SAAQ,SAAU5I,GAClI2I,EAAE3I,EAAE,IAAM,SAAUC,GAClB,OAAOyD,KAAKmC,GAAG5F,EAAGD,EAAE,GAAIA,EAAE,QAE1BuC,EAAEsG,OAAS,SAAU7I,EAAGC,GAC1B,OAAOD,EAAE8I,KAAO9I,EAAEC,EAAG6C,EAAGP,GAAIvC,EAAE8I,IAAK,GAAKvG,GACvCA,EAAEY,OAASJ,EAAGR,EAAEwG,QAAUzG,EAAGC,EAAEwD,KAAO,SAAU/F,GACjD,OAAOuC,EAAE,IAAMvC,IACduC,EAAEyG,GAAKnG,EAAEL,GAAID,EAAE0G,GAAKpG,EAAGN,EAAED,EAAI,GAAIC,EAlU0CtC,I,iBCAhF,IAAIiJ,EAAoC,oBAAZC,QACxBC,EAAwB,mBAARC,IAChBC,EAAwB,mBAARC,IAChBC,EAAwC,mBAAhBC,eAAgCA,YAAYC,OAExE,SAASC,EAAMpJ,EAAGoI,GAEhB,GAAIpI,IAAMoI,EAAG,OAAO,EAEpB,GAAIpI,GAAKoI,GAAiB,iBAALpI,GAA6B,iBAALoI,EAAe,CAC1D,GAAIpI,EAAEqJ,cAAgBjB,EAAEiB,YAAa,OAAO,EAC5C,IAAIrI,EAAQnB,EAAGyJ,EA+BXC,EA7BJ,GAAItI,MAAMuI,QAAQxJ,GAAI,CAEpB,IADAgB,EAAShB,EAAEgB,SACGoH,EAAEpH,OAAQ,OAAO,EAE/B,IAAKnB,EAAImB,EAAgB,GAARnB,KAAY,IAAKuJ,EAAMpJ,EAAEH,GAAIuI,EAAEvI,IAAK,OAAO,EAE5D,OAAO,EAyBT,GAAIgJ,GAAU7I,aAAa8I,KAAOV,aAAaU,IAAK,CAClD,GAAI9I,EAAEyJ,OAASrB,EAAEqB,KAAM,OAAO,EAG9B,IAFAF,EAAKvJ,EAAE0J,YAEE7J,EAAI0J,EAAGI,QAAQC,UAAWxB,EAAEyB,IAAIhK,EAAEiK,MAAM,IAAK,OAAO,EAI7D,IAFAP,EAAKvJ,EAAE0J,YAEE7J,EAAI0J,EAAGI,QAAQC,UAAWR,EAAMvJ,EAAEiK,MAAM,GAAI1B,EAAEjC,IAAItG,EAAEiK,MAAM,KAAM,OAAO,EAEhF,OAAO,EAGT,GAAIf,GAAU/I,aAAagJ,KAAOZ,aAAaY,IAAK,CAClD,GAAIhJ,EAAEyJ,OAASrB,EAAEqB,KAAM,OAAO,EAG9B,IAFAF,EAAKvJ,EAAE0J,YAEE7J,EAAI0J,EAAGI,QAAQC,UAAWxB,EAAEyB,IAAIhK,EAAEiK,MAAM,IAAK,OAAO,EAE7D,OAAO,EAIT,GAAIb,GAAkBC,YAAYC,OAAOnJ,IAAMkJ,YAAYC,OAAOf,GAAI,CAEpE,IADApH,EAAShB,EAAEgB,SACGoH,EAAEpH,OAAQ,OAAO,EAE/B,IAAKnB,EAAImB,EAAgB,GAARnB,KAAY,GAAIG,EAAEH,KAAOuI,EAAEvI,GAAI,OAAO,EAEvD,OAAO,EAGT,GAAIG,EAAEqJ,cAAgBU,OAAQ,OAAO/J,EAAEgK,SAAW5B,EAAE4B,QAAUhK,EAAEiK,QAAU7B,EAAE6B,MAC5E,GAAIjK,EAAEyF,UAAYyE,OAAO7G,UAAUoC,QAAS,OAAOzF,EAAEyF,YAAc2C,EAAE3C,UACrE,GAAIzF,EAAEgF,WAAakF,OAAO7G,UAAU2B,SAAU,OAAOhF,EAAEgF,aAAeoD,EAAEpD,WAGxE,IADAhE,GADAsI,EAAOY,OAAOZ,KAAKtJ,IACLgB,UACCkJ,OAAOZ,KAAKlB,GAAGpH,OAAQ,OAAO,EAE7C,IAAKnB,EAAImB,EAAgB,GAARnB,KAAY,IAAKqK,OAAO7G,UAAU8G,eAAeC,KAAKhC,EAAGkB,EAAKzJ,IAAK,OAAO,EAK3F,GAAI8I,GAAkB3I,aAAa4I,QAAS,OAAO,EAEnD,IAAK/I,EAAImB,EAAgB,GAARnB,KACf,IAAiB,WAAZyJ,EAAKzJ,IAA+B,QAAZyJ,EAAKzJ,IAA4B,QAAZyJ,EAAKzJ,KAAiBG,EAAEqK,YAYrEjB,EAAMpJ,EAAEsJ,EAAKzJ,IAAKuI,EAAEkB,EAAKzJ,KAAM,OAAO,EAK7C,OAAO,EAGT,OAAOG,GAAMA,GAAKoI,GAAMA,EAI1B7I,EAAOC,QAAU,SAAiBQ,EAAGoI,GACnC,IACE,OAAOgB,EAAMpJ,EAAGoI,GAChB,MAAOkC,GACP,IAAKA,EAAMC,SAAW,IAAI7G,MAAM,oBAO9B,OADA8G,QAAQC,KAAK,mDACN,EAIT,MAAMH,K,kCC7HV,IAJyBI,EAIrBC,EAAQ,EAAQ,MAEhBC,GANqBF,EAMYC,IALR,iBAAPD,GAAmB,YAAaA,EAAKA,EAAY,QAAIA,EAO3E,SAASG,EAAgBC,EAAKC,EAAKjB,GAYjC,OAXIiB,KAAOD,EACTZ,OAAOc,eAAeF,EAAKC,EAAK,CAC9BjB,MAAOA,EACPmB,YAAY,EACZC,cAAc,EACdC,UAAU,IAGZL,EAAIC,GAAOjB,EAGNgB,EAST,IAAIM,IAAiC,oBAAXC,SAA0BA,OAAOC,WAAYD,OAAOC,SAASC,eA+FvFhM,EAAOC,QA7FP,SAAwBgM,EAAoBC,EAA2BC,GACrE,GAAkC,mBAAvBF,EACT,MAAM,IAAIG,MAAM,iDAGlB,GAAyC,mBAA9BF,EACT,MAAM,IAAIE,MAAM,wDAGlB,QAAgC,IAArBD,GAAgE,mBAArBA,EACpD,MAAM,IAAIC,MAAM,mEAOlB,OAAO,SAAcC,GACnB,GAAgC,mBAArBA,EACT,MAAM,IAAID,MAAM,sDAGlB,IACIE,EADAC,EAAmB,GAGvB,SAASC,IACPF,EAAQL,EAAmBM,EAAiBE,KAAI,SAAUC,GACxD,OAAOA,EAASC,UAGdC,EAAWf,UACbK,EAA0BI,GACjBH,IACTG,EAAQH,EAAiBG,IAI7B,IAAIM,EAA0B,SAAUC,GA7C5C,IAAwBC,EAAUC,EAgD5B,SAASH,IACP,OAAOC,EAAexG,MAAMzC,KAAMT,YAAcS,KAjDtBmJ,EA8CDF,GA9CTC,EA8CHF,GA7CV9I,UAAY6G,OAAOqC,OAAOD,EAAWjJ,WAC9CgJ,EAAShJ,UAAUgG,YAAcgD,EACjCA,EAASG,UAAYF,EAmDjBH,EAAWM,KAAO,WAChB,OAAOZ,GAGTM,EAAWO,OAAS,WAClB,GAAIP,EAAWf,UACb,MAAM,IAAIO,MAAM,oFAGlB,IAAIgB,EAAgBd,EAGpB,OAFAA,OAAQe,EACRd,EAAmB,GACZa,GAGT,IAAIE,EAASV,EAAW9I,UAqBxB,OAnBAwJ,EAAOC,0BAA4B,WACjChB,EAAiBiB,KAAK5J,MACtB4I,KAGFc,EAAOG,mBAAqB,WAC1BjB,KAGFc,EAAOI,qBAAuB,WAC5B,IAAIC,EAAQpB,EAAiBqB,QAAQhK,MACrC2I,EAAiBsB,OAAOF,EAAO,GAC/BnB,KAGFc,EAAOQ,OAAS,WACd,OAAoBzC,EAAeW,cAAcK,EAAkBzI,KAAK+I,QAGnEC,EA7CqB,CA8C5BxB,EAAM2C,eAMR,OAJAzC,EAAgBsB,EAAY,cAAe,cAxE7C,SAAwBP,GACtB,OAAOA,EAAiB2B,aAAe3B,EAAiBlL,MAAQ,YAuEL8M,CAAe5B,GAAoB,KAE9Ff,EAAgBsB,EAAY,YAAaf,GAElCe,K,yLCvHJ,MAAMsB,EAAM,WAA4D,IAAD,uBAAvDC,EAAuD,yBAAvDA,EAAuD,gBAC5E,OAAOA,EAAQC,OAAOC,SAAS1M,KAAK,WAAQ0L,GAGjCiB,EAA2CnE,GAC/CA,EAAQoE,QAAO,CAACC,EAAKC,KAC1BD,EAAIC,EAAI,IAAMA,EAAI,GACXD,IACN,IAGE,IAAKE,GAAZ,SAAYA,GAAAA,EAAAA,KAAAA,YAAAA,EAAAA,MAAAA,aAAAA,EAAAA,KAAAA,YAAAA,EAAAA,IAAAA,gBAAZ,CAAYA,IAAAA,EAAAA,KAOL,MAAMC,EAAYC,GAAiBA,EAAK7C,SAAS8C,KAAKC,UAAUxM,IAAI,aAAeyJ,SAAS8C,KAAKC,UAAUC,OAAO,aAE5GC,EAAe,CAACC,EAA4BC,IACvDD,EAAUb,QAAQe,IAChB,IAAIC,GAAO,EAkBX,OAhB8B,IAA1BF,EAAQG,OAAO5N,SACjB2N,EAAOF,EAAQG,OAAOC,SAASH,EAASE,SAGtCD,GAAmC,IAA3BF,EAAQK,QAAQ9N,SAC1B2N,EAAOF,EAAQK,QAAQD,SAASH,EAASI,UAGvCH,GAAQF,EAAQM,WAClBJ,EAAOK,GAAAA,GAAQ1I,SAAS,EAAGmI,EAAQM,UAAU1J,SAASqJ,EAASO,eAG7DN,GAA+B,IAAvBF,EAAQS,IAAIlO,SACtB2N,EAAOF,EAAQS,IAAIC,MAAM1P,GAAMiP,EAASU,KAAKP,SAASpP,MAGjDkP,M,uECuQLU,EA+UuBC,EACvBC,EAAQC,E,sFA7nBVC,EACI,iBADJA,EAEI,iBAFJA,EAGK,kBAELC,EAAY,CACdC,KAAM,OACNC,KAAM,OACNC,KAAM,OACNC,KAAM,OACNC,KAAM,OACNC,KAAM,OACNC,SAAU,WACVC,OAAQ,SACRC,MAAO,QACPC,MAAO,SAKLC,GAHkBnG,OAAOZ,KAAKoG,GAAW1D,KAAI,SAAUtL,GACzD,OAAOgP,EAAUhP,MAGR,WADP2P,EAEQ,UAFRA,EAGI,OAHJA,EAIS,aAJTA,EAKU,YALVA,EAMS,WANTA,EAOI,OAPJA,EAQQ,WARRA,EASG,MATHA,EAUG,MAVHA,EAWM,SAENC,EAAgB,CAClBC,UAAW,YACXC,QAAS,UACTC,MAAO,YACPC,gBAAiB,kBACjBC,YAAa,cACb,aAAc,YACdC,SAAU,WACVC,SAAU,YAERC,EACa,eADbA,EAEK,QAFLA,EAGyB,0BAHzBA,EAIsB,sBAJtBA,EAKc,gBAEdC,EAAe7G,OAAOZ,KAAKgH,GAAexC,QAAO,SAAUhD,EAAKC,GAElE,OADAD,EAAIwF,EAAcvF,IAAQA,EACnBD,IACN,IACCkG,EAAoB,CAACtB,EAAUO,SAAUP,EAAUQ,OAAQR,EAAUS,OACrEc,EAAmB,oBAEnBC,EAA4B,mBAAXC,QAAoD,iBAApBA,OAAOC,SAAwB,SAAUtG,GAC5F,cAAcA,GACZ,SAAUA,GACZ,OAAOA,GAAyB,mBAAXqG,QAAyBrG,EAAIzB,cAAgB8H,QAAUrG,IAAQqG,OAAO9N,UAAY,gBAAkByH,GAGvHuG,EAAiB,SAAUpF,EAAUqF,GACvC,KAAMrF,aAAoBqF,GACxB,MAAM,IAAIC,UAAU,sCAIpBC,EAAc,WAChB,SAASC,EAAiBC,EAAQxF,GAChC,IAAK,IAAIrM,EAAI,EAAGA,EAAIqM,EAAMlL,OAAQnB,IAAK,CACrC,IAAI8R,EAAazF,EAAMrM,GACvB8R,EAAW1G,WAAa0G,EAAW1G,aAAc,EACjD0G,EAAWzG,cAAe,EACtB,UAAWyG,IAAYA,EAAWxG,UAAW,GACjDjB,OAAOc,eAAe0G,EAAQC,EAAW5G,IAAK4G,IAIlD,OAAO,SAAUL,EAAaM,EAAYC,GAGxC,OAFID,GAAYH,EAAiBH,EAAYjO,UAAWuO,GACpDC,GAAaJ,EAAiBH,EAAaO,GACxCP,GAdO,GAkBdQ,EAAW5H,OAAO6H,QAAU,SAAUL,GACxC,IAAK,IAAI7R,EAAI,EAAGA,EAAI6C,UAAU1B,OAAQnB,IAAK,CACzC,IAAImK,EAAStH,UAAU7C,GAEvB,IAAK,IAAIkL,KAAOf,EACVE,OAAO7G,UAAU8G,eAAeC,KAAKJ,EAAQe,KAC/C2G,EAAO3G,GAAOf,EAAOe,IAK3B,OAAO2G,GAmBLM,EAA0B,SAAUlH,EAAKxB,GAC3C,IAAIoI,EAAS,GAEb,IAAK,IAAI7R,KAAKiL,EACRxB,EAAK6D,QAAQtN,IAAM,GAClBqK,OAAO7G,UAAU8G,eAAeC,KAAKU,EAAKjL,KAC/C6R,EAAO7R,GAAKiL,EAAIjL,IAGlB,OAAO6R,GAGLO,EAA4B,SAAUC,EAAM9H,GAC9C,IAAK8H,EACH,MAAM,IAAIC,eAAe,6DAG3B,OAAO/H,GAAyB,iBAATA,GAAqC,mBAATA,EAA8B8H,EAAP9H,GAGxEgI,EAA0B,SAAiCC,GAC7D,IAAIC,IAAS5P,UAAU1B,OAAS,QAAsB4L,IAAjBlK,UAAU,KAAmBA,UAAU,GAE5E,OAAe,IAAX4P,EACKvR,OAAOsR,GAGTtR,OAAOsR,GAAKhQ,QAAQ,KAAM,SAASA,QAAQ,KAAM,QAAQA,QAAQ,KAAM,QAAQA,QAAQ,KAAM,UAAUA,QAAQ,KAAM,WAG1HkQ,EAAwB,SAA+BC,GACzD,IAAIC,EAAiBC,EAAqBF,EAAW9C,EAAUU,OAC3DuC,EAAoBD,EAAqBF,EAAW1B,GAExD,GAAI6B,GAAqBF,EAEvB,OAAOE,EAAkBtQ,QAAQ,OAAO,WACtC,OAAOpB,MAAMuI,QAAQiJ,GAAkBA,EAAevR,KAAK,IAAMuR,KAIrE,IAAIG,EAAwBF,EAAqBF,EAAW1B,GAC5D,OAAO2B,GAAkBG,QAAyBhG,GAGhDiG,EAAyB,SAAgCL,GAC3D,OAAOE,EAAqBF,EAAW1B,IAAwC,cAG7EgC,EAA6B,SAAoCC,EAASP,GAC5E,OAAOA,EAAU7E,QAAO,SAAUzB,GAChC,YAAiC,IAAnBA,EAAM6G,MACnB/G,KAAI,SAAUE,GACf,OAAOA,EAAM6G,MACZjF,QAAO,SAAUkF,EAAUC,GAC5B,OAAOnB,EAAS,GAAIkB,EAAUC,KAC7B,KAGDC,EAA0B,SAAiCC,EAAmBX,GAChF,OAAOA,EAAU7E,QAAO,SAAUzB,GAChC,YAAwC,IAA1BA,EAAMwD,EAAUC,SAC7B3D,KAAI,SAAUE,GACf,OAAOA,EAAMwD,EAAUC,SACtByD,UAAUtF,QAAO,SAAUuF,EAAkBnE,GAC9C,IAAKmE,EAAiBrS,OAGpB,IAFA,IAAIsI,EAAOY,OAAOZ,KAAK4F,GAEdrP,EAAI,EAAGA,EAAIyJ,EAAKtI,OAAQnB,IAAK,CACpC,IACIyT,EADehK,EAAKzJ,GACiBuC,cAEzC,IAA0D,IAAtD+Q,EAAkBhG,QAAQmG,IAAiCpE,EAAIoE,GACjE,OAAOD,EAAiBE,OAAOrE,GAKrC,OAAOmE,IACN,KAGDG,EAAuB,SAA8BC,EAASN,EAAmBX,GAEnF,IAAIkB,EAAmB,GACvB,OAAOlB,EAAU7E,QAAO,SAAUzB,GAChC,QAAIjL,MAAMuI,QAAQ0C,EAAMuH,WAIM,IAAnBvH,EAAMuH,IACfhJ,GAAK,WAAagJ,EAAU,mDAAwDvC,EAAQhF,EAAMuH,IAAY,MAGzG,MACNzH,KAAI,SAAUE,GACf,OAAOA,EAAMuH,MACZL,UAAUtF,QAAO,SAAU6F,EAAcC,GAC1C,IAAIC,EAAmB,GACvBD,EAAajG,QAAO,SAAUuB,GAI5B,IAHA,IAAI4E,OAAsB,EACtBxK,EAAOY,OAAOZ,KAAK4F,GAEdrP,EAAI,EAAGA,EAAIyJ,EAAKtI,OAAQnB,IAAK,CACpC,IAAIkU,EAAezK,EAAKzJ,GACpByT,EAAwBS,EAAa3R,eAEiB,IAAtD+Q,EAAkBhG,QAAQmG,IAAmCQ,IAAwBzD,GAAiE,cAA3CnB,EAAI4E,GAAqB1R,eAAoCkR,IAA0BjD,GAAmE,eAA7CnB,EAAIoE,GAAuBlR,gBACrP0R,EAAsBR,IAIyB,IAA7CH,EAAkBhG,QAAQ4G,IAAyBA,IAAiB1D,GAA6B0D,IAAiB1D,GAA2B0D,IAAiB1D,IAChKyD,EAAsBC,GAI1B,IAAKD,IAAwB5E,EAAI4E,GAC/B,OAAO,EAGT,IAAIhK,EAAQoF,EAAI4E,GAAqB1R,cAUrC,OARKsR,EAAiBI,KACpBJ,EAAiBI,GAAuB,IAGrCD,EAAiBC,KACpBD,EAAiBC,GAAuB,KAGrCJ,EAAiBI,GAAqBhK,KACzC+J,EAAiBC,GAAqBhK,IAAS,GACxC,MAIRsJ,UAAU/K,SAAQ,SAAU6G,GAC7B,OAAOyE,EAAa5G,KAAKmC,MAK3B,IAFA,IAAI5F,EAAOY,OAAOZ,KAAKuK,GAEdhU,EAAI,EAAGA,EAAIyJ,EAAKtI,OAAQnB,IAAK,CACpC,IAAIkU,EAAezK,EAAKzJ,GACpBmU,EAAW,IAAa,GAAIN,EAAiBK,GAAeF,EAAiBE,IACjFL,EAAiBK,GAAgBC,EAGnC,OAAOL,IACN,IAAIP,WAGLV,EAAuB,SAA8BF,EAAWyB,GAClE,IAAK,IAAIpU,EAAI2S,EAAUxR,OAAS,EAAGnB,GAAK,EAAGA,IAAK,CAC9C,IAAIqM,EAAQsG,EAAU3S,GAEtB,GAAIqM,EAAM/B,eAAe8J,GACvB,OAAO/H,EAAM+H,GAIjB,OAAO,MAqBLC,GACE7E,EAAQ9L,KAAK4Q,MACV,SAAUC,GACf,IAAIC,EAAc9Q,KAAK4Q,MAEnBE,EAAchF,EAAQ,IACxBA,EAAQgF,EACRD,EAASC,IAETC,YAAW,WACTJ,EAAYE,KACX,KAKLG,GAAc,SAAqBC,GACrC,OAAOC,aAAaD,IAGlBE,GAA0C,oBAAXrJ,OAAyBA,OAAOqJ,uBAAyBrJ,OAAOqJ,sBAAsBC,KAAKtJ,SAAWA,OAAOuJ,6BAA+BvJ,OAAOwJ,0BAA4BX,EAAc,EAAA/S,EAAOuT,uBAAyBR,EAC5PY,GAAyC,oBAAXzJ,OAAyBA,OAAOyJ,sBAAwBzJ,OAAO0J,4BAA8B1J,OAAO2J,yBAA2BT,GAAc,EAAApT,EAAO2T,sBAAwBP,GAE1M9J,GAAO,SAAcwK,GACvB,OAAOzK,SAAmC,mBAAjBA,QAAQC,MAAuBD,QAAQC,KAAKwK,IAGnEC,GAAkB,KAmBlBC,GAAmB,SAA0BC,EAAUC,GACzD,IAAIC,EAAUF,EAASE,QACnBC,EAAiBH,EAASG,eAC1BC,EAAiBJ,EAASI,eAC1BC,EAAWL,EAASK,SACpBC,EAAWN,EAASM,SACpBC,EAAeP,EAASO,aACxBC,EAAsBR,EAASQ,oBAC/BC,EAAaT,EAASS,WACtBC,EAAYV,EAASU,UACrBC,EAAQX,EAASW,MACjBC,EAAkBZ,EAASY,gBAC/BC,GAAiBvG,EAAUE,KAAM2F,GACjCU,GAAiBvG,EAAUI,KAAM0F,GACjCU,GAAYH,EAAOC,GACnB,IAAIG,EAAa,CACfb,QAASc,GAAW1G,EAAUC,KAAM2F,GACpCG,SAAUW,GAAW1G,EAAUK,KAAM0F,GACrCC,SAAUU,GAAW1G,EAAUM,KAAM0F,GACrCC,aAAcS,GAAW1G,EAAUO,SAAU0F,GAC7CE,WAAYO,GAAW1G,EAAUQ,OAAQ2F,GACzCC,UAAWM,GAAW1G,EAAUS,MAAO2F,IAErCO,EAAY,GACZC,EAAc,GAClBpM,OAAOZ,KAAK6M,GAAY9N,SAAQ,SAAU0K,GACxC,IAAIwD,EAAsBJ,EAAWpD,GACjCyD,EAAUD,EAAoBC,QAC9BC,EAAUF,EAAoBE,QAE9BD,EAAQxV,SACVqV,EAAUtD,GAAWyD,GAGnBC,EAAQzV,SACVsV,EAAYvD,GAAWoD,EAAWpD,GAAS0D,YAG/CpB,GAAMA,IACNO,EAAoBR,EAAUiB,EAAWC,IAGvCI,GAAe,SAAsBC,GACvC,OAAO1V,MAAMuI,QAAQmN,GAAiBA,EAAczV,KAAK,IAAMyV,GAG7DT,GAAc,SAAqBH,EAAOa,QACvB,IAAVb,GAAyBzK,SAASyK,QAAUA,IACrDzK,SAASyK,MAAQW,GAAaX,IAGhCE,GAAiBvG,EAAUU,MAAOwG,IAGhCX,GAAmB,SAA0BxC,EAASmD,GACxD,IAAIC,EAAavL,SAASwL,qBAAqBrD,GAAS,GAExD,GAAKoD,EAAL,CASA,IALA,IAAIE,EAAwBF,EAAWG,aAAa/F,GAChDgG,EAAmBF,EAAwBA,EAAsBnW,MAAM,KAAO,GAC9EsW,EAAqB,GAAG3D,OAAO0D,GAC/BE,EAAgBjN,OAAOZ,KAAKsN,GAEvB/W,EAAI,EAAGA,EAAIsX,EAAcnW,OAAQnB,IAAK,CAC7C,IAAIuX,EAAYD,EAActX,GAC1BiK,EAAQ8M,EAAWQ,IAAc,GAEjCP,EAAWG,aAAaI,KAAetN,GACzC+M,EAAWQ,aAAaD,EAAWtN,IAGQ,IAAzCmN,EAAiB9J,QAAQiK,IAC3BH,EAAiBlK,KAAKqK,GAGxB,IAAIE,EAAcJ,EAAmB/J,QAAQiK,IAExB,IAAjBE,GACFJ,EAAmB9J,OAAOkK,EAAa,GAI3C,IAAK,IAAIC,EAAKL,EAAmBlW,OAAS,EAAGuW,GAAM,EAAGA,IACpDV,EAAWW,gBAAgBN,EAAmBK,IAG5CN,EAAiBjW,SAAWkW,EAAmBlW,OACjD6V,EAAWW,gBAAgBvG,GAClB4F,EAAWG,aAAa/F,KAAsBkG,EAAcjW,KAAK,MAC1E2V,EAAWQ,aAAapG,EAAkBkG,EAAcjW,KAAK,QAI7DkV,GAAa,SAAoBqB,EAAMrI,GACzC,IAAIsI,EAAcpM,SAASqM,MAAQrM,SAASsM,cAAclI,EAAUG,MAChEgI,EAAWH,EAAYI,iBAAiBL,EAAO,IAAPA,sBACxChB,EAAUxV,MAAMoC,UAAUwC,MAAMuE,KAAKyN,GACrCrB,EAAU,GACVuB,OAAgB,EA0CpB,OAxCI3I,GAAQA,EAAKpO,QACfoO,EAAK/G,SAAQ,SAAU6G,GACrB,IAAI8I,EAAa1M,SAASC,cAAckM,GAExC,IAAK,IAAIL,KAAalI,EACpB,GAAIA,EAAI/E,eAAeiN,GACrB,GAAIA,IAAc/G,EAChB2H,EAAWC,UAAY/I,EAAI+I,eACtB,GAAIb,IAAc/G,EACnB2H,EAAWE,WACbF,EAAWE,WAAWC,QAAUjJ,EAAIiJ,QAEpCH,EAAWI,YAAY9M,SAAS+M,eAAenJ,EAAIiJ,cAEhD,CACL,IAAIrO,OAAkC,IAAnBoF,EAAIkI,GAA6B,GAAKlI,EAAIkI,GAC7DY,EAAWX,aAAaD,EAAWtN,GAKzCkO,EAAWX,aAAapG,EAAkB,QAEtCwF,EAAQtH,MAAK,SAAUmJ,EAAapL,GAEtC,OADA6K,EAAgB7K,EACT8K,EAAWO,YAAYD,MAE9B7B,EAAQrJ,OAAO2K,EAAe,GAE9BvB,EAAQzJ,KAAKiL,MAKnBvB,EAAQpO,SAAQ,SAAU6G,GACxB,OAAOA,EAAIsJ,WAAWC,YAAYvJ,MAEpCsH,EAAQnO,SAAQ,SAAU6G,GACxB,OAAOwI,EAAYU,YAAYlJ,MAE1B,CACLuH,QAASA,EACTD,QAASA,IAITkC,GAAoC,SAA2C9B,GACjF,OAAO1M,OAAOZ,KAAKsN,GAAY9I,QAAO,SAAUuE,EAAKtH,GACnD,IAAI4N,OAAkC,IAApB/B,EAAW7L,GAAuBA,EAAM,KAAQ6L,EAAW7L,GAAO,IAAO,GAAKA,EAChG,OAAOsH,EAAMA,EAAM,IAAMsG,EAAOA,IAC/B,KAuBDC,GAAuC,SAA8ChC,GACvF,IAAIiC,EAAYnW,UAAU1B,OAAS,QAAsB4L,IAAjBlK,UAAU,GAAmBA,UAAU,GAAK,GACpF,OAAOwH,OAAOZ,KAAKsN,GAAY9I,QAAO,SAAUhD,EAAKC,GAEnD,OADAD,EAAIwF,EAAcvF,IAAQA,GAAO6L,EAAW7L,GACrCD,IACN+N,IA6CDC,GAAmB,SAA0BrB,EAAMrI,EAAMkD,GAC3D,OAAQmF,GACN,KAAK/H,EAAUU,MACb,MAAO,CACL2I,YAAa,WACX,OAvCuEhD,EAuC5B3G,EAAK2G,MAvC8Ba,EAuCvBxH,EAAK4G,iBAnCnDgD,EAAa,CAC5BjO,IAAKgL,IACO9E,IAAoB,EAC9B/E,EAAQ0M,GAAqChC,EADToC,GAEjC,CAAC,gBAAoBtJ,EAAUU,MAAOlE,EAAO6J,IARlB,IAA6CA,EAAOa,EAClFoC,EAMA9M,GAkCElH,SAAU,WACR,OA9EkB,SAA+ByS,EAAM1B,EAAOa,EAAYtE,GAClF,IAAI2G,EAAkBP,GAAkC9B,GACpDsC,EAAiBxC,GAAaX,GAClC,OAAOkD,EAAkB,IAAMxB,EAAN,6BAAqDwB,EAAkB,IAAM7G,EAAwB8G,EAAgB5G,GAAU,KAAOmF,EAAO,IAAM,IAAMA,EAAN,6BAAqDrF,EAAwB8G,EAAgB5G,GAAU,KAAOmF,EAAO,IA2ElR0B,CAAsB1B,EAAMrI,EAAK2G,MAAO3G,EAAK4G,gBAAiB1D,KAI3E,KAAK7C,EACL,KAAKA,EACH,MAAO,CACLsJ,YAAa,WACX,OAAOH,GAAqCxJ,IAE9CpK,SAAU,WACR,OAAO0T,GAAkCtJ,KAI/C,QACE,MAAO,CACL2J,YAAa,WACX,OAjDyB,SAAsCtB,EAAMrI,GAC7E,OAAOA,EAAKpD,KAAI,SAAUkD,EAAKrP,GAC7B,IAAIuZ,EAEAC,IAAaD,EAAa,CAC5BrO,IAAKlL,IACOoR,IAAoB,EAAMmI,GAaxC,OAZAlP,OAAOZ,KAAK4F,GAAK7G,SAAQ,SAAU+O,GACjC,IAAIkC,EAAkBhJ,EAAc8G,IAAcA,EAElD,GAAIkC,IAAoBjJ,GAA6BiJ,IAAoBjJ,EAAyB,CAChG,IAAIkJ,EAAUrK,EAAI+I,WAAa/I,EAAIiJ,QACnCkB,EAAUG,wBAA0B,CAClCC,OAAQF,QAGVF,EAAUC,GAAmBpK,EAAIkI,MAG9B,gBAAoBK,EAAM4B,MA8BpBK,CAA6BjC,EAAMrI,IAE5CpK,SAAU,WACR,OA7FiB,SAA8ByS,EAAMrI,EAAMkD,GACnE,OAAOlD,EAAKtB,QAAO,SAAUuE,EAAKnD,GAChC,IAAIyK,EAAgBzP,OAAOZ,KAAK4F,GAAKvB,QAAO,SAAUyJ,GACpD,QAASA,IAAc/G,GAA6B+G,IAAc/G,MACjEvC,QAAO,SAAU8L,EAAQxC,GAC1B,IAAIuB,OAAiC,IAAnBzJ,EAAIkI,GAA6BA,EAAYA,EAAY,KAAQhF,EAAwBlD,EAAIkI,GAAY9E,GAAU,IACrI,OAAOsH,EAASA,EAAS,IAAMjB,EAAOA,IACrC,IACCkB,EAAa3K,EAAI+I,WAAa/I,EAAIiJ,SAAW,GAC7C2B,GAAqD,IAArC9I,EAAkB7D,QAAQsK,GAC9C,OAAOpF,EAAM,IAAMoF,EAAZpF,6BAA2DsH,GAAiBG,EAAgB,KAAO,IAAMD,EAAa,KAAOpC,EAAO,OAC1I,IAkFYsC,CAAqBtC,EAAMrI,EAAMkD,OAM9C5G,GAAmB,SAA0BsO,GAC/C,IAAI1E,EAAU0E,EAAK1E,QACfC,EAAiByE,EAAKzE,eACtBjD,EAAS0H,EAAK1H,OACdkD,EAAiBwE,EAAKxE,eACtBC,EAAWuE,EAAKvE,SAChBC,EAAWsE,EAAKtE,SAChBC,EAAeqE,EAAKrE,aACpBE,EAAamE,EAAKnE,WAClBC,EAAYkE,EAAKlE,UACjBmE,EAAaD,EAAKjE,MAClBA,OAAuBnJ,IAAfqN,EAA2B,GAAKA,EACxCjE,EAAkBgE,EAAKhE,gBAC3B,MAAO,CACLkE,KAAMpB,GAAiBpJ,EAAUC,KAAM2F,EAAShD,GAChDiD,eAAgBuD,GAAiBrJ,EAAsB8F,EAAgBjD,GACvEkD,eAAgBsD,GAAiBrJ,EAAsB+F,EAAgBlD,GACvE6H,KAAMrB,GAAiBpJ,EAAUK,KAAM0F,EAAUnD,GACjD8H,KAAMtB,GAAiBpJ,EAAUM,KAAM0F,EAAUpD,GACjD+H,SAAUvB,GAAiBpJ,EAAUO,SAAU0F,EAAcrD,GAC7DgI,OAAQxB,GAAiBpJ,EAAUQ,OAAQ2F,EAAYvD,GACvDiI,MAAOzB,GAAiBpJ,EAAUS,MAAO2F,EAAWxD,GACpDyD,MAAO+C,GAAiBpJ,EAAUU,MAAO,CACvC2F,MAAOA,EACPC,gBAAiBA,GAChB1D,KAoPHkI,GAAoB,KAllBC,SAA4BhI,GACnD,MAAO,CACL8C,QAASpC,EAAwB,CAAC7C,EAAqBA,GAAwBmC,GAC/E+C,eAAgBzC,EAA2BrD,EAAsB+C,GACjEiI,MAAO/H,EAAqBF,EAAW1B,GACvCwB,OAAQI,EAAqBF,EAAW1B,GACxC0E,eAAgB1C,EAA2BrD,EAAsB+C,GACjEiD,SAAUjC,EAAqB9D,EAAUK,KAAM,CAACM,EAAoBA,GAAsBmC,GAC1FkD,SAAUlC,EAAqB9D,EAAUM,KAAM,CAACK,EAAqBA,EAAwBA,EAA0BA,EAAyBA,GAA2BmC,GAC3KmD,aAAcnC,EAAqB9D,EAAUO,SAAU,CAACI,GAA4BmC,GACpFoD,oBAAqB/C,EAAuBL,GAC5CqD,WAAYrC,EAAqB9D,EAAUQ,OAAQ,CAACG,EAAoBA,GAA4BmC,GACpGsD,UAAWtC,EAAqB9D,EAAUS,MAAO,CAACE,GAA0BmC,GAC5EuD,MAAOxD,EAAsBC,GAC7BwD,gBAAiBlD,EAA2BrD,EAAuB+C,OAiCzC,SAAiC4C,GACzDF,IACFJ,GAAqBI,IAGnBE,EAASqF,MACXvF,GAAkBR,IAAsB,WACtCS,GAAiBC,GAAU,WACzBF,GAAkB,YAItBC,GAAiBC,GACjBF,GAAkB,QAshB8DxJ,GAA5D,EAJJ,WAClB,OAAO,QAILgP,IAjPyBpL,EAiPHkL,GA9OjBhL,EAAQD,EAAS,SAAUoL,GAGhC,SAASC,IAEP,OADAvJ,EAAelO,KAAMyX,GACd3I,EAA0B9O,KAAMwX,EAAiB/U,MAAMzC,KAAMT,YAuLtE,OAttBW,SAAU2J,EAAUC,GACjC,GAA0B,mBAAfA,GAA4C,OAAfA,EACtC,MAAM,IAAIiF,UAAU,kEAAoEjF,GAG1FD,EAAShJ,UAAY6G,OAAOqC,OAAOD,GAAcA,EAAWjJ,UAAW,CACrEgG,YAAa,CACXS,MAAOuC,EACPpB,YAAY,EACZE,UAAU,EACVD,cAAc,KAGdoB,IAAYpC,OAAO2Q,eAAiB3Q,OAAO2Q,eAAexO,EAAUC,GAAcD,EAASG,UAAYF,GA8gBzGwO,CAASF,EAAeD,GAOxBC,EAAcvX,UAAU0X,sBAAwB,SAA+BC,GAC7E,OAAQ,IAAQ7X,KAAK+I,MAAO8O,IAG9BJ,EAAcvX,UAAU4X,yBAA2B,SAAkCC,EAAOC,GAC1F,IAAKA,EACH,OAAO,KAGT,OAAQD,EAAMzD,MACZ,KAAK/H,EAAUQ,OACf,KAAKR,EAAUO,SACb,MAAO,CACLgI,UAAWkD,GAGf,KAAKzL,EAAUS,MACb,MAAO,CACLgI,QAASgD,GAIf,MAAM,IAAIxP,MAAM,IAAMuP,EAAMzD,KAAO,uGAGrCmD,EAAcvX,UAAU+X,yBAA2B,SAAkCpB,GACnF,IAAIqB,EAEAH,EAAQlB,EAAKkB,MACbI,EAAoBtB,EAAKsB,kBACzBC,EAAgBvB,EAAKuB,cACrBJ,EAAiBnB,EAAKmB,eAC1B,OAAOrJ,EAAS,GAAIwJ,IAAoBD,EAAwB,IAA0BH,EAAMzD,MAAQ,GAAGlE,OAAO+H,EAAkBJ,EAAMzD,OAAS,GAAI,CAAC3F,EAAS,GAAIyJ,EAAepY,KAAK8X,yBAAyBC,EAAOC,MAAoBE,KAG/OT,EAAcvX,UAAUmY,sBAAwB,SAA+BC,GAC7E,IAAIC,EAAwBC,EAExBT,EAAQO,EAAMP,MACdU,EAAWH,EAAMG,SACjBL,EAAgBE,EAAMF,cACtBJ,EAAiBM,EAAMN,eAE3B,OAAQD,EAAMzD,MACZ,KAAK/H,EAAUU,MACb,OAAO0B,EAAS,GAAI8J,IAAWF,EAAyB,IAA2BR,EAAMzD,MAAQ0D,EAAgBO,EAAuB1F,gBAAkBlE,EAAS,GAAIyJ,GAAgBG,IAEzL,KAAKhM,EAAUE,KACb,OAAOkC,EAAS,GAAI8J,EAAU,CAC5BrG,eAAgBzD,EAAS,GAAIyJ,KAGjC,KAAK7L,EAAUI,KACb,OAAOgC,EAAS,GAAI8J,EAAU,CAC5BpG,eAAgB1D,EAAS,GAAIyJ,KAInC,OAAOzJ,EAAS,GAAI8J,IAAWD,EAAyB,IAA2BT,EAAMzD,MAAQ3F,EAAS,GAAIyJ,GAAgBI,KAGhIf,EAAcvX,UAAUwY,4BAA8B,SAAqCP,EAAmBM,GAC5G,IAAIE,EAAoBhK,EAAS,GAAI8J,GAOrC,OALA1R,OAAOZ,KAAKgS,GAAmBjT,SAAQ,SAAU0T,GAC/C,IAAIC,EAEJF,EAAoBhK,EAAS,GAAIgK,IAAoBE,EAAyB,IAA2BD,GAAkBT,EAAkBS,GAAiBC,OAEzJF,GAGTlB,EAAcvX,UAAU4Y,sBAAwB,SAA+Bf,EAAOC,GAmBpF,OAAO,GAGTP,EAAcvX,UAAU6Y,mBAAqB,SAA4BC,EAAUP,GACjF,IAAIQ,EAASjZ,KAETmY,EAAoB,GAsCxB,OArCA,mBAAuBa,GAAU,SAAUjB,GACzC,GAAKA,GAAUA,EAAMhP,MAArB,CAIA,IAAImQ,EAAenB,EAAMhP,MACrBiP,EAAiBkB,EAAaF,SAE9BZ,EA/N4B,SAA2CrP,GACjF,IAAIoQ,EAAiB5Z,UAAU1B,OAAS,QAAsB4L,IAAjBlK,UAAU,GAAmBA,UAAU,GAAK,GACzF,OAAOwH,OAAOZ,KAAK4C,GAAO4B,QAAO,SAAUhD,EAAKC,GAE9C,OADAD,EAAIiG,EAAahG,IAAQA,GAAOmB,EAAMnB,GAC/BD,IACNwR,GA0NuBC,CADHvK,EAAwBqK,EAAc,CAAC,cAKxD,OAFAD,EAAOH,sBAAsBf,EAAOC,GAE5BD,EAAMzD,MACZ,KAAK/H,EAAUK,KACf,KAAKL,EAAUM,KACf,KAAKN,EAAUO,SACf,KAAKP,EAAUQ,OACf,KAAKR,EAAUS,MACbmL,EAAoBc,EAAOhB,yBAAyB,CAClDF,MAAOA,EACPI,kBAAmBA,EACnBC,cAAeA,EACfJ,eAAgBA,IAElB,MAEF,QACES,EAAWQ,EAAOZ,sBAAsB,CACtCN,MAAOA,EACPU,SAAUA,EACVL,cAAeA,EACfJ,eAAgBA,SAKxBS,EAAWzY,KAAK0Y,4BAA4BP,EAAmBM,IAIjEhB,EAAcvX,UAAUgK,OAAS,WAC/B,IAAImP,EAASrZ,KAAK+I,MACdiQ,EAAWK,EAAOL,SAClBjQ,EAAQ8F,EAAwBwK,EAAQ,CAAC,aAEzCZ,EAAW9J,EAAS,GAAI5F,GAM5B,OAJIiQ,IACFP,EAAWzY,KAAK+Y,mBAAmBC,EAAUP,IAGxC,gBAAoBtM,EAAWsM,IAGxCpK,EAAYoJ,EAAe,KAAM,CAAC,CAChC7P,IAAK,YAuBLxF,IAAK,SAAgB6F,GACnBkE,EAAUlE,UAAYA,MAGnBwP,EA5Le,CA6LtB,aAAkBrL,EAAOkN,UAAY,CACrCvC,KAAM,WACN3E,eAAgB,WAChB4G,SAAU,cAAoB,CAAC,YAAkB,UAAiB,WAClEO,aAAc,WACdjC,MAAO,SACPrI,wBAAyB,SACzBoD,eAAgB,WAChB2E,KAAM,YAAkB,YACxBC,KAAM,YAAkB,YACxBC,SAAU,YAAkB,YAC5BzE,oBAAqB,SACrB0E,OAAQ,YAAkB,YAC1BC,MAAO,YAAkB,YACzBxE,MAAO,WACPC,gBAAiB,WACjB2G,cAAe,YACdpN,EAAOqN,aAAe,CACvBnC,OAAO,EACPrI,yBAAyB,GACxB7C,EAAO9C,KAAO6C,EAAU7C,KAAM8C,EAAO7C,OAAS,WAC/C,IAAImQ,EAAcvN,EAAU5C,SAmB5B,OAjBKmQ,IAEHA,EAAcnR,GAAiB,CAC7B4J,QAAS,GACTC,eAAgB,GAChBnD,yBAAyB,EACzBoD,eAAgB,GAChBC,SAAU,GACVC,SAAU,GACVC,aAAc,GACdE,WAAY,GACZC,UAAW,GACXC,MAAO,GACPC,gBAAiB,MAId6G,GACNrN,GASLkL,GAAaoC,aAAepC,GAAahO,OACzC,I,WC92BO,MAAMqQ,GAAM,IAA+C,IAA9C,YAAEC,EAAF,KAAe5C,EAAO,GAAtB,MAA0BrE,GAAmB,EAC/D,MAAM,KAAEkH,IAASC,EAAAA,GAAAA,gBAAc,cAazBC,EAAkBH,GAAeC,EAAKG,aAAaJ,YACzD,OACE,gBAAC,GAAD,CACExH,eAAgB,CACd6H,KAAM,MAERtH,MAAOA,EACP2G,aAAcO,EAAKG,aAAarH,MAChC4G,cAAa,QAAUM,EAAKG,aAAarH,MACzCqE,KAAM,CACJ,CACE1Z,KAAK,cACL6Y,QAAS4D,GAEX,CACElJ,SAAS,WACTsF,QAASxD,GAEX,CACE9B,SAAS,iBACTsF,QAAS4D,GAEX,CACElJ,SAAS,UACTsF,QAAQ,YAEVhG,OAAO6G,IAET,wBAAMkD,IAAI,aAAaC,KAAK,iCAC5B,wBAAMD,IAAI,aAAaC,KAAK,4BAA4BC,YAAY,KACpE,wBAAMD,KAAK,2FAA2FD,IAAI,iB,eC3CzG,MAAMG,GAAS,IAAkD,IAAjD,MAAE1H,EAAF,QAAS2H,EAAT,OAAkBC,EAAlB,SAA0BxB,GAAsB,EACrE,OACE,gCACE,gBAACY,GAAD,CAAKhH,MAAOA,IACZ,uBAAK6H,WAAWnQ,EAAAA,GAAAA,ICVF,+BDUqBiQ,GCTpB,gCDS+CC,GCRhD,iCDQ2ExB","sources":["webpack://didcomm-website/./node_modules/dayjs/dayjs.min.js","webpack://didcomm-website/./node_modules/react-fast-compare/index.js","webpack://didcomm-website/./node_modules/react-side-effect/lib/index.js","webpack://didcomm-website/./src/common/utils.ts","webpack://didcomm-website/./node_modules/react-helmet/es/Helmet.js","webpack://didcomm-website/./src/components/Seo/Seo.tsx","webpack://didcomm-website/./src/components/Layout/Layout.tsx","webpack://didcomm-website/./src/components/Layout/Layout.module.scss"],"sourcesContent":["!function (t, e) {\n \"object\" == typeof exports && \"undefined\" != typeof module ? module.exports = e() : \"function\" == typeof define && define.amd ? define(e) : (t = \"undefined\" != typeof globalThis ? globalThis : t || self).dayjs = e();\n}(this, function () {\n \"use strict\";\n\n var t = 1e3,\n e = 6e4,\n n = 36e5,\n r = \"millisecond\",\n i = \"second\",\n s = \"minute\",\n u = \"hour\",\n a = \"day\",\n o = \"week\",\n f = \"month\",\n h = \"quarter\",\n c = \"year\",\n d = \"date\",\n $ = \"Invalid Date\",\n l = /^(\\d{4})[-/]?(\\d{1,2})?[-/]?(\\d{0,2})[Tt\\s]*(\\d{1,2})?:?(\\d{1,2})?:?(\\d{1,2})?[.:]?(\\d+)?$/,\n y = /\\[([^\\]]+)]|Y{1,4}|M{1,4}|D{1,2}|d{1,4}|H{1,2}|h{1,2}|a|A|m{1,2}|s{1,2}|Z{1,2}|SSS/g,\n M = {\n name: \"en\",\n weekdays: \"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday\".split(\"_\"),\n months: \"January_February_March_April_May_June_July_August_September_October_November_December\".split(\"_\")\n },\n m = function (t, e, n) {\n var r = String(t);\n return !r || r.length >= e ? t : \"\" + Array(e + 1 - r.length).join(n) + t;\n },\n g = {\n s: m,\n z: function (t) {\n var e = -t.utcOffset(),\n n = Math.abs(e),\n r = Math.floor(n / 60),\n i = n % 60;\n return (e <= 0 ? \"+\" : \"-\") + m(r, 2, \"0\") + \":\" + m(i, 2, \"0\");\n },\n m: function t(e, n) {\n if (e.date() < n.date()) return -t(n, e);\n var r = 12 * (n.year() - e.year()) + (n.month() - e.month()),\n i = e.clone().add(r, f),\n s = n - i < 0,\n u = e.clone().add(r + (s ? -1 : 1), f);\n return +(-(r + (n - i) / (s ? i - u : u - i)) || 0);\n },\n a: function (t) {\n return t < 0 ? Math.ceil(t) || 0 : Math.floor(t);\n },\n p: function (t) {\n return {\n M: f,\n y: c,\n w: o,\n d: a,\n D: d,\n h: u,\n m: s,\n s: i,\n ms: r,\n Q: h\n }[t] || String(t || \"\").toLowerCase().replace(/s$/, \"\");\n },\n u: function (t) {\n return void 0 === t;\n }\n },\n D = \"en\",\n v = {};\n\n v[D] = M;\n\n var p = function (t) {\n return t instanceof _;\n },\n S = function (t, e, n) {\n var r;\n if (!t) return D;\n if (\"string\" == typeof t) v[t] && (r = t), e && (v[t] = e, r = t);else {\n var i = t.name;\n v[i] = t, r = i;\n }\n return !n && r && (D = r), r || !n && D;\n },\n w = function (t, e) {\n if (p(t)) return t.clone();\n var n = \"object\" == typeof e ? e : {};\n return n.date = t, n.args = arguments, new _(n);\n },\n O = g;\n\n O.l = S, O.i = p, O.w = function (t, e) {\n return w(t, {\n locale: e.$L,\n utc: e.$u,\n x: e.$x,\n $offset: e.$offset\n });\n };\n\n var _ = function () {\n function M(t) {\n this.$L = S(t.locale, null, !0), this.parse(t);\n }\n\n var m = M.prototype;\n return m.parse = function (t) {\n this.$d = function (t) {\n var e = t.date,\n n = t.utc;\n if (null === e) return new Date(NaN);\n if (O.u(e)) return new Date();\n if (e instanceof Date) return new Date(e);\n\n if (\"string\" == typeof e && !/Z$/i.test(e)) {\n var r = e.match(l);\n\n if (r) {\n var i = r[2] - 1 || 0,\n s = (r[7] || \"0\").substring(0, 3);\n return n ? new Date(Date.UTC(r[1], i, r[3] || 1, r[4] || 0, r[5] || 0, r[6] || 0, s)) : new Date(r[1], i, r[3] || 1, r[4] || 0, r[5] || 0, r[6] || 0, s);\n }\n }\n\n return new Date(e);\n }(t), this.$x = t.x || {}, this.init();\n }, m.init = function () {\n var t = this.$d;\n this.$y = t.getFullYear(), this.$M = t.getMonth(), this.$D = t.getDate(), this.$W = t.getDay(), this.$H = t.getHours(), this.$m = t.getMinutes(), this.$s = t.getSeconds(), this.$ms = t.getMilliseconds();\n }, m.$utils = function () {\n return O;\n }, m.isValid = function () {\n return !(this.$d.toString() === $);\n }, m.isSame = function (t, e) {\n var n = w(t);\n return this.startOf(e) <= n && n <= this.endOf(e);\n }, m.isAfter = function (t, e) {\n return w(t) < this.startOf(e);\n }, m.isBefore = function (t, e) {\n return this.endOf(e) < w(t);\n }, m.$g = function (t, e, n) {\n return O.u(t) ? this[e] : this.set(n, t);\n }, m.unix = function () {\n return Math.floor(this.valueOf() / 1e3);\n }, m.valueOf = function () {\n return this.$d.getTime();\n }, m.startOf = function (t, e) {\n var n = this,\n r = !!O.u(e) || e,\n h = O.p(t),\n $ = function (t, e) {\n var i = O.w(n.$u ? Date.UTC(n.$y, e, t) : new Date(n.$y, e, t), n);\n return r ? i : i.endOf(a);\n },\n l = function (t, e) {\n return O.w(n.toDate()[t].apply(n.toDate(\"s\"), (r ? [0, 0, 0, 0] : [23, 59, 59, 999]).slice(e)), n);\n },\n y = this.$W,\n M = this.$M,\n m = this.$D,\n g = \"set\" + (this.$u ? \"UTC\" : \"\");\n\n switch (h) {\n case c:\n return r ? $(1, 0) : $(31, 11);\n\n case f:\n return r ? $(1, M) : $(0, M + 1);\n\n case o:\n var D = this.$locale().weekStart || 0,\n v = (y < D ? y + 7 : y) - D;\n return $(r ? m - v : m + (6 - v), M);\n\n case a:\n case d:\n return l(g + \"Hours\", 0);\n\n case u:\n return l(g + \"Minutes\", 1);\n\n case s:\n return l(g + \"Seconds\", 2);\n\n case i:\n return l(g + \"Milliseconds\", 3);\n\n default:\n return this.clone();\n }\n }, m.endOf = function (t) {\n return this.startOf(t, !1);\n }, m.$set = function (t, e) {\n var n,\n o = O.p(t),\n h = \"set\" + (this.$u ? \"UTC\" : \"\"),\n $ = (n = {}, n[a] = h + \"Date\", n[d] = h + \"Date\", n[f] = h + \"Month\", n[c] = h + \"FullYear\", n[u] = h + \"Hours\", n[s] = h + \"Minutes\", n[i] = h + \"Seconds\", n[r] = h + \"Milliseconds\", n)[o],\n l = o === a ? this.$D + (e - this.$W) : e;\n\n if (o === f || o === c) {\n var y = this.clone().set(d, 1);\n y.$d[$](l), y.init(), this.$d = y.set(d, Math.min(this.$D, y.daysInMonth())).$d;\n } else $ && this.$d[$](l);\n\n return this.init(), this;\n }, m.set = function (t, e) {\n return this.clone().$set(t, e);\n }, m.get = function (t) {\n return this[O.p(t)]();\n }, m.add = function (r, h) {\n var d,\n $ = this;\n r = Number(r);\n\n var l = O.p(h),\n y = function (t) {\n var e = w($);\n return O.w(e.date(e.date() + Math.round(t * r)), $);\n };\n\n if (l === f) return this.set(f, this.$M + r);\n if (l === c) return this.set(c, this.$y + r);\n if (l === a) return y(1);\n if (l === o) return y(7);\n var M = (d = {}, d[s] = e, d[u] = n, d[i] = t, d)[l] || 1,\n m = this.$d.getTime() + r * M;\n return O.w(m, this);\n }, m.subtract = function (t, e) {\n return this.add(-1 * t, e);\n }, m.format = function (t) {\n var e = this,\n n = this.$locale();\n if (!this.isValid()) return n.invalidDate || $;\n\n var r = t || \"YYYY-MM-DDTHH:mm:ssZ\",\n i = O.z(this),\n s = this.$H,\n u = this.$m,\n a = this.$M,\n o = n.weekdays,\n f = n.months,\n h = function (t, n, i, s) {\n return t && (t[n] || t(e, r)) || i[n].substr(0, s);\n },\n c = function (t) {\n return O.s(s % 12 || 12, t, \"0\");\n },\n d = n.meridiem || function (t, e, n) {\n var r = t < 12 ? \"AM\" : \"PM\";\n return n ? r.toLowerCase() : r;\n },\n l = {\n YY: String(this.$y).slice(-2),\n YYYY: this.$y,\n M: a + 1,\n MM: O.s(a + 1, 2, \"0\"),\n MMM: h(n.monthsShort, a, f, 3),\n MMMM: h(f, a),\n D: this.$D,\n DD: O.s(this.$D, 2, \"0\"),\n d: String(this.$W),\n dd: h(n.weekdaysMin, this.$W, o, 2),\n ddd: h(n.weekdaysShort, this.$W, o, 3),\n dddd: o[this.$W],\n H: String(s),\n HH: O.s(s, 2, \"0\"),\n h: c(1),\n hh: c(2),\n a: d(s, u, !0),\n A: d(s, u, !1),\n m: String(u),\n mm: O.s(u, 2, \"0\"),\n s: String(this.$s),\n ss: O.s(this.$s, 2, \"0\"),\n SSS: O.s(this.$ms, 3, \"0\"),\n Z: i\n };\n\n return r.replace(y, function (t, e) {\n return e || l[t] || i.replace(\":\", \"\");\n });\n }, m.utcOffset = function () {\n return 15 * -Math.round(this.$d.getTimezoneOffset() / 15);\n }, m.diff = function (r, d, $) {\n var l,\n y = O.p(d),\n M = w(r),\n m = (M.utcOffset() - this.utcOffset()) * e,\n g = this - M,\n D = O.m(this, M);\n return D = (l = {}, l[c] = D / 12, l[f] = D, l[h] = D / 3, l[o] = (g - m) / 6048e5, l[a] = (g - m) / 864e5, l[u] = g / n, l[s] = g / e, l[i] = g / t, l)[y] || g, $ ? D : O.a(D);\n }, m.daysInMonth = function () {\n return this.endOf(f).$D;\n }, m.$locale = function () {\n return v[this.$L];\n }, m.locale = function (t, e) {\n if (!t) return this.$L;\n var n = this.clone(),\n r = S(t, e, !0);\n return r && (n.$L = r), n;\n }, m.clone = function () {\n return O.w(this.$d, this);\n }, m.toDate = function () {\n return new Date(this.valueOf());\n }, m.toJSON = function () {\n return this.isValid() ? this.toISOString() : null;\n }, m.toISOString = function () {\n return this.$d.toISOString();\n }, m.toString = function () {\n return this.$d.toUTCString();\n }, M;\n }(),\n b = _.prototype;\n\n return w.prototype = b, [[\"$ms\", r], [\"$s\", i], [\"$m\", s], [\"$H\", u], [\"$W\", a], [\"$M\", f], [\"$y\", c], [\"$D\", d]].forEach(function (t) {\n b[t[1]] = function (e) {\n return this.$g(e, t[0], t[1]);\n };\n }), w.extend = function (t, e) {\n return t.$i || (t(e, _, w), t.$i = !0), w;\n }, w.locale = S, w.isDayjs = p, w.unix = function (t) {\n return w(1e3 * t);\n }, w.en = v[D], w.Ls = v, w.p = {}, w;\n});","/* global Map:readonly, Set:readonly, ArrayBuffer:readonly */\nvar hasElementType = typeof Element !== 'undefined';\nvar hasMap = typeof Map === 'function';\nvar hasSet = typeof Set === 'function';\nvar hasArrayBuffer = typeof ArrayBuffer === 'function' && !!ArrayBuffer.isView; // Note: We **don't** need `envHasBigInt64Array` in fde es6/index.js\n\nfunction equal(a, b) {\n // START: fast-deep-equal es6/index.js 3.1.1\n if (a === b) return true;\n\n if (a && b && typeof a == 'object' && typeof b == 'object') {\n if (a.constructor !== b.constructor) return false;\n var length, i, keys;\n\n if (Array.isArray(a)) {\n length = a.length;\n if (length != b.length) return false;\n\n for (i = length; i-- !== 0;) if (!equal(a[i], b[i])) return false;\n\n return true;\n } // START: Modifications:\n // 1. Extra `has &&` helpers in initial condition allow es6 code\n // to co-exist with es5.\n // 2. Replace `for of` with es5 compliant iteration using `for`.\n // Basically, take:\n //\n // ```js\n // for (i of a.entries())\n // if (!b.has(i[0])) return false;\n // ```\n //\n // ... and convert to:\n //\n // ```js\n // it = a.entries();\n // while (!(i = it.next()).done)\n // if (!b.has(i.value[0])) return false;\n // ```\n //\n // **Note**: `i` access switches to `i.value`.\n\n\n var it;\n\n if (hasMap && a instanceof Map && b instanceof Map) {\n if (a.size !== b.size) return false;\n it = a.entries();\n\n while (!(i = it.next()).done) if (!b.has(i.value[0])) return false;\n\n it = a.entries();\n\n while (!(i = it.next()).done) if (!equal(i.value[1], b.get(i.value[0]))) return false;\n\n return true;\n }\n\n if (hasSet && a instanceof Set && b instanceof Set) {\n if (a.size !== b.size) return false;\n it = a.entries();\n\n while (!(i = it.next()).done) if (!b.has(i.value[0])) return false;\n\n return true;\n } // END: Modifications\n\n\n if (hasArrayBuffer && ArrayBuffer.isView(a) && ArrayBuffer.isView(b)) {\n length = a.length;\n if (length != b.length) return false;\n\n for (i = length; i-- !== 0;) if (a[i] !== b[i]) return false;\n\n return true;\n }\n\n if (a.constructor === RegExp) return a.source === b.source && a.flags === b.flags;\n if (a.valueOf !== Object.prototype.valueOf) return a.valueOf() === b.valueOf();\n if (a.toString !== Object.prototype.toString) return a.toString() === b.toString();\n keys = Object.keys(a);\n length = keys.length;\n if (length !== Object.keys(b).length) return false;\n\n for (i = length; i-- !== 0;) if (!Object.prototype.hasOwnProperty.call(b, keys[i])) return false; // END: fast-deep-equal\n // START: react-fast-compare\n // custom handling for DOM elements\n\n\n if (hasElementType && a instanceof Element) return false; // custom handling for React/Preact\n\n for (i = length; i-- !== 0;) {\n if ((keys[i] === '_owner' || keys[i] === '__v' || keys[i] === '__o') && a.$$typeof) {\n // React-specific: avoid traversing React elements' _owner\n // Preact-specific: avoid traversing Preact elements' __v and __o\n // __v = $_original / $_vnode\n // __o = $_owner\n // These properties contain circular references and are not needed when\n // comparing the actual elements (and not their owners)\n // .$$typeof and ._store on just reasonable markers of elements\n continue;\n } // all other properties should be traversed as usual\n\n\n if (!equal(a[keys[i]], b[keys[i]])) return false;\n } // END: react-fast-compare\n // START: fast-deep-equal\n\n\n return true;\n }\n\n return a !== a && b !== b;\n} // end fast-deep-equal\n\n\nmodule.exports = function isEqual(a, b) {\n try {\n return equal(a, b);\n } catch (error) {\n if ((error.message || '').match(/stack|recursion/i)) {\n // warn on circular references, don't crash\n // browsers give this different errors name and messages:\n // chrome/safari: \"RangeError\", \"Maximum call stack size exceeded\"\n // firefox: \"InternalError\", too much recursion\"\n // edge: \"Error\", \"Out of stack space\"\n console.warn('react-fast-compare cannot handle circular refs');\n return false;\n } // some other error. we should definitely know about these\n\n\n throw error;\n }\n};","'use strict';\n\nfunction _interopDefault(ex) {\n return ex && typeof ex === 'object' && 'default' in ex ? ex['default'] : ex;\n}\n\nvar React = require('react');\n\nvar React__default = _interopDefault(React);\n\nfunction _defineProperty(obj, key, value) {\n if (key in obj) {\n Object.defineProperty(obj, key, {\n value: value,\n enumerable: true,\n configurable: true,\n writable: true\n });\n } else {\n obj[key] = value;\n }\n\n return obj;\n}\n\nfunction _inheritsLoose(subClass, superClass) {\n subClass.prototype = Object.create(superClass.prototype);\n subClass.prototype.constructor = subClass;\n subClass.__proto__ = superClass;\n}\n\nvar canUseDOM = !!(typeof window !== 'undefined' && window.document && window.document.createElement);\n\nfunction withSideEffect(reducePropsToState, handleStateChangeOnClient, mapStateOnServer) {\n if (typeof reducePropsToState !== 'function') {\n throw new Error('Expected reducePropsToState to be a function.');\n }\n\n if (typeof handleStateChangeOnClient !== 'function') {\n throw new Error('Expected handleStateChangeOnClient to be a function.');\n }\n\n if (typeof mapStateOnServer !== 'undefined' && typeof mapStateOnServer !== 'function') {\n throw new Error('Expected mapStateOnServer to either be undefined or a function.');\n }\n\n function getDisplayName(WrappedComponent) {\n return WrappedComponent.displayName || WrappedComponent.name || 'Component';\n }\n\n return function wrap(WrappedComponent) {\n if (typeof WrappedComponent !== 'function') {\n throw new Error('Expected WrappedComponent to be a React component.');\n }\n\n var mountedInstances = [];\n var state;\n\n function emitChange() {\n state = reducePropsToState(mountedInstances.map(function (instance) {\n return instance.props;\n }));\n\n if (SideEffect.canUseDOM) {\n handleStateChangeOnClient(state);\n } else if (mapStateOnServer) {\n state = mapStateOnServer(state);\n }\n }\n\n var SideEffect = /*#__PURE__*/function (_PureComponent) {\n _inheritsLoose(SideEffect, _PureComponent);\n\n function SideEffect() {\n return _PureComponent.apply(this, arguments) || this;\n } // Try to use displayName of wrapped component\n // Expose canUseDOM so tests can monkeypatch it\n\n\n SideEffect.peek = function peek() {\n return state;\n };\n\n SideEffect.rewind = function rewind() {\n if (SideEffect.canUseDOM) {\n throw new Error('You may only call rewind() on the server. Call peek() to read the current state.');\n }\n\n var recordedState = state;\n state = undefined;\n mountedInstances = [];\n return recordedState;\n };\n\n var _proto = SideEffect.prototype;\n\n _proto.UNSAFE_componentWillMount = function UNSAFE_componentWillMount() {\n mountedInstances.push(this);\n emitChange();\n };\n\n _proto.componentDidUpdate = function componentDidUpdate() {\n emitChange();\n };\n\n _proto.componentWillUnmount = function componentWillUnmount() {\n var index = mountedInstances.indexOf(this);\n mountedInstances.splice(index, 1);\n emitChange();\n };\n\n _proto.render = function render() {\n return /*#__PURE__*/React__default.createElement(WrappedComponent, this.props);\n };\n\n return SideEffect;\n }(React.PureComponent);\n\n _defineProperty(SideEffect, \"displayName\", \"SideEffect(\" + getDisplayName(WrappedComponent) + \")\");\n\n _defineProperty(SideEffect, \"canUseDOM\", canUseDOM);\n\n return SideEffect;\n };\n}\n\nmodule.exports = withSideEffect;","import { Filters, Protocol } from './types'\nimport dayjs from 'dayjs'\n\nexport const cls = (...classes: Array): string => {\n return classes.filter(Boolean).join(' ') || undefined\n}\n\nexport const objectFromEntries = (entries: Array<[T2, T]>): Record => {\n return entries.reduce((res, cur) => {\n res[cur[0]] = cur[1]\n return res\n }, {} as Record)\n}\n\nexport enum formatDateUnit {\n year = 'Last year',\n month = 'Last month',\n week = 'Last week',\n day = 'Last 24 hours',\n}\n\nexport const noScroll = (on: boolean) => (on ? document.body.classList.add('no-scroll') : document.body.classList.remove('no-scroll'))\n\nexport const applyFilters = (protocols: Array, filters: Filters) =>\n protocols.filter((protocol: Protocol) => {\n let pass = true\n\n if (filters.status.length !== 0) {\n pass = filters.status.includes(protocol.status)\n }\n\n if (pass && filters.license.length !== 0) {\n pass = filters.license.includes(protocol.license)\n }\n\n if (pass && filters.dateUnit) {\n pass = dayjs().subtract(1, filters.dateUnit).isBefore(protocol.modifiedDate)\n }\n\n if (pass && filters.tag.length !== 0) {\n pass = filters.tag.some((t) => protocol.tags.includes(t))\n }\n\n return pass\n })\n","import PropTypes from 'prop-types';\nimport withSideEffect from 'react-side-effect';\nimport isEqual from 'react-fast-compare';\nimport React from 'react';\nimport objectAssign from 'object-assign';\nvar ATTRIBUTE_NAMES = {\n BODY: \"bodyAttributes\",\n HTML: \"htmlAttributes\",\n TITLE: \"titleAttributes\"\n};\nvar TAG_NAMES = {\n BASE: \"base\",\n BODY: \"body\",\n HEAD: \"head\",\n HTML: \"html\",\n LINK: \"link\",\n META: \"meta\",\n NOSCRIPT: \"noscript\",\n SCRIPT: \"script\",\n STYLE: \"style\",\n TITLE: \"title\"\n};\nvar VALID_TAG_NAMES = Object.keys(TAG_NAMES).map(function (name) {\n return TAG_NAMES[name];\n});\nvar TAG_PROPERTIES = {\n CHARSET: \"charset\",\n CSS_TEXT: \"cssText\",\n HREF: \"href\",\n HTTPEQUIV: \"http-equiv\",\n INNER_HTML: \"innerHTML\",\n ITEM_PROP: \"itemprop\",\n NAME: \"name\",\n PROPERTY: \"property\",\n REL: \"rel\",\n SRC: \"src\",\n TARGET: \"target\"\n};\nvar REACT_TAG_MAP = {\n accesskey: \"accessKey\",\n charset: \"charSet\",\n class: \"className\",\n contenteditable: \"contentEditable\",\n contextmenu: \"contextMenu\",\n \"http-equiv\": \"httpEquiv\",\n itemprop: \"itemProp\",\n tabindex: \"tabIndex\"\n};\nvar HELMET_PROPS = {\n DEFAULT_TITLE: \"defaultTitle\",\n DEFER: \"defer\",\n ENCODE_SPECIAL_CHARACTERS: \"encodeSpecialCharacters\",\n ON_CHANGE_CLIENT_STATE: \"onChangeClientState\",\n TITLE_TEMPLATE: \"titleTemplate\"\n};\nvar HTML_TAG_MAP = Object.keys(REACT_TAG_MAP).reduce(function (obj, key) {\n obj[REACT_TAG_MAP[key]] = key;\n return obj;\n}, {});\nvar SELF_CLOSING_TAGS = [TAG_NAMES.NOSCRIPT, TAG_NAMES.SCRIPT, TAG_NAMES.STYLE];\nvar HELMET_ATTRIBUTE = \"data-react-helmet\";\n\nvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) {\n return typeof obj;\n} : function (obj) {\n return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj;\n};\n\nvar classCallCheck = function (instance, Constructor) {\n if (!(instance instanceof Constructor)) {\n throw new TypeError(\"Cannot call a class as a function\");\n }\n};\n\nvar createClass = function () {\n function defineProperties(target, props) {\n for (var i = 0; i < props.length; i++) {\n var descriptor = props[i];\n descriptor.enumerable = descriptor.enumerable || false;\n descriptor.configurable = true;\n if (\"value\" in descriptor) descriptor.writable = true;\n Object.defineProperty(target, descriptor.key, descriptor);\n }\n }\n\n return function (Constructor, protoProps, staticProps) {\n if (protoProps) defineProperties(Constructor.prototype, protoProps);\n if (staticProps) defineProperties(Constructor, staticProps);\n return Constructor;\n };\n}();\n\nvar _extends = Object.assign || function (target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = arguments[i];\n\n for (var key in source) {\n if (Object.prototype.hasOwnProperty.call(source, key)) {\n target[key] = source[key];\n }\n }\n }\n\n return target;\n};\n\nvar inherits = function (subClass, superClass) {\n if (typeof superClass !== \"function\" && superClass !== null) {\n throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass);\n }\n\n subClass.prototype = Object.create(superClass && superClass.prototype, {\n constructor: {\n value: subClass,\n enumerable: false,\n writable: true,\n configurable: true\n }\n });\n if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass;\n};\n\nvar objectWithoutProperties = function (obj, keys) {\n var target = {};\n\n for (var i in obj) {\n if (keys.indexOf(i) >= 0) continue;\n if (!Object.prototype.hasOwnProperty.call(obj, i)) continue;\n target[i] = obj[i];\n }\n\n return target;\n};\n\nvar possibleConstructorReturn = function (self, call) {\n if (!self) {\n throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");\n }\n\n return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self;\n};\n\nvar encodeSpecialCharacters = function encodeSpecialCharacters(str) {\n var encode = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;\n\n if (encode === false) {\n return String(str);\n }\n\n return String(str).replace(/&/g, \"&\").replace(//g, \">\").replace(/\"/g, \""\").replace(/'/g, \"'\");\n};\n\nvar getTitleFromPropsList = function getTitleFromPropsList(propsList) {\n var innermostTitle = getInnermostProperty(propsList, TAG_NAMES.TITLE);\n var innermostTemplate = getInnermostProperty(propsList, HELMET_PROPS.TITLE_TEMPLATE);\n\n if (innermostTemplate && innermostTitle) {\n // use function arg to avoid need to escape $ characters\n return innermostTemplate.replace(/%s/g, function () {\n return Array.isArray(innermostTitle) ? innermostTitle.join(\"\") : innermostTitle;\n });\n }\n\n var innermostDefaultTitle = getInnermostProperty(propsList, HELMET_PROPS.DEFAULT_TITLE);\n return innermostTitle || innermostDefaultTitle || undefined;\n};\n\nvar getOnChangeClientState = function getOnChangeClientState(propsList) {\n return getInnermostProperty(propsList, HELMET_PROPS.ON_CHANGE_CLIENT_STATE) || function () {};\n};\n\nvar getAttributesFromPropsList = function getAttributesFromPropsList(tagType, propsList) {\n return propsList.filter(function (props) {\n return typeof props[tagType] !== \"undefined\";\n }).map(function (props) {\n return props[tagType];\n }).reduce(function (tagAttrs, current) {\n return _extends({}, tagAttrs, current);\n }, {});\n};\n\nvar getBaseTagFromPropsList = function getBaseTagFromPropsList(primaryAttributes, propsList) {\n return propsList.filter(function (props) {\n return typeof props[TAG_NAMES.BASE] !== \"undefined\";\n }).map(function (props) {\n return props[TAG_NAMES.BASE];\n }).reverse().reduce(function (innermostBaseTag, tag) {\n if (!innermostBaseTag.length) {\n var keys = Object.keys(tag);\n\n for (var i = 0; i < keys.length; i++) {\n var attributeKey = keys[i];\n var lowerCaseAttributeKey = attributeKey.toLowerCase();\n\n if (primaryAttributes.indexOf(lowerCaseAttributeKey) !== -1 && tag[lowerCaseAttributeKey]) {\n return innermostBaseTag.concat(tag);\n }\n }\n }\n\n return innermostBaseTag;\n }, []);\n};\n\nvar getTagsFromPropsList = function getTagsFromPropsList(tagName, primaryAttributes, propsList) {\n // Calculate list of tags, giving priority innermost component (end of the propslist)\n var approvedSeenTags = {};\n return propsList.filter(function (props) {\n if (Array.isArray(props[tagName])) {\n return true;\n }\n\n if (typeof props[tagName] !== \"undefined\") {\n warn(\"Helmet: \" + tagName + \" should be of type \\\"Array\\\". Instead found type \\\"\" + _typeof(props[tagName]) + \"\\\"\");\n }\n\n return false;\n }).map(function (props) {\n return props[tagName];\n }).reverse().reduce(function (approvedTags, instanceTags) {\n var instanceSeenTags = {};\n instanceTags.filter(function (tag) {\n var primaryAttributeKey = void 0;\n var keys = Object.keys(tag);\n\n for (var i = 0; i < keys.length; i++) {\n var attributeKey = keys[i];\n var lowerCaseAttributeKey = attributeKey.toLowerCase(); // Special rule with link tags, since rel and href are both primary tags, rel takes priority\n\n if (primaryAttributes.indexOf(lowerCaseAttributeKey) !== -1 && !(primaryAttributeKey === TAG_PROPERTIES.REL && tag[primaryAttributeKey].toLowerCase() === \"canonical\") && !(lowerCaseAttributeKey === TAG_PROPERTIES.REL && tag[lowerCaseAttributeKey].toLowerCase() === \"stylesheet\")) {\n primaryAttributeKey = lowerCaseAttributeKey;\n } // Special case for innerHTML which doesn't work lowercased\n\n\n if (primaryAttributes.indexOf(attributeKey) !== -1 && (attributeKey === TAG_PROPERTIES.INNER_HTML || attributeKey === TAG_PROPERTIES.CSS_TEXT || attributeKey === TAG_PROPERTIES.ITEM_PROP)) {\n primaryAttributeKey = attributeKey;\n }\n }\n\n if (!primaryAttributeKey || !tag[primaryAttributeKey]) {\n return false;\n }\n\n var value = tag[primaryAttributeKey].toLowerCase();\n\n if (!approvedSeenTags[primaryAttributeKey]) {\n approvedSeenTags[primaryAttributeKey] = {};\n }\n\n if (!instanceSeenTags[primaryAttributeKey]) {\n instanceSeenTags[primaryAttributeKey] = {};\n }\n\n if (!approvedSeenTags[primaryAttributeKey][value]) {\n instanceSeenTags[primaryAttributeKey][value] = true;\n return true;\n }\n\n return false;\n }).reverse().forEach(function (tag) {\n return approvedTags.push(tag);\n }); // Update seen tags with tags from this instance\n\n var keys = Object.keys(instanceSeenTags);\n\n for (var i = 0; i < keys.length; i++) {\n var attributeKey = keys[i];\n var tagUnion = objectAssign({}, approvedSeenTags[attributeKey], instanceSeenTags[attributeKey]);\n approvedSeenTags[attributeKey] = tagUnion;\n }\n\n return approvedTags;\n }, []).reverse();\n};\n\nvar getInnermostProperty = function getInnermostProperty(propsList, property) {\n for (var i = propsList.length - 1; i >= 0; i--) {\n var props = propsList[i];\n\n if (props.hasOwnProperty(property)) {\n return props[property];\n }\n }\n\n return null;\n};\n\nvar reducePropsToState = function reducePropsToState(propsList) {\n return {\n baseTag: getBaseTagFromPropsList([TAG_PROPERTIES.HREF, TAG_PROPERTIES.TARGET], propsList),\n bodyAttributes: getAttributesFromPropsList(ATTRIBUTE_NAMES.BODY, propsList),\n defer: getInnermostProperty(propsList, HELMET_PROPS.DEFER),\n encode: getInnermostProperty(propsList, HELMET_PROPS.ENCODE_SPECIAL_CHARACTERS),\n htmlAttributes: getAttributesFromPropsList(ATTRIBUTE_NAMES.HTML, propsList),\n linkTags: getTagsFromPropsList(TAG_NAMES.LINK, [TAG_PROPERTIES.REL, TAG_PROPERTIES.HREF], propsList),\n metaTags: getTagsFromPropsList(TAG_NAMES.META, [TAG_PROPERTIES.NAME, TAG_PROPERTIES.CHARSET, TAG_PROPERTIES.HTTPEQUIV, TAG_PROPERTIES.PROPERTY, TAG_PROPERTIES.ITEM_PROP], propsList),\n noscriptTags: getTagsFromPropsList(TAG_NAMES.NOSCRIPT, [TAG_PROPERTIES.INNER_HTML], propsList),\n onChangeClientState: getOnChangeClientState(propsList),\n scriptTags: getTagsFromPropsList(TAG_NAMES.SCRIPT, [TAG_PROPERTIES.SRC, TAG_PROPERTIES.INNER_HTML], propsList),\n styleTags: getTagsFromPropsList(TAG_NAMES.STYLE, [TAG_PROPERTIES.CSS_TEXT], propsList),\n title: getTitleFromPropsList(propsList),\n titleAttributes: getAttributesFromPropsList(ATTRIBUTE_NAMES.TITLE, propsList)\n };\n};\n\nvar rafPolyfill = function () {\n var clock = Date.now();\n return function (callback) {\n var currentTime = Date.now();\n\n if (currentTime - clock > 16) {\n clock = currentTime;\n callback(currentTime);\n } else {\n setTimeout(function () {\n rafPolyfill(callback);\n }, 0);\n }\n };\n}();\n\nvar cafPolyfill = function cafPolyfill(id) {\n return clearTimeout(id);\n};\n\nvar requestAnimationFrame = typeof window !== \"undefined\" ? window.requestAnimationFrame && window.requestAnimationFrame.bind(window) || window.webkitRequestAnimationFrame || window.mozRequestAnimationFrame || rafPolyfill : global.requestAnimationFrame || rafPolyfill;\nvar cancelAnimationFrame = typeof window !== \"undefined\" ? window.cancelAnimationFrame || window.webkitCancelAnimationFrame || window.mozCancelAnimationFrame || cafPolyfill : global.cancelAnimationFrame || cafPolyfill;\n\nvar warn = function warn(msg) {\n return console && typeof console.warn === \"function\" && console.warn(msg);\n};\n\nvar _helmetCallback = null;\n\nvar handleClientStateChange = function handleClientStateChange(newState) {\n if (_helmetCallback) {\n cancelAnimationFrame(_helmetCallback);\n }\n\n if (newState.defer) {\n _helmetCallback = requestAnimationFrame(function () {\n commitTagChanges(newState, function () {\n _helmetCallback = null;\n });\n });\n } else {\n commitTagChanges(newState);\n _helmetCallback = null;\n }\n};\n\nvar commitTagChanges = function commitTagChanges(newState, cb) {\n var baseTag = newState.baseTag,\n bodyAttributes = newState.bodyAttributes,\n htmlAttributes = newState.htmlAttributes,\n linkTags = newState.linkTags,\n metaTags = newState.metaTags,\n noscriptTags = newState.noscriptTags,\n onChangeClientState = newState.onChangeClientState,\n scriptTags = newState.scriptTags,\n styleTags = newState.styleTags,\n title = newState.title,\n titleAttributes = newState.titleAttributes;\n updateAttributes(TAG_NAMES.BODY, bodyAttributes);\n updateAttributes(TAG_NAMES.HTML, htmlAttributes);\n updateTitle(title, titleAttributes);\n var tagUpdates = {\n baseTag: updateTags(TAG_NAMES.BASE, baseTag),\n linkTags: updateTags(TAG_NAMES.LINK, linkTags),\n metaTags: updateTags(TAG_NAMES.META, metaTags),\n noscriptTags: updateTags(TAG_NAMES.NOSCRIPT, noscriptTags),\n scriptTags: updateTags(TAG_NAMES.SCRIPT, scriptTags),\n styleTags: updateTags(TAG_NAMES.STYLE, styleTags)\n };\n var addedTags = {};\n var removedTags = {};\n Object.keys(tagUpdates).forEach(function (tagType) {\n var _tagUpdates$tagType = tagUpdates[tagType],\n newTags = _tagUpdates$tagType.newTags,\n oldTags = _tagUpdates$tagType.oldTags;\n\n if (newTags.length) {\n addedTags[tagType] = newTags;\n }\n\n if (oldTags.length) {\n removedTags[tagType] = tagUpdates[tagType].oldTags;\n }\n });\n cb && cb();\n onChangeClientState(newState, addedTags, removedTags);\n};\n\nvar flattenArray = function flattenArray(possibleArray) {\n return Array.isArray(possibleArray) ? possibleArray.join(\"\") : possibleArray;\n};\n\nvar updateTitle = function updateTitle(title, attributes) {\n if (typeof title !== \"undefined\" && document.title !== title) {\n document.title = flattenArray(title);\n }\n\n updateAttributes(TAG_NAMES.TITLE, attributes);\n};\n\nvar updateAttributes = function updateAttributes(tagName, attributes) {\n var elementTag = document.getElementsByTagName(tagName)[0];\n\n if (!elementTag) {\n return;\n }\n\n var helmetAttributeString = elementTag.getAttribute(HELMET_ATTRIBUTE);\n var helmetAttributes = helmetAttributeString ? helmetAttributeString.split(\",\") : [];\n var attributesToRemove = [].concat(helmetAttributes);\n var attributeKeys = Object.keys(attributes);\n\n for (var i = 0; i < attributeKeys.length; i++) {\n var attribute = attributeKeys[i];\n var value = attributes[attribute] || \"\";\n\n if (elementTag.getAttribute(attribute) !== value) {\n elementTag.setAttribute(attribute, value);\n }\n\n if (helmetAttributes.indexOf(attribute) === -1) {\n helmetAttributes.push(attribute);\n }\n\n var indexToSave = attributesToRemove.indexOf(attribute);\n\n if (indexToSave !== -1) {\n attributesToRemove.splice(indexToSave, 1);\n }\n }\n\n for (var _i = attributesToRemove.length - 1; _i >= 0; _i--) {\n elementTag.removeAttribute(attributesToRemove[_i]);\n }\n\n if (helmetAttributes.length === attributesToRemove.length) {\n elementTag.removeAttribute(HELMET_ATTRIBUTE);\n } else if (elementTag.getAttribute(HELMET_ATTRIBUTE) !== attributeKeys.join(\",\")) {\n elementTag.setAttribute(HELMET_ATTRIBUTE, attributeKeys.join(\",\"));\n }\n};\n\nvar updateTags = function updateTags(type, tags) {\n var headElement = document.head || document.querySelector(TAG_NAMES.HEAD);\n var tagNodes = headElement.querySelectorAll(type + \"[\" + HELMET_ATTRIBUTE + \"]\");\n var oldTags = Array.prototype.slice.call(tagNodes);\n var newTags = [];\n var indexToDelete = void 0;\n\n if (tags && tags.length) {\n tags.forEach(function (tag) {\n var newElement = document.createElement(type);\n\n for (var attribute in tag) {\n if (tag.hasOwnProperty(attribute)) {\n if (attribute === TAG_PROPERTIES.INNER_HTML) {\n newElement.innerHTML = tag.innerHTML;\n } else if (attribute === TAG_PROPERTIES.CSS_TEXT) {\n if (newElement.styleSheet) {\n newElement.styleSheet.cssText = tag.cssText;\n } else {\n newElement.appendChild(document.createTextNode(tag.cssText));\n }\n } else {\n var value = typeof tag[attribute] === \"undefined\" ? \"\" : tag[attribute];\n newElement.setAttribute(attribute, value);\n }\n }\n }\n\n newElement.setAttribute(HELMET_ATTRIBUTE, \"true\"); // Remove a duplicate tag from domTagstoRemove, so it isn't cleared.\n\n if (oldTags.some(function (existingTag, index) {\n indexToDelete = index;\n return newElement.isEqualNode(existingTag);\n })) {\n oldTags.splice(indexToDelete, 1);\n } else {\n newTags.push(newElement);\n }\n });\n }\n\n oldTags.forEach(function (tag) {\n return tag.parentNode.removeChild(tag);\n });\n newTags.forEach(function (tag) {\n return headElement.appendChild(tag);\n });\n return {\n oldTags: oldTags,\n newTags: newTags\n };\n};\n\nvar generateElementAttributesAsString = function generateElementAttributesAsString(attributes) {\n return Object.keys(attributes).reduce(function (str, key) {\n var attr = typeof attributes[key] !== \"undefined\" ? key + \"=\\\"\" + attributes[key] + \"\\\"\" : \"\" + key;\n return str ? str + \" \" + attr : attr;\n }, \"\");\n};\n\nvar generateTitleAsString = function generateTitleAsString(type, title, attributes, encode) {\n var attributeString = generateElementAttributesAsString(attributes);\n var flattenedTitle = flattenArray(title);\n return attributeString ? \"<\" + type + \" \" + HELMET_ATTRIBUTE + \"=\\\"true\\\" \" + attributeString + \">\" + encodeSpecialCharacters(flattenedTitle, encode) + \"\" : \"<\" + type + \" \" + HELMET_ATTRIBUTE + \"=\\\"true\\\">\" + encodeSpecialCharacters(flattenedTitle, encode) + \"\";\n};\n\nvar generateTagsAsString = function generateTagsAsString(type, tags, encode) {\n return tags.reduce(function (str, tag) {\n var attributeHtml = Object.keys(tag).filter(function (attribute) {\n return !(attribute === TAG_PROPERTIES.INNER_HTML || attribute === TAG_PROPERTIES.CSS_TEXT);\n }).reduce(function (string, attribute) {\n var attr = typeof tag[attribute] === \"undefined\" ? attribute : attribute + \"=\\\"\" + encodeSpecialCharacters(tag[attribute], encode) + \"\\\"\";\n return string ? string + \" \" + attr : attr;\n }, \"\");\n var tagContent = tag.innerHTML || tag.cssText || \"\";\n var isSelfClosing = SELF_CLOSING_TAGS.indexOf(type) === -1;\n return str + \"<\" + type + \" \" + HELMET_ATTRIBUTE + \"=\\\"true\\\" \" + attributeHtml + (isSelfClosing ? \"/>\" : \">\" + tagContent + \"\");\n }, \"\");\n};\n\nvar convertElementAttributestoReactProps = function convertElementAttributestoReactProps(attributes) {\n var initProps = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n return Object.keys(attributes).reduce(function (obj, key) {\n obj[REACT_TAG_MAP[key] || key] = attributes[key];\n return obj;\n }, initProps);\n};\n\nvar convertReactPropstoHtmlAttributes = function convertReactPropstoHtmlAttributes(props) {\n var initAttributes = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n return Object.keys(props).reduce(function (obj, key) {\n obj[HTML_TAG_MAP[key] || key] = props[key];\n return obj;\n }, initAttributes);\n};\n\nvar generateTitleAsReactComponent = function generateTitleAsReactComponent(type, title, attributes) {\n var _initProps; // assigning into an array to define toString function on it\n\n\n var initProps = (_initProps = {\n key: title\n }, _initProps[HELMET_ATTRIBUTE] = true, _initProps);\n var props = convertElementAttributestoReactProps(attributes, initProps);\n return [React.createElement(TAG_NAMES.TITLE, props, title)];\n};\n\nvar generateTagsAsReactComponent = function generateTagsAsReactComponent(type, tags) {\n return tags.map(function (tag, i) {\n var _mappedTag;\n\n var mappedTag = (_mappedTag = {\n key: i\n }, _mappedTag[HELMET_ATTRIBUTE] = true, _mappedTag);\n Object.keys(tag).forEach(function (attribute) {\n var mappedAttribute = REACT_TAG_MAP[attribute] || attribute;\n\n if (mappedAttribute === TAG_PROPERTIES.INNER_HTML || mappedAttribute === TAG_PROPERTIES.CSS_TEXT) {\n var content = tag.innerHTML || tag.cssText;\n mappedTag.dangerouslySetInnerHTML = {\n __html: content\n };\n } else {\n mappedTag[mappedAttribute] = tag[attribute];\n }\n });\n return React.createElement(type, mappedTag);\n });\n};\n\nvar getMethodsForTag = function getMethodsForTag(type, tags, encode) {\n switch (type) {\n case TAG_NAMES.TITLE:\n return {\n toComponent: function toComponent() {\n return generateTitleAsReactComponent(type, tags.title, tags.titleAttributes, encode);\n },\n toString: function toString() {\n return generateTitleAsString(type, tags.title, tags.titleAttributes, encode);\n }\n };\n\n case ATTRIBUTE_NAMES.BODY:\n case ATTRIBUTE_NAMES.HTML:\n return {\n toComponent: function toComponent() {\n return convertElementAttributestoReactProps(tags);\n },\n toString: function toString() {\n return generateElementAttributesAsString(tags);\n }\n };\n\n default:\n return {\n toComponent: function toComponent() {\n return generateTagsAsReactComponent(type, tags);\n },\n toString: function toString() {\n return generateTagsAsString(type, tags, encode);\n }\n };\n }\n};\n\nvar mapStateOnServer = function mapStateOnServer(_ref) {\n var baseTag = _ref.baseTag,\n bodyAttributes = _ref.bodyAttributes,\n encode = _ref.encode,\n htmlAttributes = _ref.htmlAttributes,\n linkTags = _ref.linkTags,\n metaTags = _ref.metaTags,\n noscriptTags = _ref.noscriptTags,\n scriptTags = _ref.scriptTags,\n styleTags = _ref.styleTags,\n _ref$title = _ref.title,\n title = _ref$title === undefined ? \"\" : _ref$title,\n titleAttributes = _ref.titleAttributes;\n return {\n base: getMethodsForTag(TAG_NAMES.BASE, baseTag, encode),\n bodyAttributes: getMethodsForTag(ATTRIBUTE_NAMES.BODY, bodyAttributes, encode),\n htmlAttributes: getMethodsForTag(ATTRIBUTE_NAMES.HTML, htmlAttributes, encode),\n link: getMethodsForTag(TAG_NAMES.LINK, linkTags, encode),\n meta: getMethodsForTag(TAG_NAMES.META, metaTags, encode),\n noscript: getMethodsForTag(TAG_NAMES.NOSCRIPT, noscriptTags, encode),\n script: getMethodsForTag(TAG_NAMES.SCRIPT, scriptTags, encode),\n style: getMethodsForTag(TAG_NAMES.STYLE, styleTags, encode),\n title: getMethodsForTag(TAG_NAMES.TITLE, {\n title: title,\n titleAttributes: titleAttributes\n }, encode)\n };\n};\n\nvar Helmet = function Helmet(Component) {\n var _class, _temp;\n\n return _temp = _class = function (_React$Component) {\n inherits(HelmetWrapper, _React$Component);\n\n function HelmetWrapper() {\n classCallCheck(this, HelmetWrapper);\n return possibleConstructorReturn(this, _React$Component.apply(this, arguments));\n }\n\n HelmetWrapper.prototype.shouldComponentUpdate = function shouldComponentUpdate(nextProps) {\n return !isEqual(this.props, nextProps);\n };\n\n HelmetWrapper.prototype.mapNestedChildrenToProps = function mapNestedChildrenToProps(child, nestedChildren) {\n if (!nestedChildren) {\n return null;\n }\n\n switch (child.type) {\n case TAG_NAMES.SCRIPT:\n case TAG_NAMES.NOSCRIPT:\n return {\n innerHTML: nestedChildren\n };\n\n case TAG_NAMES.STYLE:\n return {\n cssText: nestedChildren\n };\n }\n\n throw new Error(\"<\" + child.type + \" /> elements are self-closing and can not contain children. Refer to our API for more information.\");\n };\n\n HelmetWrapper.prototype.flattenArrayTypeChildren = function flattenArrayTypeChildren(_ref) {\n var _babelHelpers$extends;\n\n var child = _ref.child,\n arrayTypeChildren = _ref.arrayTypeChildren,\n newChildProps = _ref.newChildProps,\n nestedChildren = _ref.nestedChildren;\n return _extends({}, arrayTypeChildren, (_babelHelpers$extends = {}, _babelHelpers$extends[child.type] = [].concat(arrayTypeChildren[child.type] || [], [_extends({}, newChildProps, this.mapNestedChildrenToProps(child, nestedChildren))]), _babelHelpers$extends));\n };\n\n HelmetWrapper.prototype.mapObjectTypeChildren = function mapObjectTypeChildren(_ref2) {\n var _babelHelpers$extends2, _babelHelpers$extends3;\n\n var child = _ref2.child,\n newProps = _ref2.newProps,\n newChildProps = _ref2.newChildProps,\n nestedChildren = _ref2.nestedChildren;\n\n switch (child.type) {\n case TAG_NAMES.TITLE:\n return _extends({}, newProps, (_babelHelpers$extends2 = {}, _babelHelpers$extends2[child.type] = nestedChildren, _babelHelpers$extends2.titleAttributes = _extends({}, newChildProps), _babelHelpers$extends2));\n\n case TAG_NAMES.BODY:\n return _extends({}, newProps, {\n bodyAttributes: _extends({}, newChildProps)\n });\n\n case TAG_NAMES.HTML:\n return _extends({}, newProps, {\n htmlAttributes: _extends({}, newChildProps)\n });\n }\n\n return _extends({}, newProps, (_babelHelpers$extends3 = {}, _babelHelpers$extends3[child.type] = _extends({}, newChildProps), _babelHelpers$extends3));\n };\n\n HelmetWrapper.prototype.mapArrayTypeChildrenToProps = function mapArrayTypeChildrenToProps(arrayTypeChildren, newProps) {\n var newFlattenedProps = _extends({}, newProps);\n\n Object.keys(arrayTypeChildren).forEach(function (arrayChildName) {\n var _babelHelpers$extends4;\n\n newFlattenedProps = _extends({}, newFlattenedProps, (_babelHelpers$extends4 = {}, _babelHelpers$extends4[arrayChildName] = arrayTypeChildren[arrayChildName], _babelHelpers$extends4));\n });\n return newFlattenedProps;\n };\n\n HelmetWrapper.prototype.warnOnInvalidChildren = function warnOnInvalidChildren(child, nestedChildren) {\n if (process.env.NODE_ENV !== \"production\") {\n if (!VALID_TAG_NAMES.some(function (name) {\n return child.type === name;\n })) {\n if (typeof child.type === \"function\") {\n return warn(\"You may be attempting to nest components within each other, which is not allowed. Refer to our API for more information.\");\n }\n\n return warn(\"Only elements types \" + VALID_TAG_NAMES.join(\", \") + \" are allowed. Helmet does not support rendering <\" + child.type + \"> elements. Refer to our API for more information.\");\n }\n\n if (nestedChildren && typeof nestedChildren !== \"string\" && (!Array.isArray(nestedChildren) || nestedChildren.some(function (nestedChild) {\n return typeof nestedChild !== \"string\";\n }))) {\n throw new Error(\"Helmet expects a string as a child of <\" + child.type + \">. Did you forget to wrap your children in braces? ( <\" + child.type + \">{``} ) Refer to our API for more information.\");\n }\n }\n\n return true;\n };\n\n HelmetWrapper.prototype.mapChildrenToProps = function mapChildrenToProps(children, newProps) {\n var _this2 = this;\n\n var arrayTypeChildren = {};\n React.Children.forEach(children, function (child) {\n if (!child || !child.props) {\n return;\n }\n\n var _child$props = child.props,\n nestedChildren = _child$props.children,\n childProps = objectWithoutProperties(_child$props, [\"children\"]);\n var newChildProps = convertReactPropstoHtmlAttributes(childProps);\n\n _this2.warnOnInvalidChildren(child, nestedChildren);\n\n switch (child.type) {\n case TAG_NAMES.LINK:\n case TAG_NAMES.META:\n case TAG_NAMES.NOSCRIPT:\n case TAG_NAMES.SCRIPT:\n case TAG_NAMES.STYLE:\n arrayTypeChildren = _this2.flattenArrayTypeChildren({\n child: child,\n arrayTypeChildren: arrayTypeChildren,\n newChildProps: newChildProps,\n nestedChildren: nestedChildren\n });\n break;\n\n default:\n newProps = _this2.mapObjectTypeChildren({\n child: child,\n newProps: newProps,\n newChildProps: newChildProps,\n nestedChildren: nestedChildren\n });\n break;\n }\n });\n newProps = this.mapArrayTypeChildrenToProps(arrayTypeChildren, newProps);\n return newProps;\n };\n\n HelmetWrapper.prototype.render = function render() {\n var _props = this.props,\n children = _props.children,\n props = objectWithoutProperties(_props, [\"children\"]);\n\n var newProps = _extends({}, props);\n\n if (children) {\n newProps = this.mapChildrenToProps(children, newProps);\n }\n\n return React.createElement(Component, newProps);\n };\n\n createClass(HelmetWrapper, null, [{\n key: \"canUseDOM\",\n // Component.peek comes from react-side-effect:\n // For testing, you may use a static peek() method available on the returned component.\n // It lets you get the current state without resetting the mounted instance stack.\n // Don’t use it for anything other than testing.\n\n /**\n * @param {Object} base: {\"target\": \"_blank\", \"href\": \"http://mysite.com/\"}\n * @param {Object} bodyAttributes: {\"className\": \"root\"}\n * @param {String} defaultTitle: \"Default Title\"\n * @param {Boolean} defer: true\n * @param {Boolean} encodeSpecialCharacters: true\n * @param {Object} htmlAttributes: {\"lang\": \"en\", \"amp\": undefined}\n * @param {Array} link: [{\"rel\": \"canonical\", \"href\": \"http://mysite.com/example\"}]\n * @param {Array} meta: [{\"name\": \"description\", \"content\": \"Test description\"}]\n * @param {Array} noscript: [{\"innerHTML\": \" console.log(newState)\"\n * @param {Array} script: [{\"type\": \"text/javascript\", \"src\": \"http://mysite.com/js/test.js\"}]\n * @param {Array} style: [{\"type\": \"text/css\", \"cssText\": \"div { display: block; color: blue; }\"}]\n * @param {String} title: \"Title\"\n * @param {Object} titleAttributes: {\"itemprop\": \"name\"}\n * @param {String} titleTemplate: \"MySite.com - %s\"\n */\n set: function set$$1(canUseDOM) {\n Component.canUseDOM = canUseDOM;\n }\n }]);\n return HelmetWrapper;\n }(React.Component), _class.propTypes = {\n base: PropTypes.object,\n bodyAttributes: PropTypes.object,\n children: PropTypes.oneOfType([PropTypes.arrayOf(PropTypes.node), PropTypes.node]),\n defaultTitle: PropTypes.string,\n defer: PropTypes.bool,\n encodeSpecialCharacters: PropTypes.bool,\n htmlAttributes: PropTypes.object,\n link: PropTypes.arrayOf(PropTypes.object),\n meta: PropTypes.arrayOf(PropTypes.object),\n noscript: PropTypes.arrayOf(PropTypes.object),\n onChangeClientState: PropTypes.func,\n script: PropTypes.arrayOf(PropTypes.object),\n style: PropTypes.arrayOf(PropTypes.object),\n title: PropTypes.string,\n titleAttributes: PropTypes.object,\n titleTemplate: PropTypes.string\n }, _class.defaultProps = {\n defer: true,\n encodeSpecialCharacters: true\n }, _class.peek = Component.peek, _class.rewind = function () {\n var mappedState = Component.rewind();\n\n if (!mappedState) {\n // provide fallback if mappedState is undefined\n mappedState = mapStateOnServer({\n baseTag: [],\n bodyAttributes: {},\n encodeSpecialCharacters: true,\n htmlAttributes: {},\n linkTags: [],\n metaTags: [],\n noscriptTags: [],\n scriptTags: [],\n styleTags: [],\n title: \"\",\n titleAttributes: {}\n });\n }\n\n return mappedState;\n }, _temp;\n};\n\nvar NullComponent = function NullComponent() {\n return null;\n};\n\nvar HelmetSideEffects = withSideEffect(reducePropsToState, handleClientStateChange, mapStateOnServer)(NullComponent);\nvar HelmetExport = Helmet(HelmetSideEffects);\nHelmetExport.renderStatic = HelmetExport.rewind;\nexport default HelmetExport;\nexport { HelmetExport as Helmet };","import * as React from 'react'\nimport { Helmet } from 'react-helmet'\nimport { useStaticQuery, graphql } from 'gatsby'\n\nimport { Props, QueryData } from './Seo.types'\n\nexport const Seo = ({ description, meta = [], title }: Props) => {\n const { site } = useStaticQuery(\n graphql`\n query {\n site {\n siteMetadata {\n title\n description\n }\n }\n }\n `,\n )\n\n const metaDescription = description || site.siteMetadata.description\n return (\n \n \n \n \n \n )\n}\n","import * as React from 'react'\n\nimport { Seo } from '../Seo/Seo'\nimport { cls } from '../../common/utils'\nimport { Props } from './Layout.types'\nimport * as styles from './Layout.module.scss'\n\nexport const Layout = ({ title, primary, accent, children }: Props) => {\n return (\n <>\n \n
{children}
\n \n )\n}\n","// extracted by mini-css-extract-plugin\nexport var layout = \"Layout-module--layout--36KWw\";\nexport var primary = \"Layout-module--primary--3dHHh\";\nexport var accent = \"Layout-module--accent--3cy0V\";"],"names":["module","exports","t","e","n","r","i","s","u","a","o","f","h","c","d","$","l","y","M","name","weekdays","split","months","m","String","length","Array","join","g","z","utcOffset","Math","abs","floor","date","year","month","clone","add","ceil","p","w","D","ms","Q","toLowerCase","replace","v","_","S","args","arguments","O","locale","$L","utc","$u","x","$x","$offset","this","parse","prototype","$d","Date","NaN","test","match","substring","UTC","init","$y","getFullYear","$M","getMonth","$D","getDate","$W","getDay","$H","getHours","$m","getMinutes","$s","getSeconds","$ms","getMilliseconds","$utils","isValid","toString","isSame","startOf","endOf","isAfter","isBefore","$g","set","unix","valueOf","getTime","toDate","apply","slice","$locale","weekStart","$set","min","daysInMonth","get","Number","round","subtract","format","invalidDate","substr","meridiem","YY","YYYY","MM","MMM","monthsShort","MMMM","DD","dd","weekdaysMin","ddd","weekdaysShort","dddd","H","HH","hh","A","mm","ss","SSS","Z","getTimezoneOffset","diff","toJSON","toISOString","toUTCString","b","forEach","extend","$i","isDayjs","en","Ls","hasElementType","Element","hasMap","Map","hasSet","Set","hasArrayBuffer","ArrayBuffer","isView","equal","constructor","keys","it","isArray","size","entries","next","done","has","value","RegExp","source","flags","Object","hasOwnProperty","call","$$typeof","error","message","console","warn","ex","React","React__default","_defineProperty","obj","key","defineProperty","enumerable","configurable","writable","canUseDOM","window","document","createElement","reducePropsToState","handleStateChangeOnClient","mapStateOnServer","Error","WrappedComponent","state","mountedInstances","emitChange","map","instance","props","SideEffect","_PureComponent","subClass","superClass","create","__proto__","peek","rewind","recordedState","undefined","_proto","UNSAFE_componentWillMount","push","componentDidUpdate","componentWillUnmount","index","indexOf","splice","render","PureComponent","displayName","getDisplayName","cls","classes","filter","Boolean","objectFromEntries","reduce","res","cur","formatDateUnit","noScroll","on","body","classList","remove","applyFilters","protocols","filters","protocol","pass","status","includes","license","dateUnit","dayjs","modifiedDate","tag","some","tags","clock","Component","_class","_temp","ATTRIBUTE_NAMES","TAG_NAMES","BASE","BODY","HEAD","HTML","LINK","META","NOSCRIPT","SCRIPT","STYLE","TITLE","TAG_PROPERTIES","REACT_TAG_MAP","accesskey","charset","class","contenteditable","contextmenu","itemprop","tabindex","HELMET_PROPS","HTML_TAG_MAP","SELF_CLOSING_TAGS","HELMET_ATTRIBUTE","_typeof","Symbol","iterator","classCallCheck","Constructor","TypeError","createClass","defineProperties","target","descriptor","protoProps","staticProps","_extends","assign","objectWithoutProperties","possibleConstructorReturn","self","ReferenceError","encodeSpecialCharacters","str","encode","getTitleFromPropsList","propsList","innermostTitle","getInnermostProperty","innermostTemplate","innermostDefaultTitle","getOnChangeClientState","getAttributesFromPropsList","tagType","tagAttrs","current","getBaseTagFromPropsList","primaryAttributes","reverse","innermostBaseTag","lowerCaseAttributeKey","concat","getTagsFromPropsList","tagName","approvedSeenTags","approvedTags","instanceTags","instanceSeenTags","primaryAttributeKey","attributeKey","tagUnion","property","rafPolyfill","now","callback","currentTime","setTimeout","cafPolyfill","id","clearTimeout","requestAnimationFrame","bind","webkitRequestAnimationFrame","mozRequestAnimationFrame","cancelAnimationFrame","webkitCancelAnimationFrame","mozCancelAnimationFrame","msg","_helmetCallback","commitTagChanges","newState","cb","baseTag","bodyAttributes","htmlAttributes","linkTags","metaTags","noscriptTags","onChangeClientState","scriptTags","styleTags","title","titleAttributes","updateAttributes","updateTitle","tagUpdates","updateTags","addedTags","removedTags","_tagUpdates$tagType","newTags","oldTags","flattenArray","possibleArray","attributes","elementTag","getElementsByTagName","helmetAttributeString","getAttribute","helmetAttributes","attributesToRemove","attributeKeys","attribute","setAttribute","indexToSave","_i","removeAttribute","type","headElement","head","querySelector","tagNodes","querySelectorAll","indexToDelete","newElement","innerHTML","styleSheet","cssText","appendChild","createTextNode","existingTag","isEqualNode","parentNode","removeChild","generateElementAttributesAsString","attr","convertElementAttributestoReactProps","initProps","getMethodsForTag","toComponent","_initProps","attributeString","flattenedTitle","generateTitleAsString","_mappedTag","mappedTag","mappedAttribute","content","dangerouslySetInnerHTML","__html","generateTagsAsReactComponent","attributeHtml","string","tagContent","isSelfClosing","generateTagsAsString","_ref","_ref$title","base","link","meta","noscript","script","style","HelmetSideEffects","defer","HelmetExport","_React$Component","HelmetWrapper","setPrototypeOf","inherits","shouldComponentUpdate","nextProps","mapNestedChildrenToProps","child","nestedChildren","flattenArrayTypeChildren","_babelHelpers$extends","arrayTypeChildren","newChildProps","mapObjectTypeChildren","_ref2","_babelHelpers$extends2","_babelHelpers$extends3","newProps","mapArrayTypeChildrenToProps","newFlattenedProps","arrayChildName","_babelHelpers$extends4","warnOnInvalidChildren","mapChildrenToProps","children","_this2","_child$props","initAttributes","convertReactPropstoHtmlAttributes","_props","propTypes","defaultTitle","titleTemplate","defaultProps","mappedState","renderStatic","Seo","description","site","useStaticQuery","metaDescription","siteMetadata","lang","rel","href","crossOrigin","Layout","primary","accent","className"],"sourceRoot":""} \ No newline at end of file diff --git a/component---src-pages-404-tsx-06fe7db8f8c75ad21a4d.js b/component---src-pages-404-tsx-06fe7db8f8c75ad21a4d.js new file mode 100644 index 00000000..bc55b23c --- /dev/null +++ b/component---src-pages-404-tsx-06fe7db8f8c75ad21a4d.js @@ -0,0 +1,2 @@ +"use strict";(self.webpackChunkdidcomm_website=self.webpackChunkdidcomm_website||[]).push([[218],{7885:function(e,a,t){t.d(a,{h:function(){return s}});var r=t(7294),l=t(5444),o=t(6786),n=t(9042),c=t(8739),m="Header-module--link--4ebYS";const s=e=>{let{children:a,primary:t,className:s,hideLinks:i}=e;return r.createElement("header",{className:(0,o.yI)("Header-module--header--1Qt4T",t&&"Header-module--primary--yIDLc",s)},r.createElement("div",{className:"Header-module--container--3KhaC"},r.createElement(l.Link,{title:"Link to home",activeClassName:"Header-module--active--1N9yZ",className:"Header-module--logo--RPmCm",to:"/","aria-label":"Link to home"},r.createElement(n.l,{icon:c.P.logo,className:"Header-module--logoImg--f8A17"}),r.createElement("span",{className:(0,o.yI)("Header-module--logoText--EwM4-","hide-mobile")},"DIDComm")),r.createElement("div",{className:"Header-module--search--ucYp8"},a),!i&&r.createElement("nav",{className:(0,o.yI)("hide-mobile font-footnote","Header-module--linksContainer--WRDuP")},r.createElement("ul",{className:"Header-module--links--3cZB-"},r.createElement("li",null,r.createElement("a",{className:m,rel:"noreferrer noopener nofollow",href:"https://github.com/decentralized-identity/didcomm.org",target:"_blank"},"GitHub repo")),r.createElement("li",null,r.createElement("a",{className:m,rel:"noreferrer noopener nofollow",href:"https://identity.foundation/didcomm-messaging/spec/v2.1/",target:"_blank"},"Specification")),r.createElement("li",null,r.createElement("a",{className:m,href:"mailto:security@didcomm.org"},"Security"))))))}},1838:function(e,a,t){t.d(a,{o:function(){return c}});var r=t(7294),l=t(9042),o=t(8739),n=t(6786);const c=e=>{let{onSearch:a,query:t="",bordered:c}=e;const{0:m,1:s}=(0,r.useState)(t);return r.createElement("form",{className:"Search-module--search--3XfRF",onSubmit:e=>{e.preventDefault(),a(m)},role:"search"},r.createElement("input",{className:(0,n.yI)("Search-module--input--1o6QO","rounded",c&&"Search-module--bordered--34QxG"),value:m,onChange:e=>s(e.target.value),autoCorrect:"off",placeholder:" ",autoComplete:"off",type:"text",id:"search"}),r.createElement("label",{className:"Search-module--placeholder--97f4S",htmlFor:"search"},"Search protocols",r.createElement("span",{className:"Search-module--placeholderExtraText--3R9o1"}," to use in your own software")),r.createElement("button",{className:"Search-module--clearButton--3MgzD",onClick:e=>s(""),"aria-label":"Clear search text",type:"button"},r.createElement(l.l,{icon:o.P.cross,className:"Search-module--iconCross--3dnWa"})),r.createElement("button",{className:"Search-module--button--xD1TT",type:"submit","aria-label":"Search for protocols"},r.createElement(l.l,{icon:o.P.magnify,className:"Search-module--iconMagnify--j1Q9O"})))}},9042:function(e,a,t){t.d(a,{l:function(){return o}});var r=t(7294),l=t(5444);const o=e=>{let{icon:a,className:t,role:o,ariaHidden:c}=e;const{icons:{publicURL:m}}=(0,l.useStaticQuery)(n);return r.createElement("svg",{role:o,"aria-hidden":c,className:t},r.createElement("use",{href:m+"#"+a}))},n="3766577012"},8739:function(e,a,t){let r;t.d(a,{P:function(){return r}}),function(e){e.logo="logo",e.magnify="magnify",e.cross="cross",e.idea="idea",e.document="document",e.share="share",e.filter="filter"}(r||(r={}))},2847:function(e,a,t){t.r(a),t.d(a,{default:function(){return s}});var r=t(7294),l=t(5444),o=t(1937),n=t(7885),c=t(6786),m=t(1838);var s=e=>r.createElement(o.A,{accent:!0,title:"Page not Found"},r.createElement(n.h,{primary:!0,hideLinks:!0}),r.createElement("div",{className:"content"},r.createElement("main",{className:"_404-module--main--1taou"},r.createElement("div",{className:"_404-module--oops--3prb5"},"Oops!"),r.createElement("h1",{className:(0,c.yI)("font-title-1","_404-module--title--2sRC_")},"We can't seem to find the page you're looking for."),r.createElement("div",{className:(0,c.yI)("font-subheadline","_404-module--subtitle--IEi-H")},"404 error code"),r.createElement("div",{className:"_404-module--search--3zs_3"},r.createElement(m.o,{onSearch:e=>(0,l.navigate)("/search/?q="+encodeURIComponent(e)+"&page=1")})))))}}]); +//# sourceMappingURL=component---src-pages-404-tsx-06fe7db8f8c75ad21a4d.js.map \ No newline at end of file diff --git a/component---src-pages-404-tsx-06fe7db8f8c75ad21a4d.js.map b/component---src-pages-404-tsx-06fe7db8f8c75ad21a4d.js.map new file mode 100644 index 00000000..ba84c3ae --- /dev/null +++ b/component---src-pages-404-tsx-06fe7db8f8c75ad21a4d.js.map @@ -0,0 +1 @@ +{"version":3,"file":"component---src-pages-404-tsx-06fe7db8f8c75ad21a4d.js","mappings":"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","sources":["webpack://didcomm-website/./src/components/Header/Header.module.scss","webpack://didcomm-website/./src/components/Header/Header.tsx","webpack://didcomm-website/./src/components/Search/Search.tsx","webpack://didcomm-website/./src/components/Search/Search.module.scss","webpack://didcomm-website/./src/components/SvgIcon/SvgIcon.tsx","webpack://didcomm-website/./src/components/SvgIcon/SvgIcon.types.ts","webpack://didcomm-website/./src/pages/404.tsx","webpack://didcomm-website/./src/pages/404.module.scss"],"sourcesContent":["// extracted by mini-css-extract-plugin\nexport var header = \"Header-module--header--1Qt4T\";\nexport var container = \"Header-module--container--3KhaC\";\nexport var search = \"Header-module--search--ucYp8\";\nexport var linksContainer = \"Header-module--linksContainer--WRDuP\";\nexport var active = \"Header-module--active--1N9yZ\";\nexport var primary = \"Header-module--primary--yIDLc\";\nexport var logo = \"Header-module--logo--RPmCm\";\nexport var logoImg = \"Header-module--logoImg--f8A17\";\nexport var logoText = \"Header-module--logoText--EwM4-\";\nexport var links = \"Header-module--links--3cZB-\";\nexport var link = \"Header-module--link--4ebYS\";","import * as React from 'react'\nimport { Link } from 'gatsby'\n\nimport { cls } from '../../common/utils'\nimport { SvgIcon } from '../SvgIcon/SvgIcon'\nimport { Icons } from '../SvgIcon/SvgIcon.types'\nimport { Props } from './Header.types'\nimport * as styles from './Header.module.scss'\n\nexport const Header = ({ children, primary, className, hideLinks }: Props) => {\n return (\n
\n
\n \n \n DIDComm\n \n
{children}
\n {!hideLinks && (\n \n )}\n
\n
\n )\n}\n","import * as React from 'react'\nimport { useState, FormEventHandler } from 'react'\n\nimport { SvgIcon } from '../SvgIcon/SvgIcon'\nimport { Icons } from '../SvgIcon/SvgIcon.types'\nimport { cls } from '../../common/utils'\nimport { Props } from './Search.types'\nimport * as styles from './Search.module.scss'\n\nexport const Search = ({ onSearch, query = '', bordered }: Props) => {\n const [value, setValue] = useState(query)\n\n const onSubmit: FormEventHandler = (e) => {\n e.preventDefault()\n onSearch(value)\n }\n\n return (\n
\n setValue(e.target.value)}\n autoCorrect=\"off\"\n placeholder=\" \"\n autoComplete=\"off\"\n type=\"text\"\n id=\"search\"\n />\n \n \n \n \n )\n}\n","// extracted by mini-css-extract-plugin\nexport var search = \"Search-module--search--3XfRF\";\nexport var input = \"Search-module--input--1o6QO\";\nexport var bordered = \"Search-module--bordered--34QxG\";\nexport var placeholder = \"Search-module--placeholder--97f4S\";\nexport var placeholderExtraText = \"Search-module--placeholderExtraText--3R9o1\";\nexport var button = \"Search-module--button--xD1TT\";\nexport var iconMagnify = \"Search-module--iconMagnify--j1Q9O\";\nexport var clearButton = \"Search-module--clearButton--3MgzD\";\nexport var iconCross = \"Search-module--iconCross--3dnWa\";","import * as React from 'react'\nimport { graphql, useStaticQuery } from 'gatsby'\n\nimport { Props, QueryData } from './SvgIcon.types'\n\nexport const SvgIcon = ({ icon, className, role, ariaHidden }: Props) => {\n const {\n icons: { publicURL: icons },\n } = useStaticQuery(query)\n return (\n \n \n \n )\n}\n\nconst query = graphql`\n {\n icons: file(base: { eq: \"icons.svg\" }) {\n publicURL\n }\n }\n`\n","export type QueryData = {\n icons: {\n publicURL: string\n }\n}\n\nexport type Props = {\n icon: Icons\n className: string\n role?: React.AriaRole\n ariaHidden?: boolean\n}\n\nexport enum Icons {\n logo = 'logo',\n magnify = 'magnify',\n cross = 'cross',\n idea = 'idea',\n document = 'document',\n share = 'share',\n filter = 'filter',\n}\n","import * as React from 'react'\nimport { PageProps, navigate } from 'gatsby'\n\nimport { Layout } from '../components/Layout/Layout'\nimport { Header } from '../components/Header/Header'\nimport { cls } from '../common/utils'\nimport { Search } from '../components/Search/Search'\nimport * as styles from './404.module.scss'\n\nconst NotFoundPage = (props: PageProps) => (\n \n
\n
\n
\n
Oops!
\n

We can't seem to find the page you're looking for.

\n
404 error code
\n
\n navigate(`/search/?q=${encodeURIComponent(q)}&page=1`)} />\n
\n
\n
\n \n)\n\nexport default NotFoundPage\n","// extracted by mini-css-extract-plugin\nexport var main = \"_404-module--main--1taou\";\nexport var oops = \"_404-module--oops--3prb5\";\nexport var title = \"_404-module--title--2sRC_\";\nexport var subtitle = \"_404-module--subtitle--IEi-H\";\nexport var search = \"_404-module--search--3zs_3\";"],"names":["Header","children","primary","className","hideLinks","cls","Link","title","activeClassName","to","SvgIcon","icon","Icons","styles","rel","href","target","Search","onSearch","query","bordered","value","setValue","useState","onSubmit","e","preventDefault","role","onChange","autoCorrect","placeholder","autoComplete","type","id","htmlFor","onClick","_","ariaHidden","icons","publicURL","useStaticQuery","props","Layout","accent","q","navigate","encodeURIComponent"],"sourceRoot":""} \ No newline at end of file diff --git a/component---src-pages-index-tsx-eb4a3aa53617243254eb.js b/component---src-pages-index-tsx-eb4a3aa53617243254eb.js new file mode 100644 index 00000000..440ea946 --- /dev/null +++ b/component---src-pages-index-tsx-eb4a3aa53617243254eb.js @@ -0,0 +1,2 @@ +"use strict";(self.webpackChunkdidcomm_website=self.webpackChunkdidcomm_website||[]).push([[691],{7885:function(e,t,a){a.d(t,{h:function(){return s}});var r=a(7294),l=a(5444),n=a(6786),o=a(9042),c=a(8739),m="Header-module--link--4ebYS";const s=e=>{let{children:t,primary:a,className:s,hideLinks:i}=e;return r.createElement("header",{className:(0,n.yI)("Header-module--header--1Qt4T",a&&"Header-module--primary--yIDLc",s)},r.createElement("div",{className:"Header-module--container--3KhaC"},r.createElement(l.Link,{title:"Link to home",activeClassName:"Header-module--active--1N9yZ",className:"Header-module--logo--RPmCm",to:"/","aria-label":"Link to home"},r.createElement(o.l,{icon:c.P.logo,className:"Header-module--logoImg--f8A17"}),r.createElement("span",{className:(0,n.yI)("Header-module--logoText--EwM4-","hide-mobile")},"DIDComm")),r.createElement("div",{className:"Header-module--search--ucYp8"},t),!i&&r.createElement("nav",{className:(0,n.yI)("hide-mobile font-footnote","Header-module--linksContainer--WRDuP")},r.createElement("ul",{className:"Header-module--links--3cZB-"},r.createElement("li",null,r.createElement("a",{className:m,rel:"noreferrer noopener nofollow",href:"https://github.com/decentralized-identity/didcomm.org",target:"_blank"},"GitHub repo")),r.createElement("li",null,r.createElement("a",{className:m,rel:"noreferrer noopener nofollow",href:"https://identity.foundation/didcomm-messaging/spec/v2.1/",target:"_blank"},"Specification")),r.createElement("li",null,r.createElement("a",{className:m,href:"mailto:security@didcomm.org"},"Security"))))))}},1838:function(e,t,a){a.d(t,{o:function(){return c}});var r=a(7294),l=a(9042),n=a(8739),o=a(6786);const c=e=>{let{onSearch:t,query:a="",bordered:c}=e;const{0:m,1:s}=(0,r.useState)(a);return r.createElement("form",{className:"Search-module--search--3XfRF",onSubmit:e=>{e.preventDefault(),t(m)},role:"search"},r.createElement("input",{className:(0,o.yI)("Search-module--input--1o6QO","rounded",c&&"Search-module--bordered--34QxG"),value:m,onChange:e=>s(e.target.value),autoCorrect:"off",placeholder:" ",autoComplete:"off",type:"text",id:"search"}),r.createElement("label",{className:"Search-module--placeholder--97f4S",htmlFor:"search"},"Search protocols",r.createElement("span",{className:"Search-module--placeholderExtraText--3R9o1"}," to use in your own software")),r.createElement("button",{className:"Search-module--clearButton--3MgzD",onClick:e=>s(""),"aria-label":"Clear search text",type:"button"},r.createElement(l.l,{icon:n.P.cross,className:"Search-module--iconCross--3dnWa"})),r.createElement("button",{className:"Search-module--button--xD1TT",type:"submit","aria-label":"Search for protocols"},r.createElement(l.l,{icon:n.P.magnify,className:"Search-module--iconMagnify--j1Q9O"})))}},9042:function(e,t,a){a.d(t,{l:function(){return n}});var r=a(7294),l=a(5444);const n=e=>{let{icon:t,className:a,role:n,ariaHidden:c}=e;const{icons:{publicURL:m}}=(0,l.useStaticQuery)(o);return r.createElement("svg",{role:n,"aria-hidden":c,className:a},r.createElement("use",{href:m+"#"+t}))},o="3766577012"},8739:function(e,t,a){let r;a.d(t,{P:function(){return r}}),function(e){e.logo="logo",e.magnify="magnify",e.cross="cross",e.idea="idea",e.document="document",e.share="share",e.filter="filter"}(r||(r={}))},6126:function(e,t,a){a.r(t),a.d(t,{default:function(){return d}});var r=a(7294),l=a(5444),n=a(1937),o=a(7885),c=a(9042),m=a(6786);const s=e=>{let{features:t}=e;return r.createElement("ul",{className:"grid-3"},null==t?void 0:t.map((e=>r.createElement("li",{key:e.title},r.createElement("article",{className:"Features-module--feature--2-Z3l"},r.createElement(c.l,{role:"presentation",ariaHidden:!0,icon:e.icon,className:"Features-module--icon--3Lduc"}),r.createElement("h2",{className:(0,m.yI)("Features-module--title--1TZf3","font-title-2")},r.createElement("a",{href:e.link},e.title)),r.createElement("p",{className:"Features-module--text--LRQ-w",dangerouslySetInnerHTML:{__html:e.text}}))))))};var i=a(1838);const u=e=>{let{navigate:t}=e;return r.createElement("div",{className:"Hero-module--hero--1iQtF"},r.createElement("h1",{className:"font-title-1"},"Share protocols built on DIDComm"),r.createElement("p",{className:(0,m.yI)("Hero-module--subtitle--2Ew33","font-subheadline")},"Powerful, high-trust, self-sovereign interactions over any transport"),r.createElement(i.o,{onSearch:e=>t("/search/?q="+encodeURIComponent(e)+"&page=1")}),r.createElement("div",{className:"Hero-module--browseAll--2HlV5"},"or ",r.createElement(l.Link,{className:"Hero-module--browseAllLink--2T_ua",to:"/search/?page=1"},"browse all protocols")))};var d=e=>{let{data:t}=e;return r.createElement(n.A,null,r.createElement(o.h,{primary:!0}),r.createElement("main",null,r.createElement("section",null,r.createElement(u,{navigate:l.navigate})),r.createElement("section",{className:"content"},r.createElement(s,{features:t.markdownRemark.frontmatter.features}))))}}}]); +//# sourceMappingURL=component---src-pages-index-tsx-eb4a3aa53617243254eb.js.map \ No newline at end of file diff --git a/component---src-pages-index-tsx-eb4a3aa53617243254eb.js.map b/component---src-pages-index-tsx-eb4a3aa53617243254eb.js.map new file mode 100644 index 00000000..00c94fda --- /dev/null +++ b/component---src-pages-index-tsx-eb4a3aa53617243254eb.js.map @@ -0,0 +1 @@ +{"version":3,"file":"component---src-pages-index-tsx-eb4a3aa53617243254eb.js","mappings":"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","sources":["webpack://didcomm-website/./src/components/Header/Header.module.scss","webpack://didcomm-website/./src/components/Header/Header.tsx","webpack://didcomm-website/./src/components/Search/Search.tsx","webpack://didcomm-website/./src/components/Search/Search.module.scss","webpack://didcomm-website/./src/components/SvgIcon/SvgIcon.tsx","webpack://didcomm-website/./src/components/SvgIcon/SvgIcon.types.ts","webpack://didcomm-website/./src/components/Features/Features.tsx","webpack://didcomm-website/./src/components/Features/Features.module.scss","webpack://didcomm-website/./src/components/Hero/Hero.tsx","webpack://didcomm-website/./src/components/Hero/Hero.module.scss","webpack://didcomm-website/./src/pages/index.tsx"],"sourcesContent":["// extracted by mini-css-extract-plugin\nexport var header = \"Header-module--header--1Qt4T\";\nexport var container = \"Header-module--container--3KhaC\";\nexport var search = \"Header-module--search--ucYp8\";\nexport var linksContainer = \"Header-module--linksContainer--WRDuP\";\nexport var active = \"Header-module--active--1N9yZ\";\nexport var primary = \"Header-module--primary--yIDLc\";\nexport var logo = \"Header-module--logo--RPmCm\";\nexport var logoImg = \"Header-module--logoImg--f8A17\";\nexport var logoText = \"Header-module--logoText--EwM4-\";\nexport var links = \"Header-module--links--3cZB-\";\nexport var link = \"Header-module--link--4ebYS\";","import * as React from 'react'\nimport { Link } from 'gatsby'\n\nimport { cls } from '../../common/utils'\nimport { SvgIcon } from '../SvgIcon/SvgIcon'\nimport { Icons } from '../SvgIcon/SvgIcon.types'\nimport { Props } from './Header.types'\nimport * as styles from './Header.module.scss'\n\nexport const Header = ({ children, primary, className, hideLinks }: Props) => {\n return (\n
\n
\n \n \n DIDComm\n \n
{children}
\n {!hideLinks && (\n \n )}\n
\n
\n )\n}\n","import * as React from 'react'\nimport { useState, FormEventHandler } from 'react'\n\nimport { SvgIcon } from '../SvgIcon/SvgIcon'\nimport { Icons } from '../SvgIcon/SvgIcon.types'\nimport { cls } from '../../common/utils'\nimport { Props } from './Search.types'\nimport * as styles from './Search.module.scss'\n\nexport const Search = ({ onSearch, query = '', bordered }: Props) => {\n const [value, setValue] = useState(query)\n\n const onSubmit: FormEventHandler = (e) => {\n e.preventDefault()\n onSearch(value)\n }\n\n return (\n
\n setValue(e.target.value)}\n autoCorrect=\"off\"\n placeholder=\" \"\n autoComplete=\"off\"\n type=\"text\"\n id=\"search\"\n />\n \n \n \n \n )\n}\n","// extracted by mini-css-extract-plugin\nexport var search = \"Search-module--search--3XfRF\";\nexport var input = \"Search-module--input--1o6QO\";\nexport var bordered = \"Search-module--bordered--34QxG\";\nexport var placeholder = \"Search-module--placeholder--97f4S\";\nexport var placeholderExtraText = \"Search-module--placeholderExtraText--3R9o1\";\nexport var button = \"Search-module--button--xD1TT\";\nexport var iconMagnify = \"Search-module--iconMagnify--j1Q9O\";\nexport var clearButton = \"Search-module--clearButton--3MgzD\";\nexport var iconCross = \"Search-module--iconCross--3dnWa\";","import * as React from 'react'\nimport { graphql, useStaticQuery } from 'gatsby'\n\nimport { Props, QueryData } from './SvgIcon.types'\n\nexport const SvgIcon = ({ icon, className, role, ariaHidden }: Props) => {\n const {\n icons: { publicURL: icons },\n } = useStaticQuery(query)\n return (\n \n \n \n )\n}\n\nconst query = graphql`\n {\n icons: file(base: { eq: \"icons.svg\" }) {\n publicURL\n }\n }\n`\n","export type QueryData = {\n icons: {\n publicURL: string\n }\n}\n\nexport type Props = {\n icon: Icons\n className: string\n role?: React.AriaRole\n ariaHidden?: boolean\n}\n\nexport enum Icons {\n logo = 'logo',\n magnify = 'magnify',\n cross = 'cross',\n idea = 'idea',\n document = 'document',\n share = 'share',\n filter = 'filter',\n}\n","import * as React from 'react'\n\nimport { SvgIcon } from '../SvgIcon/SvgIcon'\nimport { cls } from '../../common/utils'\nimport { Props } from './Features.type'\nimport * as styles from './Features.module.scss'\n\nexport const Features = ({ features }: Props) => {\n return (\n
    \n {features?.map((feature) => (\n
  • \n \n
  • \n ))}\n
\n )\n}\n","// extracted by mini-css-extract-plugin\nexport var feature = \"Features-module--feature--2-Z3l\";\nexport var icon = \"Features-module--icon--3Lduc\";\nexport var title = \"Features-module--title--1TZf3\";\nexport var text = \"Features-module--text--LRQ-w\";","import * as React from 'react'\n\nimport { Search } from '../Search/Search'\nimport { Link } from 'gatsby'\nimport { cls } from '../../common/utils'\nimport { Props } from './Hero.types'\nimport * as styles from './Hero.module.scss'\n\nexport const Hero = ({ navigate }: Props) => {\n return (\n
\n

Share protocols built on DIDComm

\n

Powerful, high-trust, self-sovereign interactions over any transport

\n navigate(`/search/?q=${encodeURIComponent(query)}&page=1`)} />\n
\n or \n \n browse all protocols\n \n
\n
\n )\n}\n","// extracted by mini-css-extract-plugin\nexport var hero = \"Hero-module--hero--1iQtF\";\nexport var subtitle = \"Hero-module--subtitle--2Ew33\";\nexport var browseAll = \"Hero-module--browseAll--2HlV5\";\nexport var browseAllLink = \"Hero-module--browseAllLink--2T_ua\";","import * as React from 'react'\nimport { graphql, PageProps, navigate } from 'gatsby'\n\nimport { Layout } from '../components/Layout/Layout'\nimport { Header } from '../components/Header/Header'\nimport { Features } from '../components/Features/Features'\nimport { Hero } from '../components/Hero/Hero'\nimport { QueryData } from './index.types'\n\nconst IndexPage = ({ data }: PageProps) => {\n return (\n \n
\n
\n
\n \n
\n
\n \n
\n
\n \n )\n}\n\nexport default IndexPage\n\nexport const query = graphql`\n {\n markdownRemark(frontmatter: { layout: { eq: \"index\" } }) {\n frontmatter {\n features {\n icon\n title\n text\n link\n }\n }\n }\n }\n`\n"],"names":["Header","children","primary","className","hideLinks","cls","Link","title","activeClassName","to","SvgIcon","icon","Icons","styles","rel","href","target","Search","onSearch","query","bordered","value","setValue","useState","onSubmit","e","preventDefault","role","onChange","autoCorrect","placeholder","autoComplete","type","id","htmlFor","onClick","_","ariaHidden","icons","publicURL","useStaticQuery","Features","features","map","feature","key","link","dangerouslySetInnerHTML","__html","text","Hero","navigate","encodeURIComponent","data","Layout","markdownRemark","frontmatter"],"sourceRoot":""} \ No newline at end of file diff --git a/component---src-templates-book-book-tsx-f87c4cd85a9942002b2d.js b/component---src-templates-book-book-tsx-f87c4cd85a9942002b2d.js new file mode 100644 index 00000000..2d24ce0b --- /dev/null +++ b/component---src-templates-book-book-tsx-f87c4cd85a9942002b2d.js @@ -0,0 +1,2 @@ +"use strict";(self.webpackChunkdidcomm_website=self.webpackChunkdidcomm_website||[]).push([[536],{8579:function(e,t,n){n.r(t),n.d(t,{BookTemplate:function(){return m},default:function(){return c}});var a=n(7294),l=n(1937);const r=e=>{let{html:t}=e;return a.createElement("main",null,a.createElement("div",{className:"grid-3"},a.createElement("article",{className:"Book-module--body--Hy0rr",dangerouslySetInnerHTML:{__html:t}})))},m=e=>{let{data:t,pageContext:n}=e;const{markdownRemark:{}}=t;return a.createElement(l.A,null,a.createElement("div",{className:"content"},a.createElement(r,{html:n.html})))};var c=m}}]); +//# sourceMappingURL=component---src-templates-book-book-tsx-f87c4cd85a9942002b2d.js.map \ No newline at end of file diff --git a/component---src-templates-book-book-tsx-f87c4cd85a9942002b2d.js.map b/component---src-templates-book-book-tsx-f87c4cd85a9942002b2d.js.map new file mode 100644 index 00000000..73925c01 --- /dev/null +++ b/component---src-templates-book-book-tsx-f87c4cd85a9942002b2d.js.map @@ -0,0 +1 @@ +{"version":3,"file":"component---src-templates-book-book-tsx-f87c4cd85a9942002b2d.js","mappings":"8NAUA,MAAMA,EAAO,QAAC,KAAEC,GAAH,SACX,4BACE,uBAAKC,UAAU,UACb,2BAASA,UCXG,2BDWqBC,wBAAyB,CAAEC,OAAQH,QAK7DI,EAAe,IAA8D,IAA7D,KAAEC,EAAF,YAAQC,GAAoD,EACvF,MACEC,mBACEF,EAEJ,OACE,gBAACG,EAAA,EAAD,KACE,uBAAKP,UAAU,WACb,gBAACF,EAAD,CAAMC,KAAMM,EAAYN,UAMhC","sources":["webpack://didcomm-website/./src/templates/Book/Book.tsx","webpack://didcomm-website/./src/templates/Book/Book.module.scss"],"sourcesContent":["import * as React from 'react'\nimport { graphql, PageProps, navigate } from 'gatsby'\n\nimport { Header } from '../../components/Header/Header'\nimport { Status } from '../../components/Status/Status'\nimport { Layout } from '../../components/Layout/Layout'\nimport { cls } from '../../common/utils'\nimport { mdRemark, PageContext, Props } from './Book.types'\nimport * as styles from './Book.module.scss'\n\nconst Book = ({ html }: Props) => (\n
\n
\n
\n
\n
\n)\n\nexport const BookTemplate = ({ data, pageContext }: PageProps) => {\n const {\n markdownRemark: { },\n } = data\n\n return (\n \n
\n \n
\n
\n )\n}\n\nexport default BookTemplate\n\nexport const query = graphql`\n query ($id: String!) {\n markdownRemark(id: { eq: $id }) {\n html\n }\n }\n`\n","// extracted by mini-css-extract-plugin\nexport var title = \"Book-module--title--3XmVr\";\nexport var body = \"Book-module--body--Hy0rr\";\nexport var meta = \"Book-module--meta--2P1gP\";\nexport var metaTitle = \"Book-module--metaTitle--1KE11\";\nexport var metaContent = \"Book-module--metaContent--1z1bA\";\nexport var version = \"Book-module--version--161Eu\";"],"names":["Book","html","className","dangerouslySetInnerHTML","__html","BookTemplate","data","pageContext","markdownRemark","Layout"],"sourceRoot":""} \ No newline at end of file diff --git a/component---src-templates-protocol-protocol-tsx-3391b2f00d0a4ae5a5c3.js b/component---src-templates-protocol-protocol-tsx-3391b2f00d0a4ae5a5c3.js new file mode 100644 index 00000000..940f42d8 --- /dev/null +++ b/component---src-templates-protocol-protocol-tsx-3391b2f00d0a4ae5a5c3.js @@ -0,0 +1,2 @@ +(self.webpackChunkdidcomm_website=self.webpackChunkdidcomm_website||[]).push([[255],{7235:function(e){e.exports=function(){"use strict";return function(e,t,a){e=e||{};var r=t.prototype,n={future:"in %s",past:"%s ago",s:"a few seconds",m:"a minute",mm:"%d minutes",h:"an hour",hh:"%d hours",d:"a day",dd:"%d days",M:"a month",MM:"%d months",y:"a year",yy:"%d years"};function o(e,t,a,n){return r.fromToBase(e,t,a,n)}a.en.relativeTime=n,r.fromToBase=function(t,r,o,l,s){for(var c,m,i,u=o.$locale().relativeTime||n,d=e.thresholds||[{l:"s",r:44,d:"second"},{l:"m",r:89},{l:"mm",r:44,d:"minute"},{l:"h",r:89},{l:"hh",r:21,d:"hour"},{l:"d",r:35},{l:"dd",r:25,d:"day"},{l:"M",r:45},{l:"MM",r:10,d:"month"},{l:"y",r:17},{l:"yy",d:"year"}],f=d.length,h=0;h0,E<=p.r||!p.r){E<=1&&h>0&&(p=d[h-1]);var v=u[p.l];s&&(E=s(""+E)),m="string"==typeof v?v.replace("%d",E):v(E,r,p.l,i);break}}if(r)return m;var y=i?u.future:u.past;return"function"==typeof y?y(m):y.replace("%s",m)},r.to=function(e,t){return o(e,t,this,!0)},r.from=function(e,t){return o(e,t,this)};var l=function(e){return e.$u?a.utc():a()};r.toNow=function(e){return this.to(l(this),e)},r.fromNow=function(e){return this.from(l(this),e)}}}()},2575:function(e,t,a){"use strict";a.d(t,{gK:function(){return r},Kd:function(){return n},zT:function(){return o}});const r=10,n="https://github.com",o="YYYY MMM D, HH:MM A"},793:function(e,t,a){"use strict";a.d(t,{q:function(){return r}});const r={Proposed:"proposed",Demonstrated:"demonstrated",Production:"production"};let n;!function(e){e.year="year",e.month="month",e.week="week",e.day="day"}(n||(n={}))},1047:function(e,t,a){"use strict";a.d(t,{q:function(){return l}});var r=a(7294),n=a(2575),o=a(6786);const l=e=>{let{publisher:t,avatar:a}=e;return r.createElement("a",{rel:"noreferrer noopener nofollow","aria-label":"GitHub profile "+t,className:"Avatar-module--avatar--2HGSY",target:"_blank",href:n.Kd+"/"+t},r.createElement("div",{style:{backgroundImage:"url("+a+")"},className:(0,o.yI)("Avatar-module--img--3CeLS","font-footnote")}),r.createElement("span",{className:(0,o.yI)("font-footnote","Avatar-module--publisher--ktcuv")},"@",t))}},7885:function(e,t,a){"use strict";a.d(t,{h:function(){return m}});var r=a(7294),n=a(5444),o=a(6786),l=a(9042),s=a(8739),c="Header-module--link--4ebYS";const m=e=>{let{children:t,primary:a,className:m,hideLinks:i}=e;return r.createElement("header",{className:(0,o.yI)("Header-module--header--1Qt4T",a&&"Header-module--primary--yIDLc",m)},r.createElement("div",{className:"Header-module--container--3KhaC"},r.createElement(n.Link,{title:"Link to home",activeClassName:"Header-module--active--1N9yZ",className:"Header-module--logo--RPmCm",to:"/","aria-label":"Link to home"},r.createElement(l.l,{icon:s.P.logo,className:"Header-module--logoImg--f8A17"}),r.createElement("span",{className:(0,o.yI)("Header-module--logoText--EwM4-","hide-mobile")},"DIDComm")),r.createElement("div",{className:"Header-module--search--ucYp8"},t),!i&&r.createElement("nav",{className:(0,o.yI)("hide-mobile font-footnote","Header-module--linksContainer--WRDuP")},r.createElement("ul",{className:"Header-module--links--3cZB-"},r.createElement("li",null,r.createElement("a",{className:c,rel:"noreferrer noopener nofollow",href:"https://github.com/decentralized-identity/didcomm.org",target:"_blank"},"GitHub repo")),r.createElement("li",null,r.createElement("a",{className:c,rel:"noreferrer noopener nofollow",href:"https://identity.foundation/didcomm-messaging/spec/v2.1/",target:"_blank"},"Specification")),r.createElement("li",null,r.createElement("a",{className:c,href:"mailto:security@didcomm.org"},"Security"))))))}},2157:function(e,t,a){"use strict";a.d(t,{O:function(){return m}});var r=a(7294),n=a(8538),o=a.n(n),l=a(7235),s=a.n(l),c=a(2575);o().extend(s());const m=e=>{let{lastModified:t,className:a,since:n}=e;const l=n?o()().to(t):o()(t).format(c.zT);return r.createElement("span",{className:a},l)}},1838:function(e,t,a){"use strict";a.d(t,{o:function(){return s}});var r=a(7294),n=a(9042),o=a(8739),l=a(6786);const s=e=>{let{onSearch:t,query:a="",bordered:s}=e;const{0:c,1:m}=(0,r.useState)(a);return r.createElement("form",{className:"Search-module--search--3XfRF",onSubmit:e=>{e.preventDefault(),t(c)},role:"search"},r.createElement("input",{className:(0,l.yI)("Search-module--input--1o6QO","rounded",s&&"Search-module--bordered--34QxG"),value:c,onChange:e=>m(e.target.value),autoCorrect:"off",placeholder:" ",autoComplete:"off",type:"text",id:"search"}),r.createElement("label",{className:"Search-module--placeholder--97f4S",htmlFor:"search"},"Search protocols",r.createElement("span",{className:"Search-module--placeholderExtraText--3R9o1"}," to use in your own software")),r.createElement("button",{className:"Search-module--clearButton--3MgzD",onClick:e=>m(""),"aria-label":"Clear search text",type:"button"},r.createElement(n.l,{icon:o.P.cross,className:"Search-module--iconCross--3dnWa"})),r.createElement("button",{className:"Search-module--button--xD1TT",type:"submit","aria-label":"Search for protocols"},r.createElement(n.l,{icon:o.P.magnify,className:"Search-module--iconMagnify--j1Q9O"})))}},9918:function(e,t,a){"use strict";a.d(t,{q:function(){return u}});var r={};a.r(r),a.d(r,{demonstrated:function(){return i},production:function(){return m},proposed:function(){return c},status:function(){return s}});var n=a(7294),o=a(6786),l=a(793),s="Status-module--status--1dG8s",c="Status-module--proposed--3zY0z",m="Status-module--production--6xwxX",i="Status-module--demonstrated--2VaNN";const u=e=>{let{type:t}=e;return n.createElement("div",{className:(0,o.yI)(s,r[l.q[t]])},t)}},9042:function(e,t,a){"use strict";a.d(t,{l:function(){return o}});var r=a(7294),n=a(5444);const o=e=>{let{icon:t,className:a,role:o,ariaHidden:s}=e;const{icons:{publicURL:c}}=(0,n.useStaticQuery)(l);return r.createElement("svg",{role:o,"aria-hidden":s,className:a},r.createElement("use",{href:c+"#"+t}))},l="3766577012"},8739:function(e,t,a){"use strict";let r;a.d(t,{P:function(){return r}}),function(e){e.logo="logo",e.magnify="magnify",e.cross="cross",e.idea="idea",e.document="document",e.share="share",e.filter="filter"}(r||(r={}))},5205:function(e,t,a){"use strict";a.d(t,{$:function(){return o}});var r=a(7294),n=a(5444);const o=e=>{let{tags:t,onClick:a}=e;const o=e=>t=>{t.preventDefault(),a(e)};return r.createElement("div",{className:"Tags-module--tags--11-St"},t.map((e=>r.createElement(n.Link,{to:"/search?tag="+e,onClick:a?o(e):void 0,key:e,className:"Tags-module--tag--14doh"},"# ",e))))}},2559:function(e,t,a){"use strict";a.r(t),a.d(t,{ProtocolTemplate:function(){return v},default:function(){return y}});var r=a(7294),n=a(5444),o=a(1047),l=a(7885),s=a(9918),c=a(1937),m=a(5205),i=a(1838),u=a(6786),d="Protocol-module--metaTitle--PGKpJ",f="Protocol-module--metaContent--1hPYi",h=a(2157);const p=e=>{let{authors:t}=e;return r.createElement("div",{className:"Authors-module--authors--fKUTX"},t.map((e=>{let{name:t,email:a}=e;return a?r.createElement("a",{key:t+a,className:(0,u.yI)("font-footnote","Authors-module--link--2M7F6"),href:"mailto:"+a},t):r.createElement("span",{key:t+a,className:"font-footnote"},t)})))},E=e=>{let{html:t,tags:a,license:n,title:l,avatar:c,publisher:i,version:E,status:v,piuri:y,summary:N,modifiedDate:b,authors:g}=e;return r.createElement("main",null,r.createElement("h1",{className:(0,u.yI)("font-title-1","Protocol-module--title--1yzjp")},l," ",r.createElement("span",{className:(0,u.yI)("font-footnote","Protocol-module--version--vKpW5")},E)),r.createElement("div",{className:"grid-3"},r.createElement("article",{className:"Protocol-module--body--3yTdm"},r.createElement("h2",null,"Summary"),r.createElement("p",null,N),r.createElement("div",{dangerouslySetInnerHTML:{__html:t}})),r.createElement("div",{className:"Protocol-module--meta--1e1pP"},r.createElement("div",{className:f},r.createElement("div",{className:(0,u.yI)("font-subheadline",d)},"PIURI"),r.createElement("div",{className:"font-footnote"},y)),r.createElement("div",{className:f},r.createElement("div",{className:(0,u.yI)("font-subheadline",d)},"Status"),r.createElement(s.q,{type:v})),r.createElement("div",{className:f},r.createElement("div",{className:(0,u.yI)("font-subheadline",d)},"Hashtags"),r.createElement(m.$,{tags:a})),r.createElement("div",{className:f},r.createElement("div",{className:(0,u.yI)("font-subheadline",d)},"Publisher"),r.createElement(o.q,{publisher:i,avatar:c})),r.createElement("div",{className:f},r.createElement("div",{className:(0,u.yI)("font-subheadline",d)},"Authors"),r.createElement(p,{authors:g})),r.createElement("div",{className:"hide-mobile hide-print"},r.createElement("div",{className:f},r.createElement("div",{className:(0,u.yI)("font-subheadline",d)},"Version"),r.createElement("div",{className:"font-footnote"},E))),r.createElement("div",{className:f},r.createElement("div",{className:(0,u.yI)("font-subheadline",d)},"License"),r.createElement("div",{className:"font-footnote"},n)),r.createElement("div",{className:f},r.createElement("div",{className:(0,u.yI)("font-subheadline",d)},"Last modified"),r.createElement(h.O,{className:"font-footnote",lastModified:b})))))},v=e=>{let{data:t,pageContext:a}=e;const{markdownRemark:{frontmatter:o,fields:s}}=t;return r.createElement(c.A,{title:o.title},r.createElement(l.h,{className:"hide-print"},r.createElement(i.o,{bordered:!0,onSearch:e=>(0,n.navigate)("/search/?q="+encodeURIComponent(e)+"&page=1")})),r.createElement("div",{className:"content"},r.createElement(E,Object.assign({},o,{html:a.html},s))))};var y=v}}]); +//# sourceMappingURL=component---src-templates-protocol-protocol-tsx-3391b2f00d0a4ae5a5c3.js.map \ No newline at end of file diff --git a/component---src-templates-protocol-protocol-tsx-3391b2f00d0a4ae5a5c3.js.map b/component---src-templates-protocol-protocol-tsx-3391b2f00d0a4ae5a5c3.js.map new file mode 100644 index 00000000..8cb444c5 --- /dev/null +++ b/component---src-templates-protocol-protocol-tsx-3391b2f00d0a4ae5a5c3.js.map @@ -0,0 +1 @@ +{"version":3,"file":"component---src-templates-protocol-protocol-tsx-3391b2f00d0a4ae5a5c3.js","mappings":"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","sources":["webpack://didcomm-website/./node_modules/dayjs/plugin/relativeTime.js","webpack://didcomm-website/./src/common/constants.ts","webpack://didcomm-website/./src/common/types.ts","webpack://didcomm-website/./src/components/Avatar/Avatar.tsx","webpack://didcomm-website/./src/components/Avatar/Avatar.module.scss","webpack://didcomm-website/./src/components/Header/Header.module.scss","webpack://didcomm-website/./src/components/Header/Header.tsx","webpack://didcomm-website/./src/components/LastModified/LastModified.tsx","webpack://didcomm-website/./src/components/Search/Search.tsx","webpack://didcomm-website/./src/components/Search/Search.module.scss","webpack://didcomm-website/./src/components/Status/Status.module.scss","webpack://didcomm-website/./src/components/Status/Status.tsx","webpack://didcomm-website/./src/components/SvgIcon/SvgIcon.tsx","webpack://didcomm-website/./src/components/SvgIcon/SvgIcon.types.ts","webpack://didcomm-website/./src/components/Tags/Tags.tsx","webpack://didcomm-website/./src/components/Tags/Tags.module.scss","webpack://didcomm-website/./src/templates/Protocol/Protocol.module.scss","webpack://didcomm-website/./src/components/Authors/Authors.tsx","webpack://didcomm-website/./src/components/Authors/Authors.module.scss","webpack://didcomm-website/./src/templates/Protocol/Protocol.tsx"],"sourcesContent":["!function (r, e) {\n \"object\" == typeof exports && \"undefined\" != typeof module ? module.exports = e() : \"function\" == typeof define && define.amd ? define(e) : (r = \"undefined\" != typeof globalThis ? globalThis : r || self).dayjs_plugin_relativeTime = e();\n}(this, function () {\n \"use strict\";\n\n return function (r, e, t) {\n r = r || {};\n var n = e.prototype,\n o = {\n future: \"in %s\",\n past: \"%s ago\",\n s: \"a few seconds\",\n m: \"a minute\",\n mm: \"%d minutes\",\n h: \"an hour\",\n hh: \"%d hours\",\n d: \"a day\",\n dd: \"%d days\",\n M: \"a month\",\n MM: \"%d months\",\n y: \"a year\",\n yy: \"%d years\"\n };\n\n function i(r, e, t, o) {\n return n.fromToBase(r, e, t, o);\n }\n\n t.en.relativeTime = o, n.fromToBase = function (e, n, i, d, u) {\n for (var f, a, s, l = i.$locale().relativeTime || o, h = r.thresholds || [{\n l: \"s\",\n r: 44,\n d: \"second\"\n }, {\n l: \"m\",\n r: 89\n }, {\n l: \"mm\",\n r: 44,\n d: \"minute\"\n }, {\n l: \"h\",\n r: 89\n }, {\n l: \"hh\",\n r: 21,\n d: \"hour\"\n }, {\n l: \"d\",\n r: 35\n }, {\n l: \"dd\",\n r: 25,\n d: \"day\"\n }, {\n l: \"M\",\n r: 45\n }, {\n l: \"MM\",\n r: 10,\n d: \"month\"\n }, {\n l: \"y\",\n r: 17\n }, {\n l: \"yy\",\n d: \"year\"\n }], m = h.length, c = 0; c < m; c += 1) {\n var y = h[c];\n y.d && (f = d ? t(e).diff(i, y.d, !0) : i.diff(e, y.d, !0));\n var p = (r.rounding || Math.round)(Math.abs(f));\n\n if (s = f > 0, p <= y.r || !y.r) {\n p <= 1 && c > 0 && (y = h[c - 1]);\n var v = l[y.l];\n u && (p = u(\"\" + p)), a = \"string\" == typeof v ? v.replace(\"%d\", p) : v(p, n, y.l, s);\n break;\n }\n }\n\n if (n) return a;\n var M = s ? l.future : l.past;\n return \"function\" == typeof M ? M(a) : M.replace(\"%s\", a);\n }, n.to = function (r, e) {\n return i(r, e, this, !0);\n }, n.from = function (r, e) {\n return i(r, e, this);\n };\n\n var d = function (r) {\n return r.$u ? t.utc() : t();\n };\n\n n.toNow = function (r) {\n return this.to(d(this), r);\n }, n.fromNow = function (r) {\n return this.from(d(this), r);\n };\n };\n});","export const ITEMS_PER_PAGE = 10\nexport const GITHUB_URL = 'https://github.com'\nexport const DATE_FORMAT = 'YYYY MMM D, HH:MM A'\n","export type AllMarkdownRemark = {\n nodes: TNode[]\n}\nexport const Status = {\n Proposed: 'proposed',\n Demonstrated: 'demonstrated',\n Production: 'production',\n} as const\n\nexport type StatusType = keyof typeof Status\n\nexport enum DateUnit {\n year = 'year',\n month = 'month',\n week = 'week',\n day = 'day',\n}\n\nexport type Author = {\n name: string\n email?: string\n}\n\nexport type MDProtocol = {\n fields: {\n slug: string\n version: string\n avatar: string\n modifiedDate: string\n }\n frontmatter: {\n tags: string[]\n title: string\n license: string\n status: StatusType\n publisher: string\n summary: string\n piuri: string\n authors: Array\n }\n html: string\n}\n\nexport type Protocol = {\n slug: string\n tags: string[]\n title: string\n license: string\n html: string\n version: string\n status: StatusType\n publisher: string\n avatar: string\n modifiedDate: string\n summary: string\n piuri: string\n authors: Array\n}\n\nexport type Filters = {\n status: Array\n license: Array\n dateUnit: DateUnit\n tag: Array\n}\n","import * as React from 'react'\nimport { GITHUB_URL } from '../../common/constants'\nimport { cls } from '../../common/utils'\nimport { Props } from './Avatar.types'\nimport * as styles from './Avatar.module.scss'\n\nexport const Avatar = ({ publisher, avatar }: Props) => {\n return (\n \n
\n @{publisher}\n \n )\n}\n","// extracted by mini-css-extract-plugin\nexport var avatar = \"Avatar-module--avatar--2HGSY\";\nexport var img = \"Avatar-module--img--3CeLS\";\nexport var publisher = \"Avatar-module--publisher--ktcuv\";","// extracted by mini-css-extract-plugin\nexport var header = \"Header-module--header--1Qt4T\";\nexport var container = \"Header-module--container--3KhaC\";\nexport var search = \"Header-module--search--ucYp8\";\nexport var linksContainer = \"Header-module--linksContainer--WRDuP\";\nexport var active = \"Header-module--active--1N9yZ\";\nexport var primary = \"Header-module--primary--yIDLc\";\nexport var logo = \"Header-module--logo--RPmCm\";\nexport var logoImg = \"Header-module--logoImg--f8A17\";\nexport var logoText = \"Header-module--logoText--EwM4-\";\nexport var links = \"Header-module--links--3cZB-\";\nexport var link = \"Header-module--link--4ebYS\";","import * as React from 'react'\nimport { Link } from 'gatsby'\n\nimport { cls } from '../../common/utils'\nimport { SvgIcon } from '../SvgIcon/SvgIcon'\nimport { Icons } from '../SvgIcon/SvgIcon.types'\nimport { Props } from './Header.types'\nimport * as styles from './Header.module.scss'\n\nexport const Header = ({ children, primary, className, hideLinks }: Props) => {\n return (\n
\n
\n \n \n DIDComm\n \n
{children}
\n {!hideLinks && (\n \n )}\n
\n
\n )\n}\n","import * as React from 'react'\nimport dayjs from 'dayjs'\nimport relativeTime from 'dayjs/plugin/relativeTime'\n\nimport { DATE_FORMAT } from '../../common/constants'\nimport { Props } from './LastModified.types'\n\ndayjs.extend(relativeTime)\n\nexport const LastModified = ({ lastModified, className, since }: Props) => {\n const date = since ? dayjs().to(lastModified) : dayjs(lastModified).format(DATE_FORMAT)\n return {date}\n}\n","import * as React from 'react'\nimport { useState, FormEventHandler } from 'react'\n\nimport { SvgIcon } from '../SvgIcon/SvgIcon'\nimport { Icons } from '../SvgIcon/SvgIcon.types'\nimport { cls } from '../../common/utils'\nimport { Props } from './Search.types'\nimport * as styles from './Search.module.scss'\n\nexport const Search = ({ onSearch, query = '', bordered }: Props) => {\n const [value, setValue] = useState(query)\n\n const onSubmit: FormEventHandler = (e) => {\n e.preventDefault()\n onSearch(value)\n }\n\n return (\n
\n setValue(e.target.value)}\n autoCorrect=\"off\"\n placeholder=\" \"\n autoComplete=\"off\"\n type=\"text\"\n id=\"search\"\n />\n \n \n \n \n )\n}\n","// extracted by mini-css-extract-plugin\nexport var search = \"Search-module--search--3XfRF\";\nexport var input = \"Search-module--input--1o6QO\";\nexport var bordered = \"Search-module--bordered--34QxG\";\nexport var placeholder = \"Search-module--placeholder--97f4S\";\nexport var placeholderExtraText = \"Search-module--placeholderExtraText--3R9o1\";\nexport var button = \"Search-module--button--xD1TT\";\nexport var iconMagnify = \"Search-module--iconMagnify--j1Q9O\";\nexport var clearButton = \"Search-module--clearButton--3MgzD\";\nexport var iconCross = \"Search-module--iconCross--3dnWa\";","// extracted by mini-css-extract-plugin\nexport var status = \"Status-module--status--1dG8s\";\nexport var proposed = \"Status-module--proposed--3zY0z\";\nexport var production = \"Status-module--production--6xwxX\";\nexport var demonstrated = \"Status-module--demonstrated--2VaNN\";","import * as React from 'react'\n\nimport { cls } from '../../common/utils'\nimport { Status as StatusEnum } from '../../common/types'\nimport { Props } from './Status.types'\nimport * as styles from './Status.module.scss'\n\nexport const Status = ({ type }: Props) => {\n return
{type}
\n}\n","import * as React from 'react'\nimport { graphql, useStaticQuery } from 'gatsby'\n\nimport { Props, QueryData } from './SvgIcon.types'\n\nexport const SvgIcon = ({ icon, className, role, ariaHidden }: Props) => {\n const {\n icons: { publicURL: icons },\n } = useStaticQuery(query)\n return (\n \n \n \n )\n}\n\nconst query = graphql`\n {\n icons: file(base: { eq: \"icons.svg\" }) {\n publicURL\n }\n }\n`\n","export type QueryData = {\n icons: {\n publicURL: string\n }\n}\n\nexport type Props = {\n icon: Icons\n className: string\n role?: React.AriaRole\n ariaHidden?: boolean\n}\n\nexport enum Icons {\n logo = 'logo',\n magnify = 'magnify',\n cross = 'cross',\n idea = 'idea',\n document = 'document',\n share = 'share',\n filter = 'filter',\n}\n","import * as React from 'react'\n\nimport { Props } from './Tags.types'\nimport * as styles from './Tags.module.scss'\nimport { Link } from 'gatsby'\n\nexport const Tags = ({ tags, onClick }: Props) => {\n const onTagClick = (tag: string) => (e: React.MouseEvent) => {\n e.preventDefault()\n onClick(tag)\n }\n\n return (\n
\n {tags.map((tag) => (\n \n # {tag}\n \n ))}\n
\n )\n}\n","// extracted by mini-css-extract-plugin\nexport var tags = \"Tags-module--tags--11-St\";\nexport var tag = \"Tags-module--tag--14doh\";","// extracted by mini-css-extract-plugin\nexport var title = \"Protocol-module--title--1yzjp\";\nexport var body = \"Protocol-module--body--3yTdm\";\nexport var meta = \"Protocol-module--meta--1e1pP\";\nexport var metaTitle = \"Protocol-module--metaTitle--PGKpJ\";\nexport var metaContent = \"Protocol-module--metaContent--1hPYi\";\nexport var version = \"Protocol-module--version--vKpW5\";","import * as React from 'react'\n\nimport { cls } from '../../common/utils'\nimport { Props } from './Authors.types'\nimport * as styles from './Authors.module.scss'\n\nexport const Authors = ({ authors }: Props) => (\n
\n {authors.map(({ name, email }) =>\n email ? (\n \n {name}\n \n ) : (\n \n {name}\n \n ),\n )}\n
\n)\n","// extracted by mini-css-extract-plugin\nexport var authors = \"Authors-module--authors--fKUTX\";\nexport var link = \"Authors-module--link--2M7F6\";","import * as React from 'react'\nimport { graphql, PageProps, navigate } from 'gatsby'\n\nimport { Avatar } from '../../components/Avatar/Avatar'\nimport { Header } from '../../components/Header/Header'\nimport { Status } from '../../components/Status/Status'\nimport { Layout } from '../../components/Layout/Layout'\nimport { Tags } from '../../components/Tags/Tags'\nimport { Search } from '../../components/Search/Search'\nimport { cls } from '../../common/utils'\nimport { mdRemark, PageContext, Props } from './Protocol.types'\nimport * as styles from './Protocol.module.scss'\nimport { LastModified } from '../../components/LastModified/LastModified'\nimport { Authors } from '../../components/Authors/Authors'\n\nconst Protocol = ({ html, tags, license, title, avatar, publisher, version, status, piuri, summary, modifiedDate, authors }: Props) => (\n
\n

\n {title} {version}\n

\n
\n
\n

Summary

\n

{summary}

\n
\n
\n
\n
\n
PIURI
\n
{piuri}
\n
\n
\n
Status
\n \n
\n
\n
Hashtags
\n \n
\n
\n
Publisher
\n \n
\n
\n
Authors
\n \n
\n
\n
\n
Version
\n
{version}
\n
\n
\n
\n
License
\n
{license}
\n
\n
\n
Last modified
\n \n
\n
\n
\n
\n)\n\nexport const ProtocolTemplate = ({ data, pageContext }: PageProps) => {\n const {\n markdownRemark: { frontmatter, fields },\n } = data\n\n return (\n \n
\n navigate(`/search/?q=${encodeURIComponent(query)}&page=1`)} />\n
\n
\n \n
\n
\n )\n}\n\nexport default ProtocolTemplate\n\nexport const query = graphql`\n query ($id: String!) {\n markdownRemark(id: { eq: $id }) {\n html\n frontmatter {\n title\n tags\n license\n publisher\n status\n piuri\n summary\n authors {\n name\n email\n }\n }\n fields {\n modifiedDate\n avatar\n version\n }\n }\n }\n`\n"],"names":["module","exports","r","e","t","n","prototype","o","future","past","s","m","mm","h","hh","d","dd","M","MM","y","yy","i","fromToBase","en","relativeTime","u","f","a","l","$locale","thresholds","length","c","diff","p","rounding","Math","round","abs","v","replace","to","this","from","$u","utc","toNow","fromNow","ITEMS_PER_PAGE","GITHUB_URL","DATE_FORMAT","Status","Proposed","Demonstrated","Production","DateUnit","Avatar","publisher","avatar","rel","className","target","href","style","backgroundImage","cls","Header","children","primary","hideLinks","Link","title","activeClassName","SvgIcon","icon","Icons","styles","dayjs","LastModified","lastModified","since","date","format","Search","onSearch","query","bordered","value","setValue","useState","onSubmit","preventDefault","role","onChange","autoCorrect","placeholder","autoComplete","type","id","htmlFor","onClick","_","proposed","production","demonstrated","StatusEnum","ariaHidden","icons","publicURL","useStaticQuery","Tags","tags","onTagClick","tag","map","undefined","key","metaTitle","metaContent","Authors","authors","name","email","Protocol","html","license","version","status","piuri","summary","modifiedDate","dangerouslySetInnerHTML","__html","ProtocolTemplate","data","pageContext","markdownRemark","frontmatter","fields","Layout","navigate","encodeURIComponent"],"sourceRoot":""} \ No newline at end of file diff --git a/component---src-templates-search-search-tsx-e8abc6de2d7bc98ba3a7.js b/component---src-templates-search-search-tsx-e8abc6de2d7bc98ba3a7.js new file mode 100644 index 00000000..54e768c2 --- /dev/null +++ b/component---src-templates-search-search-tsx-e8abc6de2d7bc98ba3a7.js @@ -0,0 +1,2 @@ +(self.webpackChunkdidcomm_website=self.webpackChunkdidcomm_website||[]).push([[504],{7235:function(e){e.exports=function(){"use strict";return function(e,t,a){e=e||{};var n=t.prototype,r={future:"in %s",past:"%s ago",s:"a few seconds",m:"a minute",mm:"%d minutes",h:"an hour",hh:"%d hours",d:"a day",dd:"%d days",M:"a month",MM:"%d months",y:"a year",yy:"%d years"};function o(e,t,a,r){return n.fromToBase(e,t,a,r)}a.en.relativeTime=r,n.fromToBase=function(t,n,o,l,s){for(var c,i,u,m=o.$locale().relativeTime||r,d=e.thresholds||[{l:"s",r:44,d:"second"},{l:"m",r:89},{l:"mm",r:44,d:"minute"},{l:"h",r:89},{l:"hh",r:21,d:"hour"},{l:"d",r:35},{l:"dd",r:25,d:"day"},{l:"M",r:45},{l:"MM",r:10,d:"month"},{l:"y",r:17},{l:"yy",d:"year"}],h=d.length,f=0;f0,g<=p.r||!p.r){g<=1&&f>0&&(p=d[f-1]);var v=m[p.l];s&&(g=s(""+g)),i="string"==typeof v?v.replace("%d",g):v(g,n,p.l,u);break}}if(n)return i;var y=u?m.future:m.past;return"function"==typeof y?y(i):y.replace("%s",i)},n.to=function(e,t){return o(e,t,this,!0)},n.from=function(e,t){return o(e,t,this)};var l=function(e){return e.$u?a.utc():a()};n.toNow=function(e){return this.to(l(this),e)},n.fromNow=function(e){return this.from(l(this),e)}}}()},2575:function(e,t,a){"use strict";a.d(t,{gK:function(){return n},Kd:function(){return r},zT:function(){return o}});const n=10,r="https://github.com",o="YYYY MMM D, HH:MM A"},793:function(e,t,a){"use strict";a.d(t,{q:function(){return n}});const n={Proposed:"proposed",Demonstrated:"demonstrated",Production:"production"};let r;!function(e){e.year="year",e.month="month",e.week="week",e.day="day"}(r||(r={}))},1047:function(e,t,a){"use strict";a.d(t,{q:function(){return l}});var n=a(7294),r=a(2575),o=a(6786);const l=e=>{let{publisher:t,avatar:a}=e;return n.createElement("a",{rel:"noreferrer noopener nofollow","aria-label":"GitHub profile "+t,className:"Avatar-module--avatar--2HGSY",target:"_blank",href:r.Kd+"/"+t},n.createElement("div",{style:{backgroundImage:"url("+a+")"},className:(0,o.yI)("Avatar-module--img--3CeLS","font-footnote")}),n.createElement("span",{className:(0,o.yI)("font-footnote","Avatar-module--publisher--ktcuv")},"@",t))}},7885:function(e,t,a){"use strict";a.d(t,{h:function(){return i}});var n=a(7294),r=a(5444),o=a(6786),l=a(9042),s=a(8739),c="Header-module--link--4ebYS";const i=e=>{let{children:t,primary:a,className:i,hideLinks:u}=e;return n.createElement("header",{className:(0,o.yI)("Header-module--header--1Qt4T",a&&"Header-module--primary--yIDLc",i)},n.createElement("div",{className:"Header-module--container--3KhaC"},n.createElement(r.Link,{title:"Link to home",activeClassName:"Header-module--active--1N9yZ",className:"Header-module--logo--RPmCm",to:"/","aria-label":"Link to home"},n.createElement(l.l,{icon:s.P.logo,className:"Header-module--logoImg--f8A17"}),n.createElement("span",{className:(0,o.yI)("Header-module--logoText--EwM4-","hide-mobile")},"DIDComm")),n.createElement("div",{className:"Header-module--search--ucYp8"},t),!u&&n.createElement("nav",{className:(0,o.yI)("hide-mobile font-footnote","Header-module--linksContainer--WRDuP")},n.createElement("ul",{className:"Header-module--links--3cZB-"},n.createElement("li",null,n.createElement("a",{className:c,rel:"noreferrer noopener nofollow",href:"https://github.com/decentralized-identity/didcomm.org",target:"_blank"},"GitHub repo")),n.createElement("li",null,n.createElement("a",{className:c,rel:"noreferrer noopener nofollow",href:"https://identity.foundation/didcomm-messaging/spec/v2.1/",target:"_blank"},"Specification")),n.createElement("li",null,n.createElement("a",{className:c,href:"mailto:security@didcomm.org"},"Security"))))))}},2157:function(e,t,a){"use strict";a.d(t,{O:function(){return i}});var n=a(7294),r=a(8538),o=a.n(r),l=a(7235),s=a.n(l),c=a(2575);o().extend(s());const i=e=>{let{lastModified:t,className:a,since:r}=e;const l=r?o()().to(t):o()(t).format(c.zT);return n.createElement("span",{className:a},l)}},1838:function(e,t,a){"use strict";a.d(t,{o:function(){return s}});var n=a(7294),r=a(9042),o=a(8739),l=a(6786);const s=e=>{let{onSearch:t,query:a="",bordered:s}=e;const{0:c,1:i}=(0,n.useState)(a);return n.createElement("form",{className:"Search-module--search--3XfRF",onSubmit:e=>{e.preventDefault(),t(c)},role:"search"},n.createElement("input",{className:(0,l.yI)("Search-module--input--1o6QO","rounded",s&&"Search-module--bordered--34QxG"),value:c,onChange:e=>i(e.target.value),autoCorrect:"off",placeholder:" ",autoComplete:"off",type:"text",id:"search"}),n.createElement("label",{className:"Search-module--placeholder--97f4S",htmlFor:"search"},"Search protocols",n.createElement("span",{className:"Search-module--placeholderExtraText--3R9o1"}," to use in your own software")),n.createElement("button",{className:"Search-module--clearButton--3MgzD",onClick:e=>i(""),"aria-label":"Clear search text",type:"button"},n.createElement(r.l,{icon:o.P.cross,className:"Search-module--iconCross--3dnWa"})),n.createElement("button",{className:"Search-module--button--xD1TT",type:"submit","aria-label":"Search for protocols"},n.createElement(r.l,{icon:o.P.magnify,className:"Search-module--iconMagnify--j1Q9O"})))}},9918:function(e,t,a){"use strict";a.d(t,{q:function(){return m}});var n={};a.r(n),a.d(n,{demonstrated:function(){return u},production:function(){return i},proposed:function(){return c},status:function(){return s}});var r=a(7294),o=a(6786),l=a(793),s="Status-module--status--1dG8s",c="Status-module--proposed--3zY0z",i="Status-module--production--6xwxX",u="Status-module--demonstrated--2VaNN";const m=e=>{let{type:t}=e;return r.createElement("div",{className:(0,o.yI)(s,n[l.q[t]])},t)}},9042:function(e,t,a){"use strict";a.d(t,{l:function(){return o}});var n=a(7294),r=a(5444);const o=e=>{let{icon:t,className:a,role:o,ariaHidden:s}=e;const{icons:{publicURL:c}}=(0,r.useStaticQuery)(l);return n.createElement("svg",{role:o,"aria-hidden":s,className:a},n.createElement("use",{href:c+"#"+t}))},l="3766577012"},8739:function(e,t,a){"use strict";let n;a.d(t,{P:function(){return n}}),function(e){e.logo="logo",e.magnify="magnify",e.cross="cross",e.idea="idea",e.document="document",e.share="share",e.filter="filter"}(n||(n={}))},5205:function(e,t,a){"use strict";a.d(t,{$:function(){return o}});var n=a(7294),r=a(5444);const o=e=>{let{tags:t,onClick:a}=e;const o=e=>t=>{t.preventDefault(),a(e)};return n.createElement("div",{className:"Tags-module--tags--11-St"},t.map((e=>n.createElement(r.Link,{to:"/search?tag="+e,onClick:a?o(e):void 0,key:e,className:"Tags-module--tag--14doh"},"# ",e))))}},9170:function(e,t,a){"use strict";a.r(t),a.d(t,{default:function(){return R}});var n=a(7546),r=a(7294),o=a(6633),l=function(){function e(){}return e.prototype.expandToken=function(e){for(var t=[],a="",n=0,r=e.length;n{let{setPage:t,pageCount:a,currentPage:n,next:o,hasNext:l}=e;const s=((e,t)=>{let a=5*Math.floor((t-1)/5);return e-t<5&&t>5&&(a-=5-(e-a)),Array.from({length:Math.min(e,5)},((e,t)=>t+1+a))})(a,n);return a>1?r.createElement("nav",{"aria-label":"pagination",className:"Pagination-module--pagination--3KtNE"},l&&r.createElement("button",{onClick:o,className:(0,v.yI)("font-callout","Pagination-module--next--PX9hj")},"Next"),r.createElement("ul",{className:"Pagination-module--pages--1Bqv1"},s.map((e=>r.createElement("li",{key:e},r.createElement("button",{"aria-current":e===n?"page":void 0,disabled:e===n,className:(0,v.yI)("font-callout","Pagination-module--page--1qgQC",e===n&&"Pagination-module--current--2kpSb"),onClick:()=>t(e)},r.createElement("span",{className:"visually-hidden"},"page ")," ",e))))),s[s.length-1]{let{protocol:t,onTagClick:a}=e;const{title:n,slug:o,version:l,status:s,summary:c,tags:i,publisher:u,avatar:m,modifiedDate:d,license:h}=t;return r.createElement("article",{className:(0,v.yI)("ProtocolsListItem-module--item--DycmU","rounded")},r.createElement("div",{className:"ProtocolsListItem-module--header--17jzv"},r.createElement(k.Link,{to:"/"+o,className:"ProtocolsListItem-module--title--1k0xw"},r.createElement("h2",{className:"font-title-2"},n," ",r.createElement("span",{className:(0,v.yI)("font-footnote","ProtocolsListItem-module--version--1_-CI")},l))),r.createElement(E.q,{type:s})),r.createElement("p",{className:"ProtocolsListItem-module--summary--28MAv"},c),r.createElement(N.$,{onClick:a,tags:i}),r.createElement("div",{className:"ProtocolsListItem-module--footer--35Vqh"},r.createElement("div",{className:"ProtocolsListItem-module--avatar--57tBG"},r.createElement(b.q,{avatar:m,publisher:u})),r.createElement("span",{className:"font-footnote"},h),r.createElement(I.O,{since:!0,className:(0,v.yI)("ProtocolsListItem-module--lastModified--3Yt0s","font-footnote"),lastModified:d})))};var S=a(2575);const _=e=>{let{protocols:t,onTagClick:a}=e;const{items:n,setPage:l,pagesCount:s,page:c,next:i,hasNext:u}=(e=>{const[t,a]=(0,o.Wd)("page",o.yz);let n=null!=t?t:1;(0,r.useEffect)((()=>{void 0===t&&a(1,"replaceIn")}),[e]);const l=e.slice((n-1)*S.gK,n*S.gK);return{hasNext:e.length>n*S.gK,next:()=>a(n+1),prev:()=>a(n-1),items:l,pagesCount:Math.ceil(e.length/S.gK),setPage:a,page:n}})(t);return r.createElement("div",null,r.createElement("ul",{className:"ProtocolsList-module--list--1Ndxz"},n.map((e=>r.createElement("li",{key:e.slug},r.createElement(C,{onTagClick:a,protocol:e}))))),r.createElement(y,{hasNext:u,next:i,currentPage:c,pageCount:s,setPage:l}))};var x=a(1838);const P=e=>{let{value:t,onChange:a,label:n,className:o}=e;return r.createElement("label",{className:(0,v.yI)("Checkbox-module--check--15cne",o)},r.createElement("input",{type:"checkbox",checked:t,onChange:e=>a(e.target.checked),className:(0,v.yI)("visually-hidden","Checkbox-module--input--3BKOi")}),r.createElement("span",{className:(0,v.yI)("Checkbox-module--checkbox--2mZlv","rounded")}),n)};var z=a(793),M=a(9042);const w=r.forwardRef(((e,t)=>{let{icon:a,children:n,secondary:o,className:l,primary:s,expanded:c,...i}=e;return r.createElement("button",Object.assign({className:(0,v.yI)("Button-module--button--2t432","font-callout","rounded","shadow-medium",o&&"Button-module--secondary--2lup3",s&&"Button-module--primary--1Znlo",c&&"Button-module--expanded--1tS7m",l),ref:t},i),a?r.createElement(M.l,{icon:a,className:"Button-module--icon--ahMay"}):null,n)}));var D="Filters-module--group--39W7Y",T="Filters-module--groupTitle--7YFdO",L="Filters-module--filter--FPzWd";const O=e=>{let{onChange:t,label:a,value:n,name:o,checked:l,className:s}=e;return r.createElement("label",{className:(0,v.yI)("Radio-module--radio--1Zv1U",s)},r.createElement("input",{checked:l,className:(0,v.yI)("Radio-module--input--1y39W","visually-hidden"),name:o,type:"radio",value:n,onChange:e=>t(e.target.value)}),r.createElement("div",{className:"Radio-module--control--1gBRR"}),r.createElement("span",{className:"Radio-module--label--3mVdI"},a))},F=e=>{var t,a,n;let{onFilters:o,allLicenses:l,...s}=e;const{0:c,1:i}=(0,r.useState)({}),{0:u,1:m}=(0,r.useState)({}),{0:d,1:h}=(0,r.useState)();(0,r.useEffect)((()=>{i(Object.assign((0,v.m8)(Object.keys(z.q).map((e=>[e,!1]))),(0,v.m8)(s.status.map((e=>[e,!0]))))),m(Object.assign((0,v.m8)(l.map((e=>[e,!1]))),(0,v.m8)(s.license.map((e=>[e,!0]))))),h(s.date)}),[s.license,s.status,s.date]);const f=(e,t)=>{i({...c,[e]:t})};return r.createElement("div",null,r.createElement("h2",{className:(0,v.yI)("font-headline","Filters-module--title--2w9oT")},"Filters"),r.createElement("form",{autoCorrect:"off",autoComplete:"off",onSubmit:e=>{e.preventDefault(),o({status:Object.keys(c).filter((e=>c[e])),license:Object.keys(u).filter((e=>u[e])),date:d})}},r.createElement("fieldset",{className:D},r.createElement("legend",{className:T},"Status"),r.createElement(P,{className:L,value:null!==(t=c.Proposed)&&void 0!==t&&t,onChange:e=>f("Proposed",e),label:"Proposed"}),r.createElement(P,{className:L,value:null!==(a=c.Demonstrated)&&void 0!==a&&a,onChange:e=>f("Demonstrated",e),label:"Demonstrated"}),r.createElement(P,{className:L,value:null!==(n=c.Production)&&void 0!==n&&n,onChange:e=>f("Production",e),label:"Production"})),r.createElement("fieldset",{className:D},r.createElement("legend",{className:T},"License"),l.map((e=>{var t;return r.createElement(P,{className:L,key:e,value:null!==(t=u[e])&&void 0!==t&&t,onChange:t=>{return a=e,n=t,void m({...u,[a]:n});var a,n},label:e})}))),r.createElement("fieldset",{className:D},r.createElement("legend",{className:T},"Date"),r.createElement(O,{checked:"year"===d,className:L,name:"Date",value:"year",label:v.Pn.year,onChange:h}),r.createElement(O,{checked:"month"===d,className:L,name:"Date",value:"month",label:v.Pn.month,onChange:h}),r.createElement(O,{checked:"week"===d,className:L,name:"Date",value:"week",label:v.Pn.week,onChange:h}),r.createElement(O,{checked:"day"===d,className:L,name:"Date",value:"day",label:v.Pn.day,onChange:h})),r.createElement(w,{expanded:!0,secondary:!0,type:"submit"},"Filter")))};const $=e=>{let{content:t,action:a,className:n,actionIcon:o}=e;return r.createElement("div",{className:(0,v.yI)("Chips-module--chips--2PD3E",n)},r.createElement("div",{className:(0,v.yI)("font-subheadline","Chips-module--content--1fRc1")},t),r.createElement("button",{className:"Chips-module--action--18xz2",onClick:a},r.createElement(M.l,{ariaHidden:!0,icon:o,className:"Chips-module--actionIcon--3Mnic"}),r.createElement("span",{className:"visually-hidden"},"Drop filter")))};var q=a(8739),H="Search-module--chips--kTcRd";var R=e=>{var t,a,l;let{pageContext:s}=e;const[c,i]=(0,o.Kx)({status:(0,o.Wc)(o.V3,[]),license:(0,o.Wc)(o.V3,[]),tag:(0,o.Wc)(o.V3,[]),q:o.Zp,date:o.Zp}),{0:u,1:m}=(0,r.useState)(!1),d=e=>{let t;(0,v.Jc)(e),m(e),t=e?()=>{var e;return null===(e=y.current)||void 0===e?void 0:e.focus()}:()=>{var e;return null===(e=E.current)||void 0===e?void 0:e.focus()},setTimeout(t)},y=(0,r.useRef)(),E=(0,r.useRef)(),N=(0,r.useMemo)((()=>(0,v.O)(s.allProtocols,{status:c.status,license:c.license,dateUnit:c.date,tag:c.tag})),[c.status,c.date,c.license,c.tag]),{protocols:k,loading:b}=((e,t,a)=>{const n=(0,r.useRef)(null),{0:o,1:l}=(0,r.useState)([]),{0:s,1:c}=(0,r.useState)(!0);return(0,r.useEffect)((()=>{c(!0),n.current=new h("slug"),f.forEach((e=>n.current.addIndex(e))),n.current.addDocuments(e),l(t?n.current.search(t):e),c(!1)}),a),{protocols:o,loading:s}})(N,c.q,[c.q,N]),I=(e,t)=>{i("date"!==e||t?{...c,[e]:c[e].filter((e=>e!==t))}:{...c,date:void 0})},C=((e,t,a)=>{const n=Boolean(e.license.length||e.status.length||e.tag.length||e.dateUnit);return{prefix:t||n?a:"All",title:(1===a?"protocol":"protocols")+" "+(t||n?"found":"")+" "+(t?'for "'+t+'"':"")}})({...c,dateUnit:c.date},c.q,k.length);return r.createElement(g.A,{primary:!0,title:"Browse Protocols"},r.createElement(p.h,null,r.createElement(x.o,{bordered:!0,query:c.q,onSearch:e=>i({...c,q:e},"push")})),r.createElement("div",{className:"content"},r.createElement("h1",{className:"Search-module--title--2Sv1D"},r.createElement("mark",{className:"Search-module--mark--1mwSB"},C.prefix)," ",C.title),r.createElement("div",{className:"grid-3"},r.createElement("main",{className:"Search-module--main--2W9_R"},r.createElement("div",{className:"hide-desktop"},r.createElement(w,{ref:E,primary:!0,className:"Search-module--showFilters--1l0jQ",onClick:()=>d(!0),icon:q.P.filter},"Filters")),r.createElement("div",{className:"Search-module--chipsContainer--Q20QU"},null===(t=c.license)||void 0===t?void 0:t.map((e=>r.createElement($,{className:H,content:"License: "+e,actionIcon:q.P.cross,action:()=>I("license",e),key:e}))),null===(a=c.status)||void 0===a?void 0:a.map((e=>r.createElement($,{className:H,content:"Status: "+e,actionIcon:q.P.cross,action:()=>I("status",e),key:e}))),null===(l=c.tag)||void 0===l?void 0:l.map((e=>r.createElement($,{className:H,content:"Tag: "+e,actionIcon:q.P.cross,action:()=>I("tag",e),key:e}))),c.date&&r.createElement($,{className:H,content:"Date: "+v.Pn[c.date],actionIcon:q.P.cross,action:()=>I("date")})),b?"Loading...":r.createElement(_,{onTagClick:e=>{c.tag.includes(e)||i({...c,tag:[].concat((0,n.Z)(c.tag),[e])},"push")},protocols:k})),r.createElement("aside",{"aria-modal":u,role:u?"dialog":void 0,className:(0,v.yI)("hide-mobile",u&&"Search-module--filters--3UUwN")},r.createElement("button",{ref:y,className:(0,v.yI)("Search-module--close--2JH3A","hide-desktop"),onClick:()=>d(!1)},r.createElement(M.l,{icon:q.P.cross,className:"Search-module--closeIcon--1pWvM"}),r.createElement("span",{className:"visually-hidden"},"Close")),r.createElement(F,{date:c.date,allLicenses:s.allLicenses,license:c.license,status:c.status,onFilters:e=>(d(!1),i({...c,...e},"push"))})))))}}}]); +//# sourceMappingURL=component---src-templates-search-search-tsx-e8abc6de2d7bc98ba3a7.js.map \ No newline at end of file diff --git a/component---src-templates-search-search-tsx-e8abc6de2d7bc98ba3a7.js.map b/component---src-templates-search-search-tsx-e8abc6de2d7bc98ba3a7.js.map new file mode 100644 index 00000000..ed0e710f --- /dev/null +++ b/component---src-templates-search-search-tsx-e8abc6de2d7bc98ba3a7.js.map @@ -0,0 +1 @@ +{"version":3,"file":"component---src-templates-search-search-tsx-e8abc6de2d7bc98ba3a7.js","mappings":"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","sources":["webpack://didcomm-website/./node_modules/dayjs/plugin/relativeTime.js","webpack://didcomm-website/./src/common/constants.ts","webpack://didcomm-website/./src/common/types.ts","webpack://didcomm-website/./src/components/Avatar/Avatar.tsx","webpack://didcomm-website/./src/components/Avatar/Avatar.module.scss","webpack://didcomm-website/./src/components/Header/Header.module.scss","webpack://didcomm-website/./src/components/Header/Header.tsx","webpack://didcomm-website/./src/components/LastModified/LastModified.tsx","webpack://didcomm-website/./src/components/Search/Search.tsx","webpack://didcomm-website/./src/components/Search/Search.module.scss","webpack://didcomm-website/./src/components/Status/Status.module.scss","webpack://didcomm-website/./src/components/Status/Status.tsx","webpack://didcomm-website/./src/components/SvgIcon/SvgIcon.tsx","webpack://didcomm-website/./src/components/SvgIcon/SvgIcon.types.ts","webpack://didcomm-website/./src/components/Tags/Tags.tsx","webpack://didcomm-website/./src/components/Tags/Tags.module.scss","webpack://didcomm-website/./node_modules/js-search/dist/esm/js-search.js","webpack://didcomm-website/./src/common/hooks/useProtocolsSearch.ts","webpack://didcomm-website/./src/components/Pagination/Pagination.tsx","webpack://didcomm-website/./src/components/Pagination/utils.ts","webpack://didcomm-website/./src/components/Pagination/Pagination.module.scss","webpack://didcomm-website/./src/components/ProtocolsList/ProtocolsListItem/ProtocolsListItem.tsx","webpack://didcomm-website/./src/components/ProtocolsList/ProtocolsListItem/ProtocolsListItem.module.scss","webpack://didcomm-website/./src/components/ProtocolsList/ProtocolsList.tsx","webpack://didcomm-website/./src/common/hooks/usePagination.ts","webpack://didcomm-website/./src/components/ProtocolsList/ProtocolsList.module.scss","webpack://didcomm-website/./src/components/Checkbox/Checkbox.tsx","webpack://didcomm-website/./src/components/Checkbox/Checkbox.module.scss","webpack://didcomm-website/./src/components/Button/Button.tsx","webpack://didcomm-website/./src/components/Button/Button.module.scss","webpack://didcomm-website/./src/components/Filters/Filters.module.scss","webpack://didcomm-website/./src/components/Radio/Radio.tsx","webpack://didcomm-website/./src/components/Radio/Radio.module.scss","webpack://didcomm-website/./src/components/Filters/Filters.tsx","webpack://didcomm-website/./src/components/Chips/Chips.tsx","webpack://didcomm-website/./src/components/Chips/Chips.module.scss","webpack://didcomm-website/./src/templates/Search/Search.module.scss","webpack://didcomm-website/./src/templates/Search/Search.tsx"],"sourcesContent":["!function (r, e) {\n \"object\" == typeof exports && \"undefined\" != typeof module ? module.exports = e() : \"function\" == typeof define && define.amd ? define(e) : (r = \"undefined\" != typeof globalThis ? globalThis : r || self).dayjs_plugin_relativeTime = e();\n}(this, function () {\n \"use strict\";\n\n return function (r, e, t) {\n r = r || {};\n var n = e.prototype,\n o = {\n future: \"in %s\",\n past: \"%s ago\",\n s: \"a few seconds\",\n m: \"a minute\",\n mm: \"%d minutes\",\n h: \"an hour\",\n hh: \"%d hours\",\n d: \"a day\",\n dd: \"%d days\",\n M: \"a month\",\n MM: \"%d months\",\n y: \"a year\",\n yy: \"%d years\"\n };\n\n function i(r, e, t, o) {\n return n.fromToBase(r, e, t, o);\n }\n\n t.en.relativeTime = o, n.fromToBase = function (e, n, i, d, u) {\n for (var f, a, s, l = i.$locale().relativeTime || o, h = r.thresholds || [{\n l: \"s\",\n r: 44,\n d: \"second\"\n }, {\n l: \"m\",\n r: 89\n }, {\n l: \"mm\",\n r: 44,\n d: \"minute\"\n }, {\n l: \"h\",\n r: 89\n }, {\n l: \"hh\",\n r: 21,\n d: \"hour\"\n }, {\n l: \"d\",\n r: 35\n }, {\n l: \"dd\",\n r: 25,\n d: \"day\"\n }, {\n l: \"M\",\n r: 45\n }, {\n l: \"MM\",\n r: 10,\n d: \"month\"\n }, {\n l: \"y\",\n r: 17\n }, {\n l: \"yy\",\n d: \"year\"\n }], m = h.length, c = 0; c < m; c += 1) {\n var y = h[c];\n y.d && (f = d ? t(e).diff(i, y.d, !0) : i.diff(e, y.d, !0));\n var p = (r.rounding || Math.round)(Math.abs(f));\n\n if (s = f > 0, p <= y.r || !y.r) {\n p <= 1 && c > 0 && (y = h[c - 1]);\n var v = l[y.l];\n u && (p = u(\"\" + p)), a = \"string\" == typeof v ? v.replace(\"%d\", p) : v(p, n, y.l, s);\n break;\n }\n }\n\n if (n) return a;\n var M = s ? l.future : l.past;\n return \"function\" == typeof M ? M(a) : M.replace(\"%s\", a);\n }, n.to = function (r, e) {\n return i(r, e, this, !0);\n }, n.from = function (r, e) {\n return i(r, e, this);\n };\n\n var d = function (r) {\n return r.$u ? t.utc() : t();\n };\n\n n.toNow = function (r) {\n return this.to(d(this), r);\n }, n.fromNow = function (r) {\n return this.from(d(this), r);\n };\n };\n});","export const ITEMS_PER_PAGE = 10\nexport const GITHUB_URL = 'https://github.com'\nexport const DATE_FORMAT = 'YYYY MMM D, HH:MM A'\n","export type AllMarkdownRemark = {\n nodes: TNode[]\n}\nexport const Status = {\n Proposed: 'proposed',\n Demonstrated: 'demonstrated',\n Production: 'production',\n} as const\n\nexport type StatusType = keyof typeof Status\n\nexport enum DateUnit {\n year = 'year',\n month = 'month',\n week = 'week',\n day = 'day',\n}\n\nexport type Author = {\n name: string\n email?: string\n}\n\nexport type MDProtocol = {\n fields: {\n slug: string\n version: string\n avatar: string\n modifiedDate: string\n }\n frontmatter: {\n tags: string[]\n title: string\n license: string\n status: StatusType\n publisher: string\n summary: string\n piuri: string\n authors: Array\n }\n html: string\n}\n\nexport type Protocol = {\n slug: string\n tags: string[]\n title: string\n license: string\n html: string\n version: string\n status: StatusType\n publisher: string\n avatar: string\n modifiedDate: string\n summary: string\n piuri: string\n authors: Array\n}\n\nexport type Filters = {\n status: Array\n license: Array\n dateUnit: DateUnit\n tag: Array\n}\n","import * as React from 'react'\nimport { GITHUB_URL } from '../../common/constants'\nimport { cls } from '../../common/utils'\nimport { Props } from './Avatar.types'\nimport * as styles from './Avatar.module.scss'\n\nexport const Avatar = ({ publisher, avatar }: Props) => {\n return (\n \n
\n @{publisher}\n \n )\n}\n","// extracted by mini-css-extract-plugin\nexport var avatar = \"Avatar-module--avatar--2HGSY\";\nexport var img = \"Avatar-module--img--3CeLS\";\nexport var publisher = \"Avatar-module--publisher--ktcuv\";","// extracted by mini-css-extract-plugin\nexport var header = \"Header-module--header--1Qt4T\";\nexport var container = \"Header-module--container--3KhaC\";\nexport var search = \"Header-module--search--ucYp8\";\nexport var linksContainer = \"Header-module--linksContainer--WRDuP\";\nexport var active = \"Header-module--active--1N9yZ\";\nexport var primary = \"Header-module--primary--yIDLc\";\nexport var logo = \"Header-module--logo--RPmCm\";\nexport var logoImg = \"Header-module--logoImg--f8A17\";\nexport var logoText = \"Header-module--logoText--EwM4-\";\nexport var links = \"Header-module--links--3cZB-\";\nexport var link = \"Header-module--link--4ebYS\";","import * as React from 'react'\nimport { Link } from 'gatsby'\n\nimport { cls } from '../../common/utils'\nimport { SvgIcon } from '../SvgIcon/SvgIcon'\nimport { Icons } from '../SvgIcon/SvgIcon.types'\nimport { Props } from './Header.types'\nimport * as styles from './Header.module.scss'\n\nexport const Header = ({ children, primary, className, hideLinks }: Props) => {\n return (\n
\n
\n \n \n DIDComm\n \n
{children}
\n {!hideLinks && (\n \n )}\n
\n
\n )\n}\n","import * as React from 'react'\nimport dayjs from 'dayjs'\nimport relativeTime from 'dayjs/plugin/relativeTime'\n\nimport { DATE_FORMAT } from '../../common/constants'\nimport { Props } from './LastModified.types'\n\ndayjs.extend(relativeTime)\n\nexport const LastModified = ({ lastModified, className, since }: Props) => {\n const date = since ? dayjs().to(lastModified) : dayjs(lastModified).format(DATE_FORMAT)\n return {date}\n}\n","import * as React from 'react'\nimport { useState, FormEventHandler } from 'react'\n\nimport { SvgIcon } from '../SvgIcon/SvgIcon'\nimport { Icons } from '../SvgIcon/SvgIcon.types'\nimport { cls } from '../../common/utils'\nimport { Props } from './Search.types'\nimport * as styles from './Search.module.scss'\n\nexport const Search = ({ onSearch, query = '', bordered }: Props) => {\n const [value, setValue] = useState(query)\n\n const onSubmit: FormEventHandler = (e) => {\n e.preventDefault()\n onSearch(value)\n }\n\n return (\n
\n setValue(e.target.value)}\n autoCorrect=\"off\"\n placeholder=\" \"\n autoComplete=\"off\"\n type=\"text\"\n id=\"search\"\n />\n \n \n \n \n )\n}\n","// extracted by mini-css-extract-plugin\nexport var search = \"Search-module--search--3XfRF\";\nexport var input = \"Search-module--input--1o6QO\";\nexport var bordered = \"Search-module--bordered--34QxG\";\nexport var placeholder = \"Search-module--placeholder--97f4S\";\nexport var placeholderExtraText = \"Search-module--placeholderExtraText--3R9o1\";\nexport var button = \"Search-module--button--xD1TT\";\nexport var iconMagnify = \"Search-module--iconMagnify--j1Q9O\";\nexport var clearButton = \"Search-module--clearButton--3MgzD\";\nexport var iconCross = \"Search-module--iconCross--3dnWa\";","// extracted by mini-css-extract-plugin\nexport var status = \"Status-module--status--1dG8s\";\nexport var proposed = \"Status-module--proposed--3zY0z\";\nexport var production = \"Status-module--production--6xwxX\";\nexport var demonstrated = \"Status-module--demonstrated--2VaNN\";","import * as React from 'react'\n\nimport { cls } from '../../common/utils'\nimport { Status as StatusEnum } from '../../common/types'\nimport { Props } from './Status.types'\nimport * as styles from './Status.module.scss'\n\nexport const Status = ({ type }: Props) => {\n return
{type}
\n}\n","import * as React from 'react'\nimport { graphql, useStaticQuery } from 'gatsby'\n\nimport { Props, QueryData } from './SvgIcon.types'\n\nexport const SvgIcon = ({ icon, className, role, ariaHidden }: Props) => {\n const {\n icons: { publicURL: icons },\n } = useStaticQuery(query)\n return (\n \n \n \n )\n}\n\nconst query = graphql`\n {\n icons: file(base: { eq: \"icons.svg\" }) {\n publicURL\n }\n }\n`\n","export type QueryData = {\n icons: {\n publicURL: string\n }\n}\n\nexport type Props = {\n icon: Icons\n className: string\n role?: React.AriaRole\n ariaHidden?: boolean\n}\n\nexport enum Icons {\n logo = 'logo',\n magnify = 'magnify',\n cross = 'cross',\n idea = 'idea',\n document = 'document',\n share = 'share',\n filter = 'filter',\n}\n","import * as React from 'react'\n\nimport { Props } from './Tags.types'\nimport * as styles from './Tags.module.scss'\nimport { Link } from 'gatsby'\n\nexport const Tags = ({ tags, onClick }: Props) => {\n const onTagClick = (tag: string) => (e: React.MouseEvent) => {\n e.preventDefault()\n onClick(tag)\n }\n\n return (\n
\n {tags.map((tag) => (\n \n # {tag}\n \n ))}\n
\n )\n}\n","// extracted by mini-css-extract-plugin\nexport var tags = \"Tags-module--tags--11-St\";\nexport var tag = \"Tags-module--tag--14doh\";","/**\n * Indexes for all substring searches (e.g. the term \"cat\" is indexed as \"c\", \"ca\", \"cat\", \"a\", \"at\", and \"t\").\n */\nvar AllSubstringsIndexStrategy = /*#__PURE__*/function () {\n function AllSubstringsIndexStrategy() {}\n\n var _proto = AllSubstringsIndexStrategy.prototype;\n /**\n * @inheritDocs\n */\n\n _proto.expandToken = function expandToken(token) {\n var expandedTokens = [];\n var string;\n\n for (var i = 0, length = token.length; i < length; ++i) {\n string = '';\n\n for (var j = i; j < length; ++j) {\n string += token.charAt(j);\n expandedTokens.push(string);\n }\n }\n\n return expandedTokens;\n };\n\n return AllSubstringsIndexStrategy;\n}();\n/**\n * Indexes for exact word matches.\n */\n\n\nvar ExactWordIndexStrategy = /*#__PURE__*/function () {\n function ExactWordIndexStrategy() {}\n\n var _proto = ExactWordIndexStrategy.prototype;\n /**\n * @inheritDocs\n */\n\n _proto.expandToken = function expandToken(token) {\n return token ? [token] : [];\n };\n\n return ExactWordIndexStrategy;\n}();\n/**\n * Indexes for prefix searches (e.g. the term \"cat\" is indexed as \"c\", \"ca\", and \"cat\" allowing prefix search lookups).\n */\n\n\nvar PrefixIndexStrategy = /*#__PURE__*/function () {\n function PrefixIndexStrategy() {}\n\n var _proto = PrefixIndexStrategy.prototype;\n /**\n * @inheritDocs\n */\n\n _proto.expandToken = function expandToken(token) {\n var expandedTokens = [];\n var string = '';\n\n for (var i = 0, length = token.length; i < length; ++i) {\n string += token.charAt(i);\n expandedTokens.push(string);\n }\n\n return expandedTokens;\n };\n\n return PrefixIndexStrategy;\n}();\n/**\n * Enforces case-sensitive text matches.\n */\n\n\nvar CaseSensitiveSanitizer = /*#__PURE__*/function () {\n function CaseSensitiveSanitizer() {}\n\n var _proto = CaseSensitiveSanitizer.prototype;\n /**\n * @inheritDocs\n */\n\n _proto.sanitize = function sanitize(text) {\n return text ? text.trim() : '';\n };\n\n return CaseSensitiveSanitizer;\n}();\n/**\n * Sanitizes text by converting to a locale-friendly lower-case version and triming leading and trailing whitespace.\n */\n\n\nvar LowerCaseSanitizer = /*#__PURE__*/function () {\n function LowerCaseSanitizer() {}\n\n var _proto = LowerCaseSanitizer.prototype;\n /**\n * @inheritDocs\n */\n\n _proto.sanitize = function sanitize(text) {\n return text ? text.toLocaleLowerCase().trim() : '';\n };\n\n return LowerCaseSanitizer;\n}();\n/**\n * Find and return a nested object value.\n *\n * @param object to crawl\n * @param path Property path\n * @returns {any}\n */\n\n\nfunction getNestedFieldValue(object, path) {\n path = path || [];\n object = object || {};\n var value = object; // walk down the property path\n\n for (var i = 0; i < path.length; i++) {\n value = value[path[i]];\n\n if (value == null) {\n return null;\n }\n }\n\n return value;\n}\n/**\n * Search index capable of returning results matching a set of tokens and ranked according to TF-IDF.\n */\n\n\nvar TfIdfSearchIndex = /*#__PURE__*/function () {\n function TfIdfSearchIndex(uidFieldName) {\n this._uidFieldName = uidFieldName;\n this._tokenToIdfCache = {};\n this._tokenMap = {};\n }\n /**\n * @inheritDocs\n */\n\n\n var _proto = TfIdfSearchIndex.prototype;\n\n _proto.indexDocument = function indexDocument(token, uid, doc) {\n this._tokenToIdfCache = {}; // New index invalidates previous IDF caches\n\n var tokenMap = this._tokenMap;\n var tokenDatum;\n\n if (typeof tokenMap[token] !== 'object') {\n tokenMap[token] = tokenDatum = {\n $numDocumentOccurrences: 0,\n $totalNumOccurrences: 1,\n $uidMap: {}\n };\n } else {\n tokenDatum = tokenMap[token];\n tokenDatum.$totalNumOccurrences++;\n }\n\n var uidMap = tokenDatum.$uidMap;\n\n if (typeof uidMap[uid] !== 'object') {\n tokenDatum.$numDocumentOccurrences++;\n uidMap[uid] = {\n $document: doc,\n $numTokenOccurrences: 1\n };\n } else {\n uidMap[uid].$numTokenOccurrences++;\n }\n }\n /**\n * @inheritDocs\n */\n ;\n\n _proto.search = function search(tokens, corpus) {\n var uidToDocumentMap = {};\n\n for (var i = 0, numTokens = tokens.length; i < numTokens; i++) {\n var token = tokens[i];\n var tokenMetadata = this._tokenMap[token]; // Short circuit if no matches were found for any given token.\n\n if (!tokenMetadata) {\n return [];\n }\n\n if (i === 0) {\n var keys = Object.keys(tokenMetadata.$uidMap);\n\n for (var j = 0, numKeys = keys.length; j < numKeys; j++) {\n var uid = keys[j];\n uidToDocumentMap[uid] = tokenMetadata.$uidMap[uid].$document;\n }\n } else {\n var keys = Object.keys(uidToDocumentMap);\n\n for (var j = 0, numKeys = keys.length; j < numKeys; j++) {\n var uid = keys[j];\n\n if (typeof tokenMetadata.$uidMap[uid] !== 'object') {\n delete uidToDocumentMap[uid];\n }\n }\n }\n }\n\n var documents = [];\n\n for (var uid in uidToDocumentMap) {\n documents.push(uidToDocumentMap[uid]);\n }\n\n var calculateTfIdf = this._createCalculateTfIdf(); // Return documents sorted by TF-IDF\n\n\n return documents.sort(function (documentA, documentB) {\n return calculateTfIdf(tokens, documentB, corpus) - calculateTfIdf(tokens, documentA, corpus);\n });\n };\n\n _proto._createCalculateIdf = function _createCalculateIdf() {\n var tokenMap = this._tokenMap;\n var tokenToIdfCache = this._tokenToIdfCache;\n return function calculateIdf(token, documents) {\n if (!tokenToIdfCache[token]) {\n var numDocumentsWithToken = typeof tokenMap[token] !== 'undefined' ? tokenMap[token].$numDocumentOccurrences : 0;\n tokenToIdfCache[token] = 1 + Math.log(documents.length / (1 + numDocumentsWithToken));\n }\n\n return tokenToIdfCache[token];\n };\n };\n\n _proto._createCalculateTfIdf = function _createCalculateTfIdf() {\n var tokenMap = this._tokenMap;\n var uidFieldName = this._uidFieldName;\n\n var calculateIdf = this._createCalculateIdf();\n\n return function calculateTfIdf(tokens, document, documents) {\n var score = 0;\n\n for (var i = 0, numTokens = tokens.length; i < numTokens; ++i) {\n var token = tokens[i];\n var inverseDocumentFrequency = calculateIdf(token, documents);\n\n if (inverseDocumentFrequency === Infinity) {\n inverseDocumentFrequency = 0;\n }\n\n var uid;\n\n if (uidFieldName instanceof Array) {\n uid = document && getNestedFieldValue(document, uidFieldName);\n } else {\n uid = document && document[uidFieldName];\n }\n\n var termFrequency = typeof tokenMap[token] !== 'undefined' && typeof tokenMap[token].$uidMap[uid] !== 'undefined' ? tokenMap[token].$uidMap[uid].$numTokenOccurrences : 0;\n score += termFrequency * inverseDocumentFrequency;\n }\n\n return score;\n };\n };\n\n return TfIdfSearchIndex;\n}();\n/**\n * Search index capable of returning results matching a set of tokens but without any meaningful rank or order.\n */\n\n\nvar UnorderedSearchIndex = /*#__PURE__*/function () {\n function UnorderedSearchIndex() {\n this._tokenToUidToDocumentMap = {};\n }\n /**\n * @inheritDocs\n */\n\n\n var _proto = UnorderedSearchIndex.prototype;\n\n _proto.indexDocument = function indexDocument(token, uid, doc) {\n if (typeof this._tokenToUidToDocumentMap[token] !== 'object') {\n this._tokenToUidToDocumentMap[token] = {};\n }\n\n this._tokenToUidToDocumentMap[token][uid] = doc;\n }\n /**\n * @inheritDocs\n */\n ;\n\n _proto.search = function search(tokens, corpus) {\n var intersectingDocumentMap = {};\n var tokenToUidToDocumentMap = this._tokenToUidToDocumentMap;\n\n for (var i = 0, numTokens = tokens.length; i < numTokens; i++) {\n var token = tokens[i];\n var documentMap = tokenToUidToDocumentMap[token]; // Short circuit if no matches were found for any given token.\n\n if (!documentMap) {\n return [];\n }\n\n if (i === 0) {\n var keys = Object.keys(documentMap);\n\n for (var j = 0, numKeys = keys.length; j < numKeys; j++) {\n var uid = keys[j];\n intersectingDocumentMap[uid] = documentMap[uid];\n }\n } else {\n var keys = Object.keys(intersectingDocumentMap);\n\n for (var j = 0, numKeys = keys.length; j < numKeys; j++) {\n var uid = keys[j];\n\n if (typeof documentMap[uid] !== 'object') {\n delete intersectingDocumentMap[uid];\n }\n }\n }\n }\n\n var keys = Object.keys(intersectingDocumentMap);\n var documents = [];\n\n for (var i = 0, numKeys = keys.length; i < numKeys; i++) {\n var uid = keys[i];\n documents.push(intersectingDocumentMap[uid]);\n }\n\n return documents;\n };\n\n return UnorderedSearchIndex;\n}();\n\nvar REGEX = /[^a-zа-яё0-9\\-']+/i;\n/**\n * Simple tokenizer that splits strings on whitespace characters and returns an array of all non-empty substrings.\n */\n\nvar SimpleTokenizer = /*#__PURE__*/function () {\n function SimpleTokenizer() {}\n\n var _proto = SimpleTokenizer.prototype;\n /**\n * @inheritDocs\n */\n\n _proto.tokenize = function tokenize(text) {\n return text.split(REGEX).filter(function (text) {\n return text;\n } // Filter empty tokens\n );\n };\n\n return SimpleTokenizer;\n}();\n/**\n * Stemming is the process of reducing search tokens to their root (or stem) so that searches for different forms of a\n * word will match. For example \"search\", \"searching\" and \"searched\" are all reduced to the stem \"search\".\n *\n *

This stemming tokenizer converts tokens (words) to their stem forms before returning them. It requires an\n * external stemming function to be provided; for this purpose I recommend the NPM 'porter-stemmer' library.\n *\n *

For more information see http : //tartarus.org/~martin/PorterStemmer/\n */\n\n\nvar StemmingTokenizer = /*#__PURE__*/function () {\n /**\n * Constructor.\n *\n * @param stemmingFunction Function capable of accepting a word and returning its stem.\n * @param decoratedIndexStrategy Index strategy to be run after all stop words have been removed.\n */\n function StemmingTokenizer(stemmingFunction, decoratedTokenizer) {\n this._stemmingFunction = stemmingFunction;\n this._tokenizer = decoratedTokenizer;\n }\n /**\n * @inheritDocs\n */\n\n\n var _proto = StemmingTokenizer.prototype;\n\n _proto.tokenize = function tokenize(text) {\n return this._tokenizer.tokenize(text).map(this._stemmingFunction);\n };\n\n return StemmingTokenizer;\n}();\n/**\n * Stop words list copied from Lunr JS.\n */\n\n\nvar StopWordsMap = {\n a: true,\n able: true,\n about: true,\n across: true,\n after: true,\n all: true,\n almost: true,\n also: true,\n am: true,\n among: true,\n an: true,\n and: true,\n any: true,\n are: true,\n as: true,\n at: true,\n be: true,\n because: true,\n been: true,\n but: true,\n by: true,\n can: true,\n cannot: true,\n could: true,\n dear: true,\n did: true,\n 'do': true,\n does: true,\n either: true,\n 'else': true,\n ever: true,\n every: true,\n 'for': true,\n from: true,\n 'get': true,\n got: true,\n had: true,\n has: true,\n have: true,\n he: true,\n her: true,\n hers: true,\n him: true,\n his: true,\n how: true,\n however: true,\n i: true,\n 'if': true,\n 'in': true,\n into: true,\n is: true,\n it: true,\n its: true,\n just: true,\n least: true,\n \"let\": true,\n like: true,\n likely: true,\n may: true,\n me: true,\n might: true,\n most: true,\n must: true,\n my: true,\n neither: true,\n no: true,\n nor: true,\n not: true,\n of: true,\n off: true,\n often: true,\n on: true,\n only: true,\n or: true,\n other: true,\n our: true,\n own: true,\n rather: true,\n said: true,\n say: true,\n says: true,\n she: true,\n should: true,\n since: true,\n so: true,\n some: true,\n than: true,\n that: true,\n the: true,\n their: true,\n them: true,\n then: true,\n there: true,\n these: true,\n they: true,\n 'this': true,\n tis: true,\n to: true,\n too: true,\n twas: true,\n us: true,\n wants: true,\n was: true,\n we: true,\n were: true,\n what: true,\n when: true,\n where: true,\n which: true,\n 'while': true,\n who: true,\n whom: true,\n why: true,\n will: true,\n 'with': true,\n would: true,\n yet: true,\n you: true,\n your: true\n}; // Prevent false positives for inherited properties\n\nStopWordsMap.constructor = false;\nStopWordsMap.hasOwnProperty = false;\nStopWordsMap.isPrototypeOf = false;\nStopWordsMap.propertyIsEnumerable = false;\nStopWordsMap.toLocaleString = false;\nStopWordsMap.toString = false;\nStopWordsMap.valueOf = false;\n/**\n * Stop words are very common (e.g. \"a\", \"and\", \"the\") and are often not semantically meaningful in the context of a\n * search. This tokenizer removes stop words from a set of tokens before passing the remaining tokens along for\n * indexing or searching purposes.\n */\n\nvar StopWordsTokenizer = /*#__PURE__*/function () {\n /**\n * Constructor.\n *\n * @param decoratedIndexStrategy Index strategy to be run after all stop words have been removed.\n */\n function StopWordsTokenizer(decoratedTokenizer) {\n this._tokenizer = decoratedTokenizer;\n }\n /**\n * @inheritDocs\n */\n\n\n var _proto = StopWordsTokenizer.prototype;\n\n _proto.tokenize = function tokenize(text) {\n return this._tokenizer.tokenize(text).filter(function (token) {\n return !StopWordsMap[token];\n });\n };\n\n return StopWordsTokenizer;\n}();\n\nfunction _defineProperties(target, props) {\n for (var i = 0; i < props.length; i++) {\n var descriptor = props[i];\n descriptor.enumerable = descriptor.enumerable || false;\n descriptor.configurable = true;\n if (\"value\" in descriptor) descriptor.writable = true;\n Object.defineProperty(target, descriptor.key, descriptor);\n }\n}\n\nfunction _createClass(Constructor, protoProps, staticProps) {\n if (protoProps) _defineProperties(Constructor.prototype, protoProps);\n if (staticProps) _defineProperties(Constructor, staticProps);\n return Constructor;\n}\n/**\n * Simple client-side searching within a set of documents.\n *\n *

Documents can be searched by any number of fields. Indexing and search strategies are highly customizable.\n */\n\n\nvar Search = /*#__PURE__*/function () {\n /**\n * Array containing either a property name or a path (list of property names) to a nested value\n */\n\n /**\n * Constructor.\n * @param uidFieldName Field containing values that uniquely identify search documents; this field's values are used\n * to ensure that a search result set does not contain duplicate objects.\n */\n function Search(uidFieldName) {\n if (!uidFieldName) {\n throw Error('js-search requires a uid field name constructor parameter');\n }\n\n this._uidFieldName = uidFieldName; // Set default/recommended strategies\n\n this._indexStrategy = new PrefixIndexStrategy();\n this._searchIndex = new TfIdfSearchIndex(uidFieldName);\n this._sanitizer = new LowerCaseSanitizer();\n this._tokenizer = new SimpleTokenizer();\n this._documents = [];\n this._searchableFields = [];\n }\n /**\n * Override the default index strategy.\n * @param value Custom index strategy\n * @throws Error if documents have already been indexed by this search instance\n */\n\n\n var _proto = Search.prototype;\n /**\n * Add a searchable document to the index. Document will automatically be indexed for search.\n * @param document\n */\n\n _proto.addDocument = function addDocument(document) {\n this.addDocuments([document]);\n }\n /**\n * Adds searchable documents to the index. Documents will automatically be indexed for search.\n * @param document\n */\n ;\n\n _proto.addDocuments = function addDocuments(documents) {\n this._documents = this._documents.concat(documents);\n this.indexDocuments_(documents, this._searchableFields);\n }\n /**\n * Add a new searchable field to the index. Existing documents will automatically be indexed using this new field.\n *\n * @param field Searchable field or field path. Pass a string to index a top-level field and an array of strings for nested fields.\n */\n ;\n\n _proto.addIndex = function addIndex(field) {\n this._searchableFields.push(field);\n\n this.indexDocuments_(this._documents, [field]);\n }\n /**\n * Search all documents for ones matching the specified query text.\n * @param query\n * @returns {Array}\n */\n ;\n\n _proto.search = function search(query) {\n var tokens = this._tokenizer.tokenize(this._sanitizer.sanitize(query));\n\n return this._searchIndex.search(tokens, this._documents);\n }\n /**\n * @param documents\n * @param _searchableFields Array containing property names and paths (lists of property names) to nested values\n * @private\n */\n ;\n\n _proto.indexDocuments_ = function indexDocuments_(documents, _searchableFields) {\n this._initialized = true;\n var indexStrategy = this._indexStrategy;\n var sanitizer = this._sanitizer;\n var searchIndex = this._searchIndex;\n var tokenizer = this._tokenizer;\n var uidFieldName = this._uidFieldName;\n\n for (var di = 0, numDocuments = documents.length; di < numDocuments; di++) {\n var doc = documents[di];\n var uid;\n\n if (uidFieldName instanceof Array) {\n uid = getNestedFieldValue(doc, uidFieldName);\n } else {\n uid = doc[uidFieldName];\n }\n\n for (var sfi = 0, numSearchableFields = _searchableFields.length; sfi < numSearchableFields; sfi++) {\n var fieldValue;\n var searchableField = _searchableFields[sfi];\n\n if (searchableField instanceof Array) {\n fieldValue = getNestedFieldValue(doc, searchableField);\n } else {\n fieldValue = doc[searchableField];\n }\n\n if (fieldValue != null && typeof fieldValue !== 'string' && fieldValue.toString) {\n fieldValue = fieldValue.toString();\n }\n\n if (typeof fieldValue === 'string') {\n var fieldTokens = tokenizer.tokenize(sanitizer.sanitize(fieldValue));\n\n for (var fti = 0, numFieldValues = fieldTokens.length; fti < numFieldValues; fti++) {\n var fieldToken = fieldTokens[fti];\n var expandedTokens = indexStrategy.expandToken(fieldToken);\n\n for (var eti = 0, nummExpandedTokens = expandedTokens.length; eti < nummExpandedTokens; eti++) {\n var expandedToken = expandedTokens[eti];\n searchIndex.indexDocument(expandedToken, uid, doc);\n }\n }\n }\n }\n }\n };\n\n _createClass(Search, [{\n key: \"indexStrategy\",\n set: function set(value) {\n if (this._initialized) {\n throw Error('IIndexStrategy cannot be set after initialization');\n }\n\n this._indexStrategy = value;\n },\n get: function get() {\n return this._indexStrategy;\n }\n /**\n * Override the default text sanitizing strategy.\n * @param value Custom text sanitizing strategy\n * @throws Error if documents have already been indexed by this search instance\n */\n\n }, {\n key: \"sanitizer\",\n set: function set(value) {\n if (this._initialized) {\n throw Error('ISanitizer cannot be set after initialization');\n }\n\n this._sanitizer = value;\n },\n get: function get() {\n return this._sanitizer;\n }\n /**\n * Override the default search index strategy.\n * @param value Custom search index strategy\n * @throws Error if documents have already been indexed\n */\n\n }, {\n key: \"searchIndex\",\n set: function set(value) {\n if (this._initialized) {\n throw Error('ISearchIndex cannot be set after initialization');\n }\n\n this._searchIndex = value;\n },\n get: function get() {\n return this._searchIndex;\n }\n /**\n * Override the default text tokenizing strategy.\n * @param value Custom text tokenizing strategy\n * @throws Error if documents have already been indexed by this search instance\n */\n\n }, {\n key: \"tokenizer\",\n set: function set(value) {\n if (this._initialized) {\n throw Error('ITokenizer cannot be set after initialization');\n }\n\n this._tokenizer = value;\n },\n get: function get() {\n return this._tokenizer;\n }\n }]);\n\n return Search;\n}();\n/**\n * This utility highlights the occurrences of tokens within a string of text. It can be used to give visual indicators\n * of match criteria within searchable fields.\n *\n *

For performance purposes this highlighter only works with full-word or prefix token indexes.\n */\n\n\nvar TokenHighlighter = /*#__PURE__*/function () {\n /**\n * Constructor.\n *\n * @param opt_indexStrategy Index strategy used by Search\n * @param opt_sanitizer Sanitizer used by Search\n * @param opt_wrapperTagName Optional wrapper tag name; defaults to 'mark' (e.g. )\n */\n function TokenHighlighter(opt_indexStrategy, opt_sanitizer, opt_wrapperTagName) {\n this._indexStrategy = opt_indexStrategy || new PrefixIndexStrategy();\n this._sanitizer = opt_sanitizer || new LowerCaseSanitizer();\n this._wrapperTagName = opt_wrapperTagName || 'mark';\n }\n /**\n * Highlights token occurrences within a string by wrapping them with a DOM element.\n *\n * @param text e.g. \"john wayne\"\n * @param tokens e.g. [\"wa\"]\n * @returns {string} e.g. \"john wayne\"\n */\n\n\n var _proto = TokenHighlighter.prototype;\n\n _proto.highlight = function highlight(text, tokens) {\n var tagsLength = this._wrapText('').length;\n\n var tokenDictionary = Object.create(null); // Create a token map for easier lookup below.\n\n for (var i = 0, numTokens = tokens.length; i < numTokens; i++) {\n var token = this._sanitizer.sanitize(tokens[i]);\n\n var expandedTokens = this._indexStrategy.expandToken(token);\n\n for (var j = 0, numExpandedTokens = expandedTokens.length; j < numExpandedTokens; j++) {\n var expandedToken = expandedTokens[j];\n\n if (!tokenDictionary[expandedToken]) {\n tokenDictionary[expandedToken] = [token];\n } else {\n tokenDictionary[expandedToken].push(token);\n }\n }\n } // Track actualCurrentWord and sanitizedCurrentWord separately in case we encounter nested tags.\n\n\n var actualCurrentWord = '';\n var sanitizedCurrentWord = '';\n var currentWordStartIndex = 0; // Note this assumes either prefix or full word matching.\n\n for (var i = 0, textLength = text.length; i < textLength; i++) {\n var character = text.charAt(i);\n\n if (character === ' ') {\n actualCurrentWord = '';\n sanitizedCurrentWord = '';\n currentWordStartIndex = i + 1;\n } else {\n actualCurrentWord += character;\n sanitizedCurrentWord += this._sanitizer.sanitize(character);\n }\n\n if (tokenDictionary[sanitizedCurrentWord] && tokenDictionary[sanitizedCurrentWord].indexOf(sanitizedCurrentWord) >= 0) {\n actualCurrentWord = this._wrapText(actualCurrentWord);\n text = text.substring(0, currentWordStartIndex) + actualCurrentWord + text.substring(i + 1);\n i += tagsLength;\n textLength += tagsLength;\n }\n }\n\n return text;\n }\n /**\n * @param text to wrap\n * @returns Text wrapped by wrapper tag (e.g. \"foo\" becomes \"foo\")\n * @private\n */\n ;\n\n _proto._wrapText = function _wrapText(text) {\n var tagName = this._wrapperTagName;\n return \"<\" + tagName + \">\" + text + \"\";\n };\n\n return TokenHighlighter;\n}();\n\nexport { AllSubstringsIndexStrategy, CaseSensitiveSanitizer, ExactWordIndexStrategy, LowerCaseSanitizer, PrefixIndexStrategy, Search, SimpleTokenizer, StemmingTokenizer, StopWordsMap, StopWordsTokenizer, TfIdfSearchIndex, TokenHighlighter, UnorderedSearchIndex };","import { useEffect, useRef, useState } from 'react'\nimport { Search } from 'js-search'\nimport { Protocol } from '../types'\n\nconst fieldsToIndex: Array = ['title', 'tags', 'license', 'summary', 'publisher', 'piuri', 'html']\n\nexport const useProtocolsSearch = (\n allProtocols: Protocol[],\n query: string,\n deps: Array,\n): { protocols: Protocol[]; loading: boolean } => {\n const s = useRef(null)\n\n const [protocols, setProtocols] = useState([])\n const [loading, setLoading] = useState(true)\n useEffect(() => {\n setLoading(true)\n\n s.current = new Search('slug')\n fieldsToIndex.forEach((field) => s.current.addIndex(field))\n s.current.addDocuments(allProtocols)\n\n setProtocols(query ? s.current!.search(query) : allProtocols)\n\n setLoading(false)\n }, deps)\n return { protocols, loading }\n}\n","import * as React from 'react'\n\nimport { cls } from '../../common/utils'\nimport { getPages } from './utils'\nimport { Props } from './Pagination.types'\nimport * as styles from './Pagination.module.scss'\n\nexport const Pagination = ({ setPage, pageCount, currentPage, next, hasNext }: Props) => {\n const pages = getPages(pageCount, currentPage)\n return pageCount > 1 ? (\n

\n ) : null\n}\n","const PAGINATION_VISIBLE_PAGES = 5\n\nexport const getPages = (pageCount: number, curPage: number) => {\n let startPosition = Math.floor((curPage - 1) / PAGINATION_VISIBLE_PAGES) * PAGINATION_VISIBLE_PAGES\n if (pageCount - curPage < PAGINATION_VISIBLE_PAGES && curPage > PAGINATION_VISIBLE_PAGES) {\n startPosition -= PAGINATION_VISIBLE_PAGES - (pageCount - startPosition)\n }\n return Array.from({ length: Math.min(pageCount, PAGINATION_VISIBLE_PAGES) }, (_, i) => i + 1 + startPosition)\n}\n","// extracted by mini-css-extract-plugin\nexport var pagination = \"Pagination-module--pagination--3KtNE\";\nexport var pages = \"Pagination-module--pages--1Bqv1\";\nexport var page = \"Pagination-module--page--1qgQC\";\nexport var next = \"Pagination-module--next--PX9hj\";\nexport var current = \"Pagination-module--current--2kpSb\";\nexport var ellipsis = \"Pagination-module--ellipsis--1_1fQ\";","import * as React from 'react'\n\nimport { Status } from '../../Status/Status'\nimport { Tags } from '../../Tags/Tags'\nimport { Link } from 'gatsby'\nimport { Avatar } from '../../Avatar/Avatar'\nimport { cls } from '../../../common/utils'\nimport { LastModified } from '../../LastModified/LastModified'\nimport { Props } from './ProtocolsListItem.types'\nimport * as styles from './ProtocolsListItem.module.scss'\n\nexport const ProtocolsListItem = ({ protocol, onTagClick }: Props) => {\n const { title, slug, version, status, summary, tags, publisher, avatar, modifiedDate, license } = protocol\n return (\n
\n
\n \n

\n {title} {version}\n

\n \n \n
\n

{summary}

\n \n
\n
\n \n
\n {license}\n \n
\n
\n )\n}\n","// extracted by mini-css-extract-plugin\nexport var item = \"ProtocolsListItem-module--item--DycmU\";\nexport var header = \"ProtocolsListItem-module--header--17jzv\";\nexport var title = \"ProtocolsListItem-module--title--1k0xw\";\nexport var version = \"ProtocolsListItem-module--version--1_-CI\";\nexport var summary = \"ProtocolsListItem-module--summary--28MAv\";\nexport var lastModified = \"ProtocolsListItem-module--lastModified--3Yt0s\";\nexport var avatar = \"ProtocolsListItem-module--avatar--57tBG\";\nexport var footer = \"ProtocolsListItem-module--footer--35Vqh\";","import * as React from 'react'\n\nimport { Pagination } from '../Pagination/Pagination'\nimport { ProtocolsListItem } from './ProtocolsListItem/ProtocolsListItem'\nimport { usePagination } from '../../common/hooks/usePagination'\nimport { Props } from './ProtocolsList.types'\nimport * as styles from './ProtocolsList.module.scss'\n\nexport const ProtocolsList = ({ protocols, onTagClick }: Props) => {\n const { items: paginatedProtocols, setPage, pagesCount, page, next, hasNext } = usePagination(protocols)\n return (\n
\n
    \n {paginatedProtocols.map((protocol) => (\n
  • \n \n
  • \n ))}\n
\n \n
\n )\n}\n","import { useEffect } from 'react'\nimport { NumberParam, useQueryParam } from 'use-query-params'\nimport { ITEMS_PER_PAGE } from '../constants'\n\nexport type Pagination = {\n next: () => void\n pagesCount: number\n prev: () => void\n hasNext: boolean\n items: TItem[]\n page: number\n setPage: (page: number) => void\n}\n\nexport const usePagination = (list: Array): Pagination => {\n const [page, setPage] = useQueryParam('page', NumberParam)\n\n let fallbackPage = page ?? 1\n\n useEffect(() => {\n if (page === undefined) {\n setPage(1, 'replaceIn')\n }\n }, [list])\n\n const items = list.slice((fallbackPage - 1) * ITEMS_PER_PAGE, fallbackPage * ITEMS_PER_PAGE)\n const next = () => setPage(fallbackPage + 1)\n const prev = () => setPage(fallbackPage - 1)\n const hasNext = list.length > fallbackPage * ITEMS_PER_PAGE\n const pagesCount = Math.ceil(list.length / ITEMS_PER_PAGE)\n\n return {\n hasNext,\n next,\n prev,\n items,\n pagesCount,\n setPage,\n page: fallbackPage,\n }\n}\n","// extracted by mini-css-extract-plugin\nexport var list = \"ProtocolsList-module--list--1Ndxz\";","import * as React from 'react'\n\nimport { cls } from '../../common/utils'\nimport { Props } from './Checkbox.types'\nimport * as styles from './Checkbox.module.scss'\n\nexport const Checkbox = ({ value, onChange, label, className }: Props) => {\n return (\n \n )\n}\n","// extracted by mini-css-extract-plugin\nexport var check = \"Checkbox-module--check--15cne\";\nexport var checkbox = \"Checkbox-module--checkbox--2mZlv\";\nexport var input = \"Checkbox-module--input--3BKOi\";","import * as React from 'react'\n\nimport { SvgIcon } from '../SvgIcon/SvgIcon'\nimport { cls } from '../../common/utils'\nimport { Props } from './Button.types'\nimport * as styles from './Button.module.scss'\nimport { ForwardedRef } from 'react'\n\nexport const Button = React.forwardRef(\n ({ icon, children, secondary, className, primary, expanded, ...props }: Props, ref: ForwardedRef) => {\n return (\n \n {icon ? : null}\n {children}\n \n )\n },\n)\n","// extracted by mini-css-extract-plugin\nexport var button = \"Button-module--button--2t432\";\nexport var expanded = \"Button-module--expanded--1tS7m\";\nexport var primary = \"Button-module--primary--1Znlo\";\nexport var secondary = \"Button-module--secondary--2lup3\";\nexport var icon = \"Button-module--icon--ahMay\";","// extracted by mini-css-extract-plugin\nexport var title = \"Filters-module--title--2w9oT\";\nexport var group = \"Filters-module--group--39W7Y\";\nexport var groupTitle = \"Filters-module--groupTitle--7YFdO\";\nexport var filter = \"Filters-module--filter--FPzWd\";","import * as React from 'react'\n\nimport { Props } from './Radio.types'\nimport { cls } from '../../common/utils'\nimport * as styles from './Radio.module.scss'\n\nexport const Radio = ({ onChange, label, value, name, checked, className }: Props) => {\n return (\n