From bddcc9dbde66049c5d95d873fa5e93a3bf0c5543 Mon Sep 17 00:00:00 2001 From: Marien Fressinaud Date: Fri, 2 Feb 2024 10:41:36 +0100 Subject: [PATCH] release: Publish version 0.7.0-alpha --- CHANGELOG.md | 82 ++++++++++++++++++- VERSION.txt | 2 +- public/assets/application-2ncoeD6E.css | 1 + public/assets/application-Nd2aLyzF.css | 1 - public/assets/application-hCpKtbY7.js.map | 1 - ...on-hCpKtbY7.js => application-oCLmm5Qt.js} | 4 +- public/assets/application-oCLmm5Qt.js.map | 1 + public/manifest.json | 4 +- 8 files changed, 88 insertions(+), 8 deletions(-) create mode 100644 public/assets/application-2ncoeD6E.css delete mode 100644 public/assets/application-Nd2aLyzF.css delete mode 100644 public/assets/application-hCpKtbY7.js.map rename public/assets/{application-hCpKtbY7.js => application-oCLmm5Qt.js} (88%) create mode 100644 public/assets/application-oCLmm5Qt.js.map diff --git a/CHANGELOG.md b/CHANGELOG.md index 2c258be5..d4ef9545 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,6 @@ # Changelog of Bileto -## unreleased +## 2024-02-02 - 0.7.0-alpha ### Migration notes @@ -16,6 +16,86 @@ It works a lot better with the module installed. PostgreSQL >= 12 is now required. If you’re still using PostgreSQL 11, you must upgrade to a newer version. +Its no longer possible to create sub-organizations. +In next releases, your existing sub-organizations will be transformed into first-level organizations (see [the issue #516](https://github.com/Probesys/bileto/issues/516)). + +The structure of the roles changed. +“User” roles (as opposed to admin and operational roles) are now more restricted by default. +You should review these roles and possibly change them to “operational” roles. + +### New + +- Allow to approve or refuse a solution ([288a17a](https://github.com/Probesys/bileto/commit/288a17a)) +- Allow to edit the contracts ([0b72c7c](https://github.com/Probesys/bileto/commit/0b72c7c)) + +### Improvements + +- Disallow the creation of sub-organizations ([ee2cc44](https://github.com/Probesys/bileto/commit/ee2cc44)) +- Paginate the tickets lists ([d263301](https://github.com/Probesys/bileto/commit/d263301)) +- Improve the lifecycle of the tickets ([85fad0f](https://github.com/Probesys/bileto/commit/85fad0f)) +- Create "incident" tickets by default ([4de596a](https://github.com/Probesys/bileto/commit/4de596a)) +- Allow emails not to be deleted after collecting them ([4acac03](https://github.com/Probesys/bileto/commit/4acac03)) +- Make roles easier to understand ([6d5e2b6](https://github.com/Probesys/bileto/commit/6d5e2b6)) +- Reword "admin" to "administrator" ([272eec1](https://github.com/Probesys/bileto/commit/272eec1)) +- Warn if user has no permission in their default organization ([911afc4](https://github.com/Probesys/bileto/commit/911afc4)) +- Select the default organization when setting an authorization after creating a user ([8cf832e](https://github.com/Probesys/bileto/commit/8cf832e)) +- Change the label of the organization of authorization ([ed42e09](https://github.com/Probesys/bileto/commit/ed42e09)) +- Change time spent wording from billed/charged to accounted time ([ea707ae](https://github.com/Probesys/bileto/commit/ea707ae)) +- Redirect to the contract after its creation ([73700f6](https://github.com/Probesys/bileto/commit/73700f6)) +- Initialize default contract alerts on creation ([0fe0a91](https://github.com/Probesys/bileto/commit/0fe0a91)) +- Change the traduction of ticket's "Contract" to "Ongoing contract" ([77ab61f](https://github.com/Probesys/bileto/commit/77ab61f)) +- Improve the look and behaviour of disabled checkboxes ([8862664](https://github.com/Probesys/bileto/commit/8862664)) +- Improve the look of the progress bars ([1ffbe9f](https://github.com/Probesys/bileto/commit/1ffbe9f)) +- Improve the CSRF error message ([1595742](https://github.com/Probesys/bileto/commit/1595742)) + +### Bug fixes + +- Display correctly the inline attachments in messages contents ([417a76d](https://github.com/Probesys/bileto/commit/417a76d)) +- Attach messageDocuments to notification emails ([164e45a](https://github.com/Probesys/bileto/commit/164e45a)) +- Ignore HTML errors when creating tickets from emails ([f0dc217](https://github.com/Probesys/bileto/commit/f0dc217)) +- Remove incorrect UTF-8 chars from attachments names ([8d59c95](https://github.com/Probesys/bileto/commit/8d59c95)) +- Handle emails with empty body ([31fdc13](https://github.com/Probesys/bileto/commit/31fdc13)) +- Fix encoding of the email body ([22ef430](https://github.com/Probesys/bileto/commit/22ef430)) +- Track changes to the tickets' ongoing contracts ([c4da224](https://github.com/Probesys/bileto/commit/c4da224)) +- Trim name and notes when creating a contract ([46723b4](https://github.com/Probesys/bileto/commit/46723b4)) +- Disallow to set contracts maxHours below their consumedHours ([32a5bbe](https://github.com/Probesys/bileto/commit/32a5bbe)) +- Use `strcmp` in LocaleSorter if comparison failed with the Collator ([db600db](https://github.com/Probesys/bileto/commit/db600db)) +- Wrap pre elements in messages contents ([6b9cdc4](https://github.com/Probesys/bileto/commit/6b9cdc4)) +- Remove the orphan parenthesis from the "incident updated on" label ([959ed9d](https://github.com/Probesys/bileto/commit/959ed9d)) +- Add a missing HTML closing tag in the header ([3bfbb04](https://github.com/Probesys/bileto/commit/3bfbb04)) + +### Technical + +- Require PostgreSQL >= 12 ([b9917f0](https://github.com/Probesys/bileto/commit/b9917f0)) +- Require PHP >= 8.2 ([1dc250f](https://github.com/Probesys/bileto/commit/1dc250f)) +- Require the PHP imap module ([0f1699f](https://github.com/Probesys/bileto/commit/0f1699f)) +- Upgrade to Symfony 6.4 ([afe5eda](https://github.com/Probesys/bileto/commit/afe5eda)) +- Update the dependencies ([ebf01e7](https://github.com/Probesys/bileto/commit/ebf01e7), [af19f56](https://github.com/Probesys/bileto/commit/af19f56), [4dd097d](https://github.com/Probesys/bileto/commit/4dd097d), [df2e5f5](https://github.com/Probesys/bileto/commit/df2e5f5), [62bb824](https://github.com/Probesys/bileto/commit/62bb824)) +- Configure the `default_uri` in routing ([47a8fb9](https://github.com/Probesys/bileto/commit/47a8fb9)) + +### Documentation + +- Improve the documentation about contributing to code ([17f5be0](https://github.com/Probesys/bileto/commit/17f5be0)) +- Update the roadmap with links to GitHub ([8379dfe](https://github.com/Probesys/bileto/commit/8379dfe)) +- Fix typos in the dependencies documentation ([5dcdc05](https://github.com/Probesys/bileto/commit/5dcdc05)) + +### Developers + +- Provide a pagination component ([7d424db](https://github.com/Probesys/bileto/commit/7d424db)) +- Allow to check permissions of any user ([bfc7a5d](https://github.com/Probesys/bileto/commit/bfc7a5d)) +- Install the Symfony Form component ([e03b841](https://github.com/Probesys/bileto/commit/e03b841)) +- Refactor the contract form with the Form component ([184f273](https://github.com/Probesys/bileto/commit/184f273)) +- Refactor the monitoring of the activity of the entities ([d86759e](https://github.com/Probesys/bileto/commit/d86759e)) +- Add getEntityType to RecordableEntityInterface ([86692d3](https://github.com/Probesys/bileto/commit/86692d3)) +- Set the activeUser in CreateTicketsFromMailboxEmailsHandler ([f2db100](https://github.com/Probesys/bileto/commit/f2db100)) +- Make deprecations notices less verbose in tests ([4c9ea03](https://github.com/Probesys/bileto/commit/4c9ea03)) +- Configure Rector as a new linter ([2c86af0](https://github.com/Probesys/bileto/commit/2c86af0)) +- Provide a make db-rollback command ([ee4d7c2](https://github.com/Probesys/bileto/commit/ee4d7c2)) +- Clean all the Docker stuff on make docker-clean ([aea07f5](https://github.com/Probesys/bileto/commit/aea07f5)) +- Move some docker files under docker/development ([838e769](https://github.com/Probesys/bileto/commit/838e769)) +- Fix node bundler for uid != 1000 ([50f3c95](https://github.com/Probesys/bileto/commit/50f3c95)) +- Restore validators files when extracting translations ([985ed96](https://github.com/Probesys/bileto/commit/985ed96)) + ## 2023-11-23 - 0.6.0-alpha ### New diff --git a/VERSION.txt b/VERSION.txt index 6689d768..630bf599 100644 --- a/VERSION.txt +++ b/VERSION.txt @@ -1 +1 @@ -0.6.0-alpha +0.7.0-alpha diff --git a/public/assets/application-2ncoeD6E.css b/public/assets/application-2ncoeD6E.css new file mode 100644 index 00000000..03e92648 --- /dev/null +++ b/public/assets/application-2ncoeD6E.css @@ -0,0 +1 @@ +p,h1,h2,h3,ul,ol{margin-top:0;margin-bottom:0}@font-face{font-family:Atkinson Hyperlegible;font-style:italic;font-weight:400;font-display:swap;src:url(/assets/atkinson-hyperlegible-400-italic-latin-ext-F8vF4Wdt.woff2) format("woff2");unicode-range:U+0100-024F,U+0259,U+1E00-1EFF,U+2020,U+20A0-20AB,U+20AD-20CF,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:Atkinson Hyperlegible;font-style:italic;font-weight:700;font-display:swap;src:url(/assets/atkinson-hyperlegible-700-italic-latin-ext-qisSKbpU.woff2) format("woff2");unicode-range:U+0100-024F,U+0259,U+1E00-1EFF,U+2020,U+20A0-20AB,U+20AD-20CF,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:Atkinson Hyperlegible;font-style:normal;font-weight:400;font-display:swap;src:url(/assets/atkinson-hyperlegible-400-normal-latin-ext-h_zsaZms.woff2) format("woff2");unicode-range:U+0100-024F,U+0259,U+1E00-1EFF,U+2020,U+20A0-20AB,U+20AD-20CF,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:Atkinson Hyperlegible;font-style:normal;font-weight:700;font-display:swap;src:url(/assets/atkinson-hyperlegible-700-normal-latin-ext-jLOIVgAo.woff2) format("woff2");unicode-range:U+0100-024F,U+0259,U+1E00-1EFF,U+2020,U+20A0-20AB,U+20AD-20CF,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:Atkinson Hyperlegible;font-style:italic;font-weight:400;font-display:swap;src:url(/assets/atkinson-hyperlegible-400-italic-latin-NhNB2np4.woff2) format("woff2");unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+2000-206F,U+2074,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}@font-face{font-family:Atkinson Hyperlegible;font-style:italic;font-weight:700;font-display:swap;src:url(/assets/atkinson-hyperlegible-700-italic-latin-yjrNtZ7y.woff2) format("woff2");unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+2000-206F,U+2074,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}@font-face{font-family:Atkinson Hyperlegible;font-style:normal;font-weight:400;font-display:swap;src:url(/assets/atkinson-hyperlegible-400-normal-latin-s17VRVKp.woff2) format("woff2");unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+2000-206F,U+2074,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}@font-face{font-family:Atkinson Hyperlegible;font-style:normal;font-weight:700;font-display:swap;src:url(/assets/atkinson-hyperlegible-700-normal-latin-61z-i-tS.woff2) format("woff2");unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+2000-206F,U+2074,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}[data-color-scheme=dark]{color-scheme:dark;--color-error1: #1d1412;--color-error2: #2a1410;--color-error3: #3b1813;--color-error4: #481a14;--color-error5: #541c15;--color-error6: #652016;--color-error7: #7f2315;--color-error8: #a42a12;--color-error9: #e54d2e;--color-error10: #ec5e41;--color-error11: #f16a50;--color-error12: #feefec;--color-grey1: #151718;--color-grey2: #1a1d1e;--color-grey3: #202425;--color-grey4: #26292b;--color-grey5: #2b2f31;--color-grey6: #313538;--color-grey7: #3a3f42;--color-grey8: #4c5155;--color-grey9: #697177;--color-grey10: #787f85;--color-grey11: #9ba1a6;--color-grey12: #ecedee;--color-info1: #0c1820;--color-info2: #071d2a;--color-info3: #082636;--color-info4: #082d41;--color-info5: #08354c;--color-info6: #083e59;--color-info7: #064b6b;--color-info8: #005d85;--color-info9: #68ddfd;--color-info10: #8ae8ff;--color-info11: #2ec8ee;--color-info12: #eaf8ff;--color-primary1: #091915;--color-primary2: #04201b;--color-primary3: #062923;--color-primary4: #07312b;--color-primary5: #083932;--color-primary6: #09443c;--color-primary7: #0b544a;--color-primary8: #0c6d62;--color-primary9: #12a594;--color-primary10: #10b3a3;--color-primary11: #0ac5b3;--color-primary12: #e1faf4;--color-success1: #0d1912;--color-success2: #0c1f17;--color-success3: #0f291e;--color-success4: #113123;--color-success5: #133929;--color-success6: #164430;--color-success7: #1b543a;--color-success8: #236e4a;--color-success9: #30a46c;--color-success10: #3cb179;--color-success11: #4cc38a;--color-success12: #e5fbeb;--color-warning1: #1f1300;--color-warning2: #271700;--color-warning3: #341c00;--color-warning4: #3f2200;--color-warning5: #4a2900;--color-warning6: #573300;--color-warning7: #693f05;--color-warning8: #824e00;--color-warning9: #ffb224;--color-warning10: #ffcb47;--color-warning11: #f1a10d;--color-warning12: #fef3dd;--color-box-shadow: rgb(0 0 0 / 50%)}[data-color-scheme=light]{color-scheme:light;--color-error1: #fffcfc;--color-error2: #fff8f7;--color-error3: #fff0ee;--color-error4: #ffe6e2;--color-error5: #fdd8d3;--color-error6: #fac7be;--color-error7: #f3b0a2;--color-error8: #ea9280;--color-error9: #e54d2e;--color-error10: #db4324;--color-error11: #ca3214;--color-error12: #341711;--color-grey1: #fbfcfd;--color-grey2: #f8f9fa;--color-grey3: #f1f3f5;--color-grey4: #eceef0;--color-grey5: #e6e8eb;--color-grey6: #dfe3e6;--color-grey7: #d7dbdf;--color-grey8: #c1c8cd;--color-grey9: #889096;--color-grey10: #7e868c;--color-grey11: #687076;--color-grey12: #11181c;--color-info1: #f9feff;--color-info2: #f1fcff;--color-info3: #e4f9ff;--color-info4: #d5f4fd;--color-info5: #c1ecf9;--color-info6: #a4dff1;--color-info7: #79cfea;--color-info8: #2ebde5;--color-info9: #68ddfd;--color-info10: #5fd4f4;--color-info11: #0078a1;--color-info12: #003242;--color-primary1: #fafefd;--color-primary2: #f1fcfa;--color-primary3: #e7f9f5;--color-primary4: #d9f3ee;--color-primary5: #c7ebe5;--color-primary6: #afdfd7;--color-primary7: #8dcec3;--color-primary8: #53b9ab;--color-primary9: #12a594;--color-primary10: #0e9888;--color-primary11: #067a6f;--color-primary12: #10302b;--color-success1: #fbfefc;--color-success2: #f2fcf5;--color-success3: #e9f9ee;--color-success4: #ddf3e4;--color-success5: #ccebd7;--color-success6: #b4dfc4;--color-success7: #92ceac;--color-success8: #5bb98c;--color-success9: #30a46c;--color-success10: #299764;--color-success11: #18794e;--color-success12: #153226;--color-warning1: #fefdfb;--color-warning2: #fff9ed;--color-warning3: #fff4d5;--color-warning4: #ffecbc;--color-warning5: #ffe3a2;--color-warning6: #ffd386;--color-warning7: #f3ba63;--color-warning8: #ee9d2b;--color-warning9: #ffb224;--color-warning10: #ffa01c;--color-warning11: #ad5700;--color-warning12: #4e2009;--color-box-shadow: rgb(0 0 0 / 12%)}:root{--font-size-smaller: .8em;--font-size-small: .9em;--font-size-normal: 1em;--font-size-big: 1.2em;--font-size-bigger: 1.3em;--width-border: 1px;--width-border-bold: 2px;--width-border-bolder: .5rem;--width-border-input: var(--width-border-bold);--width-outline: .2rem}.flow>*{--flow-size: 2rem}.flow--smaller>*{--flow-size: .5rem}.flow--small>*{--flow-size: 1rem}.flow--large>*{--flow-size: 3rem}.flow--larger>*{--flow-size: 4rem}.flow>*+*{margin-top:var(--flow-size)}.grid{display:grid;grid-gap:2rem;grid-template-columns:repeat(auto-fill,minmax(25rem,1fr))}.grid>*{min-width:0}.indent{margin-left:3rem}.row{display:flex;align-items:stretch}@media (max-width: 799px){.row:not(.row--always){flex-direction:column}}.row--center{align-items:center}.row--baseline{align-items:baseline}.row--middle{justify-content:center}.row--wrap{flex-wrap:wrap}.row__item--extend{flex:1}.row__item--noshrink{flex-shrink:0}.row__item--size1{flex-basis:calc(1 * 100% / 12)}.row__item--size2{flex-basis:calc(2 * 100% / 12)}.row__item--size3{flex-basis:25%}.row__item--size4{flex-basis:calc(4 * 100% / 12)}.row__item--size5{flex-basis:calc(5 * 100% / 12)}.row__item--size6{flex-basis:50%}.row__item--size7{flex-basis:calc(7 * 100% / 12)}.row__item--size8{flex-basis:calc(8 * 100% / 12)}.row__item--size9{flex-basis:75%}.row__item--size10{flex-basis:calc(10 * 100% / 12)}.row__item--size11{flex-basis:calc(11 * 100% / 12)}.row--always.flow>*+*{margin-top:0;margin-left:var(--flow-size)}@media (min-width: 800px){.row.flow>*+*{margin-top:0;margin-left:var(--flow-size)}}.row--always.row--wrap.flow>*{margin-bottom:var(--flow-size)}@media (min-width: 800px){.row--wrap.flow>*{margin-bottom:var(--flow-size)}}.text--secondary{color:var(--color-grey11)}.text--success{color:var(--color-success11)}.text--error{color:var(--color-error11)}.text--info{color:var(--color-info11)}.text--warning{color:var(--color-warning11)}.text--italic{font-style:italic}.text--center{text-align:center}.text--right{text-align:right}.text--left{text-align:left}.text--smaller{font-size:var(--font-size-smaller)}.text--small{font-size:var(--font-size-small)}.text--normal{font-size:var(--font-size-normal)}.text--big{font-size:var(--font-size-big)}.text--bigger{font-size:var(--font-size-bigger)}code{padding:0 .5rem;font-size:var(--font-size-small);background-color:var(--color-grey3);border-radius:.5rem}.wrapper{--wrapper-max-width: 1000px;max-width:var(--wrapper-max-width)}.wrapper--text{--wrapper-max-width: 55ch}.wrapper--small{--wrapper-max-width: 600px}.wrapper--large{--wrapper-max-width: 1200px}.wrapper--larger{--wrapper-max-width: 1400px}.wrapper--center{margin-right:auto;margin-left:auto}.alert{padding:1.5rem 1.5rem 1.5rem 5rem;background-repeat:no-repeat;background-position:left 1rem top 1.5rem;background-size:3rem;border-width:var(--width-border-bold);border-style:solid;border-radius:.5rem}.alert--success{color:var(--color-success12);background-color:var(--color-success2);background-image:url("data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20viewBox='0%200%20512%20512'%3e%3cpath%20fill='%2330a46c'%20d='M256%20512c141.4%200%20256-114.6%20256-256S397.4%200%20256%200S0%20114.6%200%20256S114.6%20512%20256%20512zM369%20209L241%20337c-9.4%209.4-24.6%209.4-33.9%200l-64-64c-9.4-9.4-9.4-24.6%200-33.9s24.6-9.4%2033.9%200l47%2047L335%20175c9.4-9.4%2024.6-9.4%2033.9%200s9.4%2024.6%200%2033.9z'/%3e%3c/svg%3e");border-color:var(--color-success9)}.alert--error{color:var(--color-error12);background-color:var(--color-error2);background-image:url("data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20viewBox='0%200%20512%20512'%3e%3cpath%20fill='%23e54d2e'%20d='M256%20512c141.4%200%20256-114.6%20256-256S397.4%200%20256%200S0%20114.6%200%20256S114.6%20512%20256%20512zm0-384c13.3%200%2024%2010.7%2024%2024V264c0%2013.3-10.7%2024-24%2024s-24-10.7-24-24V152c0-13.3%2010.7-24%2024-24zm32%20224c0%2017.7-14.3%2032-32%2032s-32-14.3-32-32s14.3-32%2032-32s32%2014.3%2032%2032z'/%3e%3c/svg%3e");border-color:var(--color-error9)}.alert--info{color:var(--color-info12);background-color:var(--color-info2);background-image:url("data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20viewBox='0%200%20512%20512'%3e%3cpath%20fill='%230078a1'%20d='M256%20512c141.4%200%20256-114.6%20256-256S397.4%200%20256%200S0%20114.6%200%20256S114.6%20512%20256%20512zM216%20336h24V272H216c-13.3%200-24-10.7-24-24s10.7-24%2024-24h48c13.3%200%2024%2010.7%2024%2024v88h8c13.3%200%2024%2010.7%2024%2024s-10.7%2024-24%2024H216c-13.3%200-24-10.7-24-24s10.7-24%2024-24zm40-144c-17.7%200-32-14.3-32-32s14.3-32%2032-32s32%2014.3%2032%2032s-14.3%2032-32%2032z'/%3e%3c/svg%3e");border-color:var(--color-info9)}.alert--warning{color:var(--color-warning12);background-color:var(--color-warning2);background-image:url("data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20viewBox='0%200%20512%20512'%3e%3cpath%20fill='%23ffb224'%20d='M256%2032c14.2%200%2027.3%207.5%2034.5%2019.8l216%20368c7.3%2012.4%207.3%2027.7%20.2%2040.1S486.3%20480%20472%20480H40c-14.3%200-27.6-7.7-34.7-20.1s-7-27.8%20.2-40.1l216-368C228.7%2039.5%20241.8%2032%20256%2032zm0%20128c-13.3%200-24%2010.7-24%2024V296c0%2013.3%2010.7%2024%2024%2024s24-10.7%2024-24V184c0-13.3-10.7-24-24-24zm32%20224c0-17.7-14.3-32-32-32s-32%2014.3-32%2032s14.3%2032%2032%2032s32-14.3%2032-32z'/%3e%3c/svg%3e");border-color:var(--color-warning9)}.alert__title{font-weight:700}.alert--success .alert__title{color:var(--color-success9)}.alert--error .alert__title{color:var(--color-error9)}.alert--info .alert__title{color:var(--color-info11)}.alert--warning .alert__title{color:var(--color-warning11)}.alert__message{margin-top:.5rem}.alert__message a{color:currentcolor}a{color:var(--color-primary11)}.anchor--noline{text-decoration:none}.anchor--action{display:inline-block;padding:.5rem 1.75rem;line-height:1.5;text-decoration:none;background-color:var(--color-primary3);border:var(--width-border) solid currentcolor;border-radius:2rem;transition:background-color .2s ease-in-out}.anchor--action:hover,.anchor--action:focus{background-color:var(--color-primary4)}.badge{display:inline-block;min-width:3rem;padding:.75rem 1.5rem;text-align:center;white-space:nowrap;border-radius:2.5rem}.badge--block{display:block}.badge--bold{font-weight:700}.badge--smaller{padding:.25rem .5rem;font-size:var(--font-size-smaller)}.badge--small{padding:.25rem .75rem;font-size:var(--font-size-small)}.badge--blue{color:var(--color-info12);background-color:var(--color-info5)}.badge--green{color:var(--color-success12);background-color:var(--color-success5)}.badge--grey{color:var(--color-grey12);background-color:var(--color-grey5)}.badge--orange{color:var(--color-warning12);background-color:var(--color-warning5)}.badge--red{color:var(--color-error12);background-color:var(--color-error5)}button,.button{display:inline-block;padding:.5rem 1.75rem;color:var(--color-grey12);font-family:inherit;font-size:var(--font-size-normal);line-height:1.5;text-decoration:none;background-color:var(--color-grey3);background-image:linear-gradient(to bottom,#0000,#0000000d);box-shadow:0 1px 2px var(--color-box-shadow);border:var(--width-border) solid var(--color-grey8);border-radius:2rem;transition:background-color .2s ease-in-out,border-color .2s ease-in-out;cursor:pointer}button:not([disabled]):hover,button:not([disabled]):focus,.button:not([aria-disabled]):hover,.button:not([aria-disabled]):focus{background-color:var(--color-grey4)}button:not([disabled]):active,.button:not([aria-disabled]):active{background-color:var(--color-grey5)}button[disabled],.button[aria-disabled]{color:var(--color-grey11);border-color:var(--color-grey7);outline:none;cursor:not-allowed;pointer-events:none}.button--primary{color:var(--color-primary12);background-color:var(--color-primary6);border-color:var(--color-primary8)}.button--primary:not([disabled]):hover,.button--primary:not([disabled]):focus,.button--primary:not([aria-disabled]):hover,.button--primary:not([aria-disabled]):focus{background-color:var(--color-primary7)}.button--primary:not([disabled]):active,.button--primary:not([aria-disabled]):active{background-color:var(--color-primary8)}.button--primary[disabled],.button--primary[aria-disabled]{color:var(--color-primary11);border-color:var(--color-primary7)}.button--icon{padding:.75rem 1rem;line-height:1.2;border-radius:5rem}.button--anchor{padding:0;color:var(--color-primary11);background-color:transparent;background-image:none;box-shadow:none;border:none;border-radius:0}.button--anchor:not([disabled]):hover,.button--anchor:not([aria-disabled]):hover,.button--anchor:not([disabled]):focus,.button--anchor:not([aria-disabled]):focus,.button--anchor:not([disabled]):active,.button--anchor:not([aria-disabled]):active{background-color:transparent}.button--discreet{padding:.25rem 1.25rem}.button--caret{position:relative;padding-right:3.75rem}.button--caret:after{content:"";position:absolute;top:.5em;right:.5em;display:block;width:1em;height:1em;opacity:.8;background-image:url("data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20viewBox='0%200%20320%20512'%3e%3cpath%20d='M137.4%20374.6c12.5%2012.5%2032.8%2012.5%2045.3%200l128-128c9.2-9.2%2011.9-22.9%206.9-34.9s-16.6-19.8-29.6-19.8L32%20192c-12.9%200-24.6%207.8-29.6%2019.8s-2.2%2025.7%206.9%2034.9l128%20128z'/%3e%3c/svg%3e");background-repeat:no-repeat;background-position:center;background-size:.7em}.button--caret.button--discreet{padding-right:3.5rem}.button--caret.button--discreet:after{top:.4em;right:.3em;background-size:.6em}.button__caption{display:block;margin-bottom:-.7rem;color:var(--color-grey11);font-size:var(--font-size-small)}.button-group{display:inline-flex}.button-group .button-group__item{height:100%}.button-group>.button-group__item:not(:first-child),.button-group>*:not(:first-child) .button-group__item{border-left:none;border-top-left-radius:0;border-bottom-left-radius:0}.button-group>.button-group__item:not(:last-child),.button-group>*:not(:last-child) .button-group__item{border-top-right-radius:0;border-bottom-right-radius:0}.card{overflow:hidden;display:flex;flex-direction:column;align-items:stretch;background-color:var(--color-grey2);box-shadow:1px 1px 2px 1px var(--color-box-shadow);border-radius:.5rem}.card>*{padding:1.5rem 1rem}.card>*+*{margin-top:-1.5rem}.card--action{align-items:center;justify-content:center;font-weight:700;text-align:center;text-decoration:none;background-color:var(--color-primary3);transition:background-color .2s ease-in-out}.card--action:hover,.card--action:focus{background-color:var(--color-primary4)}.card__title{display:block;font-size:var(--font-size-big);font-weight:700;text-align:center;overflow-wrap:anywhere;border-radius:.5rem}a.card__title{text-decoration:none;outline-offset:calc(-1 * var(--width-outline))}.card__body{flex:1}.documents__item{font-size:var(--font-size-small);background-color:var(--color-grey3);border-radius:.5rem}.documents__link{display:flex;height:100%;padding:2rem 1rem 2rem 4rem;align-items:center;text-decoration:none;background-repeat:no-repeat;background-position:1rem center;background-size:2rem;border-radius:.5rem;overflow-wrap:anywhere}.documents__item[data-type=archive] .documents__link{background-image:url("data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20viewBox='0%200%20384%20512'%3e%3cpath%20d='M365.3%2093.38l-74.63-74.64C278.6%206.742%20262.3%200%20245.4%200L64-.0001c-35.35%200-64%2028.65-64%2064l.0065%20384c0%2035.34%2028.65%2064%2064%2064H320c35.2%200%2064-28.8%2064-64V138.6C384%20121.7%20377.3%20105.4%20365.3%2093.38zM336%20448c0%208.836-7.164%2016-16%2016H64.02c-8.838%200-16-7.164-16-16L48%2064.13c0-8.836%207.164-16%2016-16h48V64h64V48.13h48.01L224%20128c0%2017.67%2014.33%2032%2032%2032h79.1V448zM176%2096h-64v32h64V96zM176%20160h-64v32h64V160zM176%20224h-64l-30.56%20116.5C73.51%20379.5%20103.7%20416%20144.3%20416c40.26%200%2070.45-36.3%2062.68-75.15L176%20224zM160%20368H128c-8.836%200-16-7.164-16-16s7.164-16%2016-16h32c8.836%200%2016%207.164%2016%2016S168.8%20368%20160%20368z'/%3e%3c/svg%3e")}.documents__item[data-type=doc] .documents__link{background-image:url("data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20viewBox='0%200%20384%20512'%3e%3cpath%20d='M365.3%2093.38l-74.63-74.64C278.6%206.742%20262.3%200%20245.4%200H64C28.65%200%200%2028.65%200%2064l.0065%20384c0%2035.34%2028.65%2064%2064%2064H320c35.2%200%2064-28.8%2064-64V138.6C384%20121.7%20377.3%20105.4%20365.3%2093.38zM336%20448c0%208.836-7.164%2016-16%2016H64.02c-8.838%200-16-7.164-16-16L48%2064.13c0-8.836%207.164-16%2016-16h160L224%20128c0%2017.67%2014.33%2032%2032%2032h79.1V448zM214.6%20248C211.3%20238.4%20202.2%20232%20192%20232s-19.25%206.406-22.62%2016L144.7%20318.1l-25.89-77.66C114.6%20227.8%20101%20221.2%2088.41%20225.2C75.83%20229.4%2069.05%20243%2073.23%20255.6l48%20144C124.5%20409.3%20133.5%20415.9%20143.8%20416c10.17%200%2019.45-6.406%2022.83-16L192%20328.1L217.4%20400C220.8%20409.6%20229.8%20416%20240%20416c10.27-.0938%2019.53-6.688%2022.77-16.41l48-144c4.188-12.59-2.594-26.16-15.17-30.38c-12.61-4.125-26.2%202.594-30.36%2015.19l-25.89%2077.66L214.6%20248z'/%3e%3c/svg%3e")}.documents__item[data-type=pdf] .documents__link{background-image:url("data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20viewBox='0%200%20384%20512'%3e%3cpath%20d='M320%20464C328.8%20464%20336%20456.8%20336%20448V416H384V448C384%20483.3%20355.3%20512%20320%20512H64C28.65%20512%200%20483.3%200%20448V416H48V448C48%20456.8%2055.16%20464%2064%20464H320zM256%20160C238.3%20160%20224%20145.7%20224%20128V48H64C55.16%2048%2048%2055.16%2048%2064V192H0V64C0%2028.65%2028.65%200%2064%200H229.5C246.5%200%20262.7%206.743%20274.7%2018.75L365.3%20109.3C377.3%20121.3%20384%20137.5%20384%20154.5V192H336V160H256zM88%20224C118.9%20224%20144%20249.1%20144%20280C144%20310.9%20118.9%20336%2088%20336H80V368C80%20376.8%2072.84%20384%2064%20384C55.16%20384%2048%20376.8%2048%20368V240C48%20231.2%2055.16%20224%2064%20224H88zM112%20280C112%20266.7%20101.3%20256%2088%20256H80V304H88C101.3%20304%20112%20293.3%20112%20280zM160%20240C160%20231.2%20167.2%20224%20176%20224H200C226.5%20224%20248%20245.5%20248%20272V336C248%20362.5%20226.5%20384%20200%20384H176C167.2%20384%20160%20376.8%20160%20368V240zM192%20352H200C208.8%20352%20216%20344.8%20216%20336V272C216%20263.2%20208.8%20256%20200%20256H192V352zM336%20224C344.8%20224%20352%20231.2%20352%20240C352%20248.8%20344.8%20256%20336%20256H304V288H336C344.8%20288%20352%20295.2%20352%20304C352%20312.8%20344.8%20320%20336%20320H304V368C304%20376.8%20296.8%20384%20288%20384C279.2%20384%20272%20376.8%20272%20368V240C272%20231.2%20279.2%20224%20288%20224H336z'/%3e%3c/svg%3e")}.documents__item[data-type=spreadsheet] .documents__link{background-image:url("data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20viewBox='0%200%20384%20512'%3e%3cpath%20d='M365.3%2093.38l-74.63-74.64C278.6%206.742%20262.3%200%20245.4%200H64C28.65%200%200%2028.65%200%2064l.0065%20384c0%2035.34%2028.65%2064%2064%2064H320c35.2%200%2064-28.8%2064-64V138.6C384%20121.7%20377.3%20105.4%20365.3%2093.38zM336%20448c0%208.836-7.164%2016-16%2016H64.02c-8.838%200-16-7.164-16-16L48%2064.13c0-8.836%207.164-16%2016-16h160L224%20128c0%2017.67%2014.33%2032%2032%2032h79.1V448zM229.1%20233.3L192%20280.9L154.9%20233.3C146.8%20222.8%20131.8%20220.9%20121.3%20229.1C110.8%20237.2%20108.9%20252.3%20117.1%20262.8L161.6%20320l-44.53%2057.25c-8.156%2010.47-6.25%2025.56%204.188%2033.69C125.7%20414.3%20130.8%20416%20135.1%20416c7.156%200%2014.25-3.188%2018.97-9.25L192%20359.1l37.06%2047.65C233.8%20412.8%20240.9%20416%20248%20416c5.125%200%2010.31-1.656%2014.72-5.062c10.44-8.125%2012.34-23.22%204.188-33.69L222.4%20320l44.53-57.25c8.156-10.47%206.25-25.56-4.188-33.69C252.2%20220.9%20237.2%20222.8%20229.1%20233.3z'/%3e%3c/svg%3e")}.documents__item[data-type=image] .documents__link{background-image:url("data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20viewBox='0%200%20384%20512'%3e%3cpath%20d='M365.3%2093.38l-74.63-74.64C278.6%206.742%20262.3%200%20245.4%200H64C28.65%200%200%2028.65%200%2064l.0065%20384c0%2035.34%2028.65%2064%2064%2064H320c35.2%200%2064-28.8%2064-64V138.6C384%20121.7%20377.3%20105.4%20365.3%2093.38zM336%20448c0%208.836-7.164%2016-16%2016H64.02c-8.838%200-16-7.164-16-16L48%2064.13c0-8.836%207.164-16%2016-16h160L224%20128c0%2017.67%2014.33%2032%2032%2032h79.1V448zM215.3%20292c-4.68%200-9.051%202.34-11.65%206.234L164%20357.8l-11.68-17.53C149.7%20336.3%20145.3%20334%20140.7%20334c-4.682%200-9.053%202.34-11.65%206.234l-46.67%2070c-2.865%204.297-3.131%209.82-.6953%2014.37C84.09%20429.2%2088.84%20432%2093.1%20432h196c5.163%200%209.907-2.844%2012.34-7.395c2.436-4.551%202.17-10.07-.6953-14.37l-74.67-112C224.4%20294.3%20220%20292%20215.3%20292zM128%20288c17.67%200%2032-14.33%2032-32S145.7%20224%20128%20224S96%20238.3%2096%20256S110.3%20288%20128%20288z'/%3e%3c/svg%3e")}.documents__item[data-type=file] .documents__link{background-image:url("data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20viewBox='0%200%20384%20512'%3e%3cpath%20d='M0%2064C0%2028.65%2028.65%200%2064%200H229.5C246.5%200%20262.7%206.743%20274.7%2018.75L365.3%20109.3C377.3%20121.3%20384%20137.5%20384%20154.5V448C384%20483.3%20355.3%20512%20320%20512H64C28.65%20512%200%20483.3%200%20448V64zM336%20448V160H256C238.3%20160%20224%20145.7%20224%20128V48H64C55.16%2048%2048%2055.16%2048%2064V448C48%20456.8%2055.16%20464%2064%20464H320C328.8%20464%20336%20456.8%20336%20448z'/%3e%3c/svg%3e")}.documents__delete{padding:2rem 1rem}.form--inline{display:inline-block}label{display:block;padding-right:.75rem;padding-left:.75rem}input,textarea{width:100%;padding:.5rem .75rem;color:inherit;font-family:inherit;font-size:var(--font-size-normal);line-height:1.5;background-color:var(--color-grey1);box-shadow:2px 2px 3px var(--color-box-shadow) inset;border:var(--width-border-input) solid var(--color-grey8);border-radius:.5rem;transition:background-color .2s ease-in-out,border-color .2s ease-in-out}textarea{max-width:100%;min-height:15rem}input[disabled],textarea[disabled]{color:var(--color-grey11)}input:not([disabled]):hover,input:not([disabled]):focus,textarea:not([disabled]):hover,textarea:not([disabled]):focus{background-color:var(--color-primary2);border-color:var(--color-primary8)}input[aria-invalid],textarea[aria-invalid]{background-color:var(--color-error2);border-color:var(--color-error11)}.input--size1{width:6rem}.input--size2{width:10rem}.input--size3{width:15rem}.input--size4{width:20rem}input[type=checkbox],input[type=radio]{position:absolute;overflow:hidden;clip:rect(0,0,0,0);width:1px;height:1px}input[type=checkbox]+label,input[type=radio]+label{position:relative;display:inline-flex;align-items:center}input[type=checkbox][disabled]+label,input[type=radio][disabled]+label{color:var(--color-grey11)}input[type=checkbox]+label:before,input[type=radio]+label:before{content:"";position:relative;width:2.5rem;height:2.5rem;margin-right:.75rem;flex-shrink:0;background-color:var(--color-grey1);box-shadow:2px 2px 3px var(--color-box-shadow) inset;border:var(--width-border-input) solid var(--color-grey8);border-radius:.5rem;transition:border-color .2s ease-in-out,background-color .2s ease-in-out}input[type=radio]+label:before{border-radius:50%}input[type=checkbox]:focus+label:before{outline:var(--width-outline) solid var(--color-primary9)}input[type=checkbox]:not([disabled]):checked+label:before,input[type=radio]:not([disabled]):checked+label:before{border-color:var(--color-grey11)}input[type=checkbox]:not([disabled]):hover+label:before,input[type=checkbox]:not([disabled]):focus+label:before,input[type=radio]:not([disabled]):hover+label:before,input[type=radio]:not([disabled]):focus+label:before{background-color:var(--color-primary2);border-color:var(--color-primary8)}input[type=checkbox]:checked+label:after,input[type=radio]:checked+label:after{content:"";position:absolute;left:1.25rem;width:1.5rem;height:.75rem;margin-top:-.3rem;border-bottom:var(--width-border-bold) solid var(--color-grey12);border-left:var(--width-border-bold) solid var(--color-grey12);transform:rotate(-45deg)}input[type=radio]:checked+label:after{height:1.5rem;margin-top:0;background-color:var(--color-grey12);border-top:var(--width-border-bold) solid var(--color-grey12);border-right:var(--width-border-bold) solid var(--color-grey12);border-radius:50%}input[type=checkbox]:disabled:checked+label:after,input[type=radio]:disabled:checked+label:after{border-color:var(--color-grey11)}select{width:100%;padding:.5rem .75rem;color:inherit;font-family:inherit;font-size:var(--font-size-normal);line-height:1.5;text-overflow:ellipsis;background-color:var(--color-grey3);border:var(--width-border-input) solid var(--color-grey8);border-radius:.5rem;transition:background-color .2s ease-in-out,border-color .2s ease-in-out}.row>select{width:auto}select:not([multiple]){padding-right:3.5rem;background-image:url("data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20viewBox='0%200%20448%20512'%3e%3cpath%20d='M201.4%20374.6c12.5%2012.5%2032.8%2012.5%2045.3%200l160-160c12.5-12.5%2012.5-32.8%200-45.3s-32.8-12.5-45.3%200L224%20306.7%2086.6%20169.4c-12.5-12.5-32.8-12.5-45.3%200s-12.5%2032.8%200%2045.3l160%20160z'/%3e%3c/svg%3e");background-repeat:no-repeat;background-position:right .75rem top 58%;background-size:2rem;-webkit-appearance:none;-moz-appearance:none;appearance:none}[data-color-scheme=dark] select:not([multiple]){background-image:url("data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20viewBox='0%200%20448%20512'%3e%3cpath%20fill='%23ecedee'%20d='M201.4%20374.6c12.5%2012.5%2032.8%2012.5%2045.3%200l160-160c12.5-12.5%2012.5-32.8%200-45.3s-32.8-12.5-45.3%200L224%20306.7%2086.6%20169.4c-12.5-12.5-32.8-12.5-45.3%200s-12.5%2032.8%200%2045.3l160%20160z'/%3e%3c/svg%3e")}select:not([disabled]):hover,select:not([disabled]):focus{background-color:var(--color-primary4);border-color:var(--color-primary8)}select[disabled]{color:var(--color-grey11);background-color:var(--color-grey2);border-color:var(--color-grey7)}select[disabled]:not([multiple]){background-image:url("data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20viewBox='0%200%20448%20512'%3e%3cpath%20fill='%23687076'%20d='M201.4%20374.6c12.5%2012.5%2032.8%2012.5%2045.3%200l160-160c12.5-12.5%2012.5-32.8%200-45.3s-32.8-12.5-45.3%200L224%20306.7%2086.6%20169.4c-12.5-12.5-32.8-12.5-45.3%200s-12.5%2032.8%200%2045.3l160%20160z'/%3e%3c/svg%3e")}[data-color-scheme=dark] select[disabled]:not([multiple]){background-image:url("data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20viewBox='0%200%20448%20512'%3e%3cpath%20fill='%239ba1a6'%20d='M201.4%20374.6c12.5%2012.5%2032.8%2012.5%2045.3%200l160-160c12.5-12.5%2012.5-32.8%200-45.3s-32.8-12.5-45.3%200L224%20306.7%2086.6%20169.4c-12.5-12.5-32.8-12.5-45.3%200s-12.5%2032.8%200%2045.3l160%20160z'/%3e%3c/svg%3e")}select[aria-invalid]{background-color:var(--color-error2);border-color:var(--color-error11)}fieldset{min-width:auto;margin-right:-1rem;margin-left:-1rem;padding:1rem;background-color:var(--color-grey2);border:none;border-top:var(--width-border) solid var(--color-grey6);border-bottom:var(--width-border) solid var(--color-grey6)}@media (min-width: 800px){fieldset{margin-right:-1.25rem;margin-left:-1.25rem;border:var(--width-border) solid var(--color-grey6);border-radius:.5rem}}legend{margin-right:auto;margin-left:auto;padding-right:1rem;padding-left:1rem}.editor{background-color:var(--tinymce-background);border:var(--width-border-input) solid var(--color-grey8);border-radius:.5rem;transition:border-color .2s ease-in-out}[data-color-scheme=light] .editor{--tinymce-background: #fff}[data-color-scheme=dark] .editor{--tinymce-background: #222f3e}.editor:hover,.editor:focus-within{border-color:var(--color-primary8)}.editor__documents{padding:1.5rem;border-top:var(--width-border) solid var(--color-grey8)}.editor .tox-tinymce{border:none;border-radius:.5rem .5rem 0 0}.form__caption{padding-right:.75rem;padding-left:.75rem;color:var(--color-grey11);font-size:var(--font-size-small)}.form__error{padding-left:1.75em;color:var(--color-error11);font-size:var(--font-size-small);font-weight:700;background-image:url("data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20viewBox='0%200%20512%20512'%3e%3cpath%20fill='%23e54d2e'%20d='M256%20512c141.4%200%20256-114.6%20256-256S397.4%200%20256%200S0%20114.6%200%20256S114.6%20512%20256%20512zm0-384c13.3%200%2024%2010.7%2024%2024V264c0%2013.3-10.7%2024-24%2024s-24-10.7-24-24V152c0-13.3%2010.7-24%2024-24zm32%20224c0%2017.7-14.3%2032-32%2032s-32-14.3-32-32s14.3-32%2032-32s32%2014.3%2032%2032z'/%3e%3c/svg%3e");background-repeat:no-repeat;background-position:.75rem center;background-size:1.1em}.form__actions{display:flex;flex-direction:column;align-items:center;justify-content:center}.form__actions>*+*{margin-top:1rem}@media (min-width: 800px){.form__actions{flex-direction:row-reverse}.form__actions>*+*{margin-top:0}}.input-container{position:relative}.input-container button{position:absolute;right:0;color:var(--color-grey11);background-color:transparent;background-image:none;box-shadow:none;border-color:transparent;outline-offset:calc(-1 * var(--width-outline))}.input-container button:hover,.input-container button:focus{color:var(--color-grey12);background-color:transparent}.input-container button[aria-pressed=false] .icon--eye-slash,.input-container button[aria-pressed=true] .icon--eye{display:none}.icon{display:inline-block;width:1em;height:auto;margin-top:.15em;vertical-align:text-top;fill:currentcolor}img{max-width:100%;height:auto}.layout__header-anchor{display:block;min-width:7rem;padding:2rem 2rem 1.5rem;text-align:center;text-decoration:none;border-bottom:var(--width-border-bolder) solid transparent;outline-offset:calc(-1 * var(--width-outline));transition:background-color .2s ease-in-out}.layout__header-anchor[aria-current=page]{background-color:var(--color-primary3);border-color:var(--color-primary9)}.layout__header-anchor:hover,.layout__header-anchor:focus{background-color:var(--color-primary4)}.layout__header-home{width:11rem;padding-top:1.5rem;padding-bottom:1rem}.layout__header-home img{display:block}.layout__header-avatar{margin:.5rem;border-radius:50%}.layout__header-avatar .icon{width:2em;margin-top:0}.layout__body{padding:2rem 1rem 10rem;background-color:var(--color-grey1);box-shadow:0 1px 3px var(--color-box-shadow)}.layout__body--small{max-width:600px;margin-right:auto;margin-left:auto}@media (min-width: 800px){.layout__body{padding-right:2rem;padding-left:2rem}.layout__body--small{border-radius:.5rem}}.layout__breadcrumb{padding-bottom:2rem;border-bottom:var(--width-border) solid var(--color-grey4)}.layout__breadcrumb>*{display:inline-block;vertical-align:middle}.layout__breadcrumb>a{text-decoration:none}.layout__breadcrumb>h1{text-align:left}.layout__breadcrumb>*:not(:last-child):after{content:"";display:inline-block;width:1.5rem;height:1.5rem;margin-top:-.1rem;margin-right:1rem;margin-left:.75rem;vertical-align:middle;border-top:var(--width-border-bold) solid var(--color-primary6);border-right:var(--width-border-bold) solid var(--color-primary6);transform:rotate(45deg)}.banner__container{display:block;padding:1rem;text-align:center;background-color:var(--color-primary3);box-shadow:0 1px 3px var(--color-box-shadow);border-bottom:var(--width-border-bold) solid var(--color-primary6)}.layout__banner--alert .banner__container{color:var(--color-error12);background-color:var(--color-error2);border-bottom-color:var(--color-error9)}.list--nostyle{padding:0;list-style:none}.list--padded>li{padding:1rem 1.75rem}.list--border{border:var(--width-border) solid var(--color-grey7);border-radius:.5rem}.list--border>li+li{border-top:var(--width-border) solid var(--color-grey7)}.list--strip>li:first-child{border-top-left-radius:.5rem;border-top-right-radius:.5rem}.list--strip>li:last-child{border-bottom-right-radius:.5rem;border-bottom-left-radius:.5rem}.list--strip>li:nth-child(odd){background-color:var(--color-grey3)}.list--strip>li:nth-child(2n){background-color:var(--color-grey4)}.message{--message-background: var(--color-grey2);--message-background-header: var(--color-grey3);--message-border-color: var(--color-grey7);--message-border-width: var(--width-border);display:flex;align-items:flex-start}.message--solution{--message-background: var(--color-success1);--message-background-header: var(--color-success4);--message-border-color: var(--color-success7);--message-border-width: var(--width-border-bold)}.message__avatar{position:relative;margin-right:2rem}@media (max-width: 799px){.message__avatar{display:none}}.message__avatar>.icon{width:5rem}.message__role{position:absolute;right:-.75rem;bottom:-.75rem;width:3rem;height:3rem;padding:.3rem;text-align:center;opacity:.9;background-color:var(--color-grey1);border:var(--message-border-width) solid var(--message-border-color);border-radius:2rem}.message__role>.icon{width:75%;height:75%}.message__box{position:relative;flex:1;border:var(--message-border-width) solid var(--message-border-color);border-radius:.5rem}@media (min-width: 800px){.message__avatar+.message__box:before{content:" ";position:absolute;top:14px;right:100%;left:-8px;display:block;width:8px;height:16px;background-color:var(--message-border-color);-webkit-clip-path:polygon(0 50%,100% 0,100% 100%);clip-path:polygon(0 50%,100% 0,100% 100%)}}.message__top{display:flex;padding:.75rem 2rem;align-items:center;font-size:var(--font-size-small);background-color:var(--message-background-header);border-bottom:var(--message-border-width) solid var(--message-border-color);border-radius:.5rem .5rem 0 0}.message--solution .message__top{color:var(--color-success12)}.message__top *+*{margin-left:.5rem}.message__top-separator{flex:1}.message__author{font-weight:700}.message__badge{margin-left:1rem;padding:.25rem .5rem;font-size:var(--font-size-small);border:var(--width-border) solid var(--message-border-color);border-radius:.5rem}.message__date{color:var(--color-grey11)}.message--solution .message__date{color:var(--color-success11)}.message__content{position:relative;padding:3rem 2rem;background-color:var(--message-background);border-radius:0 0 .5rem .5rem}.message--confidential .message__content:after{content:"";position:absolute;top:0;right:0;bottom:0;left:0;opacity:.1;background-image:url("data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20viewBox='0%200%20448%20512'%3e%3cpath%20d='M224%2016c-6.7%200-10.8-2.8-15.5-6.1C201.9%205.4%20194%200%20176%200c-30.5%200-52%2043.7-66%2089.4C62.7%2098.1%2032%20112.2%2032%20128c0%2014.3%2025%2027.1%2064.6%2035.9c-.4%204-.6%208-.6%2012.1c0%2017%203.3%2033.2%209.3%2048H45.4C38%20224%2032%20230%2032%20237.4c0%201.7%20.3%203.4%201%205l38.8%2096.9C28.2%20371.8%200%20423.8%200%20482.3C0%20498.7%2013.3%20512%2029.7%20512H418.3c16.4%200%2029.7-13.3%2029.7-29.7c0-58.5-28.2-110.4-71.7-143L415%20242.4c.6-1.6%201-3.3%201-5c0-7.4-6-13.4-13.4-13.4H342.7c6-14.8%209.3-31%209.3-48c0-4.1-.2-8.1-.6-12.1C391%20155.1%20416%20142.3%20416%20128c0-15.8-30.7-29.9-78-38.6C324%2043.7%20302.5%200%20272%200c-18%200-25.9%205.4-32.5%209.9c-4.7%203.3-8.8%206.1-15.5%206.1zm56%20208H267.6c-16.5%200-31.1-10.6-36.3-26.2c-2.3-7-12.2-7-14.5%200c-5.2%2015.6-19.9%2026.2-36.3%2026.2H168c-22.1%200-40-17.9-40-40V169.6c28.2%204.1%2061%206.4%2096%206.4s67.8-2.3%2096-6.4V184c0%2022.1-17.9%2040-40%2040zm-88%2096l16%2032L176%20480%20128%20288l64%2032zm128-32L272%20480%20240%20352l16-32%2064-32z'/%3e%3c/svg%3e");background-repeat:no-repeat;background-position:calc(100% - 2rem) calc(100% + 4rem);background-size:10rem;pointer-events:none}[data-color-scheme=dark] .message--confidential .message__content:after{background-image:url("data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20viewBox='0%200%20448%20512'%3e%3cpath%20fill='%23ecedee'%20d='M224%2016c-6.7%200-10.8-2.8-15.5-6.1C201.9%205.4%20194%200%20176%200c-30.5%200-52%2043.7-66%2089.4C62.7%2098.1%2032%20112.2%2032%20128c0%2014.3%2025%2027.1%2064.6%2035.9c-.4%204-.6%208-.6%2012.1c0%2017%203.3%2033.2%209.3%2048H45.4C38%20224%2032%20230%2032%20237.4c0%201.7%20.3%203.4%201%205l38.8%2096.9C28.2%20371.8%200%20423.8%200%20482.3C0%20498.7%2013.3%20512%2029.7%20512H418.3c16.4%200%2029.7-13.3%2029.7-29.7c0-58.5-28.2-110.4-71.7-143L415%20242.4c.6-1.6%201-3.3%201-5c0-7.4-6-13.4-13.4-13.4H342.7c6-14.8%209.3-31%209.3-48c0-4.1-.2-8.1-.6-12.1C391%20155.1%20416%20142.3%20416%20128c0-15.8-30.7-29.9-78-38.6C324%2043.7%20302.5%200%20272%200c-18%200-25.9%205.4-32.5%209.9c-4.7%203.3-8.8%206.1-15.5%206.1zm56%20208H267.6c-16.5%200-31.1-10.6-36.3-26.2c-2.3-7-12.2-7-14.5%200c-5.2%2015.6-19.9%2026.2-36.3%2026.2H168c-22.1%200-40-17.9-40-40V169.6c28.2%204.1%2061%206.4%2096%206.4s67.8-2.3%2096-6.4V184c0%2022.1-17.9%2040-40%2040zm-88%2096l16%2032L176%20480%20128%20288l64%2032zm128-32L272%20480%20240%20352l16-32%2064-32z'/%3e%3c/svg%3e")}.message__content *+p,.message__content *+ul,.message__content *+ol{margin-top:2rem}.message__content th,.message__content td{padding:initial;font-size:var(--font-size-normal);vertical-align:initial}.message__content tbody tr{border-bottom:none}.message__content tbody tr:nth-child(odd){background-color:var(--message-background)}.message__content tbody tr:nth-child(2n){background-color:var(--message-background)}.message__content blockquote{margin-left:0;padding-left:2rem;color:var(--color-grey11);border-left:var(--width-border-bold) solid var(--color-primary6)}.message__content pre{white-space:pre-wrap}.message__bottom{padding:2rem;background-color:var(--message-background);border-top:var(--message-border-width) solid var(--message-border-color);border-radius:0 0 .5rem .5rem}.modal{position:fixed;z-index:999;top:0;right:0;bottom:0;left:0;visibility:hidden;overflow:hidden auto;opacity:0;background-color:#0000007f;transform:scaleX(1.02) scaleY(1.02);transition:visibility 0s linear .2s,opacity .2s 0s,transform .2s}.modal[aria-hidden=false]{visibility:visible;opacity:1;transform:scaleX(1) scaleY(1);transition:visibility 0s linear 0s,opacity .2s 0s,transform .2s}.modal__box{max-width:1000px;margin:2rem auto 5rem;background-color:var(--color-grey1);box-shadow:0 0 10px var(--color-box-shadow);scroll-margin-top:2rem}@media (min-width: 800px){.modal__box{margin-top:5rem}}@media (min-width: 1000px){.modal__box{border-radius:.75rem}}.modal__header{padding:1rem;text-align:right}.modal__body{overflow:hidden;min-height:15rem;padding-right:1rem;padding-bottom:6rem;padding-left:1rem}@media (min-width: 800px){.modal__body{padding-right:2rem;padding-left:2rem}}.modal__title{margin-bottom:2rem;text-align:center}body.modal-opened{overflow:hidden}.notifications{position:fixed;z-index:9999;top:0;right:0;left:0;padding:3rem;pointer-events:none}.notifications__item{position:relative;max-width:500px;margin-left:auto;padding:2rem 5rem;font-weight:700;background-repeat:no-repeat;background-position:left 1rem center;background-size:3rem;box-shadow:1px 2px 3px 1px var(--color-box-shadow);border-left-width:var(--width-border-bolder);border-left-style:solid;border-radius:.5rem;pointer-events:auto}.notifications__item--success{color:var(--color-success11);background-color:var(--color-success3);background-image:url("data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20viewBox='0%200%20512%20512'%3e%3cpath%20fill='%2330a46c'%20d='M256%20512c141.4%200%20256-114.6%20256-256S397.4%200%20256%200S0%20114.6%200%20256S114.6%20512%20256%20512zM369%20209L241%20337c-9.4%209.4-24.6%209.4-33.9%200l-64-64c-9.4-9.4-9.4-24.6%200-33.9s24.6-9.4%2033.9%200l47%2047L335%20175c9.4-9.4%2024.6-9.4%2033.9%200s9.4%2024.6%200%2033.9z'/%3e%3c/svg%3e");border-color:var(--color-success9)}.notifications__item--error{color:var(--color-error11);background-color:var(--color-error3);background-image:url("data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20viewBox='0%200%20512%20512'%3e%3cpath%20fill='%23e54d2e'%20d='M256%20512c141.4%200%20256-114.6%20256-256S397.4%200%20256%200S0%20114.6%200%20256S114.6%20512%20256%20512zm0-384c13.3%200%2024%2010.7%2024%2024V264c0%2013.3-10.7%2024-24%2024s-24-10.7-24-24V152c0-13.3%2010.7-24%2024-24zm32%20224c0%2017.7-14.3%2032-32%2032s-32-14.3-32-32s14.3-32%2032-32s32%2014.3%2032%2032z'/%3e%3c/svg%3e");border-color:var(--color-error9)}.notifications__item button{position:absolute;top:1.25rem;right:1rem;color:currentcolor;background:none;box-shadow:none;border:none}.pagination__container{display:flex;padding-left:0;justify-content:center;list-style:none}.pagination__item{margin-right:.25rem;margin-left:.25rem}.pagination__item--disabled{visibility:hidden}.pagination__link{display:inline-block;padding:.5rem 1.25rem;color:var(--color-primary12);text-decoration:none;border-radius:.5rem}.pagination__item--current .pagination__link{font-weight:700;background-color:var(--color-primary6)}.pagination__item--ellipsis{color:var(--color-grey10)}@media (max-width: 799px){.pagination__item--number,.pagination__item--ellipsis{display:none}}.placeholder{display:flex;min-height:25rem;padding:1rem;flex-direction:column;align-items:center;justify-content:center;color:var(--color-grey11);font-size:var(--font-size-bigger);text-align:center;background-color:var(--color-grey3);border-radius:.5rem}.placeholder .icon{margin-bottom:1rem;font-size:2em}.popup{position:relative;display:inline-block}.popup__opener{height:100%;list-style:none}.popup__opener::-webkit-details-marker{display:none}.popup__opener:focus{outline:0}.popup__opener:focus>*{outline:var(--width-outline) solid var(--color-primary9)}.popup__container{position:fixed;z-index:100;right:0;bottom:0;left:0;padding-top:1rem;padding-bottom:1rem;background-color:var(--color-primary3);border-top:var(--width-border) solid var(--color-primary7)}@media (min-width: 800px){.popup__container{position:absolute;bottom:auto;min-width:27rem;box-shadow:1px 2px 3px 1px var(--color-box-shadow);border:var(--width-border) solid var(--color-primary7);border-top-width:var(--width-border);border-radius:.75rem}.popup__container--large{min-width:31rem}.popup__container--center{left:50%;margin-top:1.25rem;margin-right:auto;margin-left:auto;transform:translate(-50%)}.popup__container--right{right:0;left:auto;margin-top:1.25rem}.popup__container--left{right:auto;left:0;margin-top:1.25rem}.popup__container--top{bottom:100%;margin-top:0;margin-bottom:1.25rem}.popup__container--center:before,.popup__container--right:before,.popup__container--left:before{content:"";position:absolute;top:-8px;display:block;width:16px;height:8px;background-color:var(--color-primary7);-webkit-clip-path:polygon(50% 0,100% 100%,0 100%);clip-path:polygon(50% 0,100% 100%,0 100%)}.popup__container--center:before{left:50%;transform:translate(-50%)}.popup__container--right:before{right:2.75rem}.popup__container--left:before{left:2.75rem}.popup__container--top:before{top:auto;bottom:-8px;transform:rotate(180deg)}}.popup__title{margin-bottom:1rem;padding-right:1.5rem;padding-left:1.5rem;font-weight:700;overflow-wrap:anywhere}.popup__separator{height:.2rem;margin:1rem 1.5rem;background-color:var(--color-primary7);border-radius:.75rem}.popup__item{display:block;width:100%;padding:1rem 1.5rem;color:var(--color-grey12);line-height:1.5;text-align:left;text-decoration:none;background-color:transparent;background-image:none;box-shadow:none;border:none;border-radius:0;transition:none;transition:background-color .2s ease-in-out}@media (min-width: 800px){.popup__item{white-space:nowrap}}.popup__item:not([disabled]):hover,.popup__item:not([disabled]):focus{color:var(--color-grey12);background-color:var(--color-primary5)}.popup__item:not([disabled]):focus{outline-offset:-.1rem}.popup__item:not([disabled]):active{background-color:var(--color-primary5)}.popup__item .icon{margin-right:.25rem}input[type=radio]:focus+.popup__item{color:var(--color-grey12);background-color:var(--color-primary5);outline:var(--width-outline) solid var(--color-primary9);outline-offset:-.1rem}input[type=radio]+.popup__item:before{visibility:hidden}input[type=radio]:checked+.popup__item:after{top:1.75rem;left:2.2rem;height:1rem;background-color:transparent;border-top:none;border-right:none;border-radius:0}progress{display:block;width:100%;height:2rem;background-color:var(--color-primary2);border:var(--width-border) solid var(--color-primary9);border-radius:1rem;-webkit-appearance:none;-moz-appearance:none;appearance:none}progress::-webkit-progress-bar,progress::-moz-progress-bar{max-width:calc(100% - 2px);height:calc(100% - 2px);margin:1px;background-color:var(--color-primary9);border-radius:1rem}.progress--warning{background-color:var(--color-warning2);border-color:var(--color-warning9)}.progress--warning::-webkit-progress-bar,.progress--warning::-moz-progress-bar{background-color:var(--color-warning9)}.progress-with-marker{position:relative}.progress__marker{position:absolute;top:0;left:var(--marker-percent);padding-top:2.5rem;font-size:.8em;text-align:center;transform:translate(-50%)}.progress__marker:before{content:"";position:absolute;top:0;left:calc(50% - 1px);display:block;width:0;height:2.5rem;border-left:2px dotted var(--color-grey12)}.scroll-to-top{position:absolute;top:0;right:0;width:1px;height:100vh}.scroll-to-top__button{position:fixed;right:50%;bottom:2rem;visibility:visible;opacity:1;transform:translate(50%);transition:opacity .2s ease}@media (min-width: 800px){.scroll-to-top__button{right:2rem;transform:none}}.scroll-to-top[data-visible=false] .scroll-to-top__button{visibility:hidden;opacity:0}.sidebar{padding-right:1rem;padding-left:1rem}ul.sidebar{list-style:none}@media (min-width: 800px){.sidebar{min-width:20rem;margin-right:-1rem}}@media (min-width: 1200px){.sidebar{min-width:30rem}}.sidebar__title{padding:1rem;color:var(--color-grey11)}.sidebar__anchor{display:block;padding:1rem;color:var(--color-grey12);text-decoration:none;white-space:nowrap;border-left:var(--width-border-bolder) solid transparent;border-radius:.5rem;transition:background-color .2s ease-in-out,border-color .2s ease-in-out}.sidebar__anchor.row{display:flex}.sidebar__anchor[aria-current=page]{color:var(--color-primary11);font-weight:700;background-color:var(--color-primary3);border-left-color:var(--color-primary9)}.sidebar__anchor:hover,.sidebar__anchor:focus{background-color:var(--color-primary4)}.sidebar__anchor .icon{margin-right:.5rem}.spinner{width:40px;height:40px;margin:30px auto;background-color:var(--color-primary9);border-radius:100%;animation:sk-scaleout 1s infinite ease-in-out}@keyframes sk-scaleout{0%{transform:scale(0)}to{opacity:0;transform:scale(1)}}table{width:100%;border-collapse:collapse}thead{text-align:left;background-color:var(--color-primary3);border-bottom:var(--width-border) solid var(--color-primary6)}th{font-weight:400}th,td{padding:1rem;vertical-align:baseline}tbody tr{border-bottom:var(--width-border) solid var(--color-grey4)}tbody tr:nth-child(odd){background-color:var(--color-grey1)}tbody tr:nth-child(2n){background-color:var(--color-grey2)}.col--size30{width:30%}.tabs{display:flex;margin-bottom:-1px}.tabs>*+*{margin-left:1rem}.tabs__button{line-height:initial;background:none;box-shadow:none;border-radius:.75rem .75rem 0 0;border-color:var(--color-grey7)}.tabs__button[aria-selected=true]{background-color:transparent;background-image:linear-gradient(to bottom,var(--color-grey5),var(--color-grey2));border-color:var(--color-grey8);border-bottom-color:var(--color-grey2)}.tabs__panel{padding:2rem;border:var(--width-border) solid var(--color-grey7);border-radius:0 0 .5rem .5rem}.tabs__panel:focus{outline:none}.ticket__id{margin-left:.5rem;color:var(--color-grey11);font-size:var(--font-size-small);font-weight:400}.list-tickets__anchor{display:inline-block;text-decoration:none}.list-tickets__organization{color:var(--color-grey12);text-decoration:none;white-space:nowrap}.list-tickets__requester,.list-tickets__assignee{white-space:nowrap}.timeline{--width-col-avatars: 0rem;--position-timeline-bar: 1.5rem;position:relative}.timeline:before{content:" ";position:absolute;top:0;bottom:0;left:calc(var(--width-col-avatars) + var(--position-timeline-bar));border-left:var(--width-border-bold) solid var(--color-grey6)}@media (min-width: 800px){.timeline{--width-col-avatars: 7rem }}.timeline__date{padding-top:1rem;padding-bottom:1rem;font-size:var(--font-size-normal);text-align:right}.timeline__date:first-child{position:relative;background-color:var(--color-grey1)}.timeline__date+*{margin-top:0}.timeline__date-diff{color:var(--color-grey11);font-style:italic;font-weight:400}.timeline__event{display:flex;margin-right:2rem;margin-left:calc(var(--width-col-avatars) + var(--position-timeline-bar));flex-direction:row;align-items:baseline;color:var(--color-grey11);font-size:var(--font-size-small)}.timeline__event+.timeline__event{margin-top:2rem}.timeline__event-message{padding-right:2rem;padding-left:2rem;flex:1}.timeline__event-date{flex-shrink:0;text-align:right}.timeline__time-spent{display:flex;margin-right:2rem;margin-left:var(--width-col-avatars);flex-direction:row;align-items:center}.timeline__time-spent:before{content:"";z-index:10;display:block;width:3.4rem;height:3.4rem;background-color:var(--color-grey6);background-image:url("data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20viewBox='0%200%20512%20512'%3e%3cpath%20d='M232%20120C232%20106.7%20242.7%2096%20256%2096C269.3%2096%20280%20106.7%20280%20120V243.2L365.3%20300C376.3%20307.4%20379.3%20322.3%20371.1%20333.3C364.6%20344.3%20349.7%20347.3%20338.7%20339.1L242.7%20275.1C236%20271.5%20232%20264%20232%20255.1L232%20120zM256%200C397.4%200%20512%20114.6%20512%20256C512%20397.4%20397.4%20512%20256%20512C114.6%20512%200%20397.4%200%20256C0%20114.6%20114.6%200%20256%200zM48%20256C48%20370.9%20141.1%20464%20256%20464C370.9%20464%20464%20370.9%20464%20256C464%20141.1%20370.9%2048%20256%2048C141.1%2048%2048%20141.1%2048%20256z'/%3e%3c/svg%3e");background-repeat:no-repeat;background-position:center;background-size:60%;border-radius:50%}.timeline__time-spent+.timeline__time-spent{margin-top:2rem}.timeline__time-spent-message{padding-right:2rem;padding-left:1rem;flex:1}.timeline__time-spent-date{flex-shrink:0;color:var(--color-grey11);font-size:var(--font-size-small);text-align:right}.timeline__editor{position:relative;margin-left:var(--width-col-avatars);background-color:var(--color-grey1);border-top:var(--width-border-bold) solid var(--color-grey6)}.login-new .logo{display:block;width:40rem;max-width:100%;margin-right:auto;margin-left:auto;padding-top:5rem;padding-bottom:5rem}.tickets-show .ticket__top{padding-bottom:4rem;border-bottom:var(--width-border) solid var(--color-grey4)}@media (min-width: 800px){.tickets-show .ticket__info{width:250px}}@media (min-width: 1200px){.tickets-show .ticket__info{width:300px;margin-left:10rem}}.tickets-show .answer-button{display:flex}.tickets-show .answer-button button[type=submit]{flex:1}@media (min-width: 800px){.tickets-show .answer-button{display:inline-flex}.tickets-show .answer-button button[type=submit]{min-width:30rem}}*,*:before,*:after{box-sizing:border-box}html{font-size:10px}body{margin:0;padding:0;color:var(--color-grey12);font-family:Atkinson Hyperlegible,system-ui,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;font-size:200%;background:var(--color-grey2)}*:focus{outline:var(--width-outline) solid var(--color-primary9)}h1{font-size:var(--font-size-bigger);text-align:center}h2{font-size:var(--font-size-big)}h3{font-size:var(--font-size-normal)}summary{cursor:pointer}.sr-only{position:absolute;overflow:hidden;clip:rect(0,0,0,0);width:1px;height:1px}.js-only{display:none}@media (max-width: 799px){.no-mobile{display:none}}@media (min-width: 800px){.only-mobile{display:none}}.accessibility-nav{position:absolute;overflow:hidden;clip:rect(0,0,0,0);width:1px;height:1px}.accessibility-nav:focus{top:1rem;left:1rem;clip:auto;width:auto;height:auto}.turbo-progress-bar{position:fixed;top:0;height:.5rem;background:linear-gradient(to right,var(--color-primary7),var(--color-primary9))} diff --git a/public/assets/application-Nd2aLyzF.css b/public/assets/application-Nd2aLyzF.css deleted file mode 100644 index 66a24d85..00000000 --- a/public/assets/application-Nd2aLyzF.css +++ /dev/null @@ -1 +0,0 @@ -p,h1,h2,h3,ul,ol{margin-top:0;margin-bottom:0}@font-face{font-family:Atkinson Hyperlegible;font-style:italic;font-weight:400;font-display:swap;src:url(/assets/atkinson-hyperlegible-400-italic-latin-ext-F8vF4Wdt.woff2) format("woff2");unicode-range:U+0100-024F,U+0259,U+1E00-1EFF,U+2020,U+20A0-20AB,U+20AD-20CF,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:Atkinson Hyperlegible;font-style:italic;font-weight:700;font-display:swap;src:url(/assets/atkinson-hyperlegible-700-italic-latin-ext-qisSKbpU.woff2) format("woff2");unicode-range:U+0100-024F,U+0259,U+1E00-1EFF,U+2020,U+20A0-20AB,U+20AD-20CF,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:Atkinson Hyperlegible;font-style:normal;font-weight:400;font-display:swap;src:url(/assets/atkinson-hyperlegible-400-normal-latin-ext-h_zsaZms.woff2) format("woff2");unicode-range:U+0100-024F,U+0259,U+1E00-1EFF,U+2020,U+20A0-20AB,U+20AD-20CF,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:Atkinson Hyperlegible;font-style:normal;font-weight:700;font-display:swap;src:url(/assets/atkinson-hyperlegible-700-normal-latin-ext-jLOIVgAo.woff2) format("woff2");unicode-range:U+0100-024F,U+0259,U+1E00-1EFF,U+2020,U+20A0-20AB,U+20AD-20CF,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:Atkinson Hyperlegible;font-style:italic;font-weight:400;font-display:swap;src:url(/assets/atkinson-hyperlegible-400-italic-latin-NhNB2np4.woff2) format("woff2");unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+2000-206F,U+2074,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}@font-face{font-family:Atkinson Hyperlegible;font-style:italic;font-weight:700;font-display:swap;src:url(/assets/atkinson-hyperlegible-700-italic-latin-yjrNtZ7y.woff2) format("woff2");unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+2000-206F,U+2074,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}@font-face{font-family:Atkinson Hyperlegible;font-style:normal;font-weight:400;font-display:swap;src:url(/assets/atkinson-hyperlegible-400-normal-latin-s17VRVKp.woff2) format("woff2");unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+2000-206F,U+2074,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}@font-face{font-family:Atkinson Hyperlegible;font-style:normal;font-weight:700;font-display:swap;src:url(/assets/atkinson-hyperlegible-700-normal-latin-61z-i-tS.woff2) format("woff2");unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+2000-206F,U+2074,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}[data-color-scheme=dark]{color-scheme:dark;--color-error1: #1d1412;--color-error2: #2a1410;--color-error3: #3b1813;--color-error4: #481a14;--color-error5: #541c15;--color-error6: #652016;--color-error7: #7f2315;--color-error8: #a42a12;--color-error9: #e54d2e;--color-error10: #ec5e41;--color-error11: #f16a50;--color-error12: #feefec;--color-grey1: #151718;--color-grey2: #1a1d1e;--color-grey3: #202425;--color-grey4: #26292b;--color-grey5: #2b2f31;--color-grey6: #313538;--color-grey7: #3a3f42;--color-grey8: #4c5155;--color-grey9: #697177;--color-grey10: #787f85;--color-grey11: #9ba1a6;--color-grey12: #ecedee;--color-info1: #0c1820;--color-info2: #071d2a;--color-info3: #082636;--color-info4: #082d41;--color-info5: #08354c;--color-info6: #083e59;--color-info7: #064b6b;--color-info8: #005d85;--color-info9: #68ddfd;--color-info10: #8ae8ff;--color-info11: #2ec8ee;--color-info12: #eaf8ff;--color-primary1: #091915;--color-primary2: #04201b;--color-primary3: #062923;--color-primary4: #07312b;--color-primary5: #083932;--color-primary6: #09443c;--color-primary7: #0b544a;--color-primary8: #0c6d62;--color-primary9: #12a594;--color-primary10: #10b3a3;--color-primary11: #0ac5b3;--color-primary12: #e1faf4;--color-success1: #0d1912;--color-success2: #0c1f17;--color-success3: #0f291e;--color-success4: #113123;--color-success5: #133929;--color-success6: #164430;--color-success7: #1b543a;--color-success8: #236e4a;--color-success9: #30a46c;--color-success10: #3cb179;--color-success11: #4cc38a;--color-success12: #e5fbeb;--color-warning1: #1f1300;--color-warning2: #271700;--color-warning3: #341c00;--color-warning4: #3f2200;--color-warning5: #4a2900;--color-warning6: #573300;--color-warning7: #693f05;--color-warning8: #824e00;--color-warning9: #ffb224;--color-warning10: #ffcb47;--color-warning11: #f1a10d;--color-warning12: #fef3dd;--color-box-shadow: rgb(0 0 0 / 50%)}[data-color-scheme=light]{color-scheme:light;--color-error1: #fffcfc;--color-error2: #fff8f7;--color-error3: #fff0ee;--color-error4: #ffe6e2;--color-error5: #fdd8d3;--color-error6: #fac7be;--color-error7: #f3b0a2;--color-error8: #ea9280;--color-error9: #e54d2e;--color-error10: #db4324;--color-error11: #ca3214;--color-error12: #341711;--color-grey1: #fbfcfd;--color-grey2: #f8f9fa;--color-grey3: #f1f3f5;--color-grey4: #eceef0;--color-grey5: #e6e8eb;--color-grey6: #dfe3e6;--color-grey7: #d7dbdf;--color-grey8: #c1c8cd;--color-grey9: #889096;--color-grey10: #7e868c;--color-grey11: #687076;--color-grey12: #11181c;--color-info1: #f9feff;--color-info2: #f1fcff;--color-info3: #e4f9ff;--color-info4: #d5f4fd;--color-info5: #c1ecf9;--color-info6: #a4dff1;--color-info7: #79cfea;--color-info8: #2ebde5;--color-info9: #68ddfd;--color-info10: #5fd4f4;--color-info11: #0078a1;--color-info12: #003242;--color-primary1: #fafefd;--color-primary2: #f1fcfa;--color-primary3: #e7f9f5;--color-primary4: #d9f3ee;--color-primary5: #c7ebe5;--color-primary6: #afdfd7;--color-primary7: #8dcec3;--color-primary8: #53b9ab;--color-primary9: #12a594;--color-primary10: #0e9888;--color-primary11: #067a6f;--color-primary12: #10302b;--color-success1: #fbfefc;--color-success2: #f2fcf5;--color-success3: #e9f9ee;--color-success4: #ddf3e4;--color-success5: #ccebd7;--color-success6: #b4dfc4;--color-success7: #92ceac;--color-success8: #5bb98c;--color-success9: #30a46c;--color-success10: #299764;--color-success11: #18794e;--color-success12: #153226;--color-warning1: #fefdfb;--color-warning2: #fff9ed;--color-warning3: #fff4d5;--color-warning4: #ffecbc;--color-warning5: #ffe3a2;--color-warning6: #ffd386;--color-warning7: #f3ba63;--color-warning8: #ee9d2b;--color-warning9: #ffb224;--color-warning10: #ffa01c;--color-warning11: #ad5700;--color-warning12: #4e2009;--color-box-shadow: rgb(0 0 0 / 12%)}:root{--font-size-smaller: .8em;--font-size-small: .9em;--font-size-normal: 1em;--font-size-big: 1.2em;--font-size-bigger: 1.3em;--width-border: 1px;--width-border-bold: 2px;--width-border-bolder: .5rem;--width-border-input: var(--width-border-bold);--width-outline: .2rem}.flow>*{--flow-size: 2rem}.flow--smaller>*{--flow-size: .5rem}.flow--small>*{--flow-size: 1rem}.flow--large>*{--flow-size: 3rem}.flow--larger>*{--flow-size: 4rem}.flow>*+*{margin-top:var(--flow-size)}.grid{display:grid;grid-gap:2rem;grid-template-columns:repeat(auto-fill,minmax(25rem,1fr))}.grid>*{min-width:0}.indent{margin-left:3rem}.row{display:flex;align-items:stretch}@media (max-width: 799px){.row:not(.row--always){flex-direction:column}}.row--center{align-items:center}.row--baseline{align-items:baseline}.row--middle{justify-content:center}.row--wrap{flex-wrap:wrap}.row__item--extend{flex:1}.row__item--noshrink{flex-shrink:0}.row__item--size1{flex-basis:calc(1 * 100% / 12)}.row__item--size2{flex-basis:calc(2 * 100% / 12)}.row__item--size3{flex-basis:25%}.row__item--size4{flex-basis:calc(4 * 100% / 12)}.row__item--size5{flex-basis:calc(5 * 100% / 12)}.row__item--size6{flex-basis:50%}.row__item--size7{flex-basis:calc(7 * 100% / 12)}.row__item--size8{flex-basis:calc(8 * 100% / 12)}.row__item--size9{flex-basis:75%}.row__item--size10{flex-basis:calc(10 * 100% / 12)}.row__item--size11{flex-basis:calc(11 * 100% / 12)}.row--always.flow>*+*{margin-top:0;margin-left:var(--flow-size)}@media (min-width: 800px){.row.flow>*+*{margin-top:0;margin-left:var(--flow-size)}}.row--always.row--wrap.flow>*{margin-bottom:var(--flow-size)}@media (min-width: 800px){.row--wrap.flow>*{margin-bottom:var(--flow-size)}}.text--secondary{color:var(--color-grey11)}.text--success{color:var(--color-success11)}.text--error{color:var(--color-error11)}.text--info{color:var(--color-info11)}.text--warning{color:var(--color-warning11)}.text--italic{font-style:italic}.text--center{text-align:center}.text--right{text-align:right}.text--left{text-align:left}.text--smaller{font-size:var(--font-size-smaller)}.text--small{font-size:var(--font-size-small)}.text--normal{font-size:var(--font-size-normal)}.text--big{font-size:var(--font-size-big)}.text--bigger{font-size:var(--font-size-bigger)}code{padding:0 .5rem;font-size:var(--font-size-small);background-color:var(--color-grey3);border-radius:.5rem}.wrapper{--wrapper-max-width: 1000px;max-width:var(--wrapper-max-width)}.wrapper--text{--wrapper-max-width: 55ch}.wrapper--small{--wrapper-max-width: 600px}.wrapper--large{--wrapper-max-width: 1200px}.wrapper--larger{--wrapper-max-width: 1400px}.wrapper--center{margin-right:auto;margin-left:auto}.alert{padding:1.5rem 1.5rem 1.5rem 5rem;background-repeat:no-repeat;background-position:left 1rem top 1.5rem;background-size:3rem;border-width:var(--width-border-bold);border-style:solid;border-radius:.5rem}.alert--success{color:var(--color-success12);background-color:var(--color-success2);background-image:url("data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20viewBox='0%200%20512%20512'%3e%3cpath%20fill='%2330a46c'%20d='M256%20512c141.4%200%20256-114.6%20256-256S397.4%200%20256%200S0%20114.6%200%20256S114.6%20512%20256%20512zM369%20209L241%20337c-9.4%209.4-24.6%209.4-33.9%200l-64-64c-9.4-9.4-9.4-24.6%200-33.9s24.6-9.4%2033.9%200l47%2047L335%20175c9.4-9.4%2024.6-9.4%2033.9%200s9.4%2024.6%200%2033.9z'/%3e%3c/svg%3e");border-color:var(--color-success9)}.alert--error{color:var(--color-error12);background-color:var(--color-error2);background-image:url("data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20viewBox='0%200%20512%20512'%3e%3cpath%20fill='%23e54d2e'%20d='M256%20512c141.4%200%20256-114.6%20256-256S397.4%200%20256%200S0%20114.6%200%20256S114.6%20512%20256%20512zm0-384c13.3%200%2024%2010.7%2024%2024V264c0%2013.3-10.7%2024-24%2024s-24-10.7-24-24V152c0-13.3%2010.7-24%2024-24zm32%20224c0%2017.7-14.3%2032-32%2032s-32-14.3-32-32s14.3-32%2032-32s32%2014.3%2032%2032z'/%3e%3c/svg%3e");border-color:var(--color-error9)}.alert--info{color:var(--color-info12);background-color:var(--color-info2);background-image:url("data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20viewBox='0%200%20512%20512'%3e%3cpath%20fill='%230078a1'%20d='M256%20512c141.4%200%20256-114.6%20256-256S397.4%200%20256%200S0%20114.6%200%20256S114.6%20512%20256%20512zM216%20336h24V272H216c-13.3%200-24-10.7-24-24s10.7-24%2024-24h48c13.3%200%2024%2010.7%2024%2024v88h8c13.3%200%2024%2010.7%2024%2024s-10.7%2024-24%2024H216c-13.3%200-24-10.7-24-24s10.7-24%2024-24zm40-144c-17.7%200-32-14.3-32-32s14.3-32%2032-32s32%2014.3%2032%2032s-14.3%2032-32%2032z'/%3e%3c/svg%3e");border-color:var(--color-info9)}.alert--warning{color:var(--color-warning12);background-color:var(--color-warning2);background-image:url("data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20viewBox='0%200%20512%20512'%3e%3cpath%20fill='%23ffb224'%20d='M256%2032c14.2%200%2027.3%207.5%2034.5%2019.8l216%20368c7.3%2012.4%207.3%2027.7%20.2%2040.1S486.3%20480%20472%20480H40c-14.3%200-27.6-7.7-34.7-20.1s-7-27.8%20.2-40.1l216-368C228.7%2039.5%20241.8%2032%20256%2032zm0%20128c-13.3%200-24%2010.7-24%2024V296c0%2013.3%2010.7%2024%2024%2024s24-10.7%2024-24V184c0-13.3-10.7-24-24-24zm32%20224c0-17.7-14.3-32-32-32s-32%2014.3-32%2032s14.3%2032%2032%2032s32-14.3%2032-32z'/%3e%3c/svg%3e");border-color:var(--color-warning9)}.alert__title{font-weight:700}.alert--success .alert__title{color:var(--color-success9)}.alert--error .alert__title{color:var(--color-error9)}.alert--info .alert__title{color:var(--color-info11)}.alert--warning .alert__title{color:var(--color-warning11)}.alert__message{margin-top:.5rem}a{color:var(--color-primary11)}.anchor--noline{text-decoration:none}.anchor--action{display:inline-block;padding:.5rem 1.75rem;line-height:1.5;text-decoration:none;background-color:var(--color-primary3);border:var(--width-border) solid currentcolor;border-radius:2rem;transition:background-color .2s ease-in-out}.anchor--action:hover,.anchor--action:focus{background-color:var(--color-primary4)}.badge{display:inline-block;min-width:3rem;padding:.75rem 1.5rem;text-align:center;white-space:nowrap;border-radius:2.5rem}.badge--block{display:block}.badge--bold{font-weight:700}.badge--smaller{padding:.25rem .5rem;font-size:var(--font-size-smaller)}.badge--small{padding:.25rem .75rem;font-size:var(--font-size-small)}.badge--blue{color:var(--color-info12);background-color:var(--color-info5)}.badge--green{color:var(--color-success12);background-color:var(--color-success5)}.badge--grey{color:var(--color-grey12);background-color:var(--color-grey5)}.badge--orange{color:var(--color-warning12);background-color:var(--color-warning5)}.badge--red{color:var(--color-error12);background-color:var(--color-error5)}button,.button{display:inline-block;padding:.5rem 1.75rem;color:var(--color-grey12);font-family:inherit;font-size:var(--font-size-normal);line-height:1.5;text-decoration:none;background-color:var(--color-grey3);background-image:linear-gradient(to bottom,rgb(0 0 0 / 0%),rgb(0 0 0 / 5%));box-shadow:0 1px 2px var(--color-box-shadow);border:var(--width-border) solid var(--color-grey8);border-radius:2rem;transition:background-color .2s ease-in-out,border-color .2s ease-in-out;cursor:pointer}button:not([disabled]):hover,button:not([disabled]):focus,.button:not([aria-disabled]):hover,.button:not([aria-disabled]):focus{background-color:var(--color-grey4)}button:not([disabled]):active,.button:not([aria-disabled]):active{background-color:var(--color-grey5)}button[disabled],.button[aria-disabled]{color:var(--color-grey11);border-color:var(--color-grey7);outline:none;cursor:not-allowed;pointer-events:none}.button--primary{color:var(--color-primary12);background-color:var(--color-primary6);border-color:var(--color-primary8)}.button--primary:not([disabled]):hover,.button--primary:not([disabled]):focus,.button--primary:not([aria-disabled]):hover,.button--primary:not([aria-disabled]):focus{background-color:var(--color-primary7)}.button--primary:not([disabled]):active,.button--primary:not([aria-disabled]):active{background-color:var(--color-primary8)}.button--primary[disabled],.button--primary[aria-disabled]{color:var(--color-primary11);border-color:var(--color-primary7)}.button--icon{padding:.75rem 1rem;line-height:1.2;border-radius:5rem}.button--anchor{padding:0;color:var(--color-primary11);background-color:transparent;background-image:none;box-shadow:none;border:none;border-radius:0}.button--anchor:not([disabled]):hover,.button--anchor:not([aria-disabled]):hover,.button--anchor:not([disabled]):focus,.button--anchor:not([aria-disabled]):focus,.button--anchor:not([disabled]):active,.button--anchor:not([aria-disabled]):active{background-color:transparent}.button--discreet{padding:.25rem 1.25rem}.button--caret{position:relative;padding-right:3.75rem}.button--caret:after{content:"";position:absolute;top:.5em;right:.5em;display:block;width:1em;height:1em;opacity:.8;background-image:url("data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20viewBox='0%200%20320%20512'%3e%3cpath%20d='M137.4%20374.6c12.5%2012.5%2032.8%2012.5%2045.3%200l128-128c9.2-9.2%2011.9-22.9%206.9-34.9s-16.6-19.8-29.6-19.8L32%20192c-12.9%200-24.6%207.8-29.6%2019.8s-2.2%2025.7%206.9%2034.9l128%20128z'/%3e%3c/svg%3e");background-repeat:no-repeat;background-position:center;background-size:.7em}.button--caret.button--discreet{padding-right:3.5rem}.button--caret.button--discreet:after{top:.4em;right:.3em;background-size:.6em}.button__caption{display:block;margin-bottom:-.7rem;color:var(--color-grey11);font-size:var(--font-size-small)}.button-group{display:inline-flex}.button-group .button-group__item{height:100%}.button-group>.button-group__item:not(:first-child),.button-group>*:not(:first-child) .button-group__item{border-left:none;border-top-left-radius:0;border-bottom-left-radius:0}.button-group>.button-group__item:not(:last-child),.button-group>*:not(:last-child) .button-group__item{border-top-right-radius:0;border-bottom-right-radius:0}.card{overflow:hidden;display:flex;flex-direction:column;align-items:stretch;background-color:var(--color-grey2);box-shadow:1px 1px 2px 1px var(--color-box-shadow);border-radius:.5rem}.card>*{padding:1.5rem 1rem}.card>*+*{margin-top:-1.5rem}.card--action{align-items:center;justify-content:center;font-weight:700;text-align:center;text-decoration:none;background-color:var(--color-primary3);transition:background-color .2s ease-in-out}.card--action:hover,.card--action:focus{background-color:var(--color-primary4)}.card__title{display:block;font-size:var(--font-size-big);font-weight:700;text-align:center;overflow-wrap:anywhere;border-radius:.5rem}a.card__title{text-decoration:none;outline-offset:calc(-1 * var(--width-outline))}.card__body{flex:1}.documents__item{font-size:var(--font-size-small);background-color:var(--color-grey3);border-radius:.5rem}.documents__link{display:flex;height:100%;padding:2rem 1rem 2rem 4rem;align-items:center;text-decoration:none;background-repeat:no-repeat;background-position:1rem center;background-size:2rem;border-radius:.5rem;overflow-wrap:anywhere}.documents__item[data-type=archive] .documents__link{background-image:url("data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20viewBox='0%200%20384%20512'%3e%3cpath%20d='M365.3%2093.38l-74.63-74.64C278.6%206.742%20262.3%200%20245.4%200L64-.0001c-35.35%200-64%2028.65-64%2064l.0065%20384c0%2035.34%2028.65%2064%2064%2064H320c35.2%200%2064-28.8%2064-64V138.6C384%20121.7%20377.3%20105.4%20365.3%2093.38zM336%20448c0%208.836-7.164%2016-16%2016H64.02c-8.838%200-16-7.164-16-16L48%2064.13c0-8.836%207.164-16%2016-16h48V64h64V48.13h48.01L224%20128c0%2017.67%2014.33%2032%2032%2032h79.1V448zM176%2096h-64v32h64V96zM176%20160h-64v32h64V160zM176%20224h-64l-30.56%20116.5C73.51%20379.5%20103.7%20416%20144.3%20416c40.26%200%2070.45-36.3%2062.68-75.15L176%20224zM160%20368H128c-8.836%200-16-7.164-16-16s7.164-16%2016-16h32c8.836%200%2016%207.164%2016%2016S168.8%20368%20160%20368z'/%3e%3c/svg%3e")}.documents__item[data-type=doc] .documents__link{background-image:url("data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20viewBox='0%200%20384%20512'%3e%3cpath%20d='M365.3%2093.38l-74.63-74.64C278.6%206.742%20262.3%200%20245.4%200H64C28.65%200%200%2028.65%200%2064l.0065%20384c0%2035.34%2028.65%2064%2064%2064H320c35.2%200%2064-28.8%2064-64V138.6C384%20121.7%20377.3%20105.4%20365.3%2093.38zM336%20448c0%208.836-7.164%2016-16%2016H64.02c-8.838%200-16-7.164-16-16L48%2064.13c0-8.836%207.164-16%2016-16h160L224%20128c0%2017.67%2014.33%2032%2032%2032h79.1V448zM214.6%20248C211.3%20238.4%20202.2%20232%20192%20232s-19.25%206.406-22.62%2016L144.7%20318.1l-25.89-77.66C114.6%20227.8%20101%20221.2%2088.41%20225.2C75.83%20229.4%2069.05%20243%2073.23%20255.6l48%20144C124.5%20409.3%20133.5%20415.9%20143.8%20416c10.17%200%2019.45-6.406%2022.83-16L192%20328.1L217.4%20400C220.8%20409.6%20229.8%20416%20240%20416c10.27-.0938%2019.53-6.688%2022.77-16.41l48-144c4.188-12.59-2.594-26.16-15.17-30.38c-12.61-4.125-26.2%202.594-30.36%2015.19l-25.89%2077.66L214.6%20248z'/%3e%3c/svg%3e")}.documents__item[data-type=pdf] .documents__link{background-image:url("data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20viewBox='0%200%20384%20512'%3e%3cpath%20d='M320%20464C328.8%20464%20336%20456.8%20336%20448V416H384V448C384%20483.3%20355.3%20512%20320%20512H64C28.65%20512%200%20483.3%200%20448V416H48V448C48%20456.8%2055.16%20464%2064%20464H320zM256%20160C238.3%20160%20224%20145.7%20224%20128V48H64C55.16%2048%2048%2055.16%2048%2064V192H0V64C0%2028.65%2028.65%200%2064%200H229.5C246.5%200%20262.7%206.743%20274.7%2018.75L365.3%20109.3C377.3%20121.3%20384%20137.5%20384%20154.5V192H336V160H256zM88%20224C118.9%20224%20144%20249.1%20144%20280C144%20310.9%20118.9%20336%2088%20336H80V368C80%20376.8%2072.84%20384%2064%20384C55.16%20384%2048%20376.8%2048%20368V240C48%20231.2%2055.16%20224%2064%20224H88zM112%20280C112%20266.7%20101.3%20256%2088%20256H80V304H88C101.3%20304%20112%20293.3%20112%20280zM160%20240C160%20231.2%20167.2%20224%20176%20224H200C226.5%20224%20248%20245.5%20248%20272V336C248%20362.5%20226.5%20384%20200%20384H176C167.2%20384%20160%20376.8%20160%20368V240zM192%20352H200C208.8%20352%20216%20344.8%20216%20336V272C216%20263.2%20208.8%20256%20200%20256H192V352zM336%20224C344.8%20224%20352%20231.2%20352%20240C352%20248.8%20344.8%20256%20336%20256H304V288H336C344.8%20288%20352%20295.2%20352%20304C352%20312.8%20344.8%20320%20336%20320H304V368C304%20376.8%20296.8%20384%20288%20384C279.2%20384%20272%20376.8%20272%20368V240C272%20231.2%20279.2%20224%20288%20224H336z'/%3e%3c/svg%3e")}.documents__item[data-type=spreadsheet] .documents__link{background-image:url("data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20viewBox='0%200%20384%20512'%3e%3cpath%20d='M365.3%2093.38l-74.63-74.64C278.6%206.742%20262.3%200%20245.4%200H64C28.65%200%200%2028.65%200%2064l.0065%20384c0%2035.34%2028.65%2064%2064%2064H320c35.2%200%2064-28.8%2064-64V138.6C384%20121.7%20377.3%20105.4%20365.3%2093.38zM336%20448c0%208.836-7.164%2016-16%2016H64.02c-8.838%200-16-7.164-16-16L48%2064.13c0-8.836%207.164-16%2016-16h160L224%20128c0%2017.67%2014.33%2032%2032%2032h79.1V448zM229.1%20233.3L192%20280.9L154.9%20233.3C146.8%20222.8%20131.8%20220.9%20121.3%20229.1C110.8%20237.2%20108.9%20252.3%20117.1%20262.8L161.6%20320l-44.53%2057.25c-8.156%2010.47-6.25%2025.56%204.188%2033.69C125.7%20414.3%20130.8%20416%20135.1%20416c7.156%200%2014.25-3.188%2018.97-9.25L192%20359.1l37.06%2047.65C233.8%20412.8%20240.9%20416%20248%20416c5.125%200%2010.31-1.656%2014.72-5.062c10.44-8.125%2012.34-23.22%204.188-33.69L222.4%20320l44.53-57.25c8.156-10.47%206.25-25.56-4.188-33.69C252.2%20220.9%20237.2%20222.8%20229.1%20233.3z'/%3e%3c/svg%3e")}.documents__item[data-type=image] .documents__link{background-image:url("data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20viewBox='0%200%20384%20512'%3e%3cpath%20d='M365.3%2093.38l-74.63-74.64C278.6%206.742%20262.3%200%20245.4%200H64C28.65%200%200%2028.65%200%2064l.0065%20384c0%2035.34%2028.65%2064%2064%2064H320c35.2%200%2064-28.8%2064-64V138.6C384%20121.7%20377.3%20105.4%20365.3%2093.38zM336%20448c0%208.836-7.164%2016-16%2016H64.02c-8.838%200-16-7.164-16-16L48%2064.13c0-8.836%207.164-16%2016-16h160L224%20128c0%2017.67%2014.33%2032%2032%2032h79.1V448zM215.3%20292c-4.68%200-9.051%202.34-11.65%206.234L164%20357.8l-11.68-17.53C149.7%20336.3%20145.3%20334%20140.7%20334c-4.682%200-9.053%202.34-11.65%206.234l-46.67%2070c-2.865%204.297-3.131%209.82-.6953%2014.37C84.09%20429.2%2088.84%20432%2093.1%20432h196c5.163%200%209.907-2.844%2012.34-7.395c2.436-4.551%202.17-10.07-.6953-14.37l-74.67-112C224.4%20294.3%20220%20292%20215.3%20292zM128%20288c17.67%200%2032-14.33%2032-32S145.7%20224%20128%20224S96%20238.3%2096%20256S110.3%20288%20128%20288z'/%3e%3c/svg%3e")}.documents__item[data-type=file] .documents__link{background-image:url("data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20viewBox='0%200%20384%20512'%3e%3cpath%20d='M0%2064C0%2028.65%2028.65%200%2064%200H229.5C246.5%200%20262.7%206.743%20274.7%2018.75L365.3%20109.3C377.3%20121.3%20384%20137.5%20384%20154.5V448C384%20483.3%20355.3%20512%20320%20512H64C28.65%20512%200%20483.3%200%20448V64zM336%20448V160H256C238.3%20160%20224%20145.7%20224%20128V48H64C55.16%2048%2048%2055.16%2048%2064V448C48%20456.8%2055.16%20464%2064%20464H320C328.8%20464%20336%20456.8%20336%20448z'/%3e%3c/svg%3e")}.documents__delete{padding:2rem 1rem}.form--inline{display:inline-block}label{display:block;padding-right:.75rem;padding-left:.75rem}input,textarea{width:100%;padding:.5rem .75rem;color:inherit;font-family:inherit;font-size:var(--font-size-normal);line-height:1.5;background-color:var(--color-grey1);box-shadow:2px 2px 3px var(--color-box-shadow) inset;border:var(--width-border-input) solid var(--color-grey8);border-radius:.5rem;transition:background-color .2s ease-in-out,border-color .2s ease-in-out}textarea{max-width:100%;min-height:15rem}input[disabled],textarea[disabled]{color:var(--color-grey11)}input:not([disabled]):hover,input:not([disabled]):focus,textarea:not([disabled]):hover,textarea:not([disabled]):focus{background-color:var(--color-primary2);border-color:var(--color-primary8)}input[aria-invalid],textarea[aria-invalid]{background-color:var(--color-error2);border-color:var(--color-error11)}.input--size1{width:6rem}.input--size2{width:10rem}.input--size3{width:15rem}.input--size4{width:20rem}input[type=checkbox],input[type=radio]{position:absolute;overflow:hidden;clip:rect(0,0,0,0);width:1px;height:1px}input[type=checkbox]+label,input[type=radio]+label{position:relative;display:inline-flex;align-items:center}input[type=checkbox][disabled]+label,input[type=radio][disabled]+label{color:var(--color-grey11)}input[type=checkbox]+label:before,input[type=radio]+label:before{content:"";position:relative;width:2.5rem;height:2.5rem;margin-right:.75rem;flex-shrink:0;background-color:var(--color-grey1);box-shadow:2px 2px 3px var(--color-box-shadow) inset;border:var(--width-border-input) solid var(--color-grey8);border-radius:.5rem;transition:border-color .2s ease-in-out,background-color .2s ease-in-out}input[type=radio]+label:before{border-radius:50%}input[type=checkbox]:focus+label:before{outline:var(--width-outline) solid var(--color-primary9)}input[type=checkbox]:checked+label:before,input[type=radio]:checked+label:before{border-color:var(--color-grey11)}input[type=checkbox]:not([disabled]):hover+label:before,input[type=checkbox]:not([disabled]):focus+label:before,input[type=radio]:not([disabled]):hover+label:before,input[type=radio]:not([disabled]):focus+label:before{background-color:var(--color-primary2);border-color:var(--color-primary8)}input[type=checkbox]:checked+label:after,input[type=radio]:checked+label:after{content:"";position:absolute;left:1.25rem;width:1.5rem;height:.75rem;margin-top:-.3rem;border-bottom:var(--width-border-bold) solid var(--color-grey12);border-left:var(--width-border-bold) solid var(--color-grey12);transform:rotate(-45deg)}input[type=radio]:checked+label:after{height:1.5rem;margin-top:0;background-color:var(--color-grey12);border-top:var(--width-border-bold) solid var(--color-grey12);border-right:var(--width-border-bold) solid var(--color-grey12);border-radius:50%}select{width:100%;padding:.5rem .75rem;color:inherit;font-family:inherit;font-size:var(--font-size-normal);line-height:1.5;text-overflow:ellipsis;background-color:var(--color-grey3);border:var(--width-border-input) solid var(--color-grey8);border-radius:.5rem;transition:background-color .2s ease-in-out,border-color .2s ease-in-out}.row>select{width:auto}select:not([multiple]){padding-right:3.5rem;background-image:url("data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20viewBox='0%200%20448%20512'%3e%3cpath%20d='M201.4%20374.6c12.5%2012.5%2032.8%2012.5%2045.3%200l160-160c12.5-12.5%2012.5-32.8%200-45.3s-32.8-12.5-45.3%200L224%20306.7%2086.6%20169.4c-12.5-12.5-32.8-12.5-45.3%200s-12.5%2032.8%200%2045.3l160%20160z'/%3e%3c/svg%3e");background-repeat:no-repeat;background-position:right .75rem top 58%;background-size:2rem;-webkit-appearance:none;-moz-appearance:none;appearance:none}[data-color-scheme=dark] select:not([multiple]){background-image:url("data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20viewBox='0%200%20448%20512'%3e%3cpath%20fill='%23ecedee'%20d='M201.4%20374.6c12.5%2012.5%2032.8%2012.5%2045.3%200l160-160c12.5-12.5%2012.5-32.8%200-45.3s-32.8-12.5-45.3%200L224%20306.7%2086.6%20169.4c-12.5-12.5-32.8-12.5-45.3%200s-12.5%2032.8%200%2045.3l160%20160z'/%3e%3c/svg%3e")}select:not([disabled]):hover,select:not([disabled]):focus{background-color:var(--color-primary4);border-color:var(--color-primary8)}select[disabled]{color:var(--color-grey11);background-color:var(--color-grey2);border-color:var(--color-grey7)}select[disabled]:not([multiple]){background-image:url("data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20viewBox='0%200%20448%20512'%3e%3cpath%20fill='%23687076'%20d='M201.4%20374.6c12.5%2012.5%2032.8%2012.5%2045.3%200l160-160c12.5-12.5%2012.5-32.8%200-45.3s-32.8-12.5-45.3%200L224%20306.7%2086.6%20169.4c-12.5-12.5-32.8-12.5-45.3%200s-12.5%2032.8%200%2045.3l160%20160z'/%3e%3c/svg%3e")}[data-color-scheme=dark] select[disabled]:not([multiple]){background-image:url("data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20viewBox='0%200%20448%20512'%3e%3cpath%20fill='%239ba1a6'%20d='M201.4%20374.6c12.5%2012.5%2032.8%2012.5%2045.3%200l160-160c12.5-12.5%2012.5-32.8%200-45.3s-32.8-12.5-45.3%200L224%20306.7%2086.6%20169.4c-12.5-12.5-32.8-12.5-45.3%200s-12.5%2032.8%200%2045.3l160%20160z'/%3e%3c/svg%3e")}select[aria-invalid]{background-color:var(--color-error2);border-color:var(--color-error11)}fieldset{min-width:auto;margin-right:-1rem;margin-left:-1rem;padding:1rem;background-color:var(--color-grey2);border:none;border-top:var(--width-border) solid var(--color-grey6);border-bottom:var(--width-border) solid var(--color-grey6)}@media (min-width: 800px){fieldset{margin-right:-1.25rem;margin-left:-1.25rem;border:var(--width-border) solid var(--color-grey6);border-radius:.5rem}}legend{margin-right:auto;margin-left:auto;padding-right:1rem;padding-left:1rem}.editor{background-color:var(--tinymce-background);border:var(--width-border-input) solid var(--color-grey8);border-radius:.5rem;transition:border-color .2s ease-in-out}[data-color-scheme=light] .editor{--tinymce-background: #fff}[data-color-scheme=dark] .editor{--tinymce-background: #222f3e}.editor:hover,.editor:focus-within{border-color:var(--color-primary8)}.editor__documents{padding:1.5rem;border-top:var(--width-border) solid var(--color-grey8)}.editor .tox-tinymce{border:none;border-radius:.5rem .5rem 0 0}.form__caption{padding-right:.75rem;padding-left:.75rem;color:var(--color-grey11);font-size:var(--font-size-small)}.form__error{padding-left:1.75em;color:var(--color-error11);font-size:var(--font-size-small);font-weight:700;background-image:url("data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20viewBox='0%200%20512%20512'%3e%3cpath%20fill='%23e54d2e'%20d='M256%20512c141.4%200%20256-114.6%20256-256S397.4%200%20256%200S0%20114.6%200%20256S114.6%20512%20256%20512zm0-384c13.3%200%2024%2010.7%2024%2024V264c0%2013.3-10.7%2024-24%2024s-24-10.7-24-24V152c0-13.3%2010.7-24%2024-24zm32%20224c0%2017.7-14.3%2032-32%2032s-32-14.3-32-32s14.3-32%2032-32s32%2014.3%2032%2032z'/%3e%3c/svg%3e");background-repeat:no-repeat;background-position:.75rem center;background-size:1.1em}.form__actions{display:flex;flex-direction:column;align-items:center;justify-content:center}.form__actions>*+*{margin-top:1rem}@media (min-width: 800px){.form__actions{flex-direction:row-reverse}.form__actions>*+*{margin-top:0}}.input-container{position:relative}.input-container button{position:absolute;right:0;color:var(--color-grey11);background-color:transparent;background-image:none;box-shadow:none;border-color:transparent;outline-offset:calc(-1 * var(--width-outline))}.input-container button:hover,.input-container button:focus{color:var(--color-grey12);background-color:transparent}.input-container button[aria-pressed=false] .icon--eye-slash,.input-container button[aria-pressed=true] .icon--eye{display:none}.icon{display:inline-block;width:1em;height:auto;margin-top:.15em;vertical-align:text-top;fill:currentcolor}img{max-width:100%;height:auto}.layout__header-anchor{display:block;min-width:7rem;padding:2rem 2rem 1.5rem;text-align:center;text-decoration:none;border-bottom:var(--width-border-bolder) solid transparent;outline-offset:calc(-1 * var(--width-outline));transition:background-color .2s ease-in-out}.layout__header-anchor[aria-current=page]{background-color:var(--color-primary3);border-color:var(--color-primary9)}.layout__header-anchor:hover,.layout__header-anchor:focus{background-color:var(--color-primary4)}.layout__header-home{width:11rem;padding-top:1.5rem;padding-bottom:1rem}.layout__header-home img{display:block}.layout__header-avatar{margin:.5rem;border-radius:50%}.layout__header-avatar .icon{width:2em;margin-top:0}.layout__body{padding:2rem 1rem 10rem;background-color:var(--color-grey1);box-shadow:0 1px 3px var(--color-box-shadow)}.layout__body--small{max-width:600px;margin-right:auto;margin-left:auto}@media (min-width: 800px){.layout__body{padding-right:2rem;padding-left:2rem}.layout__body--small{border-radius:.5rem}}.layout__breadcrumb{padding-bottom:2rem;border-bottom:var(--width-border) solid var(--color-grey4)}.layout__breadcrumb>*{display:inline-block;vertical-align:middle}.layout__breadcrumb>a{text-decoration:none}.layout__breadcrumb>h1{text-align:left}.layout__breadcrumb>*:not(:last-child):after{content:"";display:inline-block;width:1.5rem;height:1.5rem;margin-top:-.1rem;margin-right:1rem;margin-left:.75rem;vertical-align:middle;border-top:var(--width-border-bold) solid var(--color-primary6);border-right:var(--width-border-bold) solid var(--color-primary6);transform:rotate(45deg)}.banner__container{display:block;padding:1rem;text-align:center;background-color:var(--color-primary3);box-shadow:0 1px 3px var(--color-box-shadow);border-bottom:var(--width-border-bold) solid var(--color-primary6)}.layout__banner--alert .banner__container{color:var(--color-error12);background-color:var(--color-error2);border-bottom-color:var(--color-error9)}.list--nostyle{padding:0;list-style:none}.list--padded>li{padding:1rem 1.75rem}.list--border{border:var(--width-border) solid var(--color-grey7);border-radius:.5rem}.list--border>li+li{border-top:var(--width-border) solid var(--color-grey7)}.list--strip>li:first-child{border-top-left-radius:.5rem;border-top-right-radius:.5rem}.list--strip>li:last-child{border-bottom-right-radius:.5rem;border-bottom-left-radius:.5rem}.list--strip>li:nth-child(odd){background-color:var(--color-grey3)}.list--strip>li:nth-child(2n){background-color:var(--color-grey4)}.message{--message-background: var(--color-grey2);--message-background-header: var(--color-grey3);--message-border-color: var(--color-grey7);--message-border-width: var(--width-border);display:flex;align-items:flex-start}.message--solution{--message-background: var(--color-success1);--message-background-header: var(--color-success4);--message-border-color: var(--color-success7);--message-border-width: var(--width-border-bold)}.message__avatar{position:relative;margin-right:2rem}@media (max-width: 799px){.message__avatar{display:none}}.message__avatar>.icon{width:5rem}.message__role{position:absolute;right:-.75rem;bottom:-.75rem;width:3rem;height:3rem;padding:.3rem;text-align:center;opacity:.9;background-color:var(--color-grey1);border:var(--message-border-width) solid var(--message-border-color);border-radius:2rem}.message__role>.icon{width:75%;height:75%}.message__box{position:relative;flex:1;border:var(--message-border-width) solid var(--message-border-color);border-radius:.5rem}@media (min-width: 800px){.message__avatar+.message__box:before{content:" ";position:absolute;top:14px;right:100%;left:-8px;display:block;width:8px;height:16px;background-color:var(--message-border-color);-webkit-clip-path:polygon(0 50%,100% 0,100% 100%);clip-path:polygon(0 50%,100% 0,100% 100%)}}.message__top{display:flex;padding:.75rem 2rem;align-items:center;font-size:var(--font-size-small);background-color:var(--message-background-header);border-bottom:var(--message-border-width) solid var(--message-border-color);border-radius:.5rem .5rem 0 0}.message--solution .message__top{color:var(--color-success12)}.message__top *+*{margin-left:.5rem}.message__top-separator{flex:1}.message__author{font-weight:700}.message__badge{margin-left:1rem;padding:.25rem .5rem;font-size:var(--font-size-small);border:var(--width-border) solid var(--message-border-color);border-radius:.5rem}.message__date{color:var(--color-grey11)}.message--solution .message__date{color:var(--color-success11)}.message__content{position:relative;padding:3rem 2rem;background-color:var(--message-background);border-radius:0 0 .5rem .5rem}.message--confidential .message__content:after{content:"";position:absolute;top:0;right:0;bottom:0;left:0;opacity:.1;background-image:url("data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20viewBox='0%200%20448%20512'%3e%3cpath%20d='M224%2016c-6.7%200-10.8-2.8-15.5-6.1C201.9%205.4%20194%200%20176%200c-30.5%200-52%2043.7-66%2089.4C62.7%2098.1%2032%20112.2%2032%20128c0%2014.3%2025%2027.1%2064.6%2035.9c-.4%204-.6%208-.6%2012.1c0%2017%203.3%2033.2%209.3%2048H45.4C38%20224%2032%20230%2032%20237.4c0%201.7%20.3%203.4%201%205l38.8%2096.9C28.2%20371.8%200%20423.8%200%20482.3C0%20498.7%2013.3%20512%2029.7%20512H418.3c16.4%200%2029.7-13.3%2029.7-29.7c0-58.5-28.2-110.4-71.7-143L415%20242.4c.6-1.6%201-3.3%201-5c0-7.4-6-13.4-13.4-13.4H342.7c6-14.8%209.3-31%209.3-48c0-4.1-.2-8.1-.6-12.1C391%20155.1%20416%20142.3%20416%20128c0-15.8-30.7-29.9-78-38.6C324%2043.7%20302.5%200%20272%200c-18%200-25.9%205.4-32.5%209.9c-4.7%203.3-8.8%206.1-15.5%206.1zm56%20208H267.6c-16.5%200-31.1-10.6-36.3-26.2c-2.3-7-12.2-7-14.5%200c-5.2%2015.6-19.9%2026.2-36.3%2026.2H168c-22.1%200-40-17.9-40-40V169.6c28.2%204.1%2061%206.4%2096%206.4s67.8-2.3%2096-6.4V184c0%2022.1-17.9%2040-40%2040zm-88%2096l16%2032L176%20480%20128%20288l64%2032zm128-32L272%20480%20240%20352l16-32%2064-32z'/%3e%3c/svg%3e");background-repeat:no-repeat;background-position:calc(100% - 2rem) calc(100% + 4rem);background-size:10rem;pointer-events:none}[data-color-scheme=dark] .message--confidential .message__content:after{background-image:url("data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20viewBox='0%200%20448%20512'%3e%3cpath%20fill='%23ecedee'%20d='M224%2016c-6.7%200-10.8-2.8-15.5-6.1C201.9%205.4%20194%200%20176%200c-30.5%200-52%2043.7-66%2089.4C62.7%2098.1%2032%20112.2%2032%20128c0%2014.3%2025%2027.1%2064.6%2035.9c-.4%204-.6%208-.6%2012.1c0%2017%203.3%2033.2%209.3%2048H45.4C38%20224%2032%20230%2032%20237.4c0%201.7%20.3%203.4%201%205l38.8%2096.9C28.2%20371.8%200%20423.8%200%20482.3C0%20498.7%2013.3%20512%2029.7%20512H418.3c16.4%200%2029.7-13.3%2029.7-29.7c0-58.5-28.2-110.4-71.7-143L415%20242.4c.6-1.6%201-3.3%201-5c0-7.4-6-13.4-13.4-13.4H342.7c6-14.8%209.3-31%209.3-48c0-4.1-.2-8.1-.6-12.1C391%20155.1%20416%20142.3%20416%20128c0-15.8-30.7-29.9-78-38.6C324%2043.7%20302.5%200%20272%200c-18%200-25.9%205.4-32.5%209.9c-4.7%203.3-8.8%206.1-15.5%206.1zm56%20208H267.6c-16.5%200-31.1-10.6-36.3-26.2c-2.3-7-12.2-7-14.5%200c-5.2%2015.6-19.9%2026.2-36.3%2026.2H168c-22.1%200-40-17.9-40-40V169.6c28.2%204.1%2061%206.4%2096%206.4s67.8-2.3%2096-6.4V184c0%2022.1-17.9%2040-40%2040zm-88%2096l16%2032L176%20480%20128%20288l64%2032zm128-32L272%20480%20240%20352l16-32%2064-32z'/%3e%3c/svg%3e")}.message__content *+p,.message__content *+ul,.message__content *+ol{margin-top:2rem}.message__content th,.message__content td{padding:initial;font-size:var(--font-size-normal);vertical-align:initial}.message__content tbody tr{border-bottom:none}.message__content tbody tr:nth-child(odd){background-color:var(--message-background)}.message__content tbody tr:nth-child(2n){background-color:var(--message-background)}.message__content blockquote{margin-left:0;padding-left:2rem;color:var(--color-grey11);border-left:var(--width-border-bold) solid var(--color-primary6)}.message__bottom{padding:2rem;background-color:var(--message-background);border-top:var(--message-border-width) solid var(--message-border-color);border-radius:0 0 .5rem .5rem}.modal{position:fixed;z-index:999;top:0;right:0;bottom:0;left:0;visibility:hidden;overflow:hidden auto;opacity:0;background-color:#0000007f;transform:scaleX(1.02) scaleY(1.02);transition:visibility 0s linear .2s,opacity .2s 0s,transform .2s}.modal[aria-hidden=false]{visibility:visible;opacity:1;transform:scaleX(1) scaleY(1);transition:visibility 0s linear 0s,opacity .2s 0s,transform .2s}.modal__box{max-width:1000px;margin:2rem auto 5rem;background-color:var(--color-grey1);box-shadow:0 0 10px var(--color-box-shadow);scroll-margin-top:2rem}@media (min-width: 800px){.modal__box{margin-top:5rem}}@media (min-width: 1000px){.modal__box{border-radius:.75rem}}.modal__header{padding:1rem;text-align:right}.modal__body{overflow:hidden;min-height:15rem;padding-right:1rem;padding-bottom:6rem;padding-left:1rem}@media (min-width: 800px){.modal__body{padding-right:2rem;padding-left:2rem}}.modal__title{margin-bottom:2rem;text-align:center}body.modal-opened{overflow:hidden}.notifications{position:fixed;z-index:9999;top:0;right:0;left:0;padding:3rem;pointer-events:none}.notifications__item{position:relative;max-width:500px;margin-left:auto;padding:2rem 5rem;font-weight:700;background-repeat:no-repeat;background-position:left 1rem center;background-size:3rem;box-shadow:1px 2px 3px 1px var(--color-box-shadow);border-left-width:var(--width-border-bolder);border-left-style:solid;border-radius:.5rem;pointer-events:auto}.notifications__item--success{color:var(--color-success11);background-color:var(--color-success3);background-image:url("data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20viewBox='0%200%20512%20512'%3e%3cpath%20fill='%2330a46c'%20d='M256%20512c141.4%200%20256-114.6%20256-256S397.4%200%20256%200S0%20114.6%200%20256S114.6%20512%20256%20512zM369%20209L241%20337c-9.4%209.4-24.6%209.4-33.9%200l-64-64c-9.4-9.4-9.4-24.6%200-33.9s24.6-9.4%2033.9%200l47%2047L335%20175c9.4-9.4%2024.6-9.4%2033.9%200s9.4%2024.6%200%2033.9z'/%3e%3c/svg%3e");border-color:var(--color-success9)}.notifications__item--error{color:var(--color-error11);background-color:var(--color-error3);background-image:url("data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20viewBox='0%200%20512%20512'%3e%3cpath%20fill='%23e54d2e'%20d='M256%20512c141.4%200%20256-114.6%20256-256S397.4%200%20256%200S0%20114.6%200%20256S114.6%20512%20256%20512zm0-384c13.3%200%2024%2010.7%2024%2024V264c0%2013.3-10.7%2024-24%2024s-24-10.7-24-24V152c0-13.3%2010.7-24%2024-24zm32%20224c0%2017.7-14.3%2032-32%2032s-32-14.3-32-32s14.3-32%2032-32s32%2014.3%2032%2032z'/%3e%3c/svg%3e");border-color:var(--color-error9)}.notifications__item button{position:absolute;top:1.25rem;right:1rem;color:currentcolor;background:none;box-shadow:none;border:none}.placeholder{display:flex;min-height:25rem;padding:1rem;flex-direction:column;align-items:center;justify-content:center;color:var(--color-grey11);font-size:var(--font-size-bigger);text-align:center;background-color:var(--color-grey3);border-radius:.5rem}.placeholder .icon{margin-bottom:1rem;font-size:2em}.popup{position:relative;display:inline-block}.popup__opener{height:100%;list-style:none}.popup__opener::-webkit-details-marker{display:none}.popup__opener:focus{outline:0}.popup__opener:focus>*{outline:var(--width-outline) solid var(--color-primary9)}.popup__container{position:fixed;z-index:100;right:0;bottom:0;left:0;padding-top:1rem;padding-bottom:1rem;background-color:var(--color-primary3);border-top:var(--width-border) solid var(--color-primary7)}@media (min-width: 800px){.popup__container{position:absolute;bottom:auto;min-width:27rem;box-shadow:1px 2px 3px 1px var(--color-box-shadow);border:var(--width-border) solid var(--color-primary7);border-top-width:var(--width-border);border-radius:.75rem}.popup__container--large{min-width:31rem}.popup__container--center{left:50%;margin-top:1.25rem;margin-right:auto;margin-left:auto;transform:translate(-50%)}.popup__container--right{right:0;left:auto;margin-top:1.25rem}.popup__container--left{right:auto;left:0;margin-top:1.25rem}.popup__container--top{bottom:100%;margin-top:0;margin-bottom:1.25rem}.popup__container--center:before,.popup__container--right:before,.popup__container--left:before{content:"";position:absolute;top:-8px;display:block;width:16px;height:8px;background-color:var(--color-primary7);-webkit-clip-path:polygon(50% 0,100% 100%,0 100%);clip-path:polygon(50% 0,100% 100%,0 100%)}.popup__container--center:before{left:50%;transform:translate(-50%)}.popup__container--right:before{right:2.75rem}.popup__container--left:before{left:2.75rem}.popup__container--top:before{top:auto;bottom:-8px;transform:rotate(180deg)}}.popup__title{margin-bottom:1rem;padding-right:1.5rem;padding-left:1.5rem;font-weight:700;overflow-wrap:anywhere}.popup__separator{height:.2rem;margin:1rem 1.5rem;background-color:var(--color-primary7);border-radius:.75rem}.popup__item{display:block;width:100%;padding:1rem 1.5rem;color:var(--color-grey12);line-height:1.5;text-align:left;text-decoration:none;background-color:transparent;background-image:none;box-shadow:none;border:none;border-radius:0;transition:none;transition:background-color .2s ease-in-out}@media (min-width: 800px){.popup__item{white-space:nowrap}}.popup__item:not([disabled]):hover,.popup__item:not([disabled]):focus{color:var(--color-grey12);background-color:var(--color-primary5)}.popup__item:not([disabled]):focus{outline-offset:-.1rem}.popup__item:not([disabled]):active{background-color:var(--color-primary5)}.popup__item .icon{margin-right:.25rem}input[type=radio]:focus+.popup__item{color:var(--color-grey12);background-color:var(--color-primary5);outline:var(--width-outline) solid var(--color-primary9);outline-offset:-.1rem}input[type=radio]+.popup__item:before{visibility:hidden}input[type=radio]:checked+.popup__item:after{top:1.75rem;left:2.2rem;height:1rem;background-color:transparent;border-top:none;border-right:none;border-radius:0}progress{display:block;width:100%;height:2rem;background-color:var(--color-primary2);border:var(--width-border) solid var(--color-primary9);border-radius:.5rem;-webkit-appearance:none;-moz-appearance:none;appearance:none}progress::-webkit-progress-bar,progress::-moz-progress-bar{background-color:var(--color-primary9)}.progress--warning{background-color:var(--color-warning2);border-color:var(--color-warning9)}.progress--warning::-webkit-progress-bar,.progress--warning::-moz-progress-bar{background-color:var(--color-warning9)}.progress-with-marker{position:relative}.progress__marker{position:absolute;top:0;left:var(--marker-percent);padding-top:2.5rem;font-size:.8em;text-align:center;transform:translate(-50%)}.progress__marker:before{content:"";position:absolute;top:0;left:calc(50% - 1px);display:block;width:0;height:2.5rem;border-left:2px dotted var(--color-grey12)}.scroll-to-top{position:absolute;top:0;right:0;width:1px;height:100vh}.scroll-to-top__button{position:fixed;right:50%;bottom:2rem;visibility:visible;opacity:1;transform:translate(50%);transition:opacity .2s ease}@media (min-width: 800px){.scroll-to-top__button{right:2rem;transform:none}}.scroll-to-top[data-visible=false] .scroll-to-top__button{visibility:hidden;opacity:0}.sidebar{padding-right:1rem;padding-left:1rem}ul.sidebar{list-style:none}@media (min-width: 800px){.sidebar{min-width:20rem;margin-right:-1rem}}@media (min-width: 1200px){.sidebar{min-width:30rem}}.sidebar__title{padding:1rem;color:var(--color-grey11)}.sidebar__anchor{display:block;padding:1rem;color:var(--color-grey12);text-decoration:none;white-space:nowrap;border-left:var(--width-border-bolder) solid transparent;border-radius:.5rem;transition:background-color .2s ease-in-out,border-color .2s ease-in-out}.sidebar__anchor.row{display:flex}.sidebar__anchor[aria-current=page]{color:var(--color-primary11);font-weight:700;background-color:var(--color-primary3);border-left-color:var(--color-primary9)}.sidebar__anchor:hover,.sidebar__anchor:focus{background-color:var(--color-primary4)}.sidebar__anchor .icon{margin-right:.5rem}.spinner{width:40px;height:40px;margin:30px auto;background-color:var(--color-primary9);border-radius:100%;animation:sk-scaleout 1s infinite ease-in-out}@keyframes sk-scaleout{0%{transform:scale(0)}to{opacity:0;transform:scale(1)}}table{width:100%;border-collapse:collapse}thead{text-align:left;background-color:var(--color-primary3);border-bottom:var(--width-border) solid var(--color-primary6)}th{font-weight:400}th,td{padding:1rem;vertical-align:baseline}tbody tr{border-bottom:var(--width-border) solid var(--color-grey4)}tbody tr:nth-child(odd){background-color:var(--color-grey1)}tbody tr:nth-child(2n){background-color:var(--color-grey2)}.col--size30{width:30%}.tabs{display:flex;margin-bottom:-1px}.tabs>*+*{margin-left:1rem}.tabs__button{line-height:initial;background:none;box-shadow:none;border-radius:.75rem .75rem 0 0;border-color:var(--color-grey7)}.tabs__button[aria-selected=true]{background-color:transparent;background-image:linear-gradient(to bottom,var(--color-grey5),var(--color-grey2));border-color:var(--color-grey8);border-bottom-color:var(--color-grey2)}.tabs__panel{padding:2rem;border:var(--width-border) solid var(--color-grey7);border-radius:0 0 .5rem .5rem}.tabs__panel:focus{outline:none}.ticket__id{margin-left:.5rem;color:var(--color-grey11);font-size:var(--font-size-small);font-weight:400}.list-tickets__anchor{display:inline-block;text-decoration:none}.list-tickets__organization{color:var(--color-grey12);text-decoration:none;white-space:nowrap}.list-tickets__requester,.list-tickets__assignee{white-space:nowrap}.timeline{--width-col-avatars: 0rem;--position-timeline-bar: 1.5rem;position:relative}.timeline:before{content:" ";position:absolute;top:0;bottom:0;left:calc(var(--width-col-avatars) + var(--position-timeline-bar));border-left:var(--width-border-bold) solid var(--color-grey6)}@media (min-width: 800px){.timeline{--width-col-avatars:7rem}}.timeline__date{padding-top:1rem;padding-bottom:1rem;font-size:var(--font-size-normal);text-align:right}.timeline__date:first-child{position:relative;background-color:var(--color-grey1)}.timeline__date+*{margin-top:0}.timeline__date-diff{color:var(--color-grey11);font-style:italic;font-weight:400}.timeline__event{display:flex;margin-right:2rem;margin-left:calc(var(--width-col-avatars) + var(--position-timeline-bar));flex-direction:row;align-items:baseline;color:var(--color-grey11);font-size:var(--font-size-small)}.timeline__event+.timeline__event{margin-top:2rem}.timeline__event-message{padding-right:2rem;padding-left:2rem;flex:1}.timeline__event-date{flex-shrink:0;text-align:right}.timeline__time-spent{display:flex;margin-right:2rem;margin-left:var(--width-col-avatars);flex-direction:row;align-items:center}.timeline__time-spent:before{content:"";z-index:10;display:block;width:3.4rem;height:3.4rem;background-color:var(--color-grey6);background-image:url("data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20viewBox='0%200%20512%20512'%3e%3cpath%20d='M232%20120C232%20106.7%20242.7%2096%20256%2096C269.3%2096%20280%20106.7%20280%20120V243.2L365.3%20300C376.3%20307.4%20379.3%20322.3%20371.1%20333.3C364.6%20344.3%20349.7%20347.3%20338.7%20339.1L242.7%20275.1C236%20271.5%20232%20264%20232%20255.1L232%20120zM256%200C397.4%200%20512%20114.6%20512%20256C512%20397.4%20397.4%20512%20256%20512C114.6%20512%200%20397.4%200%20256C0%20114.6%20114.6%200%20256%200zM48%20256C48%20370.9%20141.1%20464%20256%20464C370.9%20464%20464%20370.9%20464%20256C464%20141.1%20370.9%2048%20256%2048C141.1%2048%2048%20141.1%2048%20256z'/%3e%3c/svg%3e");background-repeat:no-repeat;background-position:center;background-size:60%;border-radius:50%}.timeline__time-spent+.timeline__time-spent{margin-top:2rem}.timeline__time-spent-message{padding-right:2rem;padding-left:1rem;flex:1}.timeline__time-spent-date{flex-shrink:0;color:var(--color-grey11);font-size:var(--font-size-small);text-align:right}.timeline__editor{position:relative;margin-left:var(--width-col-avatars);background-color:var(--color-grey1);border-top:var(--width-border-bold) solid var(--color-grey6)}.login-new .logo{display:block;width:40rem;max-width:100%;margin-right:auto;margin-left:auto;padding-top:5rem;padding-bottom:5rem}.tickets-show .ticket__top{padding-bottom:4rem;border-bottom:var(--width-border) solid var(--color-grey4)}@media (min-width: 800px){.tickets-show .ticket__info{width:250px}}@media (min-width: 1200px){.tickets-show .ticket__info{width:300px;margin-left:10rem}}.tickets-show .answer-button{display:flex}.tickets-show .answer-button button[type=submit]{flex:1}@media (min-width: 800px){.tickets-show .answer-button{display:inline-flex}.tickets-show .answer-button button[type=submit]{min-width:30rem}}*,*:before,*:after{box-sizing:border-box}html{font-size:10px}body{margin:0;padding:0;color:var(--color-grey12);font-family:Atkinson Hyperlegible,system-ui,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;font-size:200%;background:var(--color-grey2)}*:focus{outline:var(--width-outline) solid var(--color-primary9)}h1{font-size:var(--font-size-bigger);text-align:center}h2{font-size:var(--font-size-big)}h3{font-size:var(--font-size-normal)}summary{cursor:pointer}.sr-only{position:absolute;overflow:hidden;clip:rect(0,0,0,0);width:1px;height:1px}.js-only{display:none}@media (max-width: 799px){.no-mobile{display:none}}@media (min-width: 800px){.only-mobile{display:none}}.accessibility-nav{position:absolute;overflow:hidden;clip:rect(0,0,0,0);width:1px;height:1px}.accessibility-nav:focus{top:1rem;left:1rem;clip:auto;width:auto;height:auto}.turbo-progress-bar{position:fixed;top:0;height:.5rem;background:linear-gradient(to right,var(--color-primary7),var(--color-primary9))} diff --git a/public/assets/application-hCpKtbY7.js.map b/public/assets/application-hCpKtbY7.js.map deleted file mode 100644 index 04c7da7a..00000000 --- a/public/assets/application-hCpKtbY7.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"application-hCpKtbY7.js","sources":["../../node_modules/@hotwired/turbo/dist/turbo.es2017-esm.js","../../node_modules/@hotwired/stimulus/dist/stimulus.js","../../assets/javascripts/controllers/button_select_controller.js","../../assets/javascripts/controllers/checkboxes_controller.js","../../assets/javascripts/controllers/color_scheme_controller.js","../../assets/javascripts/controllers/editor_controller.js","../../assets/javascripts/controllers/form_new_authorization_controller.js","../../assets/javascripts/controllers/form_new_contract_controller.js","../../assets/javascripts/controllers/form_priority_controller.js","../../assets/javascripts/controllers/message_documents_controller.js","../../assets/javascripts/query_selectors.js","../../assets/javascripts/controllers/modal_controller.js","../../assets/javascripts/controllers/modal_opener_controller.js","../../assets/javascripts/controllers/multiselect_actors_controller.js","../../assets/javascripts/controllers/notifications_controller.js","../../assets/javascripts/controllers/password_controller.js","../../assets/javascripts/controllers/popup_controller.js","../../assets/javascripts/controllers/scroll_to_controller.js","../../assets/javascripts/controllers/switch_controller.js","../../assets/javascripts/controllers/tabs_controller.js","../../assets/javascripts/controllers/tinymce_controller.js","../../assets/javascripts/application.js"],"sourcesContent":["/*\nTurbo 7.3.0\nCopyright © 2023 37signals LLC\n */\n(function () {\n if (window.Reflect === undefined ||\n window.customElements === undefined ||\n window.customElements.polyfillWrapFlushCallback) {\n return;\n }\n const BuiltInHTMLElement = HTMLElement;\n const wrapperForTheName = {\n HTMLElement: function HTMLElement() {\n return Reflect.construct(BuiltInHTMLElement, [], this.constructor);\n },\n };\n window.HTMLElement = wrapperForTheName[\"HTMLElement\"];\n HTMLElement.prototype = BuiltInHTMLElement.prototype;\n HTMLElement.prototype.constructor = HTMLElement;\n Object.setPrototypeOf(HTMLElement, BuiltInHTMLElement);\n})();\n\n/**\n * The MIT License (MIT)\n * \n * Copyright (c) 2019 Javan Makhmali\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\n\n(function(prototype) {\n if (typeof prototype.requestSubmit == \"function\") return\n\n prototype.requestSubmit = function(submitter) {\n if (submitter) {\n validateSubmitter(submitter, this);\n submitter.click();\n } else {\n submitter = document.createElement(\"input\");\n submitter.type = \"submit\";\n submitter.hidden = true;\n this.appendChild(submitter);\n submitter.click();\n this.removeChild(submitter);\n }\n };\n\n function validateSubmitter(submitter, form) {\n submitter instanceof HTMLElement || raise(TypeError, \"parameter 1 is not of type 'HTMLElement'\");\n submitter.type == \"submit\" || raise(TypeError, \"The specified element is not a submit button\");\n submitter.form == form || raise(DOMException, \"The specified element is not owned by this form element\", \"NotFoundError\");\n }\n\n function raise(errorConstructor, message, name) {\n throw new errorConstructor(\"Failed to execute 'requestSubmit' on 'HTMLFormElement': \" + message + \".\", name)\n }\n})(HTMLFormElement.prototype);\n\nconst submittersByForm = new WeakMap();\nfunction findSubmitterFromClickTarget(target) {\n const element = target instanceof Element ? target : target instanceof Node ? target.parentElement : null;\n const candidate = element ? element.closest(\"input, button\") : null;\n return (candidate === null || candidate === void 0 ? void 0 : candidate.type) == \"submit\" ? candidate : null;\n}\nfunction clickCaptured(event) {\n const submitter = findSubmitterFromClickTarget(event.target);\n if (submitter && submitter.form) {\n submittersByForm.set(submitter.form, submitter);\n }\n}\n(function () {\n if (\"submitter\" in Event.prototype)\n return;\n let prototype = window.Event.prototype;\n if (\"SubmitEvent\" in window && /Apple Computer/.test(navigator.vendor)) {\n prototype = window.SubmitEvent.prototype;\n }\n else if (\"SubmitEvent\" in window) {\n return;\n }\n addEventListener(\"click\", clickCaptured, true);\n Object.defineProperty(prototype, \"submitter\", {\n get() {\n if (this.type == \"submit\" && this.target instanceof HTMLFormElement) {\n return submittersByForm.get(this.target);\n }\n },\n });\n})();\n\nvar FrameLoadingStyle;\n(function (FrameLoadingStyle) {\n FrameLoadingStyle[\"eager\"] = \"eager\";\n FrameLoadingStyle[\"lazy\"] = \"lazy\";\n})(FrameLoadingStyle || (FrameLoadingStyle = {}));\nclass FrameElement extends HTMLElement {\n static get observedAttributes() {\n return [\"disabled\", \"complete\", \"loading\", \"src\"];\n }\n constructor() {\n super();\n this.loaded = Promise.resolve();\n this.delegate = new FrameElement.delegateConstructor(this);\n }\n connectedCallback() {\n this.delegate.connect();\n }\n disconnectedCallback() {\n this.delegate.disconnect();\n }\n reload() {\n return this.delegate.sourceURLReloaded();\n }\n attributeChangedCallback(name) {\n if (name == \"loading\") {\n this.delegate.loadingStyleChanged();\n }\n else if (name == \"complete\") {\n this.delegate.completeChanged();\n }\n else if (name == \"src\") {\n this.delegate.sourceURLChanged();\n }\n else {\n this.delegate.disabledChanged();\n }\n }\n get src() {\n return this.getAttribute(\"src\");\n }\n set src(value) {\n if (value) {\n this.setAttribute(\"src\", value);\n }\n else {\n this.removeAttribute(\"src\");\n }\n }\n get loading() {\n return frameLoadingStyleFromString(this.getAttribute(\"loading\") || \"\");\n }\n set loading(value) {\n if (value) {\n this.setAttribute(\"loading\", value);\n }\n else {\n this.removeAttribute(\"loading\");\n }\n }\n get disabled() {\n return this.hasAttribute(\"disabled\");\n }\n set disabled(value) {\n if (value) {\n this.setAttribute(\"disabled\", \"\");\n }\n else {\n this.removeAttribute(\"disabled\");\n }\n }\n get autoscroll() {\n return this.hasAttribute(\"autoscroll\");\n }\n set autoscroll(value) {\n if (value) {\n this.setAttribute(\"autoscroll\", \"\");\n }\n else {\n this.removeAttribute(\"autoscroll\");\n }\n }\n get complete() {\n return !this.delegate.isLoading;\n }\n get isActive() {\n return this.ownerDocument === document && !this.isPreview;\n }\n get isPreview() {\n var _a, _b;\n return (_b = (_a = this.ownerDocument) === null || _a === void 0 ? void 0 : _a.documentElement) === null || _b === void 0 ? void 0 : _b.hasAttribute(\"data-turbo-preview\");\n }\n}\nfunction frameLoadingStyleFromString(style) {\n switch (style.toLowerCase()) {\n case \"lazy\":\n return FrameLoadingStyle.lazy;\n default:\n return FrameLoadingStyle.eager;\n }\n}\n\nfunction expandURL(locatable) {\n return new URL(locatable.toString(), document.baseURI);\n}\nfunction getAnchor(url) {\n let anchorMatch;\n if (url.hash) {\n return url.hash.slice(1);\n }\n else if ((anchorMatch = url.href.match(/#(.*)$/))) {\n return anchorMatch[1];\n }\n}\nfunction getAction(form, submitter) {\n const action = (submitter === null || submitter === void 0 ? void 0 : submitter.getAttribute(\"formaction\")) || form.getAttribute(\"action\") || form.action;\n return expandURL(action);\n}\nfunction getExtension(url) {\n return (getLastPathComponent(url).match(/\\.[^.]*$/) || [])[0] || \"\";\n}\nfunction isHTML(url) {\n return !!getExtension(url).match(/^(?:|\\.(?:htm|html|xhtml|php))$/);\n}\nfunction isPrefixedBy(baseURL, url) {\n const prefix = getPrefix(url);\n return baseURL.href === expandURL(prefix).href || baseURL.href.startsWith(prefix);\n}\nfunction locationIsVisitable(location, rootLocation) {\n return isPrefixedBy(location, rootLocation) && isHTML(location);\n}\nfunction getRequestURL(url) {\n const anchor = getAnchor(url);\n return anchor != null ? url.href.slice(0, -(anchor.length + 1)) : url.href;\n}\nfunction toCacheKey(url) {\n return getRequestURL(url);\n}\nfunction urlsAreEqual(left, right) {\n return expandURL(left).href == expandURL(right).href;\n}\nfunction getPathComponents(url) {\n return url.pathname.split(\"/\").slice(1);\n}\nfunction getLastPathComponent(url) {\n return getPathComponents(url).slice(-1)[0];\n}\nfunction getPrefix(url) {\n return addTrailingSlash(url.origin + url.pathname);\n}\nfunction addTrailingSlash(value) {\n return value.endsWith(\"/\") ? value : value + \"/\";\n}\n\nclass FetchResponse {\n constructor(response) {\n this.response = response;\n }\n get succeeded() {\n return this.response.ok;\n }\n get failed() {\n return !this.succeeded;\n }\n get clientError() {\n return this.statusCode >= 400 && this.statusCode <= 499;\n }\n get serverError() {\n return this.statusCode >= 500 && this.statusCode <= 599;\n }\n get redirected() {\n return this.response.redirected;\n }\n get location() {\n return expandURL(this.response.url);\n }\n get isHTML() {\n return this.contentType && this.contentType.match(/^(?:text\\/([^\\s;,]+\\b)?html|application\\/xhtml\\+xml)\\b/);\n }\n get statusCode() {\n return this.response.status;\n }\n get contentType() {\n return this.header(\"Content-Type\");\n }\n get responseText() {\n return this.response.clone().text();\n }\n get responseHTML() {\n if (this.isHTML) {\n return this.response.clone().text();\n }\n else {\n return Promise.resolve(undefined);\n }\n }\n header(name) {\n return this.response.headers.get(name);\n }\n}\n\nfunction activateScriptElement(element) {\n if (element.getAttribute(\"data-turbo-eval\") == \"false\") {\n return element;\n }\n else {\n const createdScriptElement = document.createElement(\"script\");\n const cspNonce = getMetaContent(\"csp-nonce\");\n if (cspNonce) {\n createdScriptElement.nonce = cspNonce;\n }\n createdScriptElement.textContent = element.textContent;\n createdScriptElement.async = false;\n copyElementAttributes(createdScriptElement, element);\n return createdScriptElement;\n }\n}\nfunction copyElementAttributes(destinationElement, sourceElement) {\n for (const { name, value } of sourceElement.attributes) {\n destinationElement.setAttribute(name, value);\n }\n}\nfunction createDocumentFragment(html) {\n const template = document.createElement(\"template\");\n template.innerHTML = html;\n return template.content;\n}\nfunction dispatch(eventName, { target, cancelable, detail } = {}) {\n const event = new CustomEvent(eventName, {\n cancelable,\n bubbles: true,\n composed: true,\n detail,\n });\n if (target && target.isConnected) {\n target.dispatchEvent(event);\n }\n else {\n document.documentElement.dispatchEvent(event);\n }\n return event;\n}\nfunction nextAnimationFrame() {\n return new Promise((resolve) => requestAnimationFrame(() => resolve()));\n}\nfunction nextEventLoopTick() {\n return new Promise((resolve) => setTimeout(() => resolve(), 0));\n}\nfunction nextMicrotask() {\n return Promise.resolve();\n}\nfunction parseHTMLDocument(html = \"\") {\n return new DOMParser().parseFromString(html, \"text/html\");\n}\nfunction unindent(strings, ...values) {\n const lines = interpolate(strings, values).replace(/^\\n/, \"\").split(\"\\n\");\n const match = lines[0].match(/^\\s+/);\n const indent = match ? match[0].length : 0;\n return lines.map((line) => line.slice(indent)).join(\"\\n\");\n}\nfunction interpolate(strings, values) {\n return strings.reduce((result, string, i) => {\n const value = values[i] == undefined ? \"\" : values[i];\n return result + string + value;\n }, \"\");\n}\nfunction uuid() {\n return Array.from({ length: 36 })\n .map((_, i) => {\n if (i == 8 || i == 13 || i == 18 || i == 23) {\n return \"-\";\n }\n else if (i == 14) {\n return \"4\";\n }\n else if (i == 19) {\n return (Math.floor(Math.random() * 4) + 8).toString(16);\n }\n else {\n return Math.floor(Math.random() * 15).toString(16);\n }\n })\n .join(\"\");\n}\nfunction getAttribute(attributeName, ...elements) {\n for (const value of elements.map((element) => element === null || element === void 0 ? void 0 : element.getAttribute(attributeName))) {\n if (typeof value == \"string\")\n return value;\n }\n return null;\n}\nfunction hasAttribute(attributeName, ...elements) {\n return elements.some((element) => element && element.hasAttribute(attributeName));\n}\nfunction markAsBusy(...elements) {\n for (const element of elements) {\n if (element.localName == \"turbo-frame\") {\n element.setAttribute(\"busy\", \"\");\n }\n element.setAttribute(\"aria-busy\", \"true\");\n }\n}\nfunction clearBusyState(...elements) {\n for (const element of elements) {\n if (element.localName == \"turbo-frame\") {\n element.removeAttribute(\"busy\");\n }\n element.removeAttribute(\"aria-busy\");\n }\n}\nfunction waitForLoad(element, timeoutInMilliseconds = 2000) {\n return new Promise((resolve) => {\n const onComplete = () => {\n element.removeEventListener(\"error\", onComplete);\n element.removeEventListener(\"load\", onComplete);\n resolve();\n };\n element.addEventListener(\"load\", onComplete, { once: true });\n element.addEventListener(\"error\", onComplete, { once: true });\n setTimeout(resolve, timeoutInMilliseconds);\n });\n}\nfunction getHistoryMethodForAction(action) {\n switch (action) {\n case \"replace\":\n return history.replaceState;\n case \"advance\":\n case \"restore\":\n return history.pushState;\n }\n}\nfunction isAction(action) {\n return action == \"advance\" || action == \"replace\" || action == \"restore\";\n}\nfunction getVisitAction(...elements) {\n const action = getAttribute(\"data-turbo-action\", ...elements);\n return isAction(action) ? action : null;\n}\nfunction getMetaElement(name) {\n return document.querySelector(`meta[name=\"${name}\"]`);\n}\nfunction getMetaContent(name) {\n const element = getMetaElement(name);\n return element && element.content;\n}\nfunction setMetaContent(name, content) {\n let element = getMetaElement(name);\n if (!element) {\n element = document.createElement(\"meta\");\n element.setAttribute(\"name\", name);\n document.head.appendChild(element);\n }\n element.setAttribute(\"content\", content);\n return element;\n}\nfunction findClosestRecursively(element, selector) {\n var _a;\n if (element instanceof Element) {\n return (element.closest(selector) ||\n findClosestRecursively(element.assignedSlot || ((_a = element.getRootNode()) === null || _a === void 0 ? void 0 : _a.host), selector));\n }\n}\n\nvar FetchMethod;\n(function (FetchMethod) {\n FetchMethod[FetchMethod[\"get\"] = 0] = \"get\";\n FetchMethod[FetchMethod[\"post\"] = 1] = \"post\";\n FetchMethod[FetchMethod[\"put\"] = 2] = \"put\";\n FetchMethod[FetchMethod[\"patch\"] = 3] = \"patch\";\n FetchMethod[FetchMethod[\"delete\"] = 4] = \"delete\";\n})(FetchMethod || (FetchMethod = {}));\nfunction fetchMethodFromString(method) {\n switch (method.toLowerCase()) {\n case \"get\":\n return FetchMethod.get;\n case \"post\":\n return FetchMethod.post;\n case \"put\":\n return FetchMethod.put;\n case \"patch\":\n return FetchMethod.patch;\n case \"delete\":\n return FetchMethod.delete;\n }\n}\nclass FetchRequest {\n constructor(delegate, method, location, body = new URLSearchParams(), target = null) {\n this.abortController = new AbortController();\n this.resolveRequestPromise = (_value) => { };\n this.delegate = delegate;\n this.method = method;\n this.headers = this.defaultHeaders;\n this.body = body;\n this.url = location;\n this.target = target;\n }\n get location() {\n return this.url;\n }\n get params() {\n return this.url.searchParams;\n }\n get entries() {\n return this.body ? Array.from(this.body.entries()) : [];\n }\n cancel() {\n this.abortController.abort();\n }\n async perform() {\n const { fetchOptions } = this;\n this.delegate.prepareRequest(this);\n await this.allowRequestToBeIntercepted(fetchOptions);\n try {\n this.delegate.requestStarted(this);\n const response = await fetch(this.url.href, fetchOptions);\n return await this.receive(response);\n }\n catch (error) {\n if (error.name !== \"AbortError\") {\n if (this.willDelegateErrorHandling(error)) {\n this.delegate.requestErrored(this, error);\n }\n throw error;\n }\n }\n finally {\n this.delegate.requestFinished(this);\n }\n }\n async receive(response) {\n const fetchResponse = new FetchResponse(response);\n const event = dispatch(\"turbo:before-fetch-response\", {\n cancelable: true,\n detail: { fetchResponse },\n target: this.target,\n });\n if (event.defaultPrevented) {\n this.delegate.requestPreventedHandlingResponse(this, fetchResponse);\n }\n else if (fetchResponse.succeeded) {\n this.delegate.requestSucceededWithResponse(this, fetchResponse);\n }\n else {\n this.delegate.requestFailedWithResponse(this, fetchResponse);\n }\n return fetchResponse;\n }\n get fetchOptions() {\n var _a;\n return {\n method: FetchMethod[this.method].toUpperCase(),\n credentials: \"same-origin\",\n headers: this.headers,\n redirect: \"follow\",\n body: this.isSafe ? null : this.body,\n signal: this.abortSignal,\n referrer: (_a = this.delegate.referrer) === null || _a === void 0 ? void 0 : _a.href,\n };\n }\n get defaultHeaders() {\n return {\n Accept: \"text/html, application/xhtml+xml\",\n };\n }\n get isSafe() {\n return this.method === FetchMethod.get;\n }\n get abortSignal() {\n return this.abortController.signal;\n }\n acceptResponseType(mimeType) {\n this.headers[\"Accept\"] = [mimeType, this.headers[\"Accept\"]].join(\", \");\n }\n async allowRequestToBeIntercepted(fetchOptions) {\n const requestInterception = new Promise((resolve) => (this.resolveRequestPromise = resolve));\n const event = dispatch(\"turbo:before-fetch-request\", {\n cancelable: true,\n detail: {\n fetchOptions,\n url: this.url,\n resume: this.resolveRequestPromise,\n },\n target: this.target,\n });\n if (event.defaultPrevented)\n await requestInterception;\n }\n willDelegateErrorHandling(error) {\n const event = dispatch(\"turbo:fetch-request-error\", {\n target: this.target,\n cancelable: true,\n detail: { request: this, error: error },\n });\n return !event.defaultPrevented;\n }\n}\n\nclass AppearanceObserver {\n constructor(delegate, element) {\n this.started = false;\n this.intersect = (entries) => {\n const lastEntry = entries.slice(-1)[0];\n if (lastEntry === null || lastEntry === void 0 ? void 0 : lastEntry.isIntersecting) {\n this.delegate.elementAppearedInViewport(this.element);\n }\n };\n this.delegate = delegate;\n this.element = element;\n this.intersectionObserver = new IntersectionObserver(this.intersect);\n }\n start() {\n if (!this.started) {\n this.started = true;\n this.intersectionObserver.observe(this.element);\n }\n }\n stop() {\n if (this.started) {\n this.started = false;\n this.intersectionObserver.unobserve(this.element);\n }\n }\n}\n\nclass StreamMessage {\n static wrap(message) {\n if (typeof message == \"string\") {\n return new this(createDocumentFragment(message));\n }\n else {\n return message;\n }\n }\n constructor(fragment) {\n this.fragment = importStreamElements(fragment);\n }\n}\nStreamMessage.contentType = \"text/vnd.turbo-stream.html\";\nfunction importStreamElements(fragment) {\n for (const element of fragment.querySelectorAll(\"turbo-stream\")) {\n const streamElement = document.importNode(element, true);\n for (const inertScriptElement of streamElement.templateElement.content.querySelectorAll(\"script\")) {\n inertScriptElement.replaceWith(activateScriptElement(inertScriptElement));\n }\n element.replaceWith(streamElement);\n }\n return fragment;\n}\n\nvar FormSubmissionState;\n(function (FormSubmissionState) {\n FormSubmissionState[FormSubmissionState[\"initialized\"] = 0] = \"initialized\";\n FormSubmissionState[FormSubmissionState[\"requesting\"] = 1] = \"requesting\";\n FormSubmissionState[FormSubmissionState[\"waiting\"] = 2] = \"waiting\";\n FormSubmissionState[FormSubmissionState[\"receiving\"] = 3] = \"receiving\";\n FormSubmissionState[FormSubmissionState[\"stopping\"] = 4] = \"stopping\";\n FormSubmissionState[FormSubmissionState[\"stopped\"] = 5] = \"stopped\";\n})(FormSubmissionState || (FormSubmissionState = {}));\nvar FormEnctype;\n(function (FormEnctype) {\n FormEnctype[\"urlEncoded\"] = \"application/x-www-form-urlencoded\";\n FormEnctype[\"multipart\"] = \"multipart/form-data\";\n FormEnctype[\"plain\"] = \"text/plain\";\n})(FormEnctype || (FormEnctype = {}));\nfunction formEnctypeFromString(encoding) {\n switch (encoding.toLowerCase()) {\n case FormEnctype.multipart:\n return FormEnctype.multipart;\n case FormEnctype.plain:\n return FormEnctype.plain;\n default:\n return FormEnctype.urlEncoded;\n }\n}\nclass FormSubmission {\n static confirmMethod(message, _element, _submitter) {\n return Promise.resolve(confirm(message));\n }\n constructor(delegate, formElement, submitter, mustRedirect = false) {\n this.state = FormSubmissionState.initialized;\n this.delegate = delegate;\n this.formElement = formElement;\n this.submitter = submitter;\n this.formData = buildFormData(formElement, submitter);\n this.location = expandURL(this.action);\n if (this.method == FetchMethod.get) {\n mergeFormDataEntries(this.location, [...this.body.entries()]);\n }\n this.fetchRequest = new FetchRequest(this, this.method, this.location, this.body, this.formElement);\n this.mustRedirect = mustRedirect;\n }\n get method() {\n var _a;\n const method = ((_a = this.submitter) === null || _a === void 0 ? void 0 : _a.getAttribute(\"formmethod\")) || this.formElement.getAttribute(\"method\") || \"\";\n return fetchMethodFromString(method.toLowerCase()) || FetchMethod.get;\n }\n get action() {\n var _a;\n const formElementAction = typeof this.formElement.action === \"string\" ? this.formElement.action : null;\n if ((_a = this.submitter) === null || _a === void 0 ? void 0 : _a.hasAttribute(\"formaction\")) {\n return this.submitter.getAttribute(\"formaction\") || \"\";\n }\n else {\n return this.formElement.getAttribute(\"action\") || formElementAction || \"\";\n }\n }\n get body() {\n if (this.enctype == FormEnctype.urlEncoded || this.method == FetchMethod.get) {\n return new URLSearchParams(this.stringFormData);\n }\n else {\n return this.formData;\n }\n }\n get enctype() {\n var _a;\n return formEnctypeFromString(((_a = this.submitter) === null || _a === void 0 ? void 0 : _a.getAttribute(\"formenctype\")) || this.formElement.enctype);\n }\n get isSafe() {\n return this.fetchRequest.isSafe;\n }\n get stringFormData() {\n return [...this.formData].reduce((entries, [name, value]) => {\n return entries.concat(typeof value == \"string\" ? [[name, value]] : []);\n }, []);\n }\n async start() {\n const { initialized, requesting } = FormSubmissionState;\n const confirmationMessage = getAttribute(\"data-turbo-confirm\", this.submitter, this.formElement);\n if (typeof confirmationMessage === \"string\") {\n const answer = await FormSubmission.confirmMethod(confirmationMessage, this.formElement, this.submitter);\n if (!answer) {\n return;\n }\n }\n if (this.state == initialized) {\n this.state = requesting;\n return this.fetchRequest.perform();\n }\n }\n stop() {\n const { stopping, stopped } = FormSubmissionState;\n if (this.state != stopping && this.state != stopped) {\n this.state = stopping;\n this.fetchRequest.cancel();\n return true;\n }\n }\n prepareRequest(request) {\n if (!request.isSafe) {\n const token = getCookieValue(getMetaContent(\"csrf-param\")) || getMetaContent(\"csrf-token\");\n if (token) {\n request.headers[\"X-CSRF-Token\"] = token;\n }\n }\n if (this.requestAcceptsTurboStreamResponse(request)) {\n request.acceptResponseType(StreamMessage.contentType);\n }\n }\n requestStarted(_request) {\n var _a;\n this.state = FormSubmissionState.waiting;\n (_a = this.submitter) === null || _a === void 0 ? void 0 : _a.setAttribute(\"disabled\", \"\");\n this.setSubmitsWith();\n dispatch(\"turbo:submit-start\", {\n target: this.formElement,\n detail: { formSubmission: this },\n });\n this.delegate.formSubmissionStarted(this);\n }\n requestPreventedHandlingResponse(request, response) {\n this.result = { success: response.succeeded, fetchResponse: response };\n }\n requestSucceededWithResponse(request, response) {\n if (response.clientError || response.serverError) {\n this.delegate.formSubmissionFailedWithResponse(this, response);\n }\n else if (this.requestMustRedirect(request) && responseSucceededWithoutRedirect(response)) {\n const error = new Error(\"Form responses must redirect to another location\");\n this.delegate.formSubmissionErrored(this, error);\n }\n else {\n this.state = FormSubmissionState.receiving;\n this.result = { success: true, fetchResponse: response };\n this.delegate.formSubmissionSucceededWithResponse(this, response);\n }\n }\n requestFailedWithResponse(request, response) {\n this.result = { success: false, fetchResponse: response };\n this.delegate.formSubmissionFailedWithResponse(this, response);\n }\n requestErrored(request, error) {\n this.result = { success: false, error };\n this.delegate.formSubmissionErrored(this, error);\n }\n requestFinished(_request) {\n var _a;\n this.state = FormSubmissionState.stopped;\n (_a = this.submitter) === null || _a === void 0 ? void 0 : _a.removeAttribute(\"disabled\");\n this.resetSubmitterText();\n dispatch(\"turbo:submit-end\", {\n target: this.formElement,\n detail: Object.assign({ formSubmission: this }, this.result),\n });\n this.delegate.formSubmissionFinished(this);\n }\n setSubmitsWith() {\n if (!this.submitter || !this.submitsWith)\n return;\n if (this.submitter.matches(\"button\")) {\n this.originalSubmitText = this.submitter.innerHTML;\n this.submitter.innerHTML = this.submitsWith;\n }\n else if (this.submitter.matches(\"input\")) {\n const input = this.submitter;\n this.originalSubmitText = input.value;\n input.value = this.submitsWith;\n }\n }\n resetSubmitterText() {\n if (!this.submitter || !this.originalSubmitText)\n return;\n if (this.submitter.matches(\"button\")) {\n this.submitter.innerHTML = this.originalSubmitText;\n }\n else if (this.submitter.matches(\"input\")) {\n const input = this.submitter;\n input.value = this.originalSubmitText;\n }\n }\n requestMustRedirect(request) {\n return !request.isSafe && this.mustRedirect;\n }\n requestAcceptsTurboStreamResponse(request) {\n return !request.isSafe || hasAttribute(\"data-turbo-stream\", this.submitter, this.formElement);\n }\n get submitsWith() {\n var _a;\n return (_a = this.submitter) === null || _a === void 0 ? void 0 : _a.getAttribute(\"data-turbo-submits-with\");\n }\n}\nfunction buildFormData(formElement, submitter) {\n const formData = new FormData(formElement);\n const name = submitter === null || submitter === void 0 ? void 0 : submitter.getAttribute(\"name\");\n const value = submitter === null || submitter === void 0 ? void 0 : submitter.getAttribute(\"value\");\n if (name) {\n formData.append(name, value || \"\");\n }\n return formData;\n}\nfunction getCookieValue(cookieName) {\n if (cookieName != null) {\n const cookies = document.cookie ? document.cookie.split(\"; \") : [];\n const cookie = cookies.find((cookie) => cookie.startsWith(cookieName));\n if (cookie) {\n const value = cookie.split(\"=\").slice(1).join(\"=\");\n return value ? decodeURIComponent(value) : undefined;\n }\n }\n}\nfunction responseSucceededWithoutRedirect(response) {\n return response.statusCode == 200 && !response.redirected;\n}\nfunction mergeFormDataEntries(url, entries) {\n const searchParams = new URLSearchParams();\n for (const [name, value] of entries) {\n if (value instanceof File)\n continue;\n searchParams.append(name, value);\n }\n url.search = searchParams.toString();\n return url;\n}\n\nclass Snapshot {\n constructor(element) {\n this.element = element;\n }\n get activeElement() {\n return this.element.ownerDocument.activeElement;\n }\n get children() {\n return [...this.element.children];\n }\n hasAnchor(anchor) {\n return this.getElementForAnchor(anchor) != null;\n }\n getElementForAnchor(anchor) {\n return anchor ? this.element.querySelector(`[id='${anchor}'], a[name='${anchor}']`) : null;\n }\n get isConnected() {\n return this.element.isConnected;\n }\n get firstAutofocusableElement() {\n const inertDisabledOrHidden = \"[inert], :disabled, [hidden], details:not([open]), dialog:not([open])\";\n for (const element of this.element.querySelectorAll(\"[autofocus]\")) {\n if (element.closest(inertDisabledOrHidden) == null)\n return element;\n else\n continue;\n }\n return null;\n }\n get permanentElements() {\n return queryPermanentElementsAll(this.element);\n }\n getPermanentElementById(id) {\n return getPermanentElementById(this.element, id);\n }\n getPermanentElementMapForSnapshot(snapshot) {\n const permanentElementMap = {};\n for (const currentPermanentElement of this.permanentElements) {\n const { id } = currentPermanentElement;\n const newPermanentElement = snapshot.getPermanentElementById(id);\n if (newPermanentElement) {\n permanentElementMap[id] = [currentPermanentElement, newPermanentElement];\n }\n }\n return permanentElementMap;\n }\n}\nfunction getPermanentElementById(node, id) {\n return node.querySelector(`#${id}[data-turbo-permanent]`);\n}\nfunction queryPermanentElementsAll(node) {\n return node.querySelectorAll(\"[id][data-turbo-permanent]\");\n}\n\nclass FormSubmitObserver {\n constructor(delegate, eventTarget) {\n this.started = false;\n this.submitCaptured = () => {\n this.eventTarget.removeEventListener(\"submit\", this.submitBubbled, false);\n this.eventTarget.addEventListener(\"submit\", this.submitBubbled, false);\n };\n this.submitBubbled = ((event) => {\n if (!event.defaultPrevented) {\n const form = event.target instanceof HTMLFormElement ? event.target : undefined;\n const submitter = event.submitter || undefined;\n if (form &&\n submissionDoesNotDismissDialog(form, submitter) &&\n submissionDoesNotTargetIFrame(form, submitter) &&\n this.delegate.willSubmitForm(form, submitter)) {\n event.preventDefault();\n event.stopImmediatePropagation();\n this.delegate.formSubmitted(form, submitter);\n }\n }\n });\n this.delegate = delegate;\n this.eventTarget = eventTarget;\n }\n start() {\n if (!this.started) {\n this.eventTarget.addEventListener(\"submit\", this.submitCaptured, true);\n this.started = true;\n }\n }\n stop() {\n if (this.started) {\n this.eventTarget.removeEventListener(\"submit\", this.submitCaptured, true);\n this.started = false;\n }\n }\n}\nfunction submissionDoesNotDismissDialog(form, submitter) {\n const method = (submitter === null || submitter === void 0 ? void 0 : submitter.getAttribute(\"formmethod\")) || form.getAttribute(\"method\");\n return method != \"dialog\";\n}\nfunction submissionDoesNotTargetIFrame(form, submitter) {\n if ((submitter === null || submitter === void 0 ? void 0 : submitter.hasAttribute(\"formtarget\")) || form.hasAttribute(\"target\")) {\n const target = (submitter === null || submitter === void 0 ? void 0 : submitter.getAttribute(\"formtarget\")) || form.target;\n for (const element of document.getElementsByName(target)) {\n if (element instanceof HTMLIFrameElement)\n return false;\n }\n return true;\n }\n else {\n return true;\n }\n}\n\nclass View {\n constructor(delegate, element) {\n this.resolveRenderPromise = (_value) => { };\n this.resolveInterceptionPromise = (_value) => { };\n this.delegate = delegate;\n this.element = element;\n }\n scrollToAnchor(anchor) {\n const element = this.snapshot.getElementForAnchor(anchor);\n if (element) {\n this.scrollToElement(element);\n this.focusElement(element);\n }\n else {\n this.scrollToPosition({ x: 0, y: 0 });\n }\n }\n scrollToAnchorFromLocation(location) {\n this.scrollToAnchor(getAnchor(location));\n }\n scrollToElement(element) {\n element.scrollIntoView();\n }\n focusElement(element) {\n if (element instanceof HTMLElement) {\n if (element.hasAttribute(\"tabindex\")) {\n element.focus();\n }\n else {\n element.setAttribute(\"tabindex\", \"-1\");\n element.focus();\n element.removeAttribute(\"tabindex\");\n }\n }\n }\n scrollToPosition({ x, y }) {\n this.scrollRoot.scrollTo(x, y);\n }\n scrollToTop() {\n this.scrollToPosition({ x: 0, y: 0 });\n }\n get scrollRoot() {\n return window;\n }\n async render(renderer) {\n const { isPreview, shouldRender, newSnapshot: snapshot } = renderer;\n if (shouldRender) {\n try {\n this.renderPromise = new Promise((resolve) => (this.resolveRenderPromise = resolve));\n this.renderer = renderer;\n await this.prepareToRenderSnapshot(renderer);\n const renderInterception = new Promise((resolve) => (this.resolveInterceptionPromise = resolve));\n const options = { resume: this.resolveInterceptionPromise, render: this.renderer.renderElement };\n const immediateRender = this.delegate.allowsImmediateRender(snapshot, options);\n if (!immediateRender)\n await renderInterception;\n await this.renderSnapshot(renderer);\n this.delegate.viewRenderedSnapshot(snapshot, isPreview);\n this.delegate.preloadOnLoadLinksForView(this.element);\n this.finishRenderingSnapshot(renderer);\n }\n finally {\n delete this.renderer;\n this.resolveRenderPromise(undefined);\n delete this.renderPromise;\n }\n }\n else {\n this.invalidate(renderer.reloadReason);\n }\n }\n invalidate(reason) {\n this.delegate.viewInvalidated(reason);\n }\n async prepareToRenderSnapshot(renderer) {\n this.markAsPreview(renderer.isPreview);\n await renderer.prepareToRender();\n }\n markAsPreview(isPreview) {\n if (isPreview) {\n this.element.setAttribute(\"data-turbo-preview\", \"\");\n }\n else {\n this.element.removeAttribute(\"data-turbo-preview\");\n }\n }\n async renderSnapshot(renderer) {\n await renderer.render();\n }\n finishRenderingSnapshot(renderer) {\n renderer.finishRendering();\n }\n}\n\nclass FrameView extends View {\n missing() {\n this.element.innerHTML = `Content missing`;\n }\n get snapshot() {\n return new Snapshot(this.element);\n }\n}\n\nclass LinkInterceptor {\n constructor(delegate, element) {\n this.clickBubbled = (event) => {\n if (this.respondsToEventTarget(event.target)) {\n this.clickEvent = event;\n }\n else {\n delete this.clickEvent;\n }\n };\n this.linkClicked = ((event) => {\n if (this.clickEvent && this.respondsToEventTarget(event.target) && event.target instanceof Element) {\n if (this.delegate.shouldInterceptLinkClick(event.target, event.detail.url, event.detail.originalEvent)) {\n this.clickEvent.preventDefault();\n event.preventDefault();\n this.delegate.linkClickIntercepted(event.target, event.detail.url, event.detail.originalEvent);\n }\n }\n delete this.clickEvent;\n });\n this.willVisit = ((_event) => {\n delete this.clickEvent;\n });\n this.delegate = delegate;\n this.element = element;\n }\n start() {\n this.element.addEventListener(\"click\", this.clickBubbled);\n document.addEventListener(\"turbo:click\", this.linkClicked);\n document.addEventListener(\"turbo:before-visit\", this.willVisit);\n }\n stop() {\n this.element.removeEventListener(\"click\", this.clickBubbled);\n document.removeEventListener(\"turbo:click\", this.linkClicked);\n document.removeEventListener(\"turbo:before-visit\", this.willVisit);\n }\n respondsToEventTarget(target) {\n const element = target instanceof Element ? target : target instanceof Node ? target.parentElement : null;\n return element && element.closest(\"turbo-frame, html\") == this.element;\n }\n}\n\nclass LinkClickObserver {\n constructor(delegate, eventTarget) {\n this.started = false;\n this.clickCaptured = () => {\n this.eventTarget.removeEventListener(\"click\", this.clickBubbled, false);\n this.eventTarget.addEventListener(\"click\", this.clickBubbled, false);\n };\n this.clickBubbled = (event) => {\n if (event instanceof MouseEvent && this.clickEventIsSignificant(event)) {\n const target = (event.composedPath && event.composedPath()[0]) || event.target;\n const link = this.findLinkFromClickTarget(target);\n if (link && doesNotTargetIFrame(link)) {\n const location = this.getLocationForLink(link);\n if (this.delegate.willFollowLinkToLocation(link, location, event)) {\n event.preventDefault();\n this.delegate.followedLinkToLocation(link, location);\n }\n }\n }\n };\n this.delegate = delegate;\n this.eventTarget = eventTarget;\n }\n start() {\n if (!this.started) {\n this.eventTarget.addEventListener(\"click\", this.clickCaptured, true);\n this.started = true;\n }\n }\n stop() {\n if (this.started) {\n this.eventTarget.removeEventListener(\"click\", this.clickCaptured, true);\n this.started = false;\n }\n }\n clickEventIsSignificant(event) {\n return !((event.target && event.target.isContentEditable) ||\n event.defaultPrevented ||\n event.which > 1 ||\n event.altKey ||\n event.ctrlKey ||\n event.metaKey ||\n event.shiftKey);\n }\n findLinkFromClickTarget(target) {\n return findClosestRecursively(target, \"a[href]:not([target^=_]):not([download])\");\n }\n getLocationForLink(link) {\n return expandURL(link.getAttribute(\"href\") || \"\");\n }\n}\nfunction doesNotTargetIFrame(anchor) {\n if (anchor.hasAttribute(\"target\")) {\n for (const element of document.getElementsByName(anchor.target)) {\n if (element instanceof HTMLIFrameElement)\n return false;\n }\n return true;\n }\n else {\n return true;\n }\n}\n\nclass FormLinkClickObserver {\n constructor(delegate, element) {\n this.delegate = delegate;\n this.linkInterceptor = new LinkClickObserver(this, element);\n }\n start() {\n this.linkInterceptor.start();\n }\n stop() {\n this.linkInterceptor.stop();\n }\n willFollowLinkToLocation(link, location, originalEvent) {\n return (this.delegate.willSubmitFormLinkToLocation(link, location, originalEvent) &&\n link.hasAttribute(\"data-turbo-method\"));\n }\n followedLinkToLocation(link, location) {\n const form = document.createElement(\"form\");\n const type = \"hidden\";\n for (const [name, value] of location.searchParams) {\n form.append(Object.assign(document.createElement(\"input\"), { type, name, value }));\n }\n const action = Object.assign(location, { search: \"\" });\n form.setAttribute(\"data-turbo\", \"true\");\n form.setAttribute(\"action\", action.href);\n form.setAttribute(\"hidden\", \"\");\n const method = link.getAttribute(\"data-turbo-method\");\n if (method)\n form.setAttribute(\"method\", method);\n const turboFrame = link.getAttribute(\"data-turbo-frame\");\n if (turboFrame)\n form.setAttribute(\"data-turbo-frame\", turboFrame);\n const turboAction = getVisitAction(link);\n if (turboAction)\n form.setAttribute(\"data-turbo-action\", turboAction);\n const turboConfirm = link.getAttribute(\"data-turbo-confirm\");\n if (turboConfirm)\n form.setAttribute(\"data-turbo-confirm\", turboConfirm);\n const turboStream = link.hasAttribute(\"data-turbo-stream\");\n if (turboStream)\n form.setAttribute(\"data-turbo-stream\", \"\");\n this.delegate.submittedFormLinkToLocation(link, location, form);\n document.body.appendChild(form);\n form.addEventListener(\"turbo:submit-end\", () => form.remove(), { once: true });\n requestAnimationFrame(() => form.requestSubmit());\n }\n}\n\nclass Bardo {\n static async preservingPermanentElements(delegate, permanentElementMap, callback) {\n const bardo = new this(delegate, permanentElementMap);\n bardo.enter();\n await callback();\n bardo.leave();\n }\n constructor(delegate, permanentElementMap) {\n this.delegate = delegate;\n this.permanentElementMap = permanentElementMap;\n }\n enter() {\n for (const id in this.permanentElementMap) {\n const [currentPermanentElement, newPermanentElement] = this.permanentElementMap[id];\n this.delegate.enteringBardo(currentPermanentElement, newPermanentElement);\n this.replaceNewPermanentElementWithPlaceholder(newPermanentElement);\n }\n }\n leave() {\n for (const id in this.permanentElementMap) {\n const [currentPermanentElement] = this.permanentElementMap[id];\n this.replaceCurrentPermanentElementWithClone(currentPermanentElement);\n this.replacePlaceholderWithPermanentElement(currentPermanentElement);\n this.delegate.leavingBardo(currentPermanentElement);\n }\n }\n replaceNewPermanentElementWithPlaceholder(permanentElement) {\n const placeholder = createPlaceholderForPermanentElement(permanentElement);\n permanentElement.replaceWith(placeholder);\n }\n replaceCurrentPermanentElementWithClone(permanentElement) {\n const clone = permanentElement.cloneNode(true);\n permanentElement.replaceWith(clone);\n }\n replacePlaceholderWithPermanentElement(permanentElement) {\n const placeholder = this.getPlaceholderById(permanentElement.id);\n placeholder === null || placeholder === void 0 ? void 0 : placeholder.replaceWith(permanentElement);\n }\n getPlaceholderById(id) {\n return this.placeholders.find((element) => element.content == id);\n }\n get placeholders() {\n return [...document.querySelectorAll(\"meta[name=turbo-permanent-placeholder][content]\")];\n }\n}\nfunction createPlaceholderForPermanentElement(permanentElement) {\n const element = document.createElement(\"meta\");\n element.setAttribute(\"name\", \"turbo-permanent-placeholder\");\n element.setAttribute(\"content\", permanentElement.id);\n return element;\n}\n\nclass Renderer {\n constructor(currentSnapshot, newSnapshot, renderElement, isPreview, willRender = true) {\n this.activeElement = null;\n this.currentSnapshot = currentSnapshot;\n this.newSnapshot = newSnapshot;\n this.isPreview = isPreview;\n this.willRender = willRender;\n this.renderElement = renderElement;\n this.promise = new Promise((resolve, reject) => (this.resolvingFunctions = { resolve, reject }));\n }\n get shouldRender() {\n return true;\n }\n get reloadReason() {\n return;\n }\n prepareToRender() {\n return;\n }\n finishRendering() {\n if (this.resolvingFunctions) {\n this.resolvingFunctions.resolve();\n delete this.resolvingFunctions;\n }\n }\n async preservingPermanentElements(callback) {\n await Bardo.preservingPermanentElements(this, this.permanentElementMap, callback);\n }\n focusFirstAutofocusableElement() {\n const element = this.connectedSnapshot.firstAutofocusableElement;\n if (elementIsFocusable(element)) {\n element.focus();\n }\n }\n enteringBardo(currentPermanentElement) {\n if (this.activeElement)\n return;\n if (currentPermanentElement.contains(this.currentSnapshot.activeElement)) {\n this.activeElement = this.currentSnapshot.activeElement;\n }\n }\n leavingBardo(currentPermanentElement) {\n if (currentPermanentElement.contains(this.activeElement) && this.activeElement instanceof HTMLElement) {\n this.activeElement.focus();\n this.activeElement = null;\n }\n }\n get connectedSnapshot() {\n return this.newSnapshot.isConnected ? this.newSnapshot : this.currentSnapshot;\n }\n get currentElement() {\n return this.currentSnapshot.element;\n }\n get newElement() {\n return this.newSnapshot.element;\n }\n get permanentElementMap() {\n return this.currentSnapshot.getPermanentElementMapForSnapshot(this.newSnapshot);\n }\n}\nfunction elementIsFocusable(element) {\n return element && typeof element.focus == \"function\";\n}\n\nclass FrameRenderer extends Renderer {\n static renderElement(currentElement, newElement) {\n var _a;\n const destinationRange = document.createRange();\n destinationRange.selectNodeContents(currentElement);\n destinationRange.deleteContents();\n const frameElement = newElement;\n const sourceRange = (_a = frameElement.ownerDocument) === null || _a === void 0 ? void 0 : _a.createRange();\n if (sourceRange) {\n sourceRange.selectNodeContents(frameElement);\n currentElement.appendChild(sourceRange.extractContents());\n }\n }\n constructor(delegate, currentSnapshot, newSnapshot, renderElement, isPreview, willRender = true) {\n super(currentSnapshot, newSnapshot, renderElement, isPreview, willRender);\n this.delegate = delegate;\n }\n get shouldRender() {\n return true;\n }\n async render() {\n await nextAnimationFrame();\n this.preservingPermanentElements(() => {\n this.loadFrameElement();\n });\n this.scrollFrameIntoView();\n await nextAnimationFrame();\n this.focusFirstAutofocusableElement();\n await nextAnimationFrame();\n this.activateScriptElements();\n }\n loadFrameElement() {\n this.delegate.willRenderFrame(this.currentElement, this.newElement);\n this.renderElement(this.currentElement, this.newElement);\n }\n scrollFrameIntoView() {\n if (this.currentElement.autoscroll || this.newElement.autoscroll) {\n const element = this.currentElement.firstElementChild;\n const block = readScrollLogicalPosition(this.currentElement.getAttribute(\"data-autoscroll-block\"), \"end\");\n const behavior = readScrollBehavior(this.currentElement.getAttribute(\"data-autoscroll-behavior\"), \"auto\");\n if (element) {\n element.scrollIntoView({ block, behavior });\n return true;\n }\n }\n return false;\n }\n activateScriptElements() {\n for (const inertScriptElement of this.newScriptElements) {\n const activatedScriptElement = activateScriptElement(inertScriptElement);\n inertScriptElement.replaceWith(activatedScriptElement);\n }\n }\n get newScriptElements() {\n return this.currentElement.querySelectorAll(\"script\");\n }\n}\nfunction readScrollLogicalPosition(value, defaultValue) {\n if (value == \"end\" || value == \"start\" || value == \"center\" || value == \"nearest\") {\n return value;\n }\n else {\n return defaultValue;\n }\n}\nfunction readScrollBehavior(value, defaultValue) {\n if (value == \"auto\" || value == \"smooth\") {\n return value;\n }\n else {\n return defaultValue;\n }\n}\n\nclass ProgressBar {\n static get defaultCSS() {\n return unindent `\n .turbo-progress-bar {\n position: fixed;\n display: block;\n top: 0;\n left: 0;\n height: 3px;\n background: #0076ff;\n z-index: 2147483647;\n transition:\n width ${ProgressBar.animationDuration}ms ease-out,\n opacity ${ProgressBar.animationDuration / 2}ms ${ProgressBar.animationDuration / 2}ms ease-in;\n transform: translate3d(0, 0, 0);\n }\n `;\n }\n constructor() {\n this.hiding = false;\n this.value = 0;\n this.visible = false;\n this.trickle = () => {\n this.setValue(this.value + Math.random() / 100);\n };\n this.stylesheetElement = this.createStylesheetElement();\n this.progressElement = this.createProgressElement();\n this.installStylesheetElement();\n this.setValue(0);\n }\n show() {\n if (!this.visible) {\n this.visible = true;\n this.installProgressElement();\n this.startTrickling();\n }\n }\n hide() {\n if (this.visible && !this.hiding) {\n this.hiding = true;\n this.fadeProgressElement(() => {\n this.uninstallProgressElement();\n this.stopTrickling();\n this.visible = false;\n this.hiding = false;\n });\n }\n }\n setValue(value) {\n this.value = value;\n this.refresh();\n }\n installStylesheetElement() {\n document.head.insertBefore(this.stylesheetElement, document.head.firstChild);\n }\n installProgressElement() {\n this.progressElement.style.width = \"0\";\n this.progressElement.style.opacity = \"1\";\n document.documentElement.insertBefore(this.progressElement, document.body);\n this.refresh();\n }\n fadeProgressElement(callback) {\n this.progressElement.style.opacity = \"0\";\n setTimeout(callback, ProgressBar.animationDuration * 1.5);\n }\n uninstallProgressElement() {\n if (this.progressElement.parentNode) {\n document.documentElement.removeChild(this.progressElement);\n }\n }\n startTrickling() {\n if (!this.trickleInterval) {\n this.trickleInterval = window.setInterval(this.trickle, ProgressBar.animationDuration);\n }\n }\n stopTrickling() {\n window.clearInterval(this.trickleInterval);\n delete this.trickleInterval;\n }\n refresh() {\n requestAnimationFrame(() => {\n this.progressElement.style.width = `${10 + this.value * 90}%`;\n });\n }\n createStylesheetElement() {\n const element = document.createElement(\"style\");\n element.type = \"text/css\";\n element.textContent = ProgressBar.defaultCSS;\n if (this.cspNonce) {\n element.nonce = this.cspNonce;\n }\n return element;\n }\n createProgressElement() {\n const element = document.createElement(\"div\");\n element.className = \"turbo-progress-bar\";\n return element;\n }\n get cspNonce() {\n return getMetaContent(\"csp-nonce\");\n }\n}\nProgressBar.animationDuration = 300;\n\nclass HeadSnapshot extends Snapshot {\n constructor() {\n super(...arguments);\n this.detailsByOuterHTML = this.children\n .filter((element) => !elementIsNoscript(element))\n .map((element) => elementWithoutNonce(element))\n .reduce((result, element) => {\n const { outerHTML } = element;\n const details = outerHTML in result\n ? result[outerHTML]\n : {\n type: elementType(element),\n tracked: elementIsTracked(element),\n elements: [],\n };\n return Object.assign(Object.assign({}, result), { [outerHTML]: Object.assign(Object.assign({}, details), { elements: [...details.elements, element] }) });\n }, {});\n }\n get trackedElementSignature() {\n return Object.keys(this.detailsByOuterHTML)\n .filter((outerHTML) => this.detailsByOuterHTML[outerHTML].tracked)\n .join(\"\");\n }\n getScriptElementsNotInSnapshot(snapshot) {\n return this.getElementsMatchingTypeNotInSnapshot(\"script\", snapshot);\n }\n getStylesheetElementsNotInSnapshot(snapshot) {\n return this.getElementsMatchingTypeNotInSnapshot(\"stylesheet\", snapshot);\n }\n getElementsMatchingTypeNotInSnapshot(matchedType, snapshot) {\n return Object.keys(this.detailsByOuterHTML)\n .filter((outerHTML) => !(outerHTML in snapshot.detailsByOuterHTML))\n .map((outerHTML) => this.detailsByOuterHTML[outerHTML])\n .filter(({ type }) => type == matchedType)\n .map(({ elements: [element] }) => element);\n }\n get provisionalElements() {\n return Object.keys(this.detailsByOuterHTML).reduce((result, outerHTML) => {\n const { type, tracked, elements } = this.detailsByOuterHTML[outerHTML];\n if (type == null && !tracked) {\n return [...result, ...elements];\n }\n else if (elements.length > 1) {\n return [...result, ...elements.slice(1)];\n }\n else {\n return result;\n }\n }, []);\n }\n getMetaValue(name) {\n const element = this.findMetaElementByName(name);\n return element ? element.getAttribute(\"content\") : null;\n }\n findMetaElementByName(name) {\n return Object.keys(this.detailsByOuterHTML).reduce((result, outerHTML) => {\n const { elements: [element], } = this.detailsByOuterHTML[outerHTML];\n return elementIsMetaElementWithName(element, name) ? element : result;\n }, undefined);\n }\n}\nfunction elementType(element) {\n if (elementIsScript(element)) {\n return \"script\";\n }\n else if (elementIsStylesheet(element)) {\n return \"stylesheet\";\n }\n}\nfunction elementIsTracked(element) {\n return element.getAttribute(\"data-turbo-track\") == \"reload\";\n}\nfunction elementIsScript(element) {\n const tagName = element.localName;\n return tagName == \"script\";\n}\nfunction elementIsNoscript(element) {\n const tagName = element.localName;\n return tagName == \"noscript\";\n}\nfunction elementIsStylesheet(element) {\n const tagName = element.localName;\n return tagName == \"style\" || (tagName == \"link\" && element.getAttribute(\"rel\") == \"stylesheet\");\n}\nfunction elementIsMetaElementWithName(element, name) {\n const tagName = element.localName;\n return tagName == \"meta\" && element.getAttribute(\"name\") == name;\n}\nfunction elementWithoutNonce(element) {\n if (element.hasAttribute(\"nonce\")) {\n element.setAttribute(\"nonce\", \"\");\n }\n return element;\n}\n\nclass PageSnapshot extends Snapshot {\n static fromHTMLString(html = \"\") {\n return this.fromDocument(parseHTMLDocument(html));\n }\n static fromElement(element) {\n return this.fromDocument(element.ownerDocument);\n }\n static fromDocument({ head, body }) {\n return new this(body, new HeadSnapshot(head));\n }\n constructor(element, headSnapshot) {\n super(element);\n this.headSnapshot = headSnapshot;\n }\n clone() {\n const clonedElement = this.element.cloneNode(true);\n const selectElements = this.element.querySelectorAll(\"select\");\n const clonedSelectElements = clonedElement.querySelectorAll(\"select\");\n for (const [index, source] of selectElements.entries()) {\n const clone = clonedSelectElements[index];\n for (const option of clone.selectedOptions)\n option.selected = false;\n for (const option of source.selectedOptions)\n clone.options[option.index].selected = true;\n }\n for (const clonedPasswordInput of clonedElement.querySelectorAll('input[type=\"password\"]')) {\n clonedPasswordInput.value = \"\";\n }\n return new PageSnapshot(clonedElement, this.headSnapshot);\n }\n get headElement() {\n return this.headSnapshot.element;\n }\n get rootLocation() {\n var _a;\n const root = (_a = this.getSetting(\"root\")) !== null && _a !== void 0 ? _a : \"/\";\n return expandURL(root);\n }\n get cacheControlValue() {\n return this.getSetting(\"cache-control\");\n }\n get isPreviewable() {\n return this.cacheControlValue != \"no-preview\";\n }\n get isCacheable() {\n return this.cacheControlValue != \"no-cache\";\n }\n get isVisitable() {\n return this.getSetting(\"visit-control\") != \"reload\";\n }\n getSetting(name) {\n return this.headSnapshot.getMetaValue(`turbo-${name}`);\n }\n}\n\nvar TimingMetric;\n(function (TimingMetric) {\n TimingMetric[\"visitStart\"] = \"visitStart\";\n TimingMetric[\"requestStart\"] = \"requestStart\";\n TimingMetric[\"requestEnd\"] = \"requestEnd\";\n TimingMetric[\"visitEnd\"] = \"visitEnd\";\n})(TimingMetric || (TimingMetric = {}));\nvar VisitState;\n(function (VisitState) {\n VisitState[\"initialized\"] = \"initialized\";\n VisitState[\"started\"] = \"started\";\n VisitState[\"canceled\"] = \"canceled\";\n VisitState[\"failed\"] = \"failed\";\n VisitState[\"completed\"] = \"completed\";\n})(VisitState || (VisitState = {}));\nconst defaultOptions = {\n action: \"advance\",\n historyChanged: false,\n visitCachedSnapshot: () => { },\n willRender: true,\n updateHistory: true,\n shouldCacheSnapshot: true,\n acceptsStreamResponse: false,\n};\nvar SystemStatusCode;\n(function (SystemStatusCode) {\n SystemStatusCode[SystemStatusCode[\"networkFailure\"] = 0] = \"networkFailure\";\n SystemStatusCode[SystemStatusCode[\"timeoutFailure\"] = -1] = \"timeoutFailure\";\n SystemStatusCode[SystemStatusCode[\"contentTypeMismatch\"] = -2] = \"contentTypeMismatch\";\n})(SystemStatusCode || (SystemStatusCode = {}));\nclass Visit {\n constructor(delegate, location, restorationIdentifier, options = {}) {\n this.identifier = uuid();\n this.timingMetrics = {};\n this.followedRedirect = false;\n this.historyChanged = false;\n this.scrolled = false;\n this.shouldCacheSnapshot = true;\n this.acceptsStreamResponse = false;\n this.snapshotCached = false;\n this.state = VisitState.initialized;\n this.delegate = delegate;\n this.location = location;\n this.restorationIdentifier = restorationIdentifier || uuid();\n const { action, historyChanged, referrer, snapshot, snapshotHTML, response, visitCachedSnapshot, willRender, updateHistory, shouldCacheSnapshot, acceptsStreamResponse, } = Object.assign(Object.assign({}, defaultOptions), options);\n this.action = action;\n this.historyChanged = historyChanged;\n this.referrer = referrer;\n this.snapshot = snapshot;\n this.snapshotHTML = snapshotHTML;\n this.response = response;\n this.isSamePage = this.delegate.locationWithActionIsSamePage(this.location, this.action);\n this.visitCachedSnapshot = visitCachedSnapshot;\n this.willRender = willRender;\n this.updateHistory = updateHistory;\n this.scrolled = !willRender;\n this.shouldCacheSnapshot = shouldCacheSnapshot;\n this.acceptsStreamResponse = acceptsStreamResponse;\n }\n get adapter() {\n return this.delegate.adapter;\n }\n get view() {\n return this.delegate.view;\n }\n get history() {\n return this.delegate.history;\n }\n get restorationData() {\n return this.history.getRestorationDataForIdentifier(this.restorationIdentifier);\n }\n get silent() {\n return this.isSamePage;\n }\n start() {\n if (this.state == VisitState.initialized) {\n this.recordTimingMetric(TimingMetric.visitStart);\n this.state = VisitState.started;\n this.adapter.visitStarted(this);\n this.delegate.visitStarted(this);\n }\n }\n cancel() {\n if (this.state == VisitState.started) {\n if (this.request) {\n this.request.cancel();\n }\n this.cancelRender();\n this.state = VisitState.canceled;\n }\n }\n complete() {\n if (this.state == VisitState.started) {\n this.recordTimingMetric(TimingMetric.visitEnd);\n this.state = VisitState.completed;\n this.followRedirect();\n if (!this.followedRedirect) {\n this.adapter.visitCompleted(this);\n this.delegate.visitCompleted(this);\n }\n }\n }\n fail() {\n if (this.state == VisitState.started) {\n this.state = VisitState.failed;\n this.adapter.visitFailed(this);\n }\n }\n changeHistory() {\n var _a;\n if (!this.historyChanged && this.updateHistory) {\n const actionForHistory = this.location.href === ((_a = this.referrer) === null || _a === void 0 ? void 0 : _a.href) ? \"replace\" : this.action;\n const method = getHistoryMethodForAction(actionForHistory);\n this.history.update(method, this.location, this.restorationIdentifier);\n this.historyChanged = true;\n }\n }\n issueRequest() {\n if (this.hasPreloadedResponse()) {\n this.simulateRequest();\n }\n else if (this.shouldIssueRequest() && !this.request) {\n this.request = new FetchRequest(this, FetchMethod.get, this.location);\n this.request.perform();\n }\n }\n simulateRequest() {\n if (this.response) {\n this.startRequest();\n this.recordResponse();\n this.finishRequest();\n }\n }\n startRequest() {\n this.recordTimingMetric(TimingMetric.requestStart);\n this.adapter.visitRequestStarted(this);\n }\n recordResponse(response = this.response) {\n this.response = response;\n if (response) {\n const { statusCode } = response;\n if (isSuccessful(statusCode)) {\n this.adapter.visitRequestCompleted(this);\n }\n else {\n this.adapter.visitRequestFailedWithStatusCode(this, statusCode);\n }\n }\n }\n finishRequest() {\n this.recordTimingMetric(TimingMetric.requestEnd);\n this.adapter.visitRequestFinished(this);\n }\n loadResponse() {\n if (this.response) {\n const { statusCode, responseHTML } = this.response;\n this.render(async () => {\n if (this.shouldCacheSnapshot)\n this.cacheSnapshot();\n if (this.view.renderPromise)\n await this.view.renderPromise;\n if (isSuccessful(statusCode) && responseHTML != null) {\n await this.view.renderPage(PageSnapshot.fromHTMLString(responseHTML), false, this.willRender, this);\n this.performScroll();\n this.adapter.visitRendered(this);\n this.complete();\n }\n else {\n await this.view.renderError(PageSnapshot.fromHTMLString(responseHTML), this);\n this.adapter.visitRendered(this);\n this.fail();\n }\n });\n }\n }\n getCachedSnapshot() {\n const snapshot = this.view.getCachedSnapshotForLocation(this.location) || this.getPreloadedSnapshot();\n if (snapshot && (!getAnchor(this.location) || snapshot.hasAnchor(getAnchor(this.location)))) {\n if (this.action == \"restore\" || snapshot.isPreviewable) {\n return snapshot;\n }\n }\n }\n getPreloadedSnapshot() {\n if (this.snapshotHTML) {\n return PageSnapshot.fromHTMLString(this.snapshotHTML);\n }\n }\n hasCachedSnapshot() {\n return this.getCachedSnapshot() != null;\n }\n loadCachedSnapshot() {\n const snapshot = this.getCachedSnapshot();\n if (snapshot) {\n const isPreview = this.shouldIssueRequest();\n this.render(async () => {\n this.cacheSnapshot();\n if (this.isSamePage) {\n this.adapter.visitRendered(this);\n }\n else {\n if (this.view.renderPromise)\n await this.view.renderPromise;\n await this.view.renderPage(snapshot, isPreview, this.willRender, this);\n this.performScroll();\n this.adapter.visitRendered(this);\n if (!isPreview) {\n this.complete();\n }\n }\n });\n }\n }\n followRedirect() {\n var _a;\n if (this.redirectedToLocation && !this.followedRedirect && ((_a = this.response) === null || _a === void 0 ? void 0 : _a.redirected)) {\n this.adapter.visitProposedToLocation(this.redirectedToLocation, {\n action: \"replace\",\n response: this.response,\n shouldCacheSnapshot: false,\n willRender: false,\n });\n this.followedRedirect = true;\n }\n }\n goToSamePageAnchor() {\n if (this.isSamePage) {\n this.render(async () => {\n this.cacheSnapshot();\n this.performScroll();\n this.changeHistory();\n this.adapter.visitRendered(this);\n });\n }\n }\n prepareRequest(request) {\n if (this.acceptsStreamResponse) {\n request.acceptResponseType(StreamMessage.contentType);\n }\n }\n requestStarted() {\n this.startRequest();\n }\n requestPreventedHandlingResponse(_request, _response) { }\n async requestSucceededWithResponse(request, response) {\n const responseHTML = await response.responseHTML;\n const { redirected, statusCode } = response;\n if (responseHTML == undefined) {\n this.recordResponse({\n statusCode: SystemStatusCode.contentTypeMismatch,\n redirected,\n });\n }\n else {\n this.redirectedToLocation = response.redirected ? response.location : undefined;\n this.recordResponse({ statusCode: statusCode, responseHTML, redirected });\n }\n }\n async requestFailedWithResponse(request, response) {\n const responseHTML = await response.responseHTML;\n const { redirected, statusCode } = response;\n if (responseHTML == undefined) {\n this.recordResponse({\n statusCode: SystemStatusCode.contentTypeMismatch,\n redirected,\n });\n }\n else {\n this.recordResponse({ statusCode: statusCode, responseHTML, redirected });\n }\n }\n requestErrored(_request, _error) {\n this.recordResponse({\n statusCode: SystemStatusCode.networkFailure,\n redirected: false,\n });\n }\n requestFinished() {\n this.finishRequest();\n }\n performScroll() {\n if (!this.scrolled && !this.view.forceReloaded) {\n if (this.action == \"restore\") {\n this.scrollToRestoredPosition() || this.scrollToAnchor() || this.view.scrollToTop();\n }\n else {\n this.scrollToAnchor() || this.view.scrollToTop();\n }\n if (this.isSamePage) {\n this.delegate.visitScrolledToSamePageLocation(this.view.lastRenderedLocation, this.location);\n }\n this.scrolled = true;\n }\n }\n scrollToRestoredPosition() {\n const { scrollPosition } = this.restorationData;\n if (scrollPosition) {\n this.view.scrollToPosition(scrollPosition);\n return true;\n }\n }\n scrollToAnchor() {\n const anchor = getAnchor(this.location);\n if (anchor != null) {\n this.view.scrollToAnchor(anchor);\n return true;\n }\n }\n recordTimingMetric(metric) {\n this.timingMetrics[metric] = new Date().getTime();\n }\n getTimingMetrics() {\n return Object.assign({}, this.timingMetrics);\n }\n getHistoryMethodForAction(action) {\n switch (action) {\n case \"replace\":\n return history.replaceState;\n case \"advance\":\n case \"restore\":\n return history.pushState;\n }\n }\n hasPreloadedResponse() {\n return typeof this.response == \"object\";\n }\n shouldIssueRequest() {\n if (this.isSamePage) {\n return false;\n }\n else if (this.action == \"restore\") {\n return !this.hasCachedSnapshot();\n }\n else {\n return this.willRender;\n }\n }\n cacheSnapshot() {\n if (!this.snapshotCached) {\n this.view.cacheSnapshot(this.snapshot).then((snapshot) => snapshot && this.visitCachedSnapshot(snapshot));\n this.snapshotCached = true;\n }\n }\n async render(callback) {\n this.cancelRender();\n await new Promise((resolve) => {\n this.frame = requestAnimationFrame(() => resolve());\n });\n await callback();\n delete this.frame;\n }\n cancelRender() {\n if (this.frame) {\n cancelAnimationFrame(this.frame);\n delete this.frame;\n }\n }\n}\nfunction isSuccessful(statusCode) {\n return statusCode >= 200 && statusCode < 300;\n}\n\nclass BrowserAdapter {\n constructor(session) {\n this.progressBar = new ProgressBar();\n this.showProgressBar = () => {\n this.progressBar.show();\n };\n this.session = session;\n }\n visitProposedToLocation(location, options) {\n this.navigator.startVisit(location, (options === null || options === void 0 ? void 0 : options.restorationIdentifier) || uuid(), options);\n }\n visitStarted(visit) {\n this.location = visit.location;\n visit.loadCachedSnapshot();\n visit.issueRequest();\n visit.goToSamePageAnchor();\n }\n visitRequestStarted(visit) {\n this.progressBar.setValue(0);\n if (visit.hasCachedSnapshot() || visit.action != \"restore\") {\n this.showVisitProgressBarAfterDelay();\n }\n else {\n this.showProgressBar();\n }\n }\n visitRequestCompleted(visit) {\n visit.loadResponse();\n }\n visitRequestFailedWithStatusCode(visit, statusCode) {\n switch (statusCode) {\n case SystemStatusCode.networkFailure:\n case SystemStatusCode.timeoutFailure:\n case SystemStatusCode.contentTypeMismatch:\n return this.reload({\n reason: \"request_failed\",\n context: {\n statusCode,\n },\n });\n default:\n return visit.loadResponse();\n }\n }\n visitRequestFinished(_visit) {\n this.progressBar.setValue(1);\n this.hideVisitProgressBar();\n }\n visitCompleted(_visit) { }\n pageInvalidated(reason) {\n this.reload(reason);\n }\n visitFailed(_visit) { }\n visitRendered(_visit) { }\n formSubmissionStarted(_formSubmission) {\n this.progressBar.setValue(0);\n this.showFormProgressBarAfterDelay();\n }\n formSubmissionFinished(_formSubmission) {\n this.progressBar.setValue(1);\n this.hideFormProgressBar();\n }\n showVisitProgressBarAfterDelay() {\n this.visitProgressBarTimeout = window.setTimeout(this.showProgressBar, this.session.progressBarDelay);\n }\n hideVisitProgressBar() {\n this.progressBar.hide();\n if (this.visitProgressBarTimeout != null) {\n window.clearTimeout(this.visitProgressBarTimeout);\n delete this.visitProgressBarTimeout;\n }\n }\n showFormProgressBarAfterDelay() {\n if (this.formProgressBarTimeout == null) {\n this.formProgressBarTimeout = window.setTimeout(this.showProgressBar, this.session.progressBarDelay);\n }\n }\n hideFormProgressBar() {\n this.progressBar.hide();\n if (this.formProgressBarTimeout != null) {\n window.clearTimeout(this.formProgressBarTimeout);\n delete this.formProgressBarTimeout;\n }\n }\n reload(reason) {\n var _a;\n dispatch(\"turbo:reload\", { detail: reason });\n window.location.href = ((_a = this.location) === null || _a === void 0 ? void 0 : _a.toString()) || window.location.href;\n }\n get navigator() {\n return this.session.navigator;\n }\n}\n\nclass CacheObserver {\n constructor() {\n this.selector = \"[data-turbo-temporary]\";\n this.deprecatedSelector = \"[data-turbo-cache=false]\";\n this.started = false;\n this.removeTemporaryElements = ((_event) => {\n for (const element of this.temporaryElements) {\n element.remove();\n }\n });\n }\n start() {\n if (!this.started) {\n this.started = true;\n addEventListener(\"turbo:before-cache\", this.removeTemporaryElements, false);\n }\n }\n stop() {\n if (this.started) {\n this.started = false;\n removeEventListener(\"turbo:before-cache\", this.removeTemporaryElements, false);\n }\n }\n get temporaryElements() {\n return [...document.querySelectorAll(this.selector), ...this.temporaryElementsWithDeprecation];\n }\n get temporaryElementsWithDeprecation() {\n const elements = document.querySelectorAll(this.deprecatedSelector);\n if (elements.length) {\n console.warn(`The ${this.deprecatedSelector} selector is deprecated and will be removed in a future version. Use ${this.selector} instead.`);\n }\n return [...elements];\n }\n}\n\nclass FrameRedirector {\n constructor(session, element) {\n this.session = session;\n this.element = element;\n this.linkInterceptor = new LinkInterceptor(this, element);\n this.formSubmitObserver = new FormSubmitObserver(this, element);\n }\n start() {\n this.linkInterceptor.start();\n this.formSubmitObserver.start();\n }\n stop() {\n this.linkInterceptor.stop();\n this.formSubmitObserver.stop();\n }\n shouldInterceptLinkClick(element, _location, _event) {\n return this.shouldRedirect(element);\n }\n linkClickIntercepted(element, url, event) {\n const frame = this.findFrameElement(element);\n if (frame) {\n frame.delegate.linkClickIntercepted(element, url, event);\n }\n }\n willSubmitForm(element, submitter) {\n return (element.closest(\"turbo-frame\") == null &&\n this.shouldSubmit(element, submitter) &&\n this.shouldRedirect(element, submitter));\n }\n formSubmitted(element, submitter) {\n const frame = this.findFrameElement(element, submitter);\n if (frame) {\n frame.delegate.formSubmitted(element, submitter);\n }\n }\n shouldSubmit(form, submitter) {\n var _a;\n const action = getAction(form, submitter);\n const meta = this.element.ownerDocument.querySelector(`meta[name=\"turbo-root\"]`);\n const rootLocation = expandURL((_a = meta === null || meta === void 0 ? void 0 : meta.content) !== null && _a !== void 0 ? _a : \"/\");\n return this.shouldRedirect(form, submitter) && locationIsVisitable(action, rootLocation);\n }\n shouldRedirect(element, submitter) {\n const isNavigatable = element instanceof HTMLFormElement\n ? this.session.submissionIsNavigatable(element, submitter)\n : this.session.elementIsNavigatable(element);\n if (isNavigatable) {\n const frame = this.findFrameElement(element, submitter);\n return frame ? frame != element.closest(\"turbo-frame\") : false;\n }\n else {\n return false;\n }\n }\n findFrameElement(element, submitter) {\n const id = (submitter === null || submitter === void 0 ? void 0 : submitter.getAttribute(\"data-turbo-frame\")) || element.getAttribute(\"data-turbo-frame\");\n if (id && id != \"_top\") {\n const frame = this.element.querySelector(`#${id}:not([disabled])`);\n if (frame instanceof FrameElement) {\n return frame;\n }\n }\n }\n}\n\nclass History {\n constructor(delegate) {\n this.restorationIdentifier = uuid();\n this.restorationData = {};\n this.started = false;\n this.pageLoaded = false;\n this.onPopState = (event) => {\n if (this.shouldHandlePopState()) {\n const { turbo } = event.state || {};\n if (turbo) {\n this.location = new URL(window.location.href);\n const { restorationIdentifier } = turbo;\n this.restorationIdentifier = restorationIdentifier;\n this.delegate.historyPoppedToLocationWithRestorationIdentifier(this.location, restorationIdentifier);\n }\n }\n };\n this.onPageLoad = async (_event) => {\n await nextMicrotask();\n this.pageLoaded = true;\n };\n this.delegate = delegate;\n }\n start() {\n if (!this.started) {\n addEventListener(\"popstate\", this.onPopState, false);\n addEventListener(\"load\", this.onPageLoad, false);\n this.started = true;\n this.replace(new URL(window.location.href));\n }\n }\n stop() {\n if (this.started) {\n removeEventListener(\"popstate\", this.onPopState, false);\n removeEventListener(\"load\", this.onPageLoad, false);\n this.started = false;\n }\n }\n push(location, restorationIdentifier) {\n this.update(history.pushState, location, restorationIdentifier);\n }\n replace(location, restorationIdentifier) {\n this.update(history.replaceState, location, restorationIdentifier);\n }\n update(method, location, restorationIdentifier = uuid()) {\n const state = { turbo: { restorationIdentifier } };\n method.call(history, state, \"\", location.href);\n this.location = location;\n this.restorationIdentifier = restorationIdentifier;\n }\n getRestorationDataForIdentifier(restorationIdentifier) {\n return this.restorationData[restorationIdentifier] || {};\n }\n updateRestorationData(additionalData) {\n const { restorationIdentifier } = this;\n const restorationData = this.restorationData[restorationIdentifier];\n this.restorationData[restorationIdentifier] = Object.assign(Object.assign({}, restorationData), additionalData);\n }\n assumeControlOfScrollRestoration() {\n var _a;\n if (!this.previousScrollRestoration) {\n this.previousScrollRestoration = (_a = history.scrollRestoration) !== null && _a !== void 0 ? _a : \"auto\";\n history.scrollRestoration = \"manual\";\n }\n }\n relinquishControlOfScrollRestoration() {\n if (this.previousScrollRestoration) {\n history.scrollRestoration = this.previousScrollRestoration;\n delete this.previousScrollRestoration;\n }\n }\n shouldHandlePopState() {\n return this.pageIsLoaded();\n }\n pageIsLoaded() {\n return this.pageLoaded || document.readyState == \"complete\";\n }\n}\n\nclass Navigator {\n constructor(delegate) {\n this.delegate = delegate;\n }\n proposeVisit(location, options = {}) {\n if (this.delegate.allowsVisitingLocationWithAction(location, options.action)) {\n if (locationIsVisitable(location, this.view.snapshot.rootLocation)) {\n this.delegate.visitProposedToLocation(location, options);\n }\n else {\n window.location.href = location.toString();\n }\n }\n }\n startVisit(locatable, restorationIdentifier, options = {}) {\n this.stop();\n this.currentVisit = new Visit(this, expandURL(locatable), restorationIdentifier, Object.assign({ referrer: this.location }, options));\n this.currentVisit.start();\n }\n submitForm(form, submitter) {\n this.stop();\n this.formSubmission = new FormSubmission(this, form, submitter, true);\n this.formSubmission.start();\n }\n stop() {\n if (this.formSubmission) {\n this.formSubmission.stop();\n delete this.formSubmission;\n }\n if (this.currentVisit) {\n this.currentVisit.cancel();\n delete this.currentVisit;\n }\n }\n get adapter() {\n return this.delegate.adapter;\n }\n get view() {\n return this.delegate.view;\n }\n get history() {\n return this.delegate.history;\n }\n formSubmissionStarted(formSubmission) {\n if (typeof this.adapter.formSubmissionStarted === \"function\") {\n this.adapter.formSubmissionStarted(formSubmission);\n }\n }\n async formSubmissionSucceededWithResponse(formSubmission, fetchResponse) {\n if (formSubmission == this.formSubmission) {\n const responseHTML = await fetchResponse.responseHTML;\n if (responseHTML) {\n const shouldCacheSnapshot = formSubmission.isSafe;\n if (!shouldCacheSnapshot) {\n this.view.clearSnapshotCache();\n }\n const { statusCode, redirected } = fetchResponse;\n const action = this.getActionForFormSubmission(formSubmission);\n const visitOptions = {\n action,\n shouldCacheSnapshot,\n response: { statusCode, responseHTML, redirected },\n };\n this.proposeVisit(fetchResponse.location, visitOptions);\n }\n }\n }\n async formSubmissionFailedWithResponse(formSubmission, fetchResponse) {\n const responseHTML = await fetchResponse.responseHTML;\n if (responseHTML) {\n const snapshot = PageSnapshot.fromHTMLString(responseHTML);\n if (fetchResponse.serverError) {\n await this.view.renderError(snapshot, this.currentVisit);\n }\n else {\n await this.view.renderPage(snapshot, false, true, this.currentVisit);\n }\n this.view.scrollToTop();\n this.view.clearSnapshotCache();\n }\n }\n formSubmissionErrored(formSubmission, error) {\n console.error(error);\n }\n formSubmissionFinished(formSubmission) {\n if (typeof this.adapter.formSubmissionFinished === \"function\") {\n this.adapter.formSubmissionFinished(formSubmission);\n }\n }\n visitStarted(visit) {\n this.delegate.visitStarted(visit);\n }\n visitCompleted(visit) {\n this.delegate.visitCompleted(visit);\n }\n locationWithActionIsSamePage(location, action) {\n const anchor = getAnchor(location);\n const currentAnchor = getAnchor(this.view.lastRenderedLocation);\n const isRestorationToTop = action === \"restore\" && typeof anchor === \"undefined\";\n return (action !== \"replace\" &&\n getRequestURL(location) === getRequestURL(this.view.lastRenderedLocation) &&\n (isRestorationToTop || (anchor != null && anchor !== currentAnchor)));\n }\n visitScrolledToSamePageLocation(oldURL, newURL) {\n this.delegate.visitScrolledToSamePageLocation(oldURL, newURL);\n }\n get location() {\n return this.history.location;\n }\n get restorationIdentifier() {\n return this.history.restorationIdentifier;\n }\n getActionForFormSubmission({ submitter, formElement }) {\n return getVisitAction(submitter, formElement) || \"advance\";\n }\n}\n\nvar PageStage;\n(function (PageStage) {\n PageStage[PageStage[\"initial\"] = 0] = \"initial\";\n PageStage[PageStage[\"loading\"] = 1] = \"loading\";\n PageStage[PageStage[\"interactive\"] = 2] = \"interactive\";\n PageStage[PageStage[\"complete\"] = 3] = \"complete\";\n})(PageStage || (PageStage = {}));\nclass PageObserver {\n constructor(delegate) {\n this.stage = PageStage.initial;\n this.started = false;\n this.interpretReadyState = () => {\n const { readyState } = this;\n if (readyState == \"interactive\") {\n this.pageIsInteractive();\n }\n else if (readyState == \"complete\") {\n this.pageIsComplete();\n }\n };\n this.pageWillUnload = () => {\n this.delegate.pageWillUnload();\n };\n this.delegate = delegate;\n }\n start() {\n if (!this.started) {\n if (this.stage == PageStage.initial) {\n this.stage = PageStage.loading;\n }\n document.addEventListener(\"readystatechange\", this.interpretReadyState, false);\n addEventListener(\"pagehide\", this.pageWillUnload, false);\n this.started = true;\n }\n }\n stop() {\n if (this.started) {\n document.removeEventListener(\"readystatechange\", this.interpretReadyState, false);\n removeEventListener(\"pagehide\", this.pageWillUnload, false);\n this.started = false;\n }\n }\n pageIsInteractive() {\n if (this.stage == PageStage.loading) {\n this.stage = PageStage.interactive;\n this.delegate.pageBecameInteractive();\n }\n }\n pageIsComplete() {\n this.pageIsInteractive();\n if (this.stage == PageStage.interactive) {\n this.stage = PageStage.complete;\n this.delegate.pageLoaded();\n }\n }\n get readyState() {\n return document.readyState;\n }\n}\n\nclass ScrollObserver {\n constructor(delegate) {\n this.started = false;\n this.onScroll = () => {\n this.updatePosition({ x: window.pageXOffset, y: window.pageYOffset });\n };\n this.delegate = delegate;\n }\n start() {\n if (!this.started) {\n addEventListener(\"scroll\", this.onScroll, false);\n this.onScroll();\n this.started = true;\n }\n }\n stop() {\n if (this.started) {\n removeEventListener(\"scroll\", this.onScroll, false);\n this.started = false;\n }\n }\n updatePosition(position) {\n this.delegate.scrollPositionChanged(position);\n }\n}\n\nclass StreamMessageRenderer {\n render({ fragment }) {\n Bardo.preservingPermanentElements(this, getPermanentElementMapForFragment(fragment), () => document.documentElement.appendChild(fragment));\n }\n enteringBardo(currentPermanentElement, newPermanentElement) {\n newPermanentElement.replaceWith(currentPermanentElement.cloneNode(true));\n }\n leavingBardo() { }\n}\nfunction getPermanentElementMapForFragment(fragment) {\n const permanentElementsInDocument = queryPermanentElementsAll(document.documentElement);\n const permanentElementMap = {};\n for (const permanentElementInDocument of permanentElementsInDocument) {\n const { id } = permanentElementInDocument;\n for (const streamElement of fragment.querySelectorAll(\"turbo-stream\")) {\n const elementInStream = getPermanentElementById(streamElement.templateElement.content, id);\n if (elementInStream) {\n permanentElementMap[id] = [permanentElementInDocument, elementInStream];\n }\n }\n }\n return permanentElementMap;\n}\n\nclass StreamObserver {\n constructor(delegate) {\n this.sources = new Set();\n this.started = false;\n this.inspectFetchResponse = ((event) => {\n const response = fetchResponseFromEvent(event);\n if (response && fetchResponseIsStream(response)) {\n event.preventDefault();\n this.receiveMessageResponse(response);\n }\n });\n this.receiveMessageEvent = (event) => {\n if (this.started && typeof event.data == \"string\") {\n this.receiveMessageHTML(event.data);\n }\n };\n this.delegate = delegate;\n }\n start() {\n if (!this.started) {\n this.started = true;\n addEventListener(\"turbo:before-fetch-response\", this.inspectFetchResponse, false);\n }\n }\n stop() {\n if (this.started) {\n this.started = false;\n removeEventListener(\"turbo:before-fetch-response\", this.inspectFetchResponse, false);\n }\n }\n connectStreamSource(source) {\n if (!this.streamSourceIsConnected(source)) {\n this.sources.add(source);\n source.addEventListener(\"message\", this.receiveMessageEvent, false);\n }\n }\n disconnectStreamSource(source) {\n if (this.streamSourceIsConnected(source)) {\n this.sources.delete(source);\n source.removeEventListener(\"message\", this.receiveMessageEvent, false);\n }\n }\n streamSourceIsConnected(source) {\n return this.sources.has(source);\n }\n async receiveMessageResponse(response) {\n const html = await response.responseHTML;\n if (html) {\n this.receiveMessageHTML(html);\n }\n }\n receiveMessageHTML(html) {\n this.delegate.receivedMessageFromStream(StreamMessage.wrap(html));\n }\n}\nfunction fetchResponseFromEvent(event) {\n var _a;\n const fetchResponse = (_a = event.detail) === null || _a === void 0 ? void 0 : _a.fetchResponse;\n if (fetchResponse instanceof FetchResponse) {\n return fetchResponse;\n }\n}\nfunction fetchResponseIsStream(response) {\n var _a;\n const contentType = (_a = response.contentType) !== null && _a !== void 0 ? _a : \"\";\n return contentType.startsWith(StreamMessage.contentType);\n}\n\nclass ErrorRenderer extends Renderer {\n static renderElement(currentElement, newElement) {\n const { documentElement, body } = document;\n documentElement.replaceChild(newElement, body);\n }\n async render() {\n this.replaceHeadAndBody();\n this.activateScriptElements();\n }\n replaceHeadAndBody() {\n const { documentElement, head } = document;\n documentElement.replaceChild(this.newHead, head);\n this.renderElement(this.currentElement, this.newElement);\n }\n activateScriptElements() {\n for (const replaceableElement of this.scriptElements) {\n const parentNode = replaceableElement.parentNode;\n if (parentNode) {\n const element = activateScriptElement(replaceableElement);\n parentNode.replaceChild(element, replaceableElement);\n }\n }\n }\n get newHead() {\n return this.newSnapshot.headSnapshot.element;\n }\n get scriptElements() {\n return document.documentElement.querySelectorAll(\"script\");\n }\n}\n\nclass PageRenderer extends Renderer {\n static renderElement(currentElement, newElement) {\n if (document.body && newElement instanceof HTMLBodyElement) {\n document.body.replaceWith(newElement);\n }\n else {\n document.documentElement.appendChild(newElement);\n }\n }\n get shouldRender() {\n return this.newSnapshot.isVisitable && this.trackedElementsAreIdentical;\n }\n get reloadReason() {\n if (!this.newSnapshot.isVisitable) {\n return {\n reason: \"turbo_visit_control_is_reload\",\n };\n }\n if (!this.trackedElementsAreIdentical) {\n return {\n reason: \"tracked_element_mismatch\",\n };\n }\n }\n async prepareToRender() {\n await this.mergeHead();\n }\n async render() {\n if (this.willRender) {\n await this.replaceBody();\n }\n }\n finishRendering() {\n super.finishRendering();\n if (!this.isPreview) {\n this.focusFirstAutofocusableElement();\n }\n }\n get currentHeadSnapshot() {\n return this.currentSnapshot.headSnapshot;\n }\n get newHeadSnapshot() {\n return this.newSnapshot.headSnapshot;\n }\n get newElement() {\n return this.newSnapshot.element;\n }\n async mergeHead() {\n const mergedHeadElements = this.mergeProvisionalElements();\n const newStylesheetElements = this.copyNewHeadStylesheetElements();\n this.copyNewHeadScriptElements();\n await mergedHeadElements;\n await newStylesheetElements;\n }\n async replaceBody() {\n await this.preservingPermanentElements(async () => {\n this.activateNewBody();\n await this.assignNewBody();\n });\n }\n get trackedElementsAreIdentical() {\n return this.currentHeadSnapshot.trackedElementSignature == this.newHeadSnapshot.trackedElementSignature;\n }\n async copyNewHeadStylesheetElements() {\n const loadingElements = [];\n for (const element of this.newHeadStylesheetElements) {\n loadingElements.push(waitForLoad(element));\n document.head.appendChild(element);\n }\n await Promise.all(loadingElements);\n }\n copyNewHeadScriptElements() {\n for (const element of this.newHeadScriptElements) {\n document.head.appendChild(activateScriptElement(element));\n }\n }\n async mergeProvisionalElements() {\n const newHeadElements = [...this.newHeadProvisionalElements];\n for (const element of this.currentHeadProvisionalElements) {\n if (!this.isCurrentElementInElementList(element, newHeadElements)) {\n document.head.removeChild(element);\n }\n }\n for (const element of newHeadElements) {\n document.head.appendChild(element);\n }\n }\n isCurrentElementInElementList(element, elementList) {\n for (const [index, newElement] of elementList.entries()) {\n if (element.tagName == \"TITLE\") {\n if (newElement.tagName != \"TITLE\") {\n continue;\n }\n if (element.innerHTML == newElement.innerHTML) {\n elementList.splice(index, 1);\n return true;\n }\n }\n if (newElement.isEqualNode(element)) {\n elementList.splice(index, 1);\n return true;\n }\n }\n return false;\n }\n removeCurrentHeadProvisionalElements() {\n for (const element of this.currentHeadProvisionalElements) {\n document.head.removeChild(element);\n }\n }\n copyNewHeadProvisionalElements() {\n for (const element of this.newHeadProvisionalElements) {\n document.head.appendChild(element);\n }\n }\n activateNewBody() {\n document.adoptNode(this.newElement);\n this.activateNewBodyScriptElements();\n }\n activateNewBodyScriptElements() {\n for (const inertScriptElement of this.newBodyScriptElements) {\n const activatedScriptElement = activateScriptElement(inertScriptElement);\n inertScriptElement.replaceWith(activatedScriptElement);\n }\n }\n async assignNewBody() {\n await this.renderElement(this.currentElement, this.newElement);\n }\n get newHeadStylesheetElements() {\n return this.newHeadSnapshot.getStylesheetElementsNotInSnapshot(this.currentHeadSnapshot);\n }\n get newHeadScriptElements() {\n return this.newHeadSnapshot.getScriptElementsNotInSnapshot(this.currentHeadSnapshot);\n }\n get currentHeadProvisionalElements() {\n return this.currentHeadSnapshot.provisionalElements;\n }\n get newHeadProvisionalElements() {\n return this.newHeadSnapshot.provisionalElements;\n }\n get newBodyScriptElements() {\n return this.newElement.querySelectorAll(\"script\");\n }\n}\n\nclass SnapshotCache {\n constructor(size) {\n this.keys = [];\n this.snapshots = {};\n this.size = size;\n }\n has(location) {\n return toCacheKey(location) in this.snapshots;\n }\n get(location) {\n if (this.has(location)) {\n const snapshot = this.read(location);\n this.touch(location);\n return snapshot;\n }\n }\n put(location, snapshot) {\n this.write(location, snapshot);\n this.touch(location);\n return snapshot;\n }\n clear() {\n this.snapshots = {};\n }\n read(location) {\n return this.snapshots[toCacheKey(location)];\n }\n write(location, snapshot) {\n this.snapshots[toCacheKey(location)] = snapshot;\n }\n touch(location) {\n const key = toCacheKey(location);\n const index = this.keys.indexOf(key);\n if (index > -1)\n this.keys.splice(index, 1);\n this.keys.unshift(key);\n this.trim();\n }\n trim() {\n for (const key of this.keys.splice(this.size)) {\n delete this.snapshots[key];\n }\n }\n}\n\nclass PageView extends View {\n constructor() {\n super(...arguments);\n this.snapshotCache = new SnapshotCache(10);\n this.lastRenderedLocation = new URL(location.href);\n this.forceReloaded = false;\n }\n renderPage(snapshot, isPreview = false, willRender = true, visit) {\n const renderer = new PageRenderer(this.snapshot, snapshot, PageRenderer.renderElement, isPreview, willRender);\n if (!renderer.shouldRender) {\n this.forceReloaded = true;\n }\n else {\n visit === null || visit === void 0 ? void 0 : visit.changeHistory();\n }\n return this.render(renderer);\n }\n renderError(snapshot, visit) {\n visit === null || visit === void 0 ? void 0 : visit.changeHistory();\n const renderer = new ErrorRenderer(this.snapshot, snapshot, ErrorRenderer.renderElement, false);\n return this.render(renderer);\n }\n clearSnapshotCache() {\n this.snapshotCache.clear();\n }\n async cacheSnapshot(snapshot = this.snapshot) {\n if (snapshot.isCacheable) {\n this.delegate.viewWillCacheSnapshot();\n const { lastRenderedLocation: location } = this;\n await nextEventLoopTick();\n const cachedSnapshot = snapshot.clone();\n this.snapshotCache.put(location, cachedSnapshot);\n return cachedSnapshot;\n }\n }\n getCachedSnapshotForLocation(location) {\n return this.snapshotCache.get(location);\n }\n get snapshot() {\n return PageSnapshot.fromElement(this.element);\n }\n}\n\nclass Preloader {\n constructor(delegate) {\n this.selector = \"a[data-turbo-preload]\";\n this.delegate = delegate;\n }\n get snapshotCache() {\n return this.delegate.navigator.view.snapshotCache;\n }\n start() {\n if (document.readyState === \"loading\") {\n return document.addEventListener(\"DOMContentLoaded\", () => {\n this.preloadOnLoadLinksForView(document.body);\n });\n }\n else {\n this.preloadOnLoadLinksForView(document.body);\n }\n }\n preloadOnLoadLinksForView(element) {\n for (const link of element.querySelectorAll(this.selector)) {\n this.preloadURL(link);\n }\n }\n async preloadURL(link) {\n const location = new URL(link.href);\n if (this.snapshotCache.has(location)) {\n return;\n }\n try {\n const response = await fetch(location.toString(), { headers: { \"VND.PREFETCH\": \"true\", Accept: \"text/html\" } });\n const responseText = await response.text();\n const snapshot = PageSnapshot.fromHTMLString(responseText);\n this.snapshotCache.put(location, snapshot);\n }\n catch (_) {\n }\n }\n}\n\nclass Session {\n constructor() {\n this.navigator = new Navigator(this);\n this.history = new History(this);\n this.preloader = new Preloader(this);\n this.view = new PageView(this, document.documentElement);\n this.adapter = new BrowserAdapter(this);\n this.pageObserver = new PageObserver(this);\n this.cacheObserver = new CacheObserver();\n this.linkClickObserver = new LinkClickObserver(this, window);\n this.formSubmitObserver = new FormSubmitObserver(this, document);\n this.scrollObserver = new ScrollObserver(this);\n this.streamObserver = new StreamObserver(this);\n this.formLinkClickObserver = new FormLinkClickObserver(this, document.documentElement);\n this.frameRedirector = new FrameRedirector(this, document.documentElement);\n this.streamMessageRenderer = new StreamMessageRenderer();\n this.drive = true;\n this.enabled = true;\n this.progressBarDelay = 500;\n this.started = false;\n this.formMode = \"on\";\n }\n start() {\n if (!this.started) {\n this.pageObserver.start();\n this.cacheObserver.start();\n this.formLinkClickObserver.start();\n this.linkClickObserver.start();\n this.formSubmitObserver.start();\n this.scrollObserver.start();\n this.streamObserver.start();\n this.frameRedirector.start();\n this.history.start();\n this.preloader.start();\n this.started = true;\n this.enabled = true;\n }\n }\n disable() {\n this.enabled = false;\n }\n stop() {\n if (this.started) {\n this.pageObserver.stop();\n this.cacheObserver.stop();\n this.formLinkClickObserver.stop();\n this.linkClickObserver.stop();\n this.formSubmitObserver.stop();\n this.scrollObserver.stop();\n this.streamObserver.stop();\n this.frameRedirector.stop();\n this.history.stop();\n this.started = false;\n }\n }\n registerAdapter(adapter) {\n this.adapter = adapter;\n }\n visit(location, options = {}) {\n const frameElement = options.frame ? document.getElementById(options.frame) : null;\n if (frameElement instanceof FrameElement) {\n frameElement.src = location.toString();\n frameElement.loaded;\n }\n else {\n this.navigator.proposeVisit(expandURL(location), options);\n }\n }\n connectStreamSource(source) {\n this.streamObserver.connectStreamSource(source);\n }\n disconnectStreamSource(source) {\n this.streamObserver.disconnectStreamSource(source);\n }\n renderStreamMessage(message) {\n this.streamMessageRenderer.render(StreamMessage.wrap(message));\n }\n clearCache() {\n this.view.clearSnapshotCache();\n }\n setProgressBarDelay(delay) {\n this.progressBarDelay = delay;\n }\n setFormMode(mode) {\n this.formMode = mode;\n }\n get location() {\n return this.history.location;\n }\n get restorationIdentifier() {\n return this.history.restorationIdentifier;\n }\n historyPoppedToLocationWithRestorationIdentifier(location, restorationIdentifier) {\n if (this.enabled) {\n this.navigator.startVisit(location, restorationIdentifier, {\n action: \"restore\",\n historyChanged: true,\n });\n }\n else {\n this.adapter.pageInvalidated({\n reason: \"turbo_disabled\",\n });\n }\n }\n scrollPositionChanged(position) {\n this.history.updateRestorationData({ scrollPosition: position });\n }\n willSubmitFormLinkToLocation(link, location) {\n return this.elementIsNavigatable(link) && locationIsVisitable(location, this.snapshot.rootLocation);\n }\n submittedFormLinkToLocation() { }\n willFollowLinkToLocation(link, location, event) {\n return (this.elementIsNavigatable(link) &&\n locationIsVisitable(location, this.snapshot.rootLocation) &&\n this.applicationAllowsFollowingLinkToLocation(link, location, event));\n }\n followedLinkToLocation(link, location) {\n const action = this.getActionForLink(link);\n const acceptsStreamResponse = link.hasAttribute(\"data-turbo-stream\");\n this.visit(location.href, { action, acceptsStreamResponse });\n }\n allowsVisitingLocationWithAction(location, action) {\n return this.locationWithActionIsSamePage(location, action) || this.applicationAllowsVisitingLocation(location);\n }\n visitProposedToLocation(location, options) {\n extendURLWithDeprecatedProperties(location);\n this.adapter.visitProposedToLocation(location, options);\n }\n visitStarted(visit) {\n if (!visit.acceptsStreamResponse) {\n markAsBusy(document.documentElement);\n }\n extendURLWithDeprecatedProperties(visit.location);\n if (!visit.silent) {\n this.notifyApplicationAfterVisitingLocation(visit.location, visit.action);\n }\n }\n visitCompleted(visit) {\n clearBusyState(document.documentElement);\n this.notifyApplicationAfterPageLoad(visit.getTimingMetrics());\n }\n locationWithActionIsSamePage(location, action) {\n return this.navigator.locationWithActionIsSamePage(location, action);\n }\n visitScrolledToSamePageLocation(oldURL, newURL) {\n this.notifyApplicationAfterVisitingSamePageLocation(oldURL, newURL);\n }\n willSubmitForm(form, submitter) {\n const action = getAction(form, submitter);\n return (this.submissionIsNavigatable(form, submitter) &&\n locationIsVisitable(expandURL(action), this.snapshot.rootLocation));\n }\n formSubmitted(form, submitter) {\n this.navigator.submitForm(form, submitter);\n }\n pageBecameInteractive() {\n this.view.lastRenderedLocation = this.location;\n this.notifyApplicationAfterPageLoad();\n }\n pageLoaded() {\n this.history.assumeControlOfScrollRestoration();\n }\n pageWillUnload() {\n this.history.relinquishControlOfScrollRestoration();\n }\n receivedMessageFromStream(message) {\n this.renderStreamMessage(message);\n }\n viewWillCacheSnapshot() {\n var _a;\n if (!((_a = this.navigator.currentVisit) === null || _a === void 0 ? void 0 : _a.silent)) {\n this.notifyApplicationBeforeCachingSnapshot();\n }\n }\n allowsImmediateRender({ element }, options) {\n const event = this.notifyApplicationBeforeRender(element, options);\n const { defaultPrevented, detail: { render }, } = event;\n if (this.view.renderer && render) {\n this.view.renderer.renderElement = render;\n }\n return !defaultPrevented;\n }\n viewRenderedSnapshot(_snapshot, _isPreview) {\n this.view.lastRenderedLocation = this.history.location;\n this.notifyApplicationAfterRender();\n }\n preloadOnLoadLinksForView(element) {\n this.preloader.preloadOnLoadLinksForView(element);\n }\n viewInvalidated(reason) {\n this.adapter.pageInvalidated(reason);\n }\n frameLoaded(frame) {\n this.notifyApplicationAfterFrameLoad(frame);\n }\n frameRendered(fetchResponse, frame) {\n this.notifyApplicationAfterFrameRender(fetchResponse, frame);\n }\n applicationAllowsFollowingLinkToLocation(link, location, ev) {\n const event = this.notifyApplicationAfterClickingLinkToLocation(link, location, ev);\n return !event.defaultPrevented;\n }\n applicationAllowsVisitingLocation(location) {\n const event = this.notifyApplicationBeforeVisitingLocation(location);\n return !event.defaultPrevented;\n }\n notifyApplicationAfterClickingLinkToLocation(link, location, event) {\n return dispatch(\"turbo:click\", {\n target: link,\n detail: { url: location.href, originalEvent: event },\n cancelable: true,\n });\n }\n notifyApplicationBeforeVisitingLocation(location) {\n return dispatch(\"turbo:before-visit\", {\n detail: { url: location.href },\n cancelable: true,\n });\n }\n notifyApplicationAfterVisitingLocation(location, action) {\n return dispatch(\"turbo:visit\", { detail: { url: location.href, action } });\n }\n notifyApplicationBeforeCachingSnapshot() {\n return dispatch(\"turbo:before-cache\");\n }\n notifyApplicationBeforeRender(newBody, options) {\n return dispatch(\"turbo:before-render\", {\n detail: Object.assign({ newBody }, options),\n cancelable: true,\n });\n }\n notifyApplicationAfterRender() {\n return dispatch(\"turbo:render\");\n }\n notifyApplicationAfterPageLoad(timing = {}) {\n return dispatch(\"turbo:load\", {\n detail: { url: this.location.href, timing },\n });\n }\n notifyApplicationAfterVisitingSamePageLocation(oldURL, newURL) {\n dispatchEvent(new HashChangeEvent(\"hashchange\", {\n oldURL: oldURL.toString(),\n newURL: newURL.toString(),\n }));\n }\n notifyApplicationAfterFrameLoad(frame) {\n return dispatch(\"turbo:frame-load\", { target: frame });\n }\n notifyApplicationAfterFrameRender(fetchResponse, frame) {\n return dispatch(\"turbo:frame-render\", {\n detail: { fetchResponse },\n target: frame,\n cancelable: true,\n });\n }\n submissionIsNavigatable(form, submitter) {\n if (this.formMode == \"off\") {\n return false;\n }\n else {\n const submitterIsNavigatable = submitter ? this.elementIsNavigatable(submitter) : true;\n if (this.formMode == \"optin\") {\n return submitterIsNavigatable && form.closest('[data-turbo=\"true\"]') != null;\n }\n else {\n return submitterIsNavigatable && this.elementIsNavigatable(form);\n }\n }\n }\n elementIsNavigatable(element) {\n const container = findClosestRecursively(element, \"[data-turbo]\");\n const withinFrame = findClosestRecursively(element, \"turbo-frame\");\n if (this.drive || withinFrame) {\n if (container) {\n return container.getAttribute(\"data-turbo\") != \"false\";\n }\n else {\n return true;\n }\n }\n else {\n if (container) {\n return container.getAttribute(\"data-turbo\") == \"true\";\n }\n else {\n return false;\n }\n }\n }\n getActionForLink(link) {\n return getVisitAction(link) || \"advance\";\n }\n get snapshot() {\n return this.view.snapshot;\n }\n}\nfunction extendURLWithDeprecatedProperties(url) {\n Object.defineProperties(url, deprecatedLocationPropertyDescriptors);\n}\nconst deprecatedLocationPropertyDescriptors = {\n absoluteURL: {\n get() {\n return this.toString();\n },\n },\n};\n\nclass Cache {\n constructor(session) {\n this.session = session;\n }\n clear() {\n this.session.clearCache();\n }\n resetCacheControl() {\n this.setCacheControl(\"\");\n }\n exemptPageFromCache() {\n this.setCacheControl(\"no-cache\");\n }\n exemptPageFromPreview() {\n this.setCacheControl(\"no-preview\");\n }\n setCacheControl(value) {\n setMetaContent(\"turbo-cache-control\", value);\n }\n}\n\nconst StreamActions = {\n after() {\n this.targetElements.forEach((e) => { var _a; return (_a = e.parentElement) === null || _a === void 0 ? void 0 : _a.insertBefore(this.templateContent, e.nextSibling); });\n },\n append() {\n this.removeDuplicateTargetChildren();\n this.targetElements.forEach((e) => e.append(this.templateContent));\n },\n before() {\n this.targetElements.forEach((e) => { var _a; return (_a = e.parentElement) === null || _a === void 0 ? void 0 : _a.insertBefore(this.templateContent, e); });\n },\n prepend() {\n this.removeDuplicateTargetChildren();\n this.targetElements.forEach((e) => e.prepend(this.templateContent));\n },\n remove() {\n this.targetElements.forEach((e) => e.remove());\n },\n replace() {\n this.targetElements.forEach((e) => e.replaceWith(this.templateContent));\n },\n update() {\n this.targetElements.forEach((targetElement) => {\n targetElement.innerHTML = \"\";\n targetElement.append(this.templateContent);\n });\n },\n};\n\nconst session = new Session();\nconst cache = new Cache(session);\nconst { navigator: navigator$1 } = session;\nfunction start() {\n session.start();\n}\nfunction registerAdapter(adapter) {\n session.registerAdapter(adapter);\n}\nfunction visit(location, options) {\n session.visit(location, options);\n}\nfunction connectStreamSource(source) {\n session.connectStreamSource(source);\n}\nfunction disconnectStreamSource(source) {\n session.disconnectStreamSource(source);\n}\nfunction renderStreamMessage(message) {\n session.renderStreamMessage(message);\n}\nfunction clearCache() {\n console.warn(\"Please replace `Turbo.clearCache()` with `Turbo.cache.clear()`. The top-level function is deprecated and will be removed in a future version of Turbo.`\");\n session.clearCache();\n}\nfunction setProgressBarDelay(delay) {\n session.setProgressBarDelay(delay);\n}\nfunction setConfirmMethod(confirmMethod) {\n FormSubmission.confirmMethod = confirmMethod;\n}\nfunction setFormMode(mode) {\n session.setFormMode(mode);\n}\n\nvar Turbo = /*#__PURE__*/Object.freeze({\n __proto__: null,\n navigator: navigator$1,\n session: session,\n cache: cache,\n PageRenderer: PageRenderer,\n PageSnapshot: PageSnapshot,\n FrameRenderer: FrameRenderer,\n start: start,\n registerAdapter: registerAdapter,\n visit: visit,\n connectStreamSource: connectStreamSource,\n disconnectStreamSource: disconnectStreamSource,\n renderStreamMessage: renderStreamMessage,\n clearCache: clearCache,\n setProgressBarDelay: setProgressBarDelay,\n setConfirmMethod: setConfirmMethod,\n setFormMode: setFormMode,\n StreamActions: StreamActions\n});\n\nclass TurboFrameMissingError extends Error {\n}\n\nclass FrameController {\n constructor(element) {\n this.fetchResponseLoaded = (_fetchResponse) => { };\n this.currentFetchRequest = null;\n this.resolveVisitPromise = () => { };\n this.connected = false;\n this.hasBeenLoaded = false;\n this.ignoredAttributes = new Set();\n this.action = null;\n this.visitCachedSnapshot = ({ element }) => {\n const frame = element.querySelector(\"#\" + this.element.id);\n if (frame && this.previousFrameElement) {\n frame.replaceChildren(...this.previousFrameElement.children);\n }\n delete this.previousFrameElement;\n };\n this.element = element;\n this.view = new FrameView(this, this.element);\n this.appearanceObserver = new AppearanceObserver(this, this.element);\n this.formLinkClickObserver = new FormLinkClickObserver(this, this.element);\n this.linkInterceptor = new LinkInterceptor(this, this.element);\n this.restorationIdentifier = uuid();\n this.formSubmitObserver = new FormSubmitObserver(this, this.element);\n }\n connect() {\n if (!this.connected) {\n this.connected = true;\n if (this.loadingStyle == FrameLoadingStyle.lazy) {\n this.appearanceObserver.start();\n }\n else {\n this.loadSourceURL();\n }\n this.formLinkClickObserver.start();\n this.linkInterceptor.start();\n this.formSubmitObserver.start();\n }\n }\n disconnect() {\n if (this.connected) {\n this.connected = false;\n this.appearanceObserver.stop();\n this.formLinkClickObserver.stop();\n this.linkInterceptor.stop();\n this.formSubmitObserver.stop();\n }\n }\n disabledChanged() {\n if (this.loadingStyle == FrameLoadingStyle.eager) {\n this.loadSourceURL();\n }\n }\n sourceURLChanged() {\n if (this.isIgnoringChangesTo(\"src\"))\n return;\n if (this.element.isConnected) {\n this.complete = false;\n }\n if (this.loadingStyle == FrameLoadingStyle.eager || this.hasBeenLoaded) {\n this.loadSourceURL();\n }\n }\n sourceURLReloaded() {\n const { src } = this.element;\n this.ignoringChangesToAttribute(\"complete\", () => {\n this.element.removeAttribute(\"complete\");\n });\n this.element.src = null;\n this.element.src = src;\n return this.element.loaded;\n }\n completeChanged() {\n if (this.isIgnoringChangesTo(\"complete\"))\n return;\n this.loadSourceURL();\n }\n loadingStyleChanged() {\n if (this.loadingStyle == FrameLoadingStyle.lazy) {\n this.appearanceObserver.start();\n }\n else {\n this.appearanceObserver.stop();\n this.loadSourceURL();\n }\n }\n async loadSourceURL() {\n if (this.enabled && this.isActive && !this.complete && this.sourceURL) {\n this.element.loaded = this.visit(expandURL(this.sourceURL));\n this.appearanceObserver.stop();\n await this.element.loaded;\n this.hasBeenLoaded = true;\n }\n }\n async loadResponse(fetchResponse) {\n if (fetchResponse.redirected || (fetchResponse.succeeded && fetchResponse.isHTML)) {\n this.sourceURL = fetchResponse.response.url;\n }\n try {\n const html = await fetchResponse.responseHTML;\n if (html) {\n const document = parseHTMLDocument(html);\n const pageSnapshot = PageSnapshot.fromDocument(document);\n if (pageSnapshot.isVisitable) {\n await this.loadFrameResponse(fetchResponse, document);\n }\n else {\n await this.handleUnvisitableFrameResponse(fetchResponse);\n }\n }\n }\n finally {\n this.fetchResponseLoaded = () => { };\n }\n }\n elementAppearedInViewport(element) {\n this.proposeVisitIfNavigatedWithAction(element, element);\n this.loadSourceURL();\n }\n willSubmitFormLinkToLocation(link) {\n return this.shouldInterceptNavigation(link);\n }\n submittedFormLinkToLocation(link, _location, form) {\n const frame = this.findFrameElement(link);\n if (frame)\n form.setAttribute(\"data-turbo-frame\", frame.id);\n }\n shouldInterceptLinkClick(element, _location, _event) {\n return this.shouldInterceptNavigation(element);\n }\n linkClickIntercepted(element, location) {\n this.navigateFrame(element, location);\n }\n willSubmitForm(element, submitter) {\n return element.closest(\"turbo-frame\") == this.element && this.shouldInterceptNavigation(element, submitter);\n }\n formSubmitted(element, submitter) {\n if (this.formSubmission) {\n this.formSubmission.stop();\n }\n this.formSubmission = new FormSubmission(this, element, submitter);\n const { fetchRequest } = this.formSubmission;\n this.prepareRequest(fetchRequest);\n this.formSubmission.start();\n }\n prepareRequest(request) {\n var _a;\n request.headers[\"Turbo-Frame\"] = this.id;\n if ((_a = this.currentNavigationElement) === null || _a === void 0 ? void 0 : _a.hasAttribute(\"data-turbo-stream\")) {\n request.acceptResponseType(StreamMessage.contentType);\n }\n }\n requestStarted(_request) {\n markAsBusy(this.element);\n }\n requestPreventedHandlingResponse(_request, _response) {\n this.resolveVisitPromise();\n }\n async requestSucceededWithResponse(request, response) {\n await this.loadResponse(response);\n this.resolveVisitPromise();\n }\n async requestFailedWithResponse(request, response) {\n await this.loadResponse(response);\n this.resolveVisitPromise();\n }\n requestErrored(request, error) {\n console.error(error);\n this.resolveVisitPromise();\n }\n requestFinished(_request) {\n clearBusyState(this.element);\n }\n formSubmissionStarted({ formElement }) {\n markAsBusy(formElement, this.findFrameElement(formElement));\n }\n formSubmissionSucceededWithResponse(formSubmission, response) {\n const frame = this.findFrameElement(formSubmission.formElement, formSubmission.submitter);\n frame.delegate.proposeVisitIfNavigatedWithAction(frame, formSubmission.formElement, formSubmission.submitter);\n frame.delegate.loadResponse(response);\n if (!formSubmission.isSafe) {\n session.clearCache();\n }\n }\n formSubmissionFailedWithResponse(formSubmission, fetchResponse) {\n this.element.delegate.loadResponse(fetchResponse);\n session.clearCache();\n }\n formSubmissionErrored(formSubmission, error) {\n console.error(error);\n }\n formSubmissionFinished({ formElement }) {\n clearBusyState(formElement, this.findFrameElement(formElement));\n }\n allowsImmediateRender({ element: newFrame }, options) {\n const event = dispatch(\"turbo:before-frame-render\", {\n target: this.element,\n detail: Object.assign({ newFrame }, options),\n cancelable: true,\n });\n const { defaultPrevented, detail: { render }, } = event;\n if (this.view.renderer && render) {\n this.view.renderer.renderElement = render;\n }\n return !defaultPrevented;\n }\n viewRenderedSnapshot(_snapshot, _isPreview) { }\n preloadOnLoadLinksForView(element) {\n session.preloadOnLoadLinksForView(element);\n }\n viewInvalidated() { }\n willRenderFrame(currentElement, _newElement) {\n this.previousFrameElement = currentElement.cloneNode(true);\n }\n async loadFrameResponse(fetchResponse, document) {\n const newFrameElement = await this.extractForeignFrameElement(document.body);\n if (newFrameElement) {\n const snapshot = new Snapshot(newFrameElement);\n const renderer = new FrameRenderer(this, this.view.snapshot, snapshot, FrameRenderer.renderElement, false, false);\n if (this.view.renderPromise)\n await this.view.renderPromise;\n this.changeHistory();\n await this.view.render(renderer);\n this.complete = true;\n session.frameRendered(fetchResponse, this.element);\n session.frameLoaded(this.element);\n this.fetchResponseLoaded(fetchResponse);\n }\n else if (this.willHandleFrameMissingFromResponse(fetchResponse)) {\n this.handleFrameMissingFromResponse(fetchResponse);\n }\n }\n async visit(url) {\n var _a;\n const request = new FetchRequest(this, FetchMethod.get, url, new URLSearchParams(), this.element);\n (_a = this.currentFetchRequest) === null || _a === void 0 ? void 0 : _a.cancel();\n this.currentFetchRequest = request;\n return new Promise((resolve) => {\n this.resolveVisitPromise = () => {\n this.resolveVisitPromise = () => { };\n this.currentFetchRequest = null;\n resolve();\n };\n request.perform();\n });\n }\n navigateFrame(element, url, submitter) {\n const frame = this.findFrameElement(element, submitter);\n frame.delegate.proposeVisitIfNavigatedWithAction(frame, element, submitter);\n this.withCurrentNavigationElement(element, () => {\n frame.src = url;\n });\n }\n proposeVisitIfNavigatedWithAction(frame, element, submitter) {\n this.action = getVisitAction(submitter, element, frame);\n if (this.action) {\n const pageSnapshot = PageSnapshot.fromElement(frame).clone();\n const { visitCachedSnapshot } = frame.delegate;\n frame.delegate.fetchResponseLoaded = (fetchResponse) => {\n if (frame.src) {\n const { statusCode, redirected } = fetchResponse;\n const responseHTML = frame.ownerDocument.documentElement.outerHTML;\n const response = { statusCode, redirected, responseHTML };\n const options = {\n response,\n visitCachedSnapshot,\n willRender: false,\n updateHistory: false,\n restorationIdentifier: this.restorationIdentifier,\n snapshot: pageSnapshot,\n };\n if (this.action)\n options.action = this.action;\n session.visit(frame.src, options);\n }\n };\n }\n }\n changeHistory() {\n if (this.action) {\n const method = getHistoryMethodForAction(this.action);\n session.history.update(method, expandURL(this.element.src || \"\"), this.restorationIdentifier);\n }\n }\n async handleUnvisitableFrameResponse(fetchResponse) {\n console.warn(`The response (${fetchResponse.statusCode}) from is performing a full page visit due to turbo-visit-control.`);\n await this.visitResponse(fetchResponse.response);\n }\n willHandleFrameMissingFromResponse(fetchResponse) {\n this.element.setAttribute(\"complete\", \"\");\n const response = fetchResponse.response;\n const visit = async (url, options = {}) => {\n if (url instanceof Response) {\n this.visitResponse(url);\n }\n else {\n session.visit(url, options);\n }\n };\n const event = dispatch(\"turbo:frame-missing\", {\n target: this.element,\n detail: { response, visit },\n cancelable: true,\n });\n return !event.defaultPrevented;\n }\n handleFrameMissingFromResponse(fetchResponse) {\n this.view.missing();\n this.throwFrameMissingError(fetchResponse);\n }\n throwFrameMissingError(fetchResponse) {\n const message = `The response (${fetchResponse.statusCode}) did not contain the expected and will be ignored. To perform a full page visit instead, set turbo-visit-control to reload.`;\n throw new TurboFrameMissingError(message);\n }\n async visitResponse(response) {\n const wrapped = new FetchResponse(response);\n const responseHTML = await wrapped.responseHTML;\n const { location, redirected, statusCode } = wrapped;\n return session.visit(location, { response: { redirected, statusCode, responseHTML } });\n }\n findFrameElement(element, submitter) {\n var _a;\n const id = getAttribute(\"data-turbo-frame\", submitter, element) || this.element.getAttribute(\"target\");\n return (_a = getFrameElementById(id)) !== null && _a !== void 0 ? _a : this.element;\n }\n async extractForeignFrameElement(container) {\n let element;\n const id = CSS.escape(this.id);\n try {\n element = activateElement(container.querySelector(`turbo-frame#${id}`), this.sourceURL);\n if (element) {\n return element;\n }\n element = activateElement(container.querySelector(`turbo-frame[src][recurse~=${id}]`), this.sourceURL);\n if (element) {\n await element.loaded;\n return await this.extractForeignFrameElement(element);\n }\n }\n catch (error) {\n console.error(error);\n return new FrameElement();\n }\n return null;\n }\n formActionIsVisitable(form, submitter) {\n const action = getAction(form, submitter);\n return locationIsVisitable(expandURL(action), this.rootLocation);\n }\n shouldInterceptNavigation(element, submitter) {\n const id = getAttribute(\"data-turbo-frame\", submitter, element) || this.element.getAttribute(\"target\");\n if (element instanceof HTMLFormElement && !this.formActionIsVisitable(element, submitter)) {\n return false;\n }\n if (!this.enabled || id == \"_top\") {\n return false;\n }\n if (id) {\n const frameElement = getFrameElementById(id);\n if (frameElement) {\n return !frameElement.disabled;\n }\n }\n if (!session.elementIsNavigatable(element)) {\n return false;\n }\n if (submitter && !session.elementIsNavigatable(submitter)) {\n return false;\n }\n return true;\n }\n get id() {\n return this.element.id;\n }\n get enabled() {\n return !this.element.disabled;\n }\n get sourceURL() {\n if (this.element.src) {\n return this.element.src;\n }\n }\n set sourceURL(sourceURL) {\n this.ignoringChangesToAttribute(\"src\", () => {\n this.element.src = sourceURL !== null && sourceURL !== void 0 ? sourceURL : null;\n });\n }\n get loadingStyle() {\n return this.element.loading;\n }\n get isLoading() {\n return this.formSubmission !== undefined || this.resolveVisitPromise() !== undefined;\n }\n get complete() {\n return this.element.hasAttribute(\"complete\");\n }\n set complete(value) {\n this.ignoringChangesToAttribute(\"complete\", () => {\n if (value) {\n this.element.setAttribute(\"complete\", \"\");\n }\n else {\n this.element.removeAttribute(\"complete\");\n }\n });\n }\n get isActive() {\n return this.element.isActive && this.connected;\n }\n get rootLocation() {\n var _a;\n const meta = this.element.ownerDocument.querySelector(`meta[name=\"turbo-root\"]`);\n const root = (_a = meta === null || meta === void 0 ? void 0 : meta.content) !== null && _a !== void 0 ? _a : \"/\";\n return expandURL(root);\n }\n isIgnoringChangesTo(attributeName) {\n return this.ignoredAttributes.has(attributeName);\n }\n ignoringChangesToAttribute(attributeName, callback) {\n this.ignoredAttributes.add(attributeName);\n callback();\n this.ignoredAttributes.delete(attributeName);\n }\n withCurrentNavigationElement(element, callback) {\n this.currentNavigationElement = element;\n callback();\n delete this.currentNavigationElement;\n }\n}\nfunction getFrameElementById(id) {\n if (id != null) {\n const element = document.getElementById(id);\n if (element instanceof FrameElement) {\n return element;\n }\n }\n}\nfunction activateElement(element, currentURL) {\n if (element) {\n const src = element.getAttribute(\"src\");\n if (src != null && currentURL != null && urlsAreEqual(src, currentURL)) {\n throw new Error(`Matching element has a source URL which references itself`);\n }\n if (element.ownerDocument !== document) {\n element = document.importNode(element, true);\n }\n if (element instanceof FrameElement) {\n element.connectedCallback();\n element.disconnectedCallback();\n return element;\n }\n }\n}\n\nclass StreamElement extends HTMLElement {\n static async renderElement(newElement) {\n await newElement.performAction();\n }\n async connectedCallback() {\n try {\n await this.render();\n }\n catch (error) {\n console.error(error);\n }\n finally {\n this.disconnect();\n }\n }\n async render() {\n var _a;\n return ((_a = this.renderPromise) !== null && _a !== void 0 ? _a : (this.renderPromise = (async () => {\n const event = this.beforeRenderEvent;\n if (this.dispatchEvent(event)) {\n await nextAnimationFrame();\n await event.detail.render(this);\n }\n })()));\n }\n disconnect() {\n try {\n this.remove();\n }\n catch (_a) { }\n }\n removeDuplicateTargetChildren() {\n this.duplicateChildren.forEach((c) => c.remove());\n }\n get duplicateChildren() {\n var _a;\n const existingChildren = this.targetElements.flatMap((e) => [...e.children]).filter((c) => !!c.id);\n const newChildrenIds = [...(((_a = this.templateContent) === null || _a === void 0 ? void 0 : _a.children) || [])].filter((c) => !!c.id).map((c) => c.id);\n return existingChildren.filter((c) => newChildrenIds.includes(c.id));\n }\n get performAction() {\n if (this.action) {\n const actionFunction = StreamActions[this.action];\n if (actionFunction) {\n return actionFunction;\n }\n this.raise(\"unknown action\");\n }\n this.raise(\"action attribute is missing\");\n }\n get targetElements() {\n if (this.target) {\n return this.targetElementsById;\n }\n else if (this.targets) {\n return this.targetElementsByQuery;\n }\n else {\n this.raise(\"target or targets attribute is missing\");\n }\n }\n get templateContent() {\n return this.templateElement.content.cloneNode(true);\n }\n get templateElement() {\n if (this.firstElementChild === null) {\n const template = this.ownerDocument.createElement(\"template\");\n this.appendChild(template);\n return template;\n }\n else if (this.firstElementChild instanceof HTMLTemplateElement) {\n return this.firstElementChild;\n }\n this.raise(\"first child element must be a