diff --git a/404.html b/404.html index ef7ddd14..634ee68e 100644 --- a/404.html +++ b/404.html @@ -2,7 +2,7 @@ - + Page Not Found | Codec Wiki @@ -13,9 +13,9 @@ - - - + + +
Skip to main content

Page Not Found

We could not find what you were looking for.

Please contact the owner of the site that linked you to the original URL and let them know their link is broken.

diff --git a/assets/css/styles.a0de4143.css b/assets/css/styles.6ca912c1.css similarity index 84% rename from assets/css/styles.a0de4143.css rename to assets/css/styles.6ca912c1.css index 51eb87f3..4004031b 100644 --- a/assets/css/styles.a0de4143.css +++ b/assets/css/styles.6ca912c1.css @@ -1 +1 @@ -.col,.container{padding:0 var(--ifm-spacing-horizontal);width:100%}.markdown>h2,.markdown>h3,.markdown>h4,.markdown>h5,.markdown>h6{margin-bottom:calc(var(--ifm-heading-vertical-rhythm-bottom)*var(--ifm-leading))}.markdown li,body{word-wrap:break-word}body,ol ol,ol ul,ul ol,ul ul{margin:0}pre,table{overflow:auto}blockquote,pre{margin:0 0 var(--ifm-spacing-vertical)}.breadcrumbs__link,.button{transition-timing-function:var(--ifm-transition-timing-default)}.button,code{vertical-align:middle}.button--outline.button--active,.button--outline:active,.button--outline:hover,:root{--ifm-button-color:var(--ifm-font-color-base-inverse)}.menu__link:hover,a{transition:color var(--ifm-transition-fast) var(--ifm-transition-timing-default)}.navbar--dark,:root{--ifm-navbar-link-hover-color:var(--ifm-color-primary)}.menu,.navbar-sidebar{overflow-x:hidden}:root,html[data-theme=dark]{--ifm-color-emphasis-500:var(--ifm-color-gray-500)}.toggleButton_gllP,html{-webkit-tap-highlight-color:transparent}*,.loadingRing_RJI3 div{box-sizing:border-box}.authorSocials_rSDt,.authorTitle_nd0D{-webkit-box-orient:vertical;overflow:hidden}.clean-list,.containsTaskList_mC6p,.details_lb9f>summary,.dropdown__menu,.menu__list{list-style:none}:root{--ifm-color-scheme:light;--ifm-dark-value:10%;--ifm-darker-value:15%;--ifm-darkest-value:30%;--ifm-light-value:15%;--ifm-lighter-value:30%;--ifm-lightest-value:50%;--ifm-contrast-background-value:90%;--ifm-contrast-foreground-value:70%;--ifm-contrast-background-dark-value:70%;--ifm-contrast-foreground-dark-value:90%;--ifm-color-primary:#3578e5;--ifm-color-secondary:#ebedf0;--ifm-color-success:#00a400;--ifm-color-info:#54c7ec;--ifm-color-warning:#ffba00;--ifm-color-danger:#fa383e;--ifm-color-primary-dark:#306cce;--ifm-color-primary-darker:#2d66c3;--ifm-color-primary-darkest:#2554a0;--ifm-color-primary-light:#538ce9;--ifm-color-primary-lighter:#72a1ed;--ifm-color-primary-lightest:#9abcf2;--ifm-color-primary-contrast-background:#ebf2fc;--ifm-color-primary-contrast-foreground:#102445;--ifm-color-secondary-dark:#d4d5d8;--ifm-color-secondary-darker:#c8c9cc;--ifm-color-secondary-darkest:#a4a6a8;--ifm-color-secondary-light:#eef0f2;--ifm-color-secondary-lighter:#f1f2f5;--ifm-color-secondary-lightest:#f5f6f8;--ifm-color-secondary-contrast-background:#fdfdfe;--ifm-color-secondary-contrast-foreground:#474748;--ifm-color-success-dark:#009400;--ifm-color-success-darker:#008b00;--ifm-color-success-darkest:#007300;--ifm-color-success-light:#26b226;--ifm-color-success-lighter:#4dbf4d;--ifm-color-success-lightest:#80d280;--ifm-color-success-contrast-background:#e6f6e6;--ifm-color-success-contrast-foreground:#003100;--ifm-color-info-dark:#4cb3d4;--ifm-color-info-darker:#47a9c9;--ifm-color-info-darkest:#3b8ba5;--ifm-color-info-light:#6ecfef;--ifm-color-info-lighter:#87d8f2;--ifm-color-info-lightest:#aae3f6;--ifm-color-info-contrast-background:#eef9fd;--ifm-color-info-contrast-foreground:#193c47;--ifm-color-warning-dark:#e6a700;--ifm-color-warning-darker:#d99e00;--ifm-color-warning-darkest:#b38200;--ifm-color-warning-light:#ffc426;--ifm-color-warning-lighter:#ffcf4d;--ifm-color-warning-lightest:#ffdd80;--ifm-color-warning-contrast-background:#fff8e6;--ifm-color-warning-contrast-foreground:#4d3800;--ifm-color-danger-dark:#e13238;--ifm-color-danger-darker:#d53035;--ifm-color-danger-darkest:#af272b;--ifm-color-danger-light:#fb565b;--ifm-color-danger-lighter:#fb7478;--ifm-color-danger-lightest:#fd9c9f;--ifm-color-danger-contrast-background:#ffebec;--ifm-color-danger-contrast-foreground:#4b1113;--ifm-color-white:#fff;--ifm-color-black:#000;--ifm-color-gray-0:var(--ifm-color-white);--ifm-color-gray-100:#f5f6f7;--ifm-color-gray-200:#ebedf0;--ifm-color-gray-300:#dadde1;--ifm-color-gray-400:#ccd0d5;--ifm-color-gray-500:#bec3c9;--ifm-color-gray-600:#8d949e;--ifm-color-gray-700:#606770;--ifm-color-gray-800:#444950;--ifm-color-gray-900:#1c1e21;--ifm-color-gray-1000:var(--ifm-color-black);--ifm-color-emphasis-0:var(--ifm-color-gray-0);--ifm-color-emphasis-100:var(--ifm-color-gray-100);--ifm-color-emphasis-200:var(--ifm-color-gray-200);--ifm-color-emphasis-300:var(--ifm-color-gray-300);--ifm-color-emphasis-400:var(--ifm-color-gray-400);--ifm-color-emphasis-600:var(--ifm-color-gray-600);--ifm-color-emphasis-700:var(--ifm-color-gray-700);--ifm-color-emphasis-800:var(--ifm-color-gray-800);--ifm-color-emphasis-900:var(--ifm-color-gray-900);--ifm-color-emphasis-1000:var(--ifm-color-gray-1000);--ifm-color-content:var(--ifm-color-emphasis-900);--ifm-color-content-inverse:var(--ifm-color-emphasis-0);--ifm-color-content-secondary:#525860;--ifm-background-color:#0000;--ifm-background-surface-color:var(--ifm-color-content-inverse);--ifm-global-border-width:1px;--ifm-global-radius:0.4rem;--ifm-hover-overlay:#0000000d;--ifm-font-color-base:var(--ifm-color-content);--ifm-font-color-base-inverse:var(--ifm-color-content-inverse);--ifm-font-color-secondary:var(--ifm-color-content-secondary);--ifm-font-family-base:system-ui,-apple-system,Segoe UI,Roboto,Ubuntu,Cantarell,Noto Sans,sans-serif,BlinkMacSystemFont,"Segoe UI",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol";--ifm-font-family-monospace:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;--ifm-font-size-base:100%;--ifm-font-weight-light:300;--ifm-font-weight-normal:400;--ifm-font-weight-semibold:500;--ifm-font-weight-bold:700;--ifm-font-weight-base:var(--ifm-font-weight-normal);--ifm-line-height-base:1.65;--ifm-global-spacing:1rem;--ifm-spacing-vertical:var(--ifm-global-spacing);--ifm-spacing-horizontal:var(--ifm-global-spacing);--ifm-transition-fast:200ms;--ifm-transition-slow:400ms;--ifm-transition-timing-default:cubic-bezier(0.08,0.52,0.52,1);--ifm-global-shadow-lw:0 1px 2px 0 #0000001a;--ifm-global-shadow-md:0 5px 40px #0003;--ifm-global-shadow-tl:0 12px 28px 0 #0003,0 2px 4px 0 #0000001a;--ifm-z-index-dropdown:100;--ifm-z-index-fixed:200;--ifm-z-index-overlay:400;--ifm-container-width:1140px;--ifm-container-width-xl:1320px;--ifm-code-background:#f6f7f8;--ifm-code-border-radius:var(--ifm-global-radius);--ifm-code-font-size:90%;--ifm-code-padding-horizontal:0.1rem;--ifm-code-padding-vertical:0.1rem;--ifm-pre-background:var(--ifm-code-background);--ifm-pre-border-radius:var(--ifm-code-border-radius);--ifm-pre-color:inherit;--ifm-pre-line-height:1.45;--ifm-pre-padding:1rem;--ifm-heading-color:inherit;--ifm-heading-margin-top:0;--ifm-heading-margin-bottom:var(--ifm-spacing-vertical);--ifm-heading-font-family:var(--ifm-font-family-base);--ifm-heading-font-weight:var(--ifm-font-weight-bold);--ifm-heading-line-height:1.25;--ifm-h1-font-size:2rem;--ifm-h2-font-size:1.5rem;--ifm-h3-font-size:1.25rem;--ifm-h4-font-size:1rem;--ifm-h5-font-size:0.875rem;--ifm-h6-font-size:0.85rem;--ifm-image-alignment-padding:1.25rem;--ifm-leading-desktop:1.25;--ifm-leading:calc(var(--ifm-leading-desktop)*1rem);--ifm-list-left-padding:2rem;--ifm-list-margin:1rem;--ifm-list-item-margin:0.25rem;--ifm-list-paragraph-margin:1rem;--ifm-table-cell-padding:0.75rem;--ifm-table-background:#0000;--ifm-table-stripe-background:#00000008;--ifm-table-border-width:1px;--ifm-table-border-color:var(--ifm-color-emphasis-300);--ifm-table-head-background:inherit;--ifm-table-head-color:inherit;--ifm-table-head-font-weight:var(--ifm-font-weight-bold);--ifm-table-cell-color:inherit;--ifm-link-color:var(--ifm-color-primary);--ifm-link-decoration:none;--ifm-link-hover-color:var(--ifm-link-color);--ifm-link-hover-decoration:underline;--ifm-paragraph-margin-bottom:var(--ifm-leading);--ifm-blockquote-font-size:var(--ifm-font-size-base);--ifm-blockquote-border-left-width:2px;--ifm-blockquote-padding-horizontal:var(--ifm-spacing-horizontal);--ifm-blockquote-padding-vertical:0;--ifm-blockquote-shadow:none;--ifm-blockquote-color:var(--ifm-color-emphasis-800);--ifm-blockquote-border-color:var(--ifm-color-emphasis-300);--ifm-hr-background-color:var(--ifm-color-emphasis-500);--ifm-hr-height:1px;--ifm-hr-margin-vertical:1.5rem;--ifm-scrollbar-size:7px;--ifm-scrollbar-track-background-color:#f1f1f1;--ifm-scrollbar-thumb-background-color:silver;--ifm-scrollbar-thumb-hover-background-color:#a7a7a7;--ifm-alert-background-color:inherit;--ifm-alert-border-color:inherit;--ifm-alert-border-radius:var(--ifm-global-radius);--ifm-alert-border-width:0px;--ifm-alert-border-left-width:5px;--ifm-alert-color:var(--ifm-font-color-base);--ifm-alert-padding-horizontal:var(--ifm-spacing-horizontal);--ifm-alert-padding-vertical:var(--ifm-spacing-vertical);--ifm-alert-shadow:var(--ifm-global-shadow-lw);--ifm-avatar-intro-margin:1rem;--ifm-avatar-intro-alignment:inherit;--ifm-avatar-photo-size:3rem;--ifm-badge-background-color:inherit;--ifm-badge-border-color:inherit;--ifm-badge-border-radius:var(--ifm-global-radius);--ifm-badge-border-width:var(--ifm-global-border-width);--ifm-badge-color:var(--ifm-color-white);--ifm-badge-padding-horizontal:calc(var(--ifm-spacing-horizontal)*0.5);--ifm-badge-padding-vertical:calc(var(--ifm-spacing-vertical)*0.25);--ifm-breadcrumb-border-radius:1.5rem;--ifm-breadcrumb-spacing:0.5rem;--ifm-breadcrumb-color-active:var(--ifm-color-primary);--ifm-breadcrumb-item-background-active:var(--ifm-hover-overlay);--ifm-breadcrumb-padding-horizontal:0.8rem;--ifm-breadcrumb-padding-vertical:0.4rem;--ifm-breadcrumb-size-multiplier:1;--ifm-breadcrumb-separator:url('data:image/svg+xml;utf8,');--ifm-breadcrumb-separator-filter:none;--ifm-breadcrumb-separator-size:0.5rem;--ifm-breadcrumb-separator-size-multiplier:1.25;--ifm-button-background-color:inherit;--ifm-button-border-color:var(--ifm-button-background-color);--ifm-button-border-width:var(--ifm-global-border-width);--ifm-button-font-weight:var(--ifm-font-weight-bold);--ifm-button-padding-horizontal:1.5rem;--ifm-button-padding-vertical:0.375rem;--ifm-button-size-multiplier:1;--ifm-button-transition-duration:var(--ifm-transition-fast);--ifm-button-border-radius:calc(var(--ifm-global-radius)*var(--ifm-button-size-multiplier));--ifm-button-group-spacing:2px;--ifm-card-background-color:var(--ifm-background-surface-color);--ifm-card-border-radius:calc(var(--ifm-global-radius)*2);--ifm-card-horizontal-spacing:var(--ifm-global-spacing);--ifm-card-vertical-spacing:var(--ifm-global-spacing);--ifm-toc-border-color:var(--ifm-color-emphasis-300);--ifm-toc-link-color:var(--ifm-color-content-secondary);--ifm-toc-padding-vertical:0.5rem;--ifm-toc-padding-horizontal:0.5rem;--ifm-dropdown-background-color:var(--ifm-background-surface-color);--ifm-dropdown-font-weight:var(--ifm-font-weight-semibold);--ifm-dropdown-link-color:var(--ifm-font-color-base);--ifm-dropdown-hover-background-color:var(--ifm-hover-overlay);--ifm-footer-background-color:var(--ifm-color-emphasis-100);--ifm-footer-color:inherit;--ifm-footer-link-color:var(--ifm-color-emphasis-700);--ifm-footer-link-hover-color:var(--ifm-color-primary);--ifm-footer-link-horizontal-spacing:0.5rem;--ifm-footer-padding-horizontal:calc(var(--ifm-spacing-horizontal)*2);--ifm-footer-padding-vertical:calc(var(--ifm-spacing-vertical)*2);--ifm-footer-title-color:inherit;--ifm-footer-logo-max-width:min(30rem,90vw);--ifm-hero-background-color:var(--ifm-background-surface-color);--ifm-hero-text-color:var(--ifm-color-emphasis-800);--ifm-menu-color:var(--ifm-color-emphasis-700);--ifm-menu-color-active:var(--ifm-color-primary);--ifm-menu-color-background-active:var(--ifm-hover-overlay);--ifm-menu-color-background-hover:var(--ifm-hover-overlay);--ifm-menu-link-padding-horizontal:0.75rem;--ifm-menu-link-padding-vertical:0.375rem;--ifm-menu-link-sublist-icon:url('data:image/svg+xml;utf8,');--ifm-menu-link-sublist-icon-filter:none;--ifm-navbar-background-color:var(--ifm-background-surface-color);--ifm-navbar-height:3.75rem;--ifm-navbar-item-padding-horizontal:0.75rem;--ifm-navbar-item-padding-vertical:0.25rem;--ifm-navbar-link-color:var(--ifm-font-color-base);--ifm-navbar-link-active-color:var(--ifm-link-color);--ifm-navbar-padding-horizontal:var(--ifm-spacing-horizontal);--ifm-navbar-padding-vertical:calc(var(--ifm-spacing-vertical)*0.5);--ifm-navbar-shadow:var(--ifm-global-shadow-lw);--ifm-navbar-search-input-background-color:var(--ifm-color-emphasis-200);--ifm-navbar-search-input-color:var(--ifm-color-emphasis-800);--ifm-navbar-search-input-placeholder-color:var(--ifm-color-emphasis-500);--ifm-navbar-search-input-icon:url('data:image/svg+xml;utf8,');--ifm-navbar-sidebar-width:83vw;--ifm-pagination-border-radius:var(--ifm-global-radius);--ifm-pagination-color-active:var(--ifm-color-primary);--ifm-pagination-font-size:1rem;--ifm-pagination-item-active-background:var(--ifm-hover-overlay);--ifm-pagination-page-spacing:0.2em;--ifm-pagination-padding-horizontal:calc(var(--ifm-spacing-horizontal)*1);--ifm-pagination-padding-vertical:calc(var(--ifm-spacing-vertical)*0.25);--ifm-pagination-nav-border-radius:var(--ifm-global-radius);--ifm-pagination-nav-color-hover:var(--ifm-color-primary);--ifm-pills-color-active:var(--ifm-color-primary);--ifm-pills-color-background-active:var(--ifm-hover-overlay);--ifm-pills-spacing:0.125rem;--ifm-tabs-color:var(--ifm-font-color-secondary);--ifm-tabs-color-active:var(--ifm-color-primary);--ifm-tabs-color-active-border:var(--ifm-tabs-color-active);--ifm-tabs-padding-horizontal:1rem;--ifm-tabs-padding-vertical:1rem;--docusaurus-progress-bar-color:var(--ifm-color-primary);--docusaurus-announcement-bar-height:auto;--docusaurus-collapse-button-bg:#0000;--docusaurus-collapse-button-bg-hover:#0000001a;--doc-sidebar-width:300px;--doc-sidebar-hidden-width:30px;--docusaurus-blog-social-icon-size:1rem;--docusaurus-tag-list-border:var(--ifm-color-emphasis-300)}.badge--danger,.badge--info,.badge--primary,.badge--secondary,.badge--success,.badge--warning{--ifm-badge-border-color:var(--ifm-badge-background-color)}.button--link,.button--outline{--ifm-button-background-color:#0000}html{background-color:var(--ifm-background-color);color:var(--ifm-font-color-base);color-scheme:var(--ifm-color-scheme);font:var(--ifm-font-size-base)/var(--ifm-line-height-base) var(--ifm-font-family-base);-webkit-font-smoothing:antialiased;text-rendering:optimizelegibility;-webkit-text-size-adjust:100%;text-size-adjust:100%}iframe{border:0;color-scheme:auto}.container{margin:0 auto;max-width:var(--ifm-container-width)}.container--fluid{max-width:inherit}.row{display:flex;flex-wrap:wrap;margin:0 calc(var(--ifm-spacing-horizontal)*-1)}.margin-bottom--none,.margin-vert--none,.markdown>:last-child{margin-bottom:0!important}.margin-top--none,.margin-vert--none,.tabItem_LNqP{margin-top:0!important}.row--no-gutters{margin-left:0;margin-right:0}.margin-horiz--none,.margin-right--none{margin-right:0!important}.row--no-gutters>.col{padding-left:0;padding-right:0}.row--align-top{align-items:flex-start}.row--align-bottom{align-items:flex-end}.menuExternalLink_NmtK,.row--align-center{align-items:center}.row--align-stretch{align-items:stretch}.row--align-baseline{align-items:baseline}.col{--ifm-col-width:100%;flex:1 0;margin-left:0;max-width:var(--ifm-col-width)}.padding-bottom--none,.padding-vert--none{padding-bottom:0!important}.padding-top--none,.padding-vert--none{padding-top:0!important}.padding-horiz--none,.padding-left--none{padding-left:0!important}.padding-horiz--none,.padding-right--none{padding-right:0!important}.col[class*=col--]{flex:0 0 var(--ifm-col-width)}.col--1{--ifm-col-width:8.33333%}.col--offset-1{margin-left:8.33333%}.col--2{--ifm-col-width:16.66667%}.col--offset-2{margin-left:16.66667%}.col--3{--ifm-col-width:25%}.col--offset-3{margin-left:25%}.col--4{--ifm-col-width:33.33333%}.col--offset-4{margin-left:33.33333%}.col--5{--ifm-col-width:41.66667%}.col--offset-5{margin-left:41.66667%}.col--6{--ifm-col-width:50%}.col--offset-6{margin-left:50%}.col--7{--ifm-col-width:58.33333%}.col--offset-7{margin-left:58.33333%}.col--8{--ifm-col-width:66.66667%}.col--offset-8{margin-left:66.66667%}.col--9{--ifm-col-width:75%}.col--offset-9{margin-left:75%}.col--10{--ifm-col-width:83.33333%}.col--offset-10{margin-left:83.33333%}.col--11{--ifm-col-width:91.66667%}.col--offset-11{margin-left:91.66667%}.col--12{--ifm-col-width:100%}.col--offset-12{margin-left:100%}.margin-horiz--none,.margin-left--none{margin-left:0!important}.margin--none{margin:0!important}.margin-bottom--xs,.margin-vert--xs{margin-bottom:.25rem!important}.margin-top--xs,.margin-vert--xs{margin-top:.25rem!important}.margin-horiz--xs,.margin-left--xs{margin-left:.25rem!important}.margin-horiz--xs,.margin-right--xs{margin-right:.25rem!important}.margin--xs{margin:.25rem!important}.margin-bottom--sm,.margin-vert--sm{margin-bottom:.5rem!important}.margin-top--sm,.margin-vert--sm{margin-top:.5rem!important}.margin-horiz--sm,.margin-left--sm{margin-left:.5rem!important}.margin-horiz--sm,.margin-right--sm{margin-right:.5rem!important}.margin--sm{margin:.5rem!important}.margin-bottom--md,.margin-vert--md{margin-bottom:1rem!important}.margin-top--md,.margin-vert--md{margin-top:1rem!important}.margin-horiz--md,.margin-left--md{margin-left:1rem!important}.margin-horiz--md,.margin-right--md{margin-right:1rem!important}.margin--md{margin:1rem!important}.margin-bottom--lg,.margin-vert--lg{margin-bottom:2rem!important}.margin-top--lg,.margin-vert--lg{margin-top:2rem!important}.margin-horiz--lg,.margin-left--lg{margin-left:2rem!important}.margin-horiz--lg,.margin-right--lg{margin-right:2rem!important}.margin--lg{margin:2rem!important}.margin-bottom--xl,.margin-vert--xl{margin-bottom:5rem!important}.margin-top--xl,.margin-vert--xl{margin-top:5rem!important}.margin-horiz--xl,.margin-left--xl{margin-left:5rem!important}.margin-horiz--xl,.margin-right--xl{margin-right:5rem!important}.margin--xl{margin:5rem!important}.padding--none{padding:0!important}.padding-bottom--xs,.padding-vert--xs{padding-bottom:.25rem!important}.padding-top--xs,.padding-vert--xs{padding-top:.25rem!important}.padding-horiz--xs,.padding-left--xs{padding-left:.25rem!important}.padding-horiz--xs,.padding-right--xs{padding-right:.25rem!important}.padding--xs{padding:.25rem!important}.padding-bottom--sm,.padding-vert--sm{padding-bottom:.5rem!important}.padding-top--sm,.padding-vert--sm{padding-top:.5rem!important}.padding-horiz--sm,.padding-left--sm{padding-left:.5rem!important}.padding-horiz--sm,.padding-right--sm{padding-right:.5rem!important}.padding--sm{padding:.5rem!important}.padding-bottom--md,.padding-vert--md{padding-bottom:1rem!important}.padding-top--md,.padding-vert--md{padding-top:1rem!important}.padding-horiz--md,.padding-left--md{padding-left:1rem!important}.padding-horiz--md,.padding-right--md{padding-right:1rem!important}.padding--md{padding:1rem!important}.padding-bottom--lg,.padding-vert--lg{padding-bottom:2rem!important}.padding-top--lg,.padding-vert--lg{padding-top:2rem!important}.padding-horiz--lg,.padding-left--lg{padding-left:2rem!important}.padding-horiz--lg,.padding-right--lg{padding-right:2rem!important}.padding--lg{padding:2rem!important}.padding-bottom--xl,.padding-vert--xl{padding-bottom:5rem!important}.padding-top--xl,.padding-vert--xl{padding-top:5rem!important}.padding-horiz--xl,.padding-left--xl{padding-left:5rem!important}.padding-horiz--xl,.padding-right--xl{padding-right:5rem!important}.padding--xl{padding:5rem!important}code{background-color:var(--ifm-code-background);border:.1rem solid #0000001a;border-radius:var(--ifm-code-border-radius);font-family:var(--ifm-font-family-monospace);font-size:var(--ifm-code-font-size);padding:var(--ifm-code-padding-vertical) var(--ifm-code-padding-horizontal)}a code{color:inherit}pre{background-color:var(--ifm-pre-background);border-radius:var(--ifm-pre-border-radius);color:var(--ifm-pre-color);font:var(--ifm-code-font-size)/var(--ifm-pre-line-height) var(--ifm-font-family-monospace);padding:var(--ifm-pre-padding)}pre code{background-color:initial;border:none;font-size:100%;line-height:inherit;padding:0}kbd{background-color:var(--ifm-color-emphasis-0);border:1px solid var(--ifm-color-emphasis-400);border-radius:.2rem;box-shadow:inset 0 -1px 0 var(--ifm-color-emphasis-400);color:var(--ifm-color-emphasis-800);font:80% var(--ifm-font-family-monospace);padding:.15rem .3rem}h1,h2,h3,h4,h5,h6{color:var(--ifm-heading-color);font-family:var(--ifm-heading-font-family);font-weight:var(--ifm-heading-font-weight);line-height:var(--ifm-heading-line-height);margin:var(--ifm-heading-margin-top) 0 var(--ifm-heading-margin-bottom) 0}h1{font-size:var(--ifm-h1-font-size)}h2{font-size:var(--ifm-h2-font-size)}h3{font-size:var(--ifm-h3-font-size)}h4{font-size:var(--ifm-h4-font-size)}h5{font-size:var(--ifm-h5-font-size)}h6{font-size:var(--ifm-h6-font-size)}img{max-width:100%}img[align=right]{padding-left:var(--image-alignment-padding)}img[align=left]{padding-right:var(--image-alignment-padding)}.markdown{--ifm-h1-vertical-rhythm-top:3;--ifm-h2-vertical-rhythm-top:2;--ifm-h3-vertical-rhythm-top:1.5;--ifm-heading-vertical-rhythm-top:1.25;--ifm-h1-vertical-rhythm-bottom:1.25;--ifm-heading-vertical-rhythm-bottom:1}.markdown:after,.markdown:before{content:"";display:table}.markdown:after{clear:both}.markdown h1:first-child{--ifm-h1-font-size:3rem;margin-bottom:calc(var(--ifm-h1-vertical-rhythm-bottom)*var(--ifm-leading))}.markdown>h2{--ifm-h2-font-size:2rem;margin-top:calc(var(--ifm-h2-vertical-rhythm-top)*var(--ifm-leading))}.markdown>h3{--ifm-h3-font-size:1.5rem;margin-top:calc(var(--ifm-h3-vertical-rhythm-top)*var(--ifm-leading))}.markdown>h4,.markdown>h5,.markdown>h6{margin-top:calc(var(--ifm-heading-vertical-rhythm-top)*var(--ifm-leading))}.markdown>p,.markdown>pre,.markdown>ul,.tabList__CuJ{margin-bottom:var(--ifm-leading)}.markdown li>p{margin-top:var(--ifm-list-paragraph-margin)}.markdown li+li{margin-top:var(--ifm-list-item-margin)}ol,ul{margin:0 0 var(--ifm-list-margin);padding-left:var(--ifm-list-left-padding)}ol ol,ul ol{list-style-type:lower-roman}ol ol ol,ol ul ol,ul ol ol,ul ul ol{list-style-type:lower-alpha}table{border-collapse:collapse;display:block;margin-bottom:var(--ifm-spacing-vertical)}table thead tr{border-bottom:2px solid var(--ifm-table-border-color)}table thead,table tr:nth-child(2n){background-color:var(--ifm-table-stripe-background)}table tr{background-color:var(--ifm-table-background);border-top:var(--ifm-table-border-width) solid var(--ifm-table-border-color)}table td,table th{border:var(--ifm-table-border-width) solid var(--ifm-table-border-color);padding:var(--ifm-table-cell-padding)}table th{background-color:var(--ifm-table-head-background);color:var(--ifm-table-head-color);font-weight:var(--ifm-table-head-font-weight)}table td{color:var(--ifm-table-cell-color)}strong{font-weight:var(--ifm-font-weight-bold)}a{color:var(--ifm-link-color);text-decoration:var(--ifm-link-decoration)}a:hover{color:var(--ifm-link-hover-color);text-decoration:var(--ifm-link-hover-decoration)}.button:hover,.text--no-decoration,.text--no-decoration:hover,a:not([href]){text-decoration:none}p{margin:0 0 var(--ifm-paragraph-margin-bottom)}blockquote{border-left:var(--ifm-blockquote-border-left-width) solid var(--ifm-blockquote-border-color);box-shadow:var(--ifm-blockquote-shadow);color:var(--ifm-blockquote-color);font-size:var(--ifm-blockquote-font-size);padding:var(--ifm-blockquote-padding-vertical) var(--ifm-blockquote-padding-horizontal)}blockquote>:first-child{margin-top:0}blockquote>:last-child{margin-bottom:0}hr{background-color:var(--ifm-hr-background-color);border:0;height:var(--ifm-hr-height);margin:var(--ifm-hr-margin-vertical) 0}.shadow--lw{box-shadow:var(--ifm-global-shadow-lw)!important}.shadow--md{box-shadow:var(--ifm-global-shadow-md)!important}.shadow--tl{box-shadow:var(--ifm-global-shadow-tl)!important}.text--primary,.wordWrapButtonEnabled_EoeP .wordWrapButtonIcon_Bwma{color:var(--ifm-color-primary)}.text--secondary{color:var(--ifm-color-secondary)}.text--success{color:var(--ifm-color-success)}.text--info{color:var(--ifm-color-info)}.text--warning{color:var(--ifm-color-warning)}.text--danger{color:var(--ifm-color-danger)}.centered-text,.text--center{text-align:center}.text--left{text-align:left}.text--justify{text-align:justify}.text--right{text-align:right}.text--capitalize{text-transform:capitalize}.text--lowercase{text-transform:lowercase}.admonitionHeading_Gvgb,.alert__heading,.text--uppercase{text-transform:uppercase}.text--light{font-weight:var(--ifm-font-weight-light)}.text--normal{font-weight:var(--ifm-font-weight-normal)}.text--semibold{font-weight:var(--ifm-font-weight-semibold)}.text--bold{font-weight:var(--ifm-font-weight-bold)}.text--italic{font-style:italic}.text--truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.text--break{word-wrap:break-word!important;word-break:break-word!important}.clean-btn{background:none;border:none;color:inherit;cursor:pointer;font-family:inherit;padding:0}.alert,.alert .close{color:var(--ifm-alert-foreground-color)}.clean-list{padding-left:0}.alert--primary{--ifm-alert-background-color:var(--ifm-color-primary-contrast-background);--ifm-alert-background-color-highlight:#3578e526;--ifm-alert-foreground-color:var(--ifm-color-primary-contrast-foreground);--ifm-alert-border-color:var(--ifm-color-primary-dark)}.alert--secondary{--ifm-alert-background-color:var(--ifm-color-secondary-contrast-background);--ifm-alert-background-color-highlight:#ebedf026;--ifm-alert-foreground-color:var(--ifm-color-secondary-contrast-foreground);--ifm-alert-border-color:var(--ifm-color-secondary-dark)}.alert--success{--ifm-alert-background-color:var(--ifm-color-success-contrast-background);--ifm-alert-background-color-highlight:#00a40026;--ifm-alert-foreground-color:var(--ifm-color-success-contrast-foreground);--ifm-alert-border-color:var(--ifm-color-success-dark)}.alert--info{--ifm-alert-background-color:var(--ifm-color-info-contrast-background);--ifm-alert-background-color-highlight:#54c7ec26;--ifm-alert-foreground-color:var(--ifm-color-info-contrast-foreground);--ifm-alert-border-color:var(--ifm-color-info-dark)}.alert--warning{--ifm-alert-background-color:var(--ifm-color-warning-contrast-background);--ifm-alert-background-color-highlight:#ffba0026;--ifm-alert-foreground-color:var(--ifm-color-warning-contrast-foreground);--ifm-alert-border-color:var(--ifm-color-warning-dark)}.alert--danger{--ifm-alert-background-color:var(--ifm-color-danger-contrast-background);--ifm-alert-background-color-highlight:#fa383e26;--ifm-alert-foreground-color:var(--ifm-color-danger-contrast-foreground);--ifm-alert-border-color:var(--ifm-color-danger-dark)}.alert{--ifm-code-background:var(--ifm-alert-background-color-highlight);--ifm-link-color:var(--ifm-alert-foreground-color);--ifm-link-hover-color:var(--ifm-alert-foreground-color);--ifm-link-decoration:underline;--ifm-tabs-color:var(--ifm-alert-foreground-color);--ifm-tabs-color-active:var(--ifm-alert-foreground-color);--ifm-tabs-color-active-border:var(--ifm-alert-border-color);background-color:var(--ifm-alert-background-color);border:var(--ifm-alert-border-width) solid var(--ifm-alert-border-color);border-left-width:var(--ifm-alert-border-left-width);border-radius:var(--ifm-alert-border-radius);box-shadow:var(--ifm-alert-shadow);padding:var(--ifm-alert-padding-vertical) var(--ifm-alert-padding-horizontal)}.alert__heading{align-items:center;display:flex;font:700 var(--ifm-h5-font-size)/var(--ifm-heading-line-height) var(--ifm-heading-font-family);margin-bottom:.5rem}.alert__icon{display:inline-flex;margin-right:.4em}.alert__icon svg{fill:var(--ifm-alert-foreground-color);stroke:var(--ifm-alert-foreground-color);stroke-width:0}.alert .close{margin:calc(var(--ifm-alert-padding-vertical)*-1) calc(var(--ifm-alert-padding-horizontal)*-1) 0 0;opacity:.75}.alert .close:focus,.alert .close:hover{opacity:1}.alert a{text-decoration-color:var(--ifm-alert-border-color)}.alert a:hover{text-decoration-thickness:2px}.avatar{column-gap:var(--ifm-avatar-intro-margin);display:flex}.avatar__photo{border-radius:50%;display:block;height:var(--ifm-avatar-photo-size);overflow:hidden;width:var(--ifm-avatar-photo-size)}.card--full-height,.navbar__logo img,body,html{height:100%}.avatar__photo--sm{--ifm-avatar-photo-size:2rem}.avatar__photo--lg{--ifm-avatar-photo-size:4rem}.avatar__photo--xl{--ifm-avatar-photo-size:6rem}.avatar__intro{display:flex;flex:1 1;flex-direction:column;justify-content:center;text-align:var(--ifm-avatar-intro-alignment)}.badge,.breadcrumbs__item,.breadcrumbs__link,.button,.dropdown>.navbar__link:after,.searchBarContainer_NW3z.searchIndexLoading_EJ1f .searchBarLoadingRing_YnHq{display:inline-block}.avatar__name{font:700 var(--ifm-h4-font-size)/var(--ifm-heading-line-height) var(--ifm-font-family-base)}.avatar__subtitle{margin-top:.25rem}.avatar--vertical{--ifm-avatar-intro-alignment:center;--ifm-avatar-intro-margin:0.5rem;align-items:center;flex-direction:column}.badge{background-color:var(--ifm-badge-background-color);border:var(--ifm-badge-border-width) solid var(--ifm-badge-border-color);border-radius:var(--ifm-badge-border-radius);color:var(--ifm-badge-color);font-size:75%;font-weight:var(--ifm-font-weight-bold);line-height:1;padding:var(--ifm-badge-padding-vertical) var(--ifm-badge-padding-horizontal)}.badge--primary{--ifm-badge-background-color:var(--ifm-color-primary)}.badge--secondary{--ifm-badge-background-color:var(--ifm-color-secondary);color:var(--ifm-color-black)}.breadcrumbs__link,.button.button--secondary.button--outline:not(.button--active):not(:hover){color:var(--ifm-font-color-base)}.badge--success{--ifm-badge-background-color:var(--ifm-color-success)}.badge--info{--ifm-badge-background-color:var(--ifm-color-info)}.badge--warning{--ifm-badge-background-color:var(--ifm-color-warning)}.badge--danger{--ifm-badge-background-color:var(--ifm-color-danger)}.breadcrumbs{margin-bottom:0;padding-left:0}.breadcrumbs__item:not(:last-child):after{background:var(--ifm-breadcrumb-separator) center;content:" ";display:inline-block;filter:var(--ifm-breadcrumb-separator-filter);height:calc(var(--ifm-breadcrumb-separator-size)*var(--ifm-breadcrumb-size-multiplier)*var(--ifm-breadcrumb-separator-size-multiplier));margin:0 var(--ifm-breadcrumb-spacing);opacity:.5;width:calc(var(--ifm-breadcrumb-separator-size)*var(--ifm-breadcrumb-size-multiplier)*var(--ifm-breadcrumb-separator-size-multiplier))}.breadcrumbs__item--active .breadcrumbs__link{background:var(--ifm-breadcrumb-item-background-active);color:var(--ifm-breadcrumb-color-active)}.breadcrumbs__link{border-radius:var(--ifm-breadcrumb-border-radius);font-size:calc(1rem*var(--ifm-breadcrumb-size-multiplier));padding:calc(var(--ifm-breadcrumb-padding-vertical)*var(--ifm-breadcrumb-size-multiplier)) calc(var(--ifm-breadcrumb-padding-horizontal)*var(--ifm-breadcrumb-size-multiplier));transition-duration:var(--ifm-transition-fast);transition-property:background,color}.breadcrumbs__link:any-link:hover,.breadcrumbs__link:link:hover,.breadcrumbs__link:visited:hover,area[href].breadcrumbs__link:hover{background:var(--ifm-breadcrumb-item-background-active);text-decoration:none}.breadcrumbs--sm{--ifm-breadcrumb-size-multiplier:0.8}.breadcrumbs--lg{--ifm-breadcrumb-size-multiplier:1.2}.button{background-color:var(--ifm-button-background-color);border:var(--ifm-button-border-width) solid var(--ifm-button-border-color);border-radius:var(--ifm-button-border-radius);cursor:pointer;font-size:calc(.875rem*var(--ifm-button-size-multiplier));font-weight:var(--ifm-button-font-weight);line-height:1.5;padding:calc(var(--ifm-button-padding-vertical)*var(--ifm-button-size-multiplier)) calc(var(--ifm-button-padding-horizontal)*var(--ifm-button-size-multiplier));text-align:center;transition-duration:var(--ifm-button-transition-duration);transition-property:color,background,border-color;-webkit-user-select:none;user-select:none;white-space:nowrap}.button,.button:hover{color:var(--ifm-button-color)}.button--outline{--ifm-button-color:var(--ifm-button-border-color)}.button--outline:hover{--ifm-button-background-color:var(--ifm-button-border-color)}.button--link{--ifm-button-border-color:#0000;color:var(--ifm-link-color);text-decoration:var(--ifm-link-decoration)}.button--link.button--active,.button--link:active,.button--link:hover{color:var(--ifm-link-hover-color);text-decoration:var(--ifm-link-hover-decoration)}.button.disabled,.button:disabled,.button[disabled]{opacity:.65;pointer-events:none}.button--sm{--ifm-button-size-multiplier:0.8}.button--lg{--ifm-button-size-multiplier:1.35}.button--block{display:block;width:100%}.button.button--secondary{color:var(--ifm-color-gray-900)}:where(.button--primary){--ifm-button-background-color:var(--ifm-color-primary);--ifm-button-border-color:var(--ifm-color-primary)}:where(.button--primary):not(.button--outline):hover{--ifm-button-background-color:var(--ifm-color-primary-dark);--ifm-button-border-color:var(--ifm-color-primary-dark)}.button--primary.button--active,.button--primary:active{--ifm-button-background-color:var(--ifm-color-primary-darker);--ifm-button-border-color:var(--ifm-color-primary-darker)}:where(.button--secondary){--ifm-button-background-color:var(--ifm-color-secondary);--ifm-button-border-color:var(--ifm-color-secondary)}:where(.button--secondary):not(.button--outline):hover{--ifm-button-background-color:var(--ifm-color-secondary-dark);--ifm-button-border-color:var(--ifm-color-secondary-dark)}.button--secondary.button--active,.button--secondary:active{--ifm-button-background-color:var(--ifm-color-secondary-darker);--ifm-button-border-color:var(--ifm-color-secondary-darker)}:where(.button--success){--ifm-button-background-color:var(--ifm-color-success);--ifm-button-border-color:var(--ifm-color-success)}:where(.button--success):not(.button--outline):hover{--ifm-button-background-color:var(--ifm-color-success-dark);--ifm-button-border-color:var(--ifm-color-success-dark)}.button--success.button--active,.button--success:active{--ifm-button-background-color:var(--ifm-color-success-darker);--ifm-button-border-color:var(--ifm-color-success-darker)}:where(.button--info){--ifm-button-background-color:var(--ifm-color-info);--ifm-button-border-color:var(--ifm-color-info)}:where(.button--info):not(.button--outline):hover{--ifm-button-background-color:var(--ifm-color-info-dark);--ifm-button-border-color:var(--ifm-color-info-dark)}.button--info.button--active,.button--info:active{--ifm-button-background-color:var(--ifm-color-info-darker);--ifm-button-border-color:var(--ifm-color-info-darker)}:where(.button--warning){--ifm-button-background-color:var(--ifm-color-warning);--ifm-button-border-color:var(--ifm-color-warning)}:where(.button--warning):not(.button--outline):hover{--ifm-button-background-color:var(--ifm-color-warning-dark);--ifm-button-border-color:var(--ifm-color-warning-dark)}.button--warning.button--active,.button--warning:active{--ifm-button-background-color:var(--ifm-color-warning-darker);--ifm-button-border-color:var(--ifm-color-warning-darker)}:where(.button--danger){--ifm-button-background-color:var(--ifm-color-danger);--ifm-button-border-color:var(--ifm-color-danger)}:where(.button--danger):not(.button--outline):hover{--ifm-button-background-color:var(--ifm-color-danger-dark);--ifm-button-border-color:var(--ifm-color-danger-dark)}.button--danger.button--active,.button--danger:active{--ifm-button-background-color:var(--ifm-color-danger-darker);--ifm-button-border-color:var(--ifm-color-danger-darker)}.button-group{display:inline-flex;gap:var(--ifm-button-group-spacing)}.button-group>.button:not(:first-child){border-bottom-left-radius:0;border-top-left-radius:0}.button-group>.button:not(:last-child){border-bottom-right-radius:0;border-top-right-radius:0}.button-group--block{display:flex;justify-content:stretch}.button-group--block>.button{flex-grow:1}.card{background-color:var(--ifm-card-background-color);border-radius:var(--ifm-card-border-radius);box-shadow:var(--ifm-global-shadow-lw);display:flex;flex-direction:column;overflow:hidden}.card__image{padding-top:var(--ifm-card-vertical-spacing)}.card__image:first-child{padding-top:0}.card__body,.card__footer,.card__header{padding:var(--ifm-card-vertical-spacing) var(--ifm-card-horizontal-spacing)}.card__body:not(:last-child),.card__footer:not(:last-child),.card__header:not(:last-child){padding-bottom:0}.card__body>:last-child,.card__footer>:last-child,.card__header>:last-child{margin-bottom:0}.card__footer{margin-top:auto}.table-of-contents{font-size:.8rem;margin-bottom:0;padding:var(--ifm-toc-padding-vertical) 0}.table-of-contents,.table-of-contents ul{list-style:none;padding-left:var(--ifm-toc-padding-horizontal)}.table-of-contents li{margin:var(--ifm-toc-padding-vertical) var(--ifm-toc-padding-horizontal)}.table-of-contents__left-border{border-left:1px solid var(--ifm-toc-border-color)}.table-of-contents__link{color:var(--ifm-toc-link-color);display:block}.table-of-contents__link--active,.table-of-contents__link--active code,.table-of-contents__link:hover,.table-of-contents__link:hover code{color:var(--ifm-color-primary);text-decoration:none}.content_knG7 a,.hitFooter_E9YW a,.suggestion_fB_2.cursor_eG29 mark{text-decoration:underline}.close{color:var(--ifm-color-black);float:right;font-size:1.5rem;font-weight:var(--ifm-font-weight-bold);line-height:1;opacity:.5;padding:1rem;transition:opacity var(--ifm-transition-fast) var(--ifm-transition-timing-default)}.close:hover{opacity:.7}.close:focus,.header-discord-link:hover,.header-github-link:hover,.theme-code-block-highlighted-line .codeLineNumber_Tfdd:before{opacity:.8}.dropdown{display:inline-flex;font-weight:var(--ifm-dropdown-font-weight);position:relative;vertical-align:top}.dropdown--hoverable:hover .dropdown__menu,.dropdown--show .dropdown__menu{opacity:1;pointer-events:all;transform:translateY(-1px);visibility:visible}.dropdown--right .dropdown__menu{left:inherit;right:0}.dropdown--nocaret .navbar__link:after{content:none!important}.dropdown__menu{background-color:var(--ifm-dropdown-background-color);border-radius:var(--ifm-global-radius);box-shadow:var(--ifm-global-shadow-md);left:0;max-height:80vh;min-width:10rem;opacity:0;overflow-y:auto;padding:.5rem;pointer-events:none;position:absolute;top:calc(100% - var(--ifm-navbar-item-padding-vertical) + .3rem);transform:translateY(-.625rem);transition-duration:var(--ifm-transition-fast);transition-property:opacity,transform,visibility;transition-timing-function:var(--ifm-transition-timing-default);visibility:hidden;z-index:var(--ifm-z-index-dropdown)}.sidebar_re4s,.tableOfContents_bqdL{max-height:calc(100vh - var(--ifm-navbar-height) - 2rem)}.menu__caret,.menu__link,.menu__list-item-collapsible{border-radius:.25rem;transition:background var(--ifm-transition-fast) var(--ifm-transition-timing-default)}.dropdown__link{border-radius:.25rem;color:var(--ifm-dropdown-link-color);display:block;font-size:.875rem;margin-top:.2rem;padding:.25rem .5rem;white-space:nowrap}.dropdown__link--active,.dropdown__link:hover{background-color:var(--ifm-dropdown-hover-background-color);color:var(--ifm-dropdown-link-color);text-decoration:none}.dropdown__link--active,.dropdown__link--active:hover{--ifm-dropdown-link-color:var(--ifm-link-color)}.dropdown>.navbar__link:after{border-color:currentcolor #0000;border-style:solid;border-width:.4em .4em 0;content:"";margin-left:.3em;position:relative;top:2px;transform:translateY(-50%)}.footer{background-color:var(--ifm-footer-background-color);color:var(--ifm-footer-color);padding:var(--ifm-footer-padding-vertical) var(--ifm-footer-padding-horizontal)}.footer--dark{--ifm-footer-background-color:#303846;--ifm-footer-color:var(--ifm-footer-link-color);--ifm-footer-link-color:var(--ifm-color-secondary);--ifm-footer-title-color:var(--ifm-color-white)}.footer__links{margin-bottom:1rem}.footer__link-item{color:var(--ifm-footer-link-color);line-height:2}.footer__link-item:hover{color:var(--ifm-footer-link-hover-color)}.footer__link-separator{margin:0 var(--ifm-footer-link-horizontal-spacing)}.footer__logo{margin-top:1rem;max-width:var(--ifm-footer-logo-max-width)}.footer__title{color:var(--ifm-footer-title-color);font:700 var(--ifm-h4-font-size)/var(--ifm-heading-line-height) var(--ifm-font-family-base);margin-bottom:var(--ifm-heading-margin-bottom)}.menu,.navbar__link{font-weight:var(--ifm-font-weight-semibold)}.docItemContainer_Djhp article>:first-child,.docItemContainer_Djhp header+*,.footer__item{margin-top:0}.admonitionContent_BuS1>:last-child,.collapsibleContent_i85q p:last-child,.details_lb9f>summary>p:last-child,.footer__items,.searchResultItem_U687>h2,.tabItem_Ymn6>:last-child{margin-bottom:0}.codeBlockStandalone_MEMb,[type=checkbox]{padding:0}.hero{align-items:center;background-color:var(--ifm-hero-background-color);color:var(--ifm-hero-text-color);display:flex;padding:4rem 2rem}.hero--primary{--ifm-hero-background-color:var(--ifm-color-primary);--ifm-hero-text-color:var(--ifm-font-color-base-inverse)}.hero--dark{--ifm-hero-background-color:#303846;--ifm-hero-text-color:var(--ifm-color-white)}.hero__title,.title_f1Hy{font-size:3rem}.hero__subtitle{font-size:1.5rem}.menu__list{margin:0;padding-left:0}.menu__caret,.menu__link{padding:var(--ifm-menu-link-padding-vertical) var(--ifm-menu-link-padding-horizontal)}.menu__list .menu__list{flex:0 0 100%;margin-top:.25rem;padding-left:var(--ifm-menu-link-padding-horizontal)}.menu__list-item:not(:first-child){margin-top:.25rem}.menu__list-item--collapsed .menu__list{height:0;overflow:hidden}.details_lb9f[data-collapsed=false].isBrowser_bmU9>summary:before,.details_lb9f[open]:not(.isBrowser_bmU9)>summary:before,.menu__list-item--collapsed .menu__caret:before,.menu__list-item--collapsed .menu__link--sublist:after{transform:rotate(90deg)}.menu__list-item-collapsible{display:flex;flex-wrap:wrap;position:relative}.menu__caret:hover,.menu__link:hover,.menu__list-item-collapsible--active,.menu__list-item-collapsible:hover{background:var(--ifm-menu-color-background-hover)}.menu__list-item-collapsible .menu__link--active,.menu__list-item-collapsible .menu__link:hover{background:none!important}.menu__caret,.menu__link{align-items:center;display:flex}.menu__link{color:var(--ifm-menu-color);flex:1;line-height:1.25}.menu__link:hover{color:var(--ifm-menu-color);text-decoration:none}.menu__caret:before,.menu__link--sublist-caret:after{height:1.25rem;transform:rotate(180deg);transition:transform var(--ifm-transition-fast) linear;width:1.25rem;content:"";filter:var(--ifm-menu-link-sublist-icon-filter)}.menu__link--sublist-caret:after{background:var(--ifm-menu-link-sublist-icon) 50%/2rem 2rem;margin-left:auto;min-width:1.25rem}.menu__link--active,.menu__link--active:hover{color:var(--ifm-menu-color-active)}.navbar__brand,.navbar__link{color:var(--ifm-navbar-link-color)}.menu__link--active:not(.menu__link--sublist){background-color:var(--ifm-menu-color-background-active)}.menu__caret:before{background:var(--ifm-menu-link-sublist-icon) 50%/2rem 2rem}.navbar--dark,html[data-theme=dark]{--ifm-menu-link-sublist-icon-filter:invert(100%) sepia(94%) saturate(17%) hue-rotate(223deg) brightness(104%) contrast(98%)}.navbar{background-color:var(--ifm-navbar-background-color);box-shadow:var(--ifm-navbar-shadow);height:var(--ifm-navbar-height);padding:var(--ifm-navbar-padding-vertical) var(--ifm-navbar-padding-horizontal)}.navbar,.navbar>.container,.navbar>.container-fluid{display:flex}.navbar--fixed-top{position:sticky;top:0;z-index:var(--ifm-z-index-fixed)}.navbar-sidebar,.navbar-sidebar__backdrop{bottom:0;opacity:0;position:fixed;transition-duration:var(--ifm-transition-fast);transition-timing-function:ease-in-out;left:0;top:0;visibility:hidden}.navbar__inner{display:flex;flex-wrap:wrap;justify-content:space-between;width:100%}.navbar__brand{align-items:center;display:flex;margin-right:1rem;min-width:0}.navbar__brand:hover{color:var(--ifm-navbar-link-hover-color);text-decoration:none}.announcementBarContent_xLdY,.navbar__title{flex:1 1 auto}.navbar__toggle{display:none;margin-right:.5rem}.navbar__logo{flex:0 0 auto;height:2rem;margin-right:.5rem}.navbar__items{align-items:center;display:flex;flex:1;min-width:0}.navbar__items--center{flex:0 0 auto}.navbar__items--center .navbar__brand{margin:0}.navbar__items--center+.navbar__items--right{flex:1}.navbar__items--right{flex:0 0 auto;justify-content:flex-end}.navbar__items--right>:last-child{padding-right:0}.navbar__item{display:inline-block;padding:var(--ifm-navbar-item-padding-vertical) var(--ifm-navbar-item-padding-horizontal)}#nprogress,.navbar__item.dropdown .navbar__link:not([href]){pointer-events:none}.navbar__link--active,.navbar__link:hover{color:var(--ifm-navbar-link-hover-color);text-decoration:none}.navbar--dark,.navbar--primary{--ifm-menu-color:var(--ifm-color-gray-300);--ifm-navbar-link-color:var(--ifm-color-gray-100);--ifm-navbar-search-input-background-color:#ffffff1a;--ifm-navbar-search-input-placeholder-color:#ffffff80;color:var(--ifm-color-white)}.navbar--dark{--ifm-navbar-background-color:#242526;--ifm-menu-color-background-active:#ffffff0d;--ifm-navbar-search-input-color:var(--ifm-color-white)}.navbar--primary{--ifm-navbar-background-color:var(--ifm-color-primary);--ifm-navbar-link-hover-color:var(--ifm-color-white);--ifm-menu-color-active:var(--ifm-color-white);--ifm-navbar-search-input-color:var(--ifm-color-emphasis-500)}.navbar__search-input{-webkit-appearance:none;appearance:none;background:var(--ifm-navbar-search-input-background-color) var(--ifm-navbar-search-input-icon) no-repeat .75rem center/1rem 1rem;border:none;border-radius:2rem;color:var(--ifm-navbar-search-input-color);cursor:text;display:inline-block;font-size:1rem;height:2rem;padding:0 .5rem 0 2.25rem;width:12.5rem}.navbar__search-input::placeholder{color:var(--ifm-navbar-search-input-placeholder-color)}.navbar-sidebar{background-color:var(--ifm-navbar-background-color);box-shadow:var(--ifm-global-shadow-md);transform:translate3d(-100%,0,0);transition-property:opacity,visibility,transform;width:var(--ifm-navbar-sidebar-width)}.navbar-sidebar--show .navbar-sidebar,.navbar-sidebar__items{transform:translateZ(0)}.navbar-sidebar--show .navbar-sidebar,.navbar-sidebar--show .navbar-sidebar__backdrop{opacity:1;visibility:visible}.navbar-sidebar__backdrop{background-color:#0009;right:0;transition-property:opacity,visibility}.navbar-sidebar__brand{align-items:center;box-shadow:var(--ifm-navbar-shadow);display:flex;flex:1;height:var(--ifm-navbar-height);padding:var(--ifm-navbar-padding-vertical) var(--ifm-navbar-padding-horizontal)}.navbar-sidebar__items{display:flex;height:calc(100% - var(--ifm-navbar-height));transition:transform var(--ifm-transition-fast) ease-in-out}.navbar-sidebar__items--show-secondary{transform:translate3d(calc((var(--ifm-navbar-sidebar-width))*-1),0,0)}.navbar-sidebar__item{flex-shrink:0;padding:.5rem;width:calc(var(--ifm-navbar-sidebar-width))}.navbar-sidebar__back{background:var(--ifm-menu-color-background-active);font-size:15px;font-weight:var(--ifm-button-font-weight);margin:0 0 .2rem -.5rem;padding:.6rem 1.5rem;position:relative;text-align:left;top:-.5rem;width:calc(100% + 1rem)}.navbar-sidebar__close{display:flex;margin-left:auto}.pagination{column-gap:var(--ifm-pagination-page-spacing);display:flex;font-size:var(--ifm-pagination-font-size);padding-left:0}.pagination--sm{--ifm-pagination-font-size:0.8rem;--ifm-pagination-padding-horizontal:0.8rem;--ifm-pagination-padding-vertical:0.2rem}.pagination--lg{--ifm-pagination-font-size:1.2rem;--ifm-pagination-padding-horizontal:1.2rem;--ifm-pagination-padding-vertical:0.3rem}.pagination__item{display:inline-flex}.pagination__item>span{padding:var(--ifm-pagination-padding-vertical)}.pagination__item--active .pagination__link{color:var(--ifm-pagination-color-active)}.pagination__item--active .pagination__link,.pagination__item:not(.pagination__item--active):hover .pagination__link{background:var(--ifm-pagination-item-active-background)}.pagination__item--disabled,.pagination__item[disabled]{opacity:.25;pointer-events:none}.pagination__link{border-radius:var(--ifm-pagination-border-radius);color:var(--ifm-font-color-base);display:inline-block;padding:var(--ifm-pagination-padding-vertical) var(--ifm-pagination-padding-horizontal);transition:background var(--ifm-transition-fast) var(--ifm-transition-timing-default)}.pagination__link:hover,.sidebarItemLink_mo7H:hover{text-decoration:none}.pagination-nav{display:grid;grid-gap:var(--ifm-spacing-horizontal);gap:var(--ifm-spacing-horizontal);grid-template-columns:repeat(2,1fr)}.pagination-nav__link{border:1px solid var(--ifm-color-emphasis-300);border-radius:var(--ifm-pagination-nav-border-radius);display:block;height:100%;line-height:var(--ifm-heading-line-height);padding:var(--ifm-global-spacing);transition:border-color var(--ifm-transition-fast) var(--ifm-transition-timing-default)}.pagination-nav__link:hover{border-color:var(--ifm-pagination-nav-color-hover);text-decoration:none}.pagination-nav__link--next{grid-column:2/3;text-align:right}.pagination-nav__label{font-size:var(--ifm-h4-font-size);font-weight:var(--ifm-heading-font-weight);word-break:break-word}.pagination-nav__link--prev .pagination-nav__label:before{content:"« "}.pagination-nav__link--next .pagination-nav__label:after{content:" »"}.pagination-nav__sublabel{color:var(--ifm-color-content-secondary);font-size:var(--ifm-h5-font-size);font-weight:var(--ifm-font-weight-semibold);margin-bottom:.25rem}.pills__item,.tabs{font-weight:var(--ifm-font-weight-bold)}.pills{display:flex;gap:var(--ifm-pills-spacing);padding-left:0}.pills__item{border-radius:.5rem;cursor:pointer;display:inline-block;padding:.25rem 1rem;transition:background var(--ifm-transition-fast) var(--ifm-transition-timing-default)}.tabs,:not(.containsTaskList_mC6p>li)>.containsTaskList_mC6p{padding-left:0}.pills__item--active{color:var(--ifm-pills-color-active)}.pills__item--active,.pills__item:not(.pills__item--active):hover{background:var(--ifm-pills-color-background-active)}.pills--block{justify-content:stretch}.pills--block .pills__item{flex-grow:1;text-align:center}.tabs{color:var(--ifm-tabs-color);display:flex;margin-bottom:0;overflow-x:auto}.tabs__item{border-bottom:3px solid #0000;border-radius:var(--ifm-global-radius);cursor:pointer;display:inline-flex;padding:var(--ifm-tabs-padding-vertical) var(--ifm-tabs-padding-horizontal);transition:background-color var(--ifm-transition-fast) var(--ifm-transition-timing-default)}.tabs__item--active{border-bottom-color:var(--ifm-tabs-color-active-border);border-bottom-left-radius:0;border-bottom-right-radius:0;color:var(--ifm-tabs-color-active)}.tabs__item:hover{background-color:var(--ifm-hover-overlay)}.tabs--block{justify-content:stretch}.tabs--block .tabs__item{flex-grow:1;justify-content:center}html[data-theme=dark]{--ifm-color-scheme:dark;--ifm-color-emphasis-0:var(--ifm-color-gray-1000);--ifm-color-emphasis-100:var(--ifm-color-gray-900);--ifm-color-emphasis-200:var(--ifm-color-gray-800);--ifm-color-emphasis-300:var(--ifm-color-gray-700);--ifm-color-emphasis-400:var(--ifm-color-gray-600);--ifm-color-emphasis-600:var(--ifm-color-gray-400);--ifm-color-emphasis-700:var(--ifm-color-gray-300);--ifm-color-emphasis-800:var(--ifm-color-gray-200);--ifm-color-emphasis-900:var(--ifm-color-gray-100);--ifm-color-emphasis-1000:var(--ifm-color-gray-0);--ifm-background-color:#1b1b1d;--ifm-background-surface-color:#242526;--ifm-hover-overlay:#ffffff0d;--ifm-color-content:#e3e3e3;--ifm-color-content-secondary:#fff;--ifm-breadcrumb-separator-filter:invert(64%) sepia(11%) saturate(0%) hue-rotate(149deg) brightness(99%) contrast(95%);--ifm-code-background:#ffffff1a;--ifm-scrollbar-track-background-color:#444;--ifm-scrollbar-thumb-background-color:#686868;--ifm-scrollbar-thumb-hover-background-color:#7a7a7a;--ifm-table-stripe-background:#ffffff12;--ifm-toc-border-color:var(--ifm-color-emphasis-200);--ifm-color-primary-contrast-background:#102445;--ifm-color-primary-contrast-foreground:#ebf2fc;--ifm-color-secondary-contrast-background:#474748;--ifm-color-secondary-contrast-foreground:#fdfdfe;--ifm-color-success-contrast-background:#003100;--ifm-color-success-contrast-foreground:#e6f6e6;--ifm-color-info-contrast-background:#193c47;--ifm-color-info-contrast-foreground:#eef9fd;--ifm-color-warning-contrast-background:#4d3800;--ifm-color-warning-contrast-foreground:#fff8e6;--ifm-color-danger-contrast-background:#4b1113;--ifm-color-danger-contrast-foreground:#ffebec}#nprogress .bar{background:var(--docusaurus-progress-bar-color);height:2px;left:0;position:fixed;top:0;width:100%;z-index:1031}#nprogress .peg{box-shadow:0 0 10px var(--docusaurus-progress-bar-color),0 0 5px var(--docusaurus-progress-bar-color);height:100%;opacity:1;position:absolute;right:0;transform:rotate(3deg) translateY(-4px);width:100px}@font-face{font-family:Mona Sans;font-stretch:75% 125%;font-weight:500 900;src:url(/assets/fonts/Mona-Sans-2f40792e491758879b8530661f90743a.woff2) format("woff2 supports variations"),url(/assets/fonts/Mona-Sans-2f40792e491758879b8530661f90743a.woff2) format("woff2-variations")}@font-face{font-family:Inter;font-stretch:75% 125%;font-weight:200 900;src:url(/assets/fonts/Inter.var-c2fe3cb2b7c746f7966a973d869d21c3.woff2) format("woff2 supports variations"),url(/assets/fonts/Inter.var-c2fe3cb2b7c746f7966a973d869d21c3.woff2) format("woff2-variations")}@font-face{font-family:Monaspace Neon;font-stretch:100% 100%;font-weight:200 900;src:url(/assets/fonts/Monaspace-Neon-d42b5dfd306f7308ea84dbc6980c5140.woff2) format("woff2 supports variations"),url(/assets/fonts/Monaspace-Neon-d42b5dfd306f7308ea84dbc6980c5140.woff2) format("woff2-variations")}h4,h5,h6,html{font-family:Inter,sans-serif}h1,h2,h3{font-family:Mona Sans,sans-serif}code *{font-family:Monaspace Neon,monospace;font-variant-ligatures:discretionary-ligatures}[data-theme=dark],[data-theme=light]{--ifm-color-primary-darkest:oklch(66.47% 0.298 7);--ifm-color-primary-darker:oklch(66.47% 0.298 7);--ifm-color-primary-dark:oklch(66.47% 0.298 7);--ifm-color-primary:oklch(66.47% 0.298 7);--ifm-color-primary-light:oklch(66.47% 0.298 7);--ifm-color-primary-lighter:oklch(66.47% 0.298 7);--ifm-color-primary-lightest:oklch(66.47% 0.298 7)}.header-discord-link{height:24px}.header-discord-link:before{background:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 127.14 96.36'%3E%3Cpath fill='%235865F2' d='M107.7 8.07A105.2 105.2 0 0 0 81.47 0a72 72 0 0 0-3.36 6.83 97.7 97.7 0 0 0-29.11 0A72 72 0 0 0 45.64 0a106 106 0 0 0-26.25 8.09C2.79 32.65-1.71 56.6.54 80.21a105.7 105.7 0 0 0 32.17 16.15 77.7 77.7 0 0 0 6.89-11.11 68.4 68.4 0 0 1-10.85-5.18c.91-.66 1.8-1.34 2.66-2a75.57 75.57 0 0 0 64.32 0c.87.71 1.76 1.39 2.66 2a68.7 68.7 0 0 1-10.87 5.19 77 77 0 0 0 6.89 11.1 105.3 105.3 0 0 0 32.19-16.14c2.64-27.38-4.51-51.11-18.9-72.15M42.45 65.69C36.18 65.69 31 60 31 53s5-12.74 11.43-12.74S54 46 53.89 53s-5.05 12.69-11.44 12.69m42.24 0C78.41 65.69 73.25 60 73.25 53s5-12.74 11.44-12.74S96.23 46 96.12 53s-5.04 12.69-11.43 12.69'/%3E%3C/svg%3E") no-repeat;content:"";display:flex;height:24px;right:550px;width:24px}.header-github-link:before{background:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath d='M12 .297c-6.63 0-12 5.373-12 12 0 5.303 3.438 9.8 8.205 11.385.6.113.82-.258.82-.577 0-.285-.01-1.04-.015-2.04-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729 1.205.084 1.838 1.236 1.838 1.236 1.07 1.835 2.809 1.305 3.495.998.108-.776.417-1.305.76-1.605-2.665-.3-5.466-1.332-5.466-5.93 0-1.31.465-2.38 1.235-3.22-.135-.303-.54-1.523.105-3.176 0 0 1.005-.322 3.3 1.23.96-.267 1.98-.399 3-.405 1.02.006 2.04.138 3 .405 2.28-1.552 3.285-1.23 3.285-1.23.645 1.653.24 2.873.12 3.176.765.84 1.23 1.91 1.23 3.22 0 4.61-2.805 5.625-5.475 5.92.42.36.81 1.096.81 2.22 0 1.606-.015 2.896-.015 3.286 0 .315.21.69.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12'/%3E%3C/svg%3E") no-repeat;content:"";display:flex;height:24px;width:24px}html[data-theme=dark] .header-github-link:before{background:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath fill='%23fff' d='M12 .297c-6.63 0-12 5.373-12 12 0 5.303 3.438 9.8 8.205 11.385.6.113.82-.258.82-.577 0-.285-.01-1.04-.015-2.04-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729 1.205.084 1.838 1.236 1.838 1.236 1.07 1.835 2.809 1.305 3.495.998.108-.776.417-1.305.76-1.605-2.665-.3-5.466-1.332-5.466-5.93 0-1.31.465-2.38 1.235-3.22-.135-.303-.54-1.523.105-3.176 0 0 1.005-.322 3.3 1.23.96-.267 1.98-.399 3-.405 1.02.006 2.04.138 3 .405 2.28-1.552 3.285-1.23 3.285-1.23.645 1.653.24 2.873.12 3.176.765.84 1.23 1.91 1.23 3.22 0 4.61-2.805 5.625-5.475 5.92.42.36.81 1.096.81 2.22 0 1.606-.015 2.896-.015 3.286 0 .315.21.69.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12'/%3E%3C/svg%3E") no-repeat}.backToTopButton_sjWU{background-color:var(--ifm-color-emphasis-200);border-radius:50%;bottom:1.3rem;box-shadow:var(--ifm-global-shadow-lw);height:3rem;opacity:0;position:fixed;right:1.3rem;transform:scale(0);transition:all var(--ifm-transition-fast) var(--ifm-transition-timing-default);visibility:hidden;width:3rem;z-index:calc(var(--ifm-z-index-fixed) - 1)}.backToTopButton_sjWU:after{background-color:var(--ifm-color-emphasis-1000);content:" ";display:inline-block;height:100%;-webkit-mask:var(--ifm-menu-link-sublist-icon) 50%/2rem 2rem no-repeat;mask:var(--ifm-menu-link-sublist-icon) 50%/2rem 2rem no-repeat;width:100%}.backToTopButtonShow_xfvO{opacity:1;transform:scale(1);visibility:visible}.skipToContent_fXgn{background-color:var(--ifm-background-surface-color);color:var(--ifm-color-emphasis-900);left:100%;padding:calc(var(--ifm-global-spacing)/2) var(--ifm-global-spacing);position:fixed;top:1rem;z-index:calc(var(--ifm-z-index-fixed) + 1)}.skipToContent_fXgn:focus{box-shadow:var(--ifm-global-shadow-md);left:1rem}.closeButton_CVFx{line-height:0;padding:0}.content_knG7{font-size:85%;padding:5px 0;text-align:center}.content_knG7 a{color:inherit}.announcementBar_mb4j{align-items:center;background-color:var(--ifm-color-white);border-bottom:1px solid var(--ifm-color-emphasis-100);color:var(--ifm-color-black);display:flex;height:var(--docusaurus-announcement-bar-height)}#__docusaurus-base-url-issue-banner-container,.docSidebarContainer_YfHR,.hideAction_vcyE>svg,.navbarSearchContainer_Bca1:empty,.sidebarLogo_isFc,.themedComponent_mlkZ,[data-theme=dark] .lightToggleIcon_pyhR,[data-theme=light] .darkToggleIcon_wfgR,html[data-announcement-bar-initially-dismissed=true] .announcementBar_mb4j{display:none}.announcementBarPlaceholder_vyr4{flex:0 0 10px}.announcementBarClose_gvF7{align-self:stretch;flex:0 0 30px}.toggle_vylO{height:2rem;width:2rem}.toggleButton_gllP{align-items:center;border-radius:50%;display:flex;height:100%;justify-content:center;transition:background var(--ifm-transition-fast);width:100%}.toggleButton_gllP:hover{background:var(--ifm-color-emphasis-200)}.toggleButtonDisabled_aARS{cursor:not-allowed}.darkNavbarColorModeToggle_X3D1:hover{background:var(--ifm-color-gray-800)}[data-theme=dark] .themedComponent--dark_xIcU,[data-theme=light] .themedComponent--light_NVdE,html:not([data-theme]) .themedComponent--light_NVdE{display:initial}[data-theme=dark]:root{--docusaurus-collapse-button-bg:#ffffff0d;--docusaurus-collapse-button-bg-hover:#ffffff1a}.collapseSidebarButton_PEFL{display:none;margin:0}.iconExternalLink_nPIU{margin-left:.3rem}.docMainContainer_TBSr,.docRoot_UBD9{display:flex;width:100%}.docsWrapper_hBAB{display:flex;flex:1 0 auto}.dropdownNavbarItemMobile_S0Fm{cursor:pointer}.iconLanguage_nlXk{margin-right:5px;vertical-align:text-bottom}.searchBar_RVTs .dropdownMenu_qbY6{background:var(--search-local-modal-background,#f5f6f7);border-radius:6px;box-shadow:var(--search-local-modal-shadow,inset 1px 1px 0 0 #ffffff80,0 3px 8px 0 #555a64);left:auto!important;margin-top:8px;padding:var(--search-local-spacing,12px);position:relative;right:0!important;width:var(--search-local-modal-width,560px)}html[data-theme=dark] .searchBar_RVTs .dropdownMenu_qbY6{background:var(--search-local-modal-background,var(--ifm-background-color));box-shadow:var(--search-local-modal-shadow,inset 1px 1px 0 0 #2c2e40,0 3px 8px 0 #000309)}.searchBar_RVTs .dropdownMenu_qbY6 .suggestion_fB_2{align-items:center;background:var(--search-local-hit-background,#fff);border-radius:4px;box-shadow:var(--search-local-hit-shadow,0 1px 3px 0 #d4d9e1);color:var(--search-local-hit-color,#444950);cursor:pointer;display:flex;flex-direction:row;height:var(--search-local-hit-height,56px);padding:0 var(--search-local-spacing,12px);width:100%}.hitTree_kk6K,.noResults_l6Q3{align-items:center;display:flex}html[data-theme=dark] .dropdownMenu_qbY6 .suggestion_fB_2{background:var(--search-local-hit-background,var(--ifm-color-emphasis-100));box-shadow:var(--search-local-hit-shadow,none);color:var(--search-local-hit-color,var(--ifm-font-color-base))}.searchBar_RVTs .dropdownMenu_qbY6 .suggestion_fB_2:not(:last-child){margin-bottom:4px}.searchBar_RVTs .dropdownMenu_qbY6 .suggestion_fB_2.cursor_eG29{background-color:var(--search-local-highlight-color,var(--ifm-color-primary))}.hitFooter_E9YW a,.hitIcon_a7Zy,.hitPath_ieM4,.hitTree_kk6K,.noResultsIcon_EBY5{color:var(--search-local-muted-color,#969faf)}html[data-theme=dark] .hitIcon_a7Zy,html[data-theme=dark] .hitPath_ieM4,html[data-theme=dark] .hitTree_kk6K,html[data-theme=dark] .noResultsIcon_EBY5{color:var(--search-local-muted-color,var(--ifm-color-secondary-darkest))}.hitTree_kk6K>svg{height:var(--search-local-hit-height,56px);opacity:.5;width:24px}.hitIcon_a7Zy,.hitTree_kk6K>svg{stroke-width:var(--search-local-icon-stroke-width,1.4)}.hitAction_NqkB,.hitIcon_a7Zy{height:20px;width:20px}.hitWrapper_sAK8{display:flex;flex:1 1 auto;flex-direction:column;font-weight:500;justify-content:center;margin:0 8px;overflow-x:hidden;width:80%}.hitWrapper_sAK8 mark{background:none;color:var(--search-local-highlight-color,var(--ifm-color-primary))}.hitTitle_vyVt{font-size:.9em}.hitPath_ieM4{font-size:.75em}.hitPath_ieM4,.hitTitle_vyVt{overflow-x:hidden;text-overflow:ellipsis;white-space:nowrap}.noResults_l6Q3{flex-direction:column;justify-content:center;padding:var(--search-local-spacing,12px) 0}.noResultsIcon_EBY5{margin-bottom:var(--search-local-spacing,12px)}.hitFooter_E9YW{font-size:.85em;margin-top:var(--search-local-spacing,12px);text-align:center}.cursor_eG29 .hideAction_vcyE>svg,.tocCollapsibleContent_vkbj a{display:block}.suggestion_fB_2.cursor_eG29,.suggestion_fB_2.cursor_eG29 .hitIcon_a7Zy,.suggestion_fB_2.cursor_eG29 .hitPath_ieM4,.suggestion_fB_2.cursor_eG29 .hitTree_kk6K,.suggestion_fB_2.cursor_eG29 mark{color:var(--search-local-hit-active-color,var(--ifm-color-white))!important}.searchBarContainer_NW3z{margin-left:16px}.searchBarContainer_NW3z .searchBarLoadingRing_YnHq{display:none;left:10px;position:absolute;top:6px}.searchBarContainer_NW3z .searchClearButton_qk4g{background:none;border:none;line-height:1rem;padding:0;position:absolute;right:.8rem;top:50%;transform:translateY(-50%)}.navbar__search{position:relative}.searchIndexLoading_EJ1f .navbar__search-input{background-image:none}.searchHintContainer_Pkmr{align-items:center;display:flex;gap:4px;height:100%;justify-content:center;pointer-events:none;position:absolute;right:10px;top:0}.searchHint_iIMx{background-color:var(--ifm-navbar-search-input-background-color);border:1px solid var(--ifm-color-emphasis-500);box-shadow:inset 0 -1px 0 var(--ifm-color-emphasis-500);color:var(--ifm-navbar-search-input-placeholder-color)}.loadingRing_RJI3{display:inline-block;height:20px;opacity:var(--search-local-loading-icon-opacity,.5);position:relative;width:20px}.authorSocialIcon_XYv3,.authorSocialLink_owbf,.authorSocials_rSDt{height:var(--docusaurus-blog-social-icon-size)}.loadingRing_RJI3 div{animation:1.2s cubic-bezier(.5,0,.5,1) infinite a;border:2px solid var(--search-load-loading-icon-color,var(--ifm-navbar-search-input-color));border-color:var(--search-load-loading-icon-color,var(--ifm-navbar-search-input-color)) #0000 #0000 #0000;border-radius:50%;display:block;height:16px;margin:2px;position:absolute;width:16px}.loadingRing_RJI3 div:first-child{animation-delay:-.45s}.loadingRing_RJI3 div:nth-child(2){animation-delay:-.3s}.loadingRing_RJI3 div:nth-child(3){animation-delay:-.15s}@keyframes a{0%{transform:rotate(0)}to{transform:rotate(1turn)}}.navbarHideable_m1mJ{transition:transform var(--ifm-transition-fast) ease}.navbarHidden_jGov{transform:translate3d(0,calc(-100% - 2px),0)}.errorBoundaryError_a6uf{color:red;white-space:pre-wrap}.errorBoundaryFallback_VBag{color:red;padding:.55rem}.footerLogoLink_BH7S{opacity:.5;transition:opacity var(--ifm-transition-fast) var(--ifm-transition-timing-default)}.footerLogoLink_BH7S:hover,.hash-link:focus,:hover>.hash-link{opacity:1}body:not(.navigation-with-keyboard) :not(input):focus{outline:0}.anchorWithStickyNavbar_LWe7{scroll-margin-top:calc(var(--ifm-navbar-height) + .5rem)}.anchorWithHideOnScrollNavbar_WYt5{scroll-margin-top:.5rem}.hash-link{opacity:0;padding-left:.5rem;transition:opacity var(--ifm-transition-fast);-webkit-user-select:none;user-select:none}.hash-link:before{content:"#"}.mainWrapper_z2l0{display:flex;flex:1 0 auto;flex-direction:column}.docusaurus-mt-lg{margin-top:3rem}#__docusaurus{display:flex;flex-direction:column;min-height:100%}.sidebar_re4s{overflow-y:auto;position:sticky;top:calc(var(--ifm-navbar-height) + 2rem)}.sidebarItemTitle_pO2u{font-size:var(--ifm-h3-font-size);font-weight:var(--ifm-font-weight-bold)}.container_mt6G,.sidebarItemList_Yudw{font-size:.9rem}.sidebarItem__DBe{margin-top:.7rem}.sidebarItemLink_mo7H{color:var(--ifm-font-color-base);display:block}.sidebarItemLinkActive_I1ZP{color:var(--ifm-color-primary)!important}.yearGroupHeading_rMGB{margin-bottom:.4rem;margin-top:1.6rem}.yearGroupHeading_QT03{margin:1rem .75rem .5rem}.searchContextInput_mXoe,.searchQueryInput_CFBF{background:var(--ifm-background-color);border:var(--ifm-global-border-width) solid var(--ifm-color-content-secondary);border-radius:var(--ifm-global-radius);color:var(--ifm-font-color-base);font-size:var(--ifm-font-size-base);margin-bottom:1rem;padding:.5rem;width:100%}.authorSocialIcon_XYv3,.authorSocialLink_owbf{width:var(--docusaurus-blog-social-icon-size)}.searchResultItem_U687{border-bottom:1px solid #dfe3e8;padding:1rem 0}.searchResultItemPath_uIbk{color:var(--ifm-color-content-secondary);font-size:.8rem;margin:.5rem 0 0}.searchResultItemSummary_oZHr{font-style:italic;margin:.5rem 0 0}[data-theme=dark] .githubSvg_Uu4N,[data-theme=dark] .xSvg_y3PF{fill:var(--light)}[data-theme=light] .githubSvg_Uu4N,[data-theme=light] .xSvg_y3PF{fill:var(--dark)}.authorSocials_rSDt{align-items:center;display:flex;flex-wrap:wrap;line-clamp:1;-webkit-line-clamp:1}.authorSocialLink_owbf,.authorSocials_rSDt{line-height:0}.authorSocialLink_owbf{margin-right:.4rem}.authorImage_XqGP{--ifm-avatar-photo-size:3.6rem}.author-as-h1_n9oJ .authorImage_XqGP{--ifm-avatar-photo-size:7rem}.author-as-h2_gXvM .authorImage_XqGP{--ifm-avatar-photo-size:5.4rem}.authorDetails_lV9A{align-items:flex-start;display:flex;flex-direction:column;justify-content:space-around}.authorName_yefp{display:flex;flex-direction:row;font-size:1.1rem;line-height:1.1rem}.author-as-h1_n9oJ .authorName_yefp{display:inline;font-size:2.4rem;line-height:2.4rem}.author-as-h2_gXvM .authorName_yefp{display:inline;font-size:1.4rem;line-height:1.4rem}.authorTitle_nd0D{display:-webkit-box;font-size:.8rem;line-height:.8rem;line-clamp:1;-webkit-line-clamp:1}.author-as-h1_n9oJ .authorTitle_nd0D{font-size:1.2rem;line-height:1.2rem}.author-as-h2_gXvM .authorTitle_nd0D{font-size:1rem;line-height:1rem}.authorBlogPostCount_iiJ5{background:var(--ifm-color-secondary);border-radius:var(--ifm-global-radius);color:var(--ifm-color-black);font-size:.8rem;line-height:1.2;margin-left:.3rem;padding:.1rem .4rem}.buttonGroup__atx button,.codeBlockContainer_Ckt0{background:var(--prism-background-color);color:var(--prism-color)}.authorCol_Hf19{max-width:inherit!important}.imageOnlyAuthorRow_pa_O{display:flex;flex-flow:row wrap}.imageOnlyAuthorCol_G86a{margin-left:.3rem;margin-right:.3rem}.heroBanner_qdFl{overflow:hidden;padding:4rem 0;position:relative;text-align:center}.buttons_AeoN{align-items:center;display:flex;justify-content:center}.codeBlockContainer_Ckt0{border-radius:var(--ifm-code-border-radius);box-shadow:var(--ifm-global-shadow-lw);margin-bottom:var(--ifm-leading)}.codeBlockContent_biex{border-radius:inherit;direction:ltr;position:relative}.codeBlockTitle_Ktv7{border-bottom:1px solid var(--ifm-color-emphasis-300);border-top-left-radius:inherit;border-top-right-radius:inherit;font-size:var(--ifm-code-font-size);font-weight:500;padding:.75rem var(--ifm-pre-padding)}.codeBlock_bY9V{--ifm-pre-background:var(--prism-background-color);margin:0;padding:0}.codeBlockTitle_Ktv7+.codeBlockContent_biex .codeBlock_bY9V{border-top-left-radius:0;border-top-right-radius:0}.codeBlockLines_e6Vv{float:left;font:inherit;min-width:100%;padding:var(--ifm-pre-padding)}.codeBlockLinesWithNumbering_o6Pm{display:table;padding:var(--ifm-pre-padding) 0}.buttonGroup__atx{column-gap:.2rem;display:flex;position:absolute;right:calc(var(--ifm-pre-padding)/2);top:calc(var(--ifm-pre-padding)/2)}.buttonGroup__atx button{align-items:center;border:1px solid var(--ifm-color-emphasis-300);border-radius:var(--ifm-global-radius);display:flex;line-height:0;opacity:0;padding:.4rem;transition:opacity var(--ifm-transition-fast) ease-in-out}.buttonGroup__atx button:focus-visible,.buttonGroup__atx button:hover{opacity:1!important}.theme-code-block:hover .buttonGroup__atx button{opacity:.4}:where(:root){--docusaurus-highlighted-code-line-bg:#484d5b}:where([data-theme=dark]){--docusaurus-highlighted-code-line-bg:#646464}.theme-code-block-highlighted-line{background-color:var(--docusaurus-highlighted-code-line-bg);display:block;margin:0 calc(var(--ifm-pre-padding)*-1);padding:0 var(--ifm-pre-padding)}.codeLine_lJS_{counter-increment:a;display:table-row}.codeLineNumber_Tfdd{background:var(--ifm-pre-background);display:table-cell;left:0;overflow-wrap:normal;padding:0 var(--ifm-pre-padding);position:sticky;text-align:right;width:1%}.codeLineNumber_Tfdd:before{content:counter(a);opacity:.4}.codeLineContent_feaV{padding-right:var(--ifm-pre-padding)}.theme-code-block:hover .copyButtonCopied_obH4{opacity:1!important}.copyButtonIcons_eSgA{height:1.125rem;position:relative;width:1.125rem}.copyButtonIcon_y97N,.copyButtonSuccessIcon_LjdS{left:0;position:absolute;top:0;fill:currentColor;height:inherit;opacity:inherit;transition:all var(--ifm-transition-fast) ease;width:inherit}.copyButtonSuccessIcon_LjdS{color:#00d600;left:50%;opacity:0;top:50%;transform:translate(-50%,-50%) scale(.33)}.copyButtonCopied_obH4 .copyButtonIcon_y97N{opacity:0;transform:scale(.33)}.copyButtonCopied_obH4 .copyButtonSuccessIcon_LjdS{opacity:1;transform:translate(-50%,-50%) scale(1);transition-delay:75ms}.tag_zVej{border:1px solid var(--docusaurus-tag-list-border);transition:border var(--ifm-transition-fast)}.tag_zVej:hover{--docusaurus-tag-list-border:var(--ifm-link-color);text-decoration:none}.tagRegular_sFm0{border-radius:var(--ifm-global-radius);font-size:90%;padding:.2rem .5rem .3rem}.tagWithCount_h2kH{align-items:center;border-left:0;display:flex;padding:0 .5rem 0 1rem;position:relative}.tagWithCount_h2kH:after,.tagWithCount_h2kH:before{border:1px solid var(--docusaurus-tag-list-border);content:"";position:absolute;top:50%;transition:inherit}.tagWithCount_h2kH:before{border-bottom:0;border-right:0;height:1.18rem;right:100%;transform:translate(50%,-50%) rotate(-45deg);width:1.18rem}.tagWithCount_h2kH:after{border-radius:50%;height:.5rem;left:0;transform:translateY(-50%);width:.5rem}.tagWithCount_h2kH span{background:var(--ifm-color-secondary);border-radius:var(--ifm-global-radius);color:var(--ifm-color-black);font-size:.7rem;line-height:1.2;margin-left:.3rem;padding:.1rem .4rem}.tag_Nnez{display:inline-block;margin:.5rem .5rem 0 1rem}.wordWrapButtonIcon_Bwma{height:1.2rem;width:1.2rem}.tags_jXut{display:inline}.tag_QGVx{display:inline-block;margin:0 .4rem .5rem 0}.iconEdit_Z9Sw{margin-right:.3em;vertical-align:sub}.details_lb9f{--docusaurus-details-summary-arrow-size:0.38rem;--docusaurus-details-transition:transform 200ms ease;--docusaurus-details-decoration-color:grey}.details_lb9f>summary{cursor:pointer;padding-left:1rem;position:relative}.details_lb9f>summary::-webkit-details-marker{display:none}.details_lb9f>summary:before{border-color:#0000 #0000 #0000 var(--docusaurus-details-decoration-color);border-style:solid;border-width:var(--docusaurus-details-summary-arrow-size);content:"";left:0;position:absolute;top:.45rem;transform:rotate(0);transform-origin:calc(var(--docusaurus-details-summary-arrow-size)/2) 50%;transition:var(--docusaurus-details-transition)}.collapsibleContent_i85q{border-top:1px solid var(--docusaurus-details-decoration-color);margin-top:1rem;padding-top:1rem}.lastUpdated_JAkA{font-size:smaller;font-style:italic;margin-top:.2rem}.tocCollapsibleButton_TO0P{align-items:center;display:flex;font-size:inherit;justify-content:space-between;padding:.4rem .8rem;width:100%}.tocCollapsibleButton_TO0P:after{background:var(--ifm-menu-link-sublist-icon) 50% 50%/2rem 2rem no-repeat;content:"";filter:var(--ifm-menu-link-sublist-icon-filter);height:1.25rem;transform:rotate(180deg);transition:transform var(--ifm-transition-fast);width:1.25rem}.tocCollapsibleButtonExpanded_MG3E:after,.tocCollapsibleExpanded_sAul{transform:none}.tocCollapsible_ETCw{background-color:var(--ifm-menu-color-background-active);border-radius:var(--ifm-global-radius);margin:1rem 0}.tocCollapsibleContent_vkbj>ul{border-left:none;border-top:1px solid var(--ifm-color-emphasis-300);font-size:15px;padding:.2rem 0}.tocCollapsibleContent_vkbj ul li{margin:.4rem .8rem}.details_b_Ee{--docusaurus-details-decoration-color:var(--ifm-alert-border-color);--docusaurus-details-transition:transform var(--ifm-transition-fast) ease;border:1px solid var(--ifm-alert-border-color);margin:0 0 var(--ifm-spacing-vertical)}.img_ev3q{height:auto}.tableOfContents_bqdL{overflow-y:auto;position:sticky;top:calc(var(--ifm-navbar-height) + 1rem)}.admonition_xJq3{margin-bottom:1em}.admonitionHeading_Gvgb{font:var(--ifm-heading-font-weight) var(--ifm-h5-font-size)/var(--ifm-heading-line-height) var(--ifm-heading-font-family)}.admonitionHeading_Gvgb:not(:last-child){margin-bottom:.3rem}.admonitionHeading_Gvgb code{text-transform:none}.admonitionIcon_Rf37{display:inline-block;margin-right:.4em;vertical-align:middle}.admonitionIcon_Rf37 svg{display:inline-block;height:1.6em;width:1.6em;fill:var(--ifm-alert-foreground-color)}.breadcrumbHomeIcon_YNFT{height:1.1rem;position:relative;top:1px;vertical-align:top;width:1.1rem}.breadcrumbsContainer_Z_bl{--ifm-breadcrumb-size-multiplier:0.8;margin-bottom:.8rem}.mdxPageWrapper_j9I6{justify-content:center}@media (min-width:997px){.collapseSidebarButton_PEFL,.expandButton_TmdG{background-color:var(--docusaurus-collapse-button-bg)}:root{--docusaurus-announcement-bar-height:30px}.announcementBarClose_gvF7,.announcementBarPlaceholder_vyr4{flex-basis:50px}.collapseSidebarButton_PEFL{border:1px solid var(--ifm-toc-border-color);border-radius:0;bottom:0;display:block!important;height:40px;position:sticky}.collapseSidebarButtonIcon_kv0_{margin-top:4px;transform:rotate(180deg)}.expandButtonIcon_i1dp,[dir=rtl] .collapseSidebarButtonIcon_kv0_{transform:rotate(0)}.collapseSidebarButton_PEFL:focus,.collapseSidebarButton_PEFL:hover,.expandButton_TmdG:focus,.expandButton_TmdG:hover{background-color:var(--docusaurus-collapse-button-bg-hover)}.menuHtmlItem_M9Kj{padding:var(--ifm-menu-link-padding-vertical) var(--ifm-menu-link-padding-horizontal)}.menu_SIkG{flex-grow:1;padding:.5rem}@supports (scrollbar-gutter:stable){.menu_SIkG{padding:.5rem 0 .5rem .5rem;scrollbar-gutter:stable}}.menuWithAnnouncementBar_GW3s{margin-bottom:var(--docusaurus-announcement-bar-height)}.sidebar_njMd{display:flex;flex-direction:column;height:100%;padding-top:var(--ifm-navbar-height);width:var(--doc-sidebar-width)}.sidebarWithHideableNavbar_wUlq{padding-top:0}.sidebarHidden_VK0M{opacity:0;visibility:hidden}.sidebarLogo_isFc{align-items:center;color:inherit!important;display:flex!important;margin:0 var(--ifm-navbar-padding-horizontal);max-height:var(--ifm-navbar-height);min-height:var(--ifm-navbar-height);text-decoration:none!important}.sidebarLogo_isFc img{height:2rem;margin-right:.5rem}.expandButton_TmdG{align-items:center;display:flex;height:100%;justify-content:center;position:absolute;right:0;top:0;transition:background-color var(--ifm-transition-fast) ease;width:100%}[dir=rtl] .expandButtonIcon_i1dp{transform:rotate(180deg)}.docSidebarContainer_YfHR{border-right:1px solid var(--ifm-toc-border-color);-webkit-clip-path:inset(0);clip-path:inset(0);display:block;margin-top:calc(var(--ifm-navbar-height)*-1);transition:width var(--ifm-transition-fast) ease;width:var(--doc-sidebar-width);will-change:width}.docSidebarContainerHidden_DPk8{cursor:pointer;width:var(--doc-sidebar-hidden-width)}.sidebarViewport_aRkj{height:100%;max-height:100vh;position:sticky;top:0}.docMainContainer_TBSr{flex-grow:1;max-width:calc(100% - var(--doc-sidebar-width))}.docMainContainerEnhanced_lQrH{max-width:calc(100% - var(--doc-sidebar-hidden-width))}.docItemWrapperEnhanced_JWYK{max-width:calc(var(--ifm-container-width) + var(--doc-sidebar-width))!important}.navbarSearchContainer_Bca1{padding:var(--ifm-navbar-item-padding-vertical) var(--ifm-navbar-item-padding-horizontal)}.lastUpdated_JAkA{text-align:right}.tocMobile_ITEo{display:none}.docItemCol_VOVn{max-width:75%!important}}@media (min-width:1440px){.container{max-width:var(--ifm-container-width-xl)}}@media (max-width:996px){.col{--ifm-col-width:100%;flex-basis:var(--ifm-col-width);margin-left:0}.footer{--ifm-footer-padding-horizontal:0}.colorModeToggle_DEke,.footer__link-separator,.navbar__item,.sidebar_re4s,.tableOfContents_bqdL{display:none}.footer__col{margin-bottom:calc(var(--ifm-spacing-vertical)*3)}.footer__link-item{display:block}.hero{padding-left:0;padding-right:0}.navbar>.container,.navbar>.container-fluid{padding:0}.navbar__toggle{display:inherit}.navbar__search-input{width:9rem}.pills--block,.tabs--block{flex-direction:column}.navbarSearchContainer_Bca1{position:absolute;right:var(--ifm-navbar-padding-horizontal)}.docItemContainer_F8PC{padding:0 .3rem}}@media not (max-width:996px){.searchBar_RVTs.searchBarLeft_MXDe .dropdownMenu_qbY6{left:0!important;right:auto!important}}@media only screen and (max-width:996px){.searchQueryColumn_q7nx{max-width:60%!important}.searchContextColumn_oWAF{max-width:40%!important}}@media screen and (max-width:996px){.heroBanner_qdFl{padding:2rem}}@media (max-width:576px){.markdown h1:first-child{--ifm-h1-font-size:2rem}.markdown>h2{--ifm-h2-font-size:1.5rem}.markdown>h3{--ifm-h3-font-size:1.25rem}.navbar__search-input:not(:focus){width:2rem}.searchBar_RVTs .dropdownMenu_qbY6{max-width:calc(100vw - var(--ifm-navbar-padding-horizontal)*2);width:var(--search-local-modal-width-sm,340px)}.searchBarContainer_NW3z:not(.focused_OWtg) .searchClearButton_qk4g,.searchHintContainer_Pkmr{display:none}.title_f1Hy{font-size:2rem}}@media screen and (max-width:576px){.searchQueryColumn_q7nx{max-width:100%!important}.searchContextColumn_oWAF{max-width:100%!important;padding-left:var(--ifm-spacing-horizontal)!important}}@media (hover:hover){.backToTopButton_sjWU:hover{background-color:var(--ifm-color-emphasis-300)}}@media (pointer:fine){.thin-scrollbar{scrollbar-width:thin}.thin-scrollbar::-webkit-scrollbar{height:var(--ifm-scrollbar-size);width:var(--ifm-scrollbar-size)}.thin-scrollbar::-webkit-scrollbar-track{background:var(--ifm-scrollbar-track-background-color);border-radius:10px}.thin-scrollbar::-webkit-scrollbar-thumb{background:var(--ifm-scrollbar-thumb-background-color);border-radius:10px}.thin-scrollbar::-webkit-scrollbar-thumb:hover{background:var(--ifm-scrollbar-thumb-hover-background-color)}}@media (prefers-reduced-motion:reduce){:root{--ifm-transition-fast:0ms;--ifm-transition-slow:0ms}}@media print{.announcementBar_mb4j,.footer,.menu,.navbar,.pagination-nav,.table-of-contents,.tocMobile_ITEo{display:none}.tabs{page-break-inside:avoid}.codeBlockLines_e6Vv{white-space:pre-wrap}} \ No newline at end of file +.col,.container{padding:0 var(--ifm-spacing-horizontal);width:100%}.markdown>h2,.markdown>h3,.markdown>h4,.markdown>h5,.markdown>h6{margin-bottom:calc(var(--ifm-heading-vertical-rhythm-bottom)*var(--ifm-leading))}.markdown li,body{word-wrap:break-word}body,ol ol,ol ul,ul ol,ul ul{margin:0}pre,table{overflow:auto}blockquote,pre{margin:0 0 var(--ifm-spacing-vertical)}.breadcrumbs__link,.button{transition-timing-function:var(--ifm-transition-timing-default)}.button,code{vertical-align:middle}.button--outline.button--active,.button--outline:active,.button--outline:hover,:root{--ifm-button-color:var(--ifm-font-color-base-inverse)}.menu__link:hover,a{transition:color var(--ifm-transition-fast) var(--ifm-transition-timing-default)}.navbar--dark,:root{--ifm-navbar-link-hover-color:var(--ifm-color-primary)}.menu,.navbar-sidebar{overflow-x:hidden}:root,html[data-theme=dark]{--ifm-color-emphasis-500:var(--ifm-color-gray-500)}.toggleButton_gllP,html{-webkit-tap-highlight-color:transparent}*,.loadingRing_RJI3 div{box-sizing:border-box}.authorSocials_rSDt,.authorTitle_nd0D{-webkit-box-orient:vertical;overflow:hidden}.clean-list,.containsTaskList_mC6p,.details_lb9f>summary,.dropdown__menu,.menu__list{list-style:none}:root{--ifm-color-scheme:light;--ifm-dark-value:10%;--ifm-darker-value:15%;--ifm-darkest-value:30%;--ifm-light-value:15%;--ifm-lighter-value:30%;--ifm-lightest-value:50%;--ifm-contrast-background-value:90%;--ifm-contrast-foreground-value:70%;--ifm-contrast-background-dark-value:70%;--ifm-contrast-foreground-dark-value:90%;--ifm-color-primary:#3578e5;--ifm-color-secondary:#ebedf0;--ifm-color-success:#00a400;--ifm-color-info:#54c7ec;--ifm-color-warning:#ffba00;--ifm-color-danger:#fa383e;--ifm-color-primary-dark:#306cce;--ifm-color-primary-darker:#2d66c3;--ifm-color-primary-darkest:#2554a0;--ifm-color-primary-light:#538ce9;--ifm-color-primary-lighter:#72a1ed;--ifm-color-primary-lightest:#9abcf2;--ifm-color-primary-contrast-background:#ebf2fc;--ifm-color-primary-contrast-foreground:#102445;--ifm-color-secondary-dark:#d4d5d8;--ifm-color-secondary-darker:#c8c9cc;--ifm-color-secondary-darkest:#a4a6a8;--ifm-color-secondary-light:#eef0f2;--ifm-color-secondary-lighter:#f1f2f5;--ifm-color-secondary-lightest:#f5f6f8;--ifm-color-secondary-contrast-background:#fdfdfe;--ifm-color-secondary-contrast-foreground:#474748;--ifm-color-success-dark:#009400;--ifm-color-success-darker:#008b00;--ifm-color-success-darkest:#007300;--ifm-color-success-light:#26b226;--ifm-color-success-lighter:#4dbf4d;--ifm-color-success-lightest:#80d280;--ifm-color-success-contrast-background:#e6f6e6;--ifm-color-success-contrast-foreground:#003100;--ifm-color-info-dark:#4cb3d4;--ifm-color-info-darker:#47a9c9;--ifm-color-info-darkest:#3b8ba5;--ifm-color-info-light:#6ecfef;--ifm-color-info-lighter:#87d8f2;--ifm-color-info-lightest:#aae3f6;--ifm-color-info-contrast-background:#eef9fd;--ifm-color-info-contrast-foreground:#193c47;--ifm-color-warning-dark:#e6a700;--ifm-color-warning-darker:#d99e00;--ifm-color-warning-darkest:#b38200;--ifm-color-warning-light:#ffc426;--ifm-color-warning-lighter:#ffcf4d;--ifm-color-warning-lightest:#ffdd80;--ifm-color-warning-contrast-background:#fff8e6;--ifm-color-warning-contrast-foreground:#4d3800;--ifm-color-danger-dark:#e13238;--ifm-color-danger-darker:#d53035;--ifm-color-danger-darkest:#af272b;--ifm-color-danger-light:#fb565b;--ifm-color-danger-lighter:#fb7478;--ifm-color-danger-lightest:#fd9c9f;--ifm-color-danger-contrast-background:#ffebec;--ifm-color-danger-contrast-foreground:#4b1113;--ifm-color-white:#fff;--ifm-color-black:#000;--ifm-color-gray-0:var(--ifm-color-white);--ifm-color-gray-100:#f5f6f7;--ifm-color-gray-200:#ebedf0;--ifm-color-gray-300:#dadde1;--ifm-color-gray-400:#ccd0d5;--ifm-color-gray-500:#bec3c9;--ifm-color-gray-600:#8d949e;--ifm-color-gray-700:#606770;--ifm-color-gray-800:#444950;--ifm-color-gray-900:#1c1e21;--ifm-color-gray-1000:var(--ifm-color-black);--ifm-color-emphasis-0:var(--ifm-color-gray-0);--ifm-color-emphasis-100:var(--ifm-color-gray-100);--ifm-color-emphasis-200:var(--ifm-color-gray-200);--ifm-color-emphasis-300:var(--ifm-color-gray-300);--ifm-color-emphasis-400:var(--ifm-color-gray-400);--ifm-color-emphasis-600:var(--ifm-color-gray-600);--ifm-color-emphasis-700:var(--ifm-color-gray-700);--ifm-color-emphasis-800:var(--ifm-color-gray-800);--ifm-color-emphasis-900:var(--ifm-color-gray-900);--ifm-color-emphasis-1000:var(--ifm-color-gray-1000);--ifm-color-content:var(--ifm-color-emphasis-900);--ifm-color-content-inverse:var(--ifm-color-emphasis-0);--ifm-color-content-secondary:#525860;--ifm-background-color:#0000;--ifm-background-surface-color:var(--ifm-color-content-inverse);--ifm-global-border-width:1px;--ifm-global-radius:0.4rem;--ifm-hover-overlay:#0000000d;--ifm-font-color-base:var(--ifm-color-content);--ifm-font-color-base-inverse:var(--ifm-color-content-inverse);--ifm-font-color-secondary:var(--ifm-color-content-secondary);--ifm-font-family-base:system-ui,-apple-system,Segoe UI,Roboto,Ubuntu,Cantarell,Noto Sans,sans-serif,BlinkMacSystemFont,"Segoe UI",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol";--ifm-font-family-monospace:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;--ifm-font-size-base:100%;--ifm-font-weight-light:300;--ifm-font-weight-normal:400;--ifm-font-weight-semibold:500;--ifm-font-weight-bold:700;--ifm-font-weight-base:var(--ifm-font-weight-normal);--ifm-line-height-base:1.65;--ifm-global-spacing:1rem;--ifm-spacing-vertical:var(--ifm-global-spacing);--ifm-spacing-horizontal:var(--ifm-global-spacing);--ifm-transition-fast:200ms;--ifm-transition-slow:400ms;--ifm-transition-timing-default:cubic-bezier(0.08,0.52,0.52,1);--ifm-global-shadow-lw:0 1px 2px 0 #0000001a;--ifm-global-shadow-md:0 5px 40px #0003;--ifm-global-shadow-tl:0 12px 28px 0 #0003,0 2px 4px 0 #0000001a;--ifm-z-index-dropdown:100;--ifm-z-index-fixed:200;--ifm-z-index-overlay:400;--ifm-container-width:1140px;--ifm-container-width-xl:1320px;--ifm-code-background:#f6f7f8;--ifm-code-border-radius:var(--ifm-global-radius);--ifm-code-font-size:90%;--ifm-code-padding-horizontal:0.1rem;--ifm-code-padding-vertical:0.1rem;--ifm-pre-background:var(--ifm-code-background);--ifm-pre-border-radius:var(--ifm-code-border-radius);--ifm-pre-color:inherit;--ifm-pre-line-height:1.45;--ifm-pre-padding:1rem;--ifm-heading-color:inherit;--ifm-heading-margin-top:0;--ifm-heading-margin-bottom:var(--ifm-spacing-vertical);--ifm-heading-font-family:var(--ifm-font-family-base);--ifm-heading-font-weight:var(--ifm-font-weight-bold);--ifm-heading-line-height:1.25;--ifm-h1-font-size:2rem;--ifm-h2-font-size:1.5rem;--ifm-h3-font-size:1.25rem;--ifm-h4-font-size:1rem;--ifm-h5-font-size:0.875rem;--ifm-h6-font-size:0.85rem;--ifm-image-alignment-padding:1.25rem;--ifm-leading-desktop:1.25;--ifm-leading:calc(var(--ifm-leading-desktop)*1rem);--ifm-list-left-padding:2rem;--ifm-list-margin:1rem;--ifm-list-item-margin:0.25rem;--ifm-list-paragraph-margin:1rem;--ifm-table-cell-padding:0.75rem;--ifm-table-background:#0000;--ifm-table-stripe-background:#00000008;--ifm-table-border-width:1px;--ifm-table-border-color:var(--ifm-color-emphasis-300);--ifm-table-head-background:inherit;--ifm-table-head-color:inherit;--ifm-table-head-font-weight:var(--ifm-font-weight-bold);--ifm-table-cell-color:inherit;--ifm-link-color:var(--ifm-color-primary);--ifm-link-decoration:none;--ifm-link-hover-color:var(--ifm-link-color);--ifm-link-hover-decoration:underline;--ifm-paragraph-margin-bottom:var(--ifm-leading);--ifm-blockquote-font-size:var(--ifm-font-size-base);--ifm-blockquote-border-left-width:2px;--ifm-blockquote-padding-horizontal:var(--ifm-spacing-horizontal);--ifm-blockquote-padding-vertical:0;--ifm-blockquote-shadow:none;--ifm-blockquote-color:var(--ifm-color-emphasis-800);--ifm-blockquote-border-color:var(--ifm-color-emphasis-300);--ifm-hr-background-color:var(--ifm-color-emphasis-500);--ifm-hr-height:1px;--ifm-hr-margin-vertical:1.5rem;--ifm-scrollbar-size:7px;--ifm-scrollbar-track-background-color:#f1f1f1;--ifm-scrollbar-thumb-background-color:silver;--ifm-scrollbar-thumb-hover-background-color:#a7a7a7;--ifm-alert-background-color:inherit;--ifm-alert-border-color:inherit;--ifm-alert-border-radius:var(--ifm-global-radius);--ifm-alert-border-width:0px;--ifm-alert-border-left-width:5px;--ifm-alert-color:var(--ifm-font-color-base);--ifm-alert-padding-horizontal:var(--ifm-spacing-horizontal);--ifm-alert-padding-vertical:var(--ifm-spacing-vertical);--ifm-alert-shadow:var(--ifm-global-shadow-lw);--ifm-avatar-intro-margin:1rem;--ifm-avatar-intro-alignment:inherit;--ifm-avatar-photo-size:3rem;--ifm-badge-background-color:inherit;--ifm-badge-border-color:inherit;--ifm-badge-border-radius:var(--ifm-global-radius);--ifm-badge-border-width:var(--ifm-global-border-width);--ifm-badge-color:var(--ifm-color-white);--ifm-badge-padding-horizontal:calc(var(--ifm-spacing-horizontal)*0.5);--ifm-badge-padding-vertical:calc(var(--ifm-spacing-vertical)*0.25);--ifm-breadcrumb-border-radius:1.5rem;--ifm-breadcrumb-spacing:0.5rem;--ifm-breadcrumb-color-active:var(--ifm-color-primary);--ifm-breadcrumb-item-background-active:var(--ifm-hover-overlay);--ifm-breadcrumb-padding-horizontal:0.8rem;--ifm-breadcrumb-padding-vertical:0.4rem;--ifm-breadcrumb-size-multiplier:1;--ifm-breadcrumb-separator:url('data:image/svg+xml;utf8,');--ifm-breadcrumb-separator-filter:none;--ifm-breadcrumb-separator-size:0.5rem;--ifm-breadcrumb-separator-size-multiplier:1.25;--ifm-button-background-color:inherit;--ifm-button-border-color:var(--ifm-button-background-color);--ifm-button-border-width:var(--ifm-global-border-width);--ifm-button-font-weight:var(--ifm-font-weight-bold);--ifm-button-padding-horizontal:1.5rem;--ifm-button-padding-vertical:0.375rem;--ifm-button-size-multiplier:1;--ifm-button-transition-duration:var(--ifm-transition-fast);--ifm-button-border-radius:calc(var(--ifm-global-radius)*var(--ifm-button-size-multiplier));--ifm-button-group-spacing:2px;--ifm-card-background-color:var(--ifm-background-surface-color);--ifm-card-border-radius:calc(var(--ifm-global-radius)*2);--ifm-card-horizontal-spacing:var(--ifm-global-spacing);--ifm-card-vertical-spacing:var(--ifm-global-spacing);--ifm-toc-border-color:var(--ifm-color-emphasis-300);--ifm-toc-link-color:var(--ifm-color-content-secondary);--ifm-toc-padding-vertical:0.5rem;--ifm-toc-padding-horizontal:0.5rem;--ifm-dropdown-background-color:var(--ifm-background-surface-color);--ifm-dropdown-font-weight:var(--ifm-font-weight-semibold);--ifm-dropdown-link-color:var(--ifm-font-color-base);--ifm-dropdown-hover-background-color:var(--ifm-hover-overlay);--ifm-footer-background-color:var(--ifm-color-emphasis-100);--ifm-footer-color:inherit;--ifm-footer-link-color:var(--ifm-color-emphasis-700);--ifm-footer-link-hover-color:var(--ifm-color-primary);--ifm-footer-link-horizontal-spacing:0.5rem;--ifm-footer-padding-horizontal:calc(var(--ifm-spacing-horizontal)*2);--ifm-footer-padding-vertical:calc(var(--ifm-spacing-vertical)*2);--ifm-footer-title-color:inherit;--ifm-footer-logo-max-width:min(30rem,90vw);--ifm-hero-background-color:var(--ifm-background-surface-color);--ifm-hero-text-color:var(--ifm-color-emphasis-800);--ifm-menu-color:var(--ifm-color-emphasis-700);--ifm-menu-color-active:var(--ifm-color-primary);--ifm-menu-color-background-active:var(--ifm-hover-overlay);--ifm-menu-color-background-hover:var(--ifm-hover-overlay);--ifm-menu-link-padding-horizontal:0.75rem;--ifm-menu-link-padding-vertical:0.375rem;--ifm-menu-link-sublist-icon:url('data:image/svg+xml;utf8,');--ifm-menu-link-sublist-icon-filter:none;--ifm-navbar-background-color:var(--ifm-background-surface-color);--ifm-navbar-height:3.75rem;--ifm-navbar-item-padding-horizontal:0.75rem;--ifm-navbar-item-padding-vertical:0.25rem;--ifm-navbar-link-color:var(--ifm-font-color-base);--ifm-navbar-link-active-color:var(--ifm-link-color);--ifm-navbar-padding-horizontal:var(--ifm-spacing-horizontal);--ifm-navbar-padding-vertical:calc(var(--ifm-spacing-vertical)*0.5);--ifm-navbar-shadow:var(--ifm-global-shadow-lw);--ifm-navbar-search-input-background-color:var(--ifm-color-emphasis-200);--ifm-navbar-search-input-color:var(--ifm-color-emphasis-800);--ifm-navbar-search-input-placeholder-color:var(--ifm-color-emphasis-500);--ifm-navbar-search-input-icon:url('data:image/svg+xml;utf8,');--ifm-navbar-sidebar-width:83vw;--ifm-pagination-border-radius:var(--ifm-global-radius);--ifm-pagination-color-active:var(--ifm-color-primary);--ifm-pagination-font-size:1rem;--ifm-pagination-item-active-background:var(--ifm-hover-overlay);--ifm-pagination-page-spacing:0.2em;--ifm-pagination-padding-horizontal:calc(var(--ifm-spacing-horizontal)*1);--ifm-pagination-padding-vertical:calc(var(--ifm-spacing-vertical)*0.25);--ifm-pagination-nav-border-radius:var(--ifm-global-radius);--ifm-pagination-nav-color-hover:var(--ifm-color-primary);--ifm-pills-color-active:var(--ifm-color-primary);--ifm-pills-color-background-active:var(--ifm-hover-overlay);--ifm-pills-spacing:0.125rem;--ifm-tabs-color:var(--ifm-font-color-secondary);--ifm-tabs-color-active:var(--ifm-color-primary);--ifm-tabs-color-active-border:var(--ifm-tabs-color-active);--ifm-tabs-padding-horizontal:1rem;--ifm-tabs-padding-vertical:1rem;--docusaurus-progress-bar-color:var(--ifm-color-primary);--docusaurus-announcement-bar-height:auto;--docusaurus-collapse-button-bg:#0000;--docusaurus-collapse-button-bg-hover:#0000001a;--doc-sidebar-width:300px;--doc-sidebar-hidden-width:30px;--docusaurus-blog-social-icon-size:1rem;--docusaurus-tag-list-border:var(--ifm-color-emphasis-300)}.badge--danger,.badge--info,.badge--primary,.badge--secondary,.badge--success,.badge--warning{--ifm-badge-border-color:var(--ifm-badge-background-color)}.button--link,.button--outline{--ifm-button-background-color:#0000}html{background-color:var(--ifm-background-color);color:var(--ifm-font-color-base);color-scheme:var(--ifm-color-scheme);font:var(--ifm-font-size-base)/var(--ifm-line-height-base) var(--ifm-font-family-base);-webkit-font-smoothing:antialiased;text-rendering:optimizelegibility;-webkit-text-size-adjust:100%;text-size-adjust:100%}iframe{border:0;color-scheme:auto}.container{margin:0 auto;max-width:var(--ifm-container-width)}.container--fluid{max-width:inherit}.row{display:flex;flex-wrap:wrap;margin:0 calc(var(--ifm-spacing-horizontal)*-1)}.margin-bottom--none,.margin-vert--none,.markdown>:last-child{margin-bottom:0!important}.margin-top--none,.margin-vert--none,.tabItem_LNqP{margin-top:0!important}.row--no-gutters{margin-left:0;margin-right:0}.margin-horiz--none,.margin-right--none{margin-right:0!important}.row--no-gutters>.col{padding-left:0;padding-right:0}.row--align-top{align-items:flex-start}.row--align-bottom{align-items:flex-end}.menuExternalLink_NmtK,.row--align-center{align-items:center}.row--align-stretch{align-items:stretch}.row--align-baseline{align-items:baseline}.col{--ifm-col-width:100%;flex:1 0;margin-left:0;max-width:var(--ifm-col-width)}.padding-bottom--none,.padding-vert--none{padding-bottom:0!important}.padding-top--none,.padding-vert--none{padding-top:0!important}.padding-horiz--none,.padding-left--none{padding-left:0!important}.padding-horiz--none,.padding-right--none{padding-right:0!important}.col[class*=col--]{flex:0 0 var(--ifm-col-width)}.col--1{--ifm-col-width:8.33333%}.col--offset-1{margin-left:8.33333%}.col--2{--ifm-col-width:16.66667%}.col--offset-2{margin-left:16.66667%}.col--3{--ifm-col-width:25%}.col--offset-3{margin-left:25%}.col--4{--ifm-col-width:33.33333%}.col--offset-4{margin-left:33.33333%}.col--5{--ifm-col-width:41.66667%}.col--offset-5{margin-left:41.66667%}.col--6{--ifm-col-width:50%}.col--offset-6{margin-left:50%}.col--7{--ifm-col-width:58.33333%}.col--offset-7{margin-left:58.33333%}.col--8{--ifm-col-width:66.66667%}.col--offset-8{margin-left:66.66667%}.col--9{--ifm-col-width:75%}.col--offset-9{margin-left:75%}.col--10{--ifm-col-width:83.33333%}.col--offset-10{margin-left:83.33333%}.col--11{--ifm-col-width:91.66667%}.col--offset-11{margin-left:91.66667%}.col--12{--ifm-col-width:100%}.col--offset-12{margin-left:100%}.margin-horiz--none,.margin-left--none{margin-left:0!important}.margin--none{margin:0!important}.margin-bottom--xs,.margin-vert--xs{margin-bottom:.25rem!important}.margin-top--xs,.margin-vert--xs{margin-top:.25rem!important}.margin-horiz--xs,.margin-left--xs{margin-left:.25rem!important}.margin-horiz--xs,.margin-right--xs{margin-right:.25rem!important}.margin--xs{margin:.25rem!important}.margin-bottom--sm,.margin-vert--sm{margin-bottom:.5rem!important}.margin-top--sm,.margin-vert--sm{margin-top:.5rem!important}.margin-horiz--sm,.margin-left--sm{margin-left:.5rem!important}.margin-horiz--sm,.margin-right--sm{margin-right:.5rem!important}.margin--sm{margin:.5rem!important}.margin-bottom--md,.margin-vert--md{margin-bottom:1rem!important}.margin-top--md,.margin-vert--md{margin-top:1rem!important}.margin-horiz--md,.margin-left--md{margin-left:1rem!important}.margin-horiz--md,.margin-right--md{margin-right:1rem!important}.margin--md{margin:1rem!important}.margin-bottom--lg,.margin-vert--lg{margin-bottom:2rem!important}.margin-top--lg,.margin-vert--lg{margin-top:2rem!important}.margin-horiz--lg,.margin-left--lg{margin-left:2rem!important}.margin-horiz--lg,.margin-right--lg{margin-right:2rem!important}.margin--lg{margin:2rem!important}.margin-bottom--xl,.margin-vert--xl{margin-bottom:5rem!important}.margin-top--xl,.margin-vert--xl{margin-top:5rem!important}.margin-horiz--xl,.margin-left--xl{margin-left:5rem!important}.margin-horiz--xl,.margin-right--xl{margin-right:5rem!important}.margin--xl{margin:5rem!important}.padding--none{padding:0!important}.padding-bottom--xs,.padding-vert--xs{padding-bottom:.25rem!important}.padding-top--xs,.padding-vert--xs{padding-top:.25rem!important}.padding-horiz--xs,.padding-left--xs{padding-left:.25rem!important}.padding-horiz--xs,.padding-right--xs{padding-right:.25rem!important}.padding--xs{padding:.25rem!important}.padding-bottom--sm,.padding-vert--sm{padding-bottom:.5rem!important}.padding-top--sm,.padding-vert--sm{padding-top:.5rem!important}.padding-horiz--sm,.padding-left--sm{padding-left:.5rem!important}.padding-horiz--sm,.padding-right--sm{padding-right:.5rem!important}.padding--sm{padding:.5rem!important}.padding-bottom--md,.padding-vert--md{padding-bottom:1rem!important}.padding-top--md,.padding-vert--md{padding-top:1rem!important}.padding-horiz--md,.padding-left--md{padding-left:1rem!important}.padding-horiz--md,.padding-right--md{padding-right:1rem!important}.padding--md{padding:1rem!important}.padding-bottom--lg,.padding-vert--lg{padding-bottom:2rem!important}.padding-top--lg,.padding-vert--lg{padding-top:2rem!important}.padding-horiz--lg,.padding-left--lg{padding-left:2rem!important}.padding-horiz--lg,.padding-right--lg{padding-right:2rem!important}.padding--lg{padding:2rem!important}.padding-bottom--xl,.padding-vert--xl{padding-bottom:5rem!important}.padding-top--xl,.padding-vert--xl{padding-top:5rem!important}.padding-horiz--xl,.padding-left--xl{padding-left:5rem!important}.padding-horiz--xl,.padding-right--xl{padding-right:5rem!important}.padding--xl{padding:5rem!important}code{background-color:var(--ifm-code-background);border:.1rem solid #0000001a;border-radius:var(--ifm-code-border-radius);font-family:var(--ifm-font-family-monospace);font-size:var(--ifm-code-font-size);padding:var(--ifm-code-padding-vertical) var(--ifm-code-padding-horizontal)}a code{color:inherit}pre{background-color:var(--ifm-pre-background);border-radius:var(--ifm-pre-border-radius);color:var(--ifm-pre-color);font:var(--ifm-code-font-size)/var(--ifm-pre-line-height) var(--ifm-font-family-monospace);padding:var(--ifm-pre-padding)}pre code{background-color:initial;border:none;font-size:100%;line-height:inherit;padding:0}kbd{background-color:var(--ifm-color-emphasis-0);border:1px solid var(--ifm-color-emphasis-400);border-radius:.2rem;box-shadow:inset 0 -1px 0 var(--ifm-color-emphasis-400);color:var(--ifm-color-emphasis-800);font:80% var(--ifm-font-family-monospace);padding:.15rem .3rem}h1,h2,h3,h4,h5,h6{color:var(--ifm-heading-color);font-family:var(--ifm-heading-font-family);font-weight:var(--ifm-heading-font-weight);line-height:var(--ifm-heading-line-height);margin:var(--ifm-heading-margin-top) 0 var(--ifm-heading-margin-bottom) 0}h1{font-size:var(--ifm-h1-font-size)}h2{font-size:var(--ifm-h2-font-size)}h3{font-size:var(--ifm-h3-font-size)}h4{font-size:var(--ifm-h4-font-size)}h5{font-size:var(--ifm-h5-font-size)}h6{font-size:var(--ifm-h6-font-size)}img{max-width:100%}img[align=right]{padding-left:var(--image-alignment-padding)}img[align=left]{padding-right:var(--image-alignment-padding)}.markdown{--ifm-h1-vertical-rhythm-top:3;--ifm-h2-vertical-rhythm-top:2;--ifm-h3-vertical-rhythm-top:1.5;--ifm-heading-vertical-rhythm-top:1.25;--ifm-h1-vertical-rhythm-bottom:1.25;--ifm-heading-vertical-rhythm-bottom:1}.markdown:after,.markdown:before{content:"";display:table}.markdown:after{clear:both}.markdown h1:first-child{--ifm-h1-font-size:3rem;margin-bottom:calc(var(--ifm-h1-vertical-rhythm-bottom)*var(--ifm-leading))}.markdown>h2{--ifm-h2-font-size:2rem;margin-top:calc(var(--ifm-h2-vertical-rhythm-top)*var(--ifm-leading))}.markdown>h3{--ifm-h3-font-size:1.5rem;margin-top:calc(var(--ifm-h3-vertical-rhythm-top)*var(--ifm-leading))}.markdown>h4,.markdown>h5,.markdown>h6{margin-top:calc(var(--ifm-heading-vertical-rhythm-top)*var(--ifm-leading))}.markdown>p,.markdown>pre,.markdown>ul,.tabList__CuJ{margin-bottom:var(--ifm-leading)}.markdown li>p{margin-top:var(--ifm-list-paragraph-margin)}.markdown li+li{margin-top:var(--ifm-list-item-margin)}ol,ul{margin:0 0 var(--ifm-list-margin);padding-left:var(--ifm-list-left-padding)}ol ol,ul ol{list-style-type:lower-roman}ol ol ol,ol ul ol,ul ol ol,ul ul ol{list-style-type:lower-alpha}table{border-collapse:collapse;display:block;margin-bottom:var(--ifm-spacing-vertical)}table thead tr{border-bottom:2px solid var(--ifm-table-border-color)}table thead,table tr:nth-child(2n){background-color:var(--ifm-table-stripe-background)}table tr{background-color:var(--ifm-table-background);border-top:var(--ifm-table-border-width) solid var(--ifm-table-border-color)}table td,table th{border:var(--ifm-table-border-width) solid var(--ifm-table-border-color);padding:var(--ifm-table-cell-padding)}table th{background-color:var(--ifm-table-head-background);color:var(--ifm-table-head-color);font-weight:var(--ifm-table-head-font-weight)}table td{color:var(--ifm-table-cell-color)}strong{font-weight:var(--ifm-font-weight-bold)}a{color:var(--ifm-link-color);text-decoration:var(--ifm-link-decoration)}a:hover{color:var(--ifm-link-hover-color);text-decoration:var(--ifm-link-hover-decoration)}.button:hover,.text--no-decoration,.text--no-decoration:hover,a:not([href]){text-decoration:none}p{margin:0 0 var(--ifm-paragraph-margin-bottom)}blockquote{border-left:var(--ifm-blockquote-border-left-width) solid var(--ifm-blockquote-border-color);box-shadow:var(--ifm-blockquote-shadow);color:var(--ifm-blockquote-color);font-size:var(--ifm-blockquote-font-size);padding:var(--ifm-blockquote-padding-vertical) var(--ifm-blockquote-padding-horizontal)}blockquote>:first-child{margin-top:0}blockquote>:last-child{margin-bottom:0}hr{background-color:var(--ifm-hr-background-color);border:0;height:var(--ifm-hr-height);margin:var(--ifm-hr-margin-vertical) 0}.shadow--lw{box-shadow:var(--ifm-global-shadow-lw)!important}.shadow--md{box-shadow:var(--ifm-global-shadow-md)!important}.shadow--tl{box-shadow:var(--ifm-global-shadow-tl)!important}.text--primary,.wordWrapButtonEnabled_EoeP .wordWrapButtonIcon_Bwma{color:var(--ifm-color-primary)}.text--secondary{color:var(--ifm-color-secondary)}.text--success{color:var(--ifm-color-success)}.text--info{color:var(--ifm-color-info)}.text--warning{color:var(--ifm-color-warning)}.text--danger{color:var(--ifm-color-danger)}.centered-text,.text--center{text-align:center}.text--left{text-align:left}.text--justify{text-align:justify}.text--right{text-align:right}.text--capitalize{text-transform:capitalize}.text--lowercase{text-transform:lowercase}.admonitionHeading_Gvgb,.alert__heading,.text--uppercase{text-transform:uppercase}.text--light{font-weight:var(--ifm-font-weight-light)}.text--normal{font-weight:var(--ifm-font-weight-normal)}.text--semibold{font-weight:var(--ifm-font-weight-semibold)}.text--bold{font-weight:var(--ifm-font-weight-bold)}.text--italic{font-style:italic}.text--truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.text--break{word-wrap:break-word!important;word-break:break-word!important}.clean-btn{background:none;border:none;color:inherit;cursor:pointer;font-family:inherit;padding:0}.alert,.alert .close{color:var(--ifm-alert-foreground-color)}.clean-list{padding-left:0}.alert--primary{--ifm-alert-background-color:var(--ifm-color-primary-contrast-background);--ifm-alert-background-color-highlight:#3578e526;--ifm-alert-foreground-color:var(--ifm-color-primary-contrast-foreground);--ifm-alert-border-color:var(--ifm-color-primary-dark)}.alert--secondary{--ifm-alert-background-color:var(--ifm-color-secondary-contrast-background);--ifm-alert-background-color-highlight:#ebedf026;--ifm-alert-foreground-color:var(--ifm-color-secondary-contrast-foreground);--ifm-alert-border-color:var(--ifm-color-secondary-dark)}.alert--success{--ifm-alert-background-color:var(--ifm-color-success-contrast-background);--ifm-alert-background-color-highlight:#00a40026;--ifm-alert-foreground-color:var(--ifm-color-success-contrast-foreground);--ifm-alert-border-color:var(--ifm-color-success-dark)}.alert--info{--ifm-alert-background-color:var(--ifm-color-info-contrast-background);--ifm-alert-background-color-highlight:#54c7ec26;--ifm-alert-foreground-color:var(--ifm-color-info-contrast-foreground);--ifm-alert-border-color:var(--ifm-color-info-dark)}.alert--warning{--ifm-alert-background-color:var(--ifm-color-warning-contrast-background);--ifm-alert-background-color-highlight:#ffba0026;--ifm-alert-foreground-color:var(--ifm-color-warning-contrast-foreground);--ifm-alert-border-color:var(--ifm-color-warning-dark)}.alert--danger{--ifm-alert-background-color:var(--ifm-color-danger-contrast-background);--ifm-alert-background-color-highlight:#fa383e26;--ifm-alert-foreground-color:var(--ifm-color-danger-contrast-foreground);--ifm-alert-border-color:var(--ifm-color-danger-dark)}.alert{--ifm-code-background:var(--ifm-alert-background-color-highlight);--ifm-link-color:var(--ifm-alert-foreground-color);--ifm-link-hover-color:var(--ifm-alert-foreground-color);--ifm-link-decoration:underline;--ifm-tabs-color:var(--ifm-alert-foreground-color);--ifm-tabs-color-active:var(--ifm-alert-foreground-color);--ifm-tabs-color-active-border:var(--ifm-alert-border-color);background-color:var(--ifm-alert-background-color);border:var(--ifm-alert-border-width) solid var(--ifm-alert-border-color);border-left-width:var(--ifm-alert-border-left-width);border-radius:var(--ifm-alert-border-radius);box-shadow:var(--ifm-alert-shadow);padding:var(--ifm-alert-padding-vertical) var(--ifm-alert-padding-horizontal)}.alert__heading{align-items:center;display:flex;font:700 var(--ifm-h5-font-size)/var(--ifm-heading-line-height) var(--ifm-heading-font-family);margin-bottom:.5rem}.alert__icon{display:inline-flex;margin-right:.4em}.alert__icon svg{fill:var(--ifm-alert-foreground-color);stroke:var(--ifm-alert-foreground-color);stroke-width:0}.alert .close{margin:calc(var(--ifm-alert-padding-vertical)*-1) calc(var(--ifm-alert-padding-horizontal)*-1) 0 0;opacity:.75}.alert .close:focus,.alert .close:hover{opacity:1}.alert a{text-decoration-color:var(--ifm-alert-border-color)}.alert a:hover{text-decoration-thickness:2px}.avatar{column-gap:var(--ifm-avatar-intro-margin);display:flex}.avatar__photo{border-radius:50%;display:block;height:var(--ifm-avatar-photo-size);overflow:hidden;width:var(--ifm-avatar-photo-size)}.card--full-height,.navbar__logo img,body,html{height:100%}.avatar__photo--sm{--ifm-avatar-photo-size:2rem}.avatar__photo--lg{--ifm-avatar-photo-size:4rem}.avatar__photo--xl{--ifm-avatar-photo-size:6rem}.avatar__intro{display:flex;flex:1 1;flex-direction:column;justify-content:center;text-align:var(--ifm-avatar-intro-alignment)}.badge,.breadcrumbs__item,.breadcrumbs__link,.button,.dropdown>.navbar__link:after,.searchBarContainer_NW3z.searchIndexLoading_EJ1f .searchBarLoadingRing_YnHq{display:inline-block}.avatar__name{font:700 var(--ifm-h4-font-size)/var(--ifm-heading-line-height) var(--ifm-font-family-base)}.avatar__subtitle{margin-top:.25rem}.avatar--vertical{--ifm-avatar-intro-alignment:center;--ifm-avatar-intro-margin:0.5rem;align-items:center;flex-direction:column}.badge{background-color:var(--ifm-badge-background-color);border:var(--ifm-badge-border-width) solid var(--ifm-badge-border-color);border-radius:var(--ifm-badge-border-radius);color:var(--ifm-badge-color);font-size:75%;font-weight:var(--ifm-font-weight-bold);line-height:1;padding:var(--ifm-badge-padding-vertical) var(--ifm-badge-padding-horizontal)}.badge--primary{--ifm-badge-background-color:var(--ifm-color-primary)}.badge--secondary{--ifm-badge-background-color:var(--ifm-color-secondary);color:var(--ifm-color-black)}.breadcrumbs__link,.button.button--secondary.button--outline:not(.button--active):not(:hover){color:var(--ifm-font-color-base)}.badge--success{--ifm-badge-background-color:var(--ifm-color-success)}.badge--info{--ifm-badge-background-color:var(--ifm-color-info)}.badge--warning{--ifm-badge-background-color:var(--ifm-color-warning)}.badge--danger{--ifm-badge-background-color:var(--ifm-color-danger)}.breadcrumbs{margin-bottom:0;padding-left:0}.breadcrumbs__item:not(:last-child):after{background:var(--ifm-breadcrumb-separator) center;content:" ";display:inline-block;filter:var(--ifm-breadcrumb-separator-filter);height:calc(var(--ifm-breadcrumb-separator-size)*var(--ifm-breadcrumb-size-multiplier)*var(--ifm-breadcrumb-separator-size-multiplier));margin:0 var(--ifm-breadcrumb-spacing);opacity:.5;width:calc(var(--ifm-breadcrumb-separator-size)*var(--ifm-breadcrumb-size-multiplier)*var(--ifm-breadcrumb-separator-size-multiplier))}.breadcrumbs__item--active .breadcrumbs__link{background:var(--ifm-breadcrumb-item-background-active);color:var(--ifm-breadcrumb-color-active)}.breadcrumbs__link{border-radius:var(--ifm-breadcrumb-border-radius);font-size:calc(1rem*var(--ifm-breadcrumb-size-multiplier));padding:calc(var(--ifm-breadcrumb-padding-vertical)*var(--ifm-breadcrumb-size-multiplier)) calc(var(--ifm-breadcrumb-padding-horizontal)*var(--ifm-breadcrumb-size-multiplier));transition-duration:var(--ifm-transition-fast);transition-property:background,color}.breadcrumbs__link:any-link:hover,.breadcrumbs__link:link:hover,.breadcrumbs__link:visited:hover,area[href].breadcrumbs__link:hover{background:var(--ifm-breadcrumb-item-background-active);text-decoration:none}.breadcrumbs--sm{--ifm-breadcrumb-size-multiplier:0.8}.breadcrumbs--lg{--ifm-breadcrumb-size-multiplier:1.2}.button{background-color:var(--ifm-button-background-color);border:var(--ifm-button-border-width) solid var(--ifm-button-border-color);border-radius:var(--ifm-button-border-radius);cursor:pointer;font-size:calc(.875rem*var(--ifm-button-size-multiplier));font-weight:var(--ifm-button-font-weight);line-height:1.5;padding:calc(var(--ifm-button-padding-vertical)*var(--ifm-button-size-multiplier)) calc(var(--ifm-button-padding-horizontal)*var(--ifm-button-size-multiplier));text-align:center;transition-duration:var(--ifm-button-transition-duration);transition-property:color,background,border-color;-webkit-user-select:none;user-select:none;white-space:nowrap}.button,.button:hover{color:var(--ifm-button-color)}.button--outline{--ifm-button-color:var(--ifm-button-border-color)}.button--outline:hover{--ifm-button-background-color:var(--ifm-button-border-color)}.button--link{--ifm-button-border-color:#0000;color:var(--ifm-link-color);text-decoration:var(--ifm-link-decoration)}.button--link.button--active,.button--link:active,.button--link:hover{color:var(--ifm-link-hover-color);text-decoration:var(--ifm-link-hover-decoration)}.button.disabled,.button:disabled,.button[disabled]{opacity:.65;pointer-events:none}.button--sm{--ifm-button-size-multiplier:0.8}.button--lg{--ifm-button-size-multiplier:1.35}.button--block{display:block;width:100%}.button.button--secondary{color:var(--ifm-color-gray-900)}:where(.button--primary){--ifm-button-background-color:var(--ifm-color-primary);--ifm-button-border-color:var(--ifm-color-primary)}:where(.button--primary):not(.button--outline):hover{--ifm-button-background-color:var(--ifm-color-primary-dark);--ifm-button-border-color:var(--ifm-color-primary-dark)}.button--primary.button--active,.button--primary:active{--ifm-button-background-color:var(--ifm-color-primary-darker);--ifm-button-border-color:var(--ifm-color-primary-darker)}:where(.button--secondary){--ifm-button-background-color:var(--ifm-color-secondary);--ifm-button-border-color:var(--ifm-color-secondary)}:where(.button--secondary):not(.button--outline):hover{--ifm-button-background-color:var(--ifm-color-secondary-dark);--ifm-button-border-color:var(--ifm-color-secondary-dark)}.button--secondary.button--active,.button--secondary:active{--ifm-button-background-color:var(--ifm-color-secondary-darker);--ifm-button-border-color:var(--ifm-color-secondary-darker)}:where(.button--success){--ifm-button-background-color:var(--ifm-color-success);--ifm-button-border-color:var(--ifm-color-success)}:where(.button--success):not(.button--outline):hover{--ifm-button-background-color:var(--ifm-color-success-dark);--ifm-button-border-color:var(--ifm-color-success-dark)}.button--success.button--active,.button--success:active{--ifm-button-background-color:var(--ifm-color-success-darker);--ifm-button-border-color:var(--ifm-color-success-darker)}:where(.button--info){--ifm-button-background-color:var(--ifm-color-info);--ifm-button-border-color:var(--ifm-color-info)}:where(.button--info):not(.button--outline):hover{--ifm-button-background-color:var(--ifm-color-info-dark);--ifm-button-border-color:var(--ifm-color-info-dark)}.button--info.button--active,.button--info:active{--ifm-button-background-color:var(--ifm-color-info-darker);--ifm-button-border-color:var(--ifm-color-info-darker)}:where(.button--warning){--ifm-button-background-color:var(--ifm-color-warning);--ifm-button-border-color:var(--ifm-color-warning)}:where(.button--warning):not(.button--outline):hover{--ifm-button-background-color:var(--ifm-color-warning-dark);--ifm-button-border-color:var(--ifm-color-warning-dark)}.button--warning.button--active,.button--warning:active{--ifm-button-background-color:var(--ifm-color-warning-darker);--ifm-button-border-color:var(--ifm-color-warning-darker)}:where(.button--danger){--ifm-button-background-color:var(--ifm-color-danger);--ifm-button-border-color:var(--ifm-color-danger)}:where(.button--danger):not(.button--outline):hover{--ifm-button-background-color:var(--ifm-color-danger-dark);--ifm-button-border-color:var(--ifm-color-danger-dark)}.button--danger.button--active,.button--danger:active{--ifm-button-background-color:var(--ifm-color-danger-darker);--ifm-button-border-color:var(--ifm-color-danger-darker)}.button-group{display:inline-flex;gap:var(--ifm-button-group-spacing)}.button-group>.button:not(:first-child){border-bottom-left-radius:0;border-top-left-radius:0}.button-group>.button:not(:last-child){border-bottom-right-radius:0;border-top-right-radius:0}.button-group--block{display:flex;justify-content:stretch}.button-group--block>.button{flex-grow:1}.card{background-color:var(--ifm-card-background-color);border-radius:var(--ifm-card-border-radius);box-shadow:var(--ifm-global-shadow-lw);display:flex;flex-direction:column;overflow:hidden}.card__image{padding-top:var(--ifm-card-vertical-spacing)}.card__image:first-child{padding-top:0}.card__body,.card__footer,.card__header{padding:var(--ifm-card-vertical-spacing) var(--ifm-card-horizontal-spacing)}.card__body:not(:last-child),.card__footer:not(:last-child),.card__header:not(:last-child){padding-bottom:0}.card__body>:last-child,.card__footer>:last-child,.card__header>:last-child{margin-bottom:0}.card__footer{margin-top:auto}.table-of-contents{font-size:.8rem;margin-bottom:0;padding:var(--ifm-toc-padding-vertical) 0}.table-of-contents,.table-of-contents ul{list-style:none;padding-left:var(--ifm-toc-padding-horizontal)}.table-of-contents li{margin:var(--ifm-toc-padding-vertical) var(--ifm-toc-padding-horizontal)}.table-of-contents__left-border{border-left:1px solid var(--ifm-toc-border-color)}.table-of-contents__link{color:var(--ifm-toc-link-color);display:block}.table-of-contents__link--active,.table-of-contents__link--active code,.table-of-contents__link:hover,.table-of-contents__link:hover code{color:var(--ifm-color-primary);text-decoration:none}.content_knG7 a,.hitFooter_E9YW a,.suggestion_fB_2.cursor_eG29 mark{text-decoration:underline}.close{color:var(--ifm-color-black);float:right;font-size:1.5rem;font-weight:var(--ifm-font-weight-bold);line-height:1;opacity:.5;padding:1rem;transition:opacity var(--ifm-transition-fast) var(--ifm-transition-timing-default)}.close:hover{opacity:.7}.close:focus,.header-discord-link:hover,.header-github-link:hover,.theme-code-block-highlighted-line .codeLineNumber_Tfdd:before{opacity:.8}.dropdown{display:inline-flex;font-weight:var(--ifm-dropdown-font-weight);position:relative;vertical-align:top}.dropdown--hoverable:hover .dropdown__menu,.dropdown--show .dropdown__menu{opacity:1;pointer-events:all;transform:translateY(-1px);visibility:visible}.dropdown--right .dropdown__menu{left:inherit;right:0}.dropdown--nocaret .navbar__link:after{content:none!important}.dropdown__menu{background-color:var(--ifm-dropdown-background-color);border-radius:var(--ifm-global-radius);box-shadow:var(--ifm-global-shadow-md);left:0;max-height:80vh;min-width:10rem;opacity:0;overflow-y:auto;padding:.5rem;pointer-events:none;position:absolute;top:calc(100% - var(--ifm-navbar-item-padding-vertical) + .3rem);transform:translateY(-.625rem);transition-duration:var(--ifm-transition-fast);transition-property:opacity,transform,visibility;transition-timing-function:var(--ifm-transition-timing-default);visibility:hidden;z-index:var(--ifm-z-index-dropdown)}.sidebar_re4s,.tableOfContents_bqdL{max-height:calc(100vh - var(--ifm-navbar-height) - 2rem)}.menu__caret,.menu__link,.menu__list-item-collapsible{border-radius:.25rem;transition:background var(--ifm-transition-fast) var(--ifm-transition-timing-default)}.dropdown__link{border-radius:.25rem;color:var(--ifm-dropdown-link-color);display:block;font-size:.875rem;margin-top:.2rem;padding:.25rem .5rem;white-space:nowrap}.dropdown__link--active,.dropdown__link:hover{background-color:var(--ifm-dropdown-hover-background-color);color:var(--ifm-dropdown-link-color);text-decoration:none}.dropdown__link--active,.dropdown__link--active:hover{--ifm-dropdown-link-color:var(--ifm-link-color)}.dropdown>.navbar__link:after{border-color:currentcolor #0000;border-style:solid;border-width:.4em .4em 0;content:"";margin-left:.3em;position:relative;top:2px;transform:translateY(-50%)}.footer{background-color:var(--ifm-footer-background-color);color:var(--ifm-footer-color);padding:var(--ifm-footer-padding-vertical) var(--ifm-footer-padding-horizontal)}.footer--dark{--ifm-footer-background-color:#303846;--ifm-footer-color:var(--ifm-footer-link-color);--ifm-footer-link-color:var(--ifm-color-secondary);--ifm-footer-title-color:var(--ifm-color-white)}.footer__links{margin-bottom:1rem}.footer__link-item{color:var(--ifm-footer-link-color);line-height:2}.footer__link-item:hover{color:var(--ifm-footer-link-hover-color)}.footer__link-separator{margin:0 var(--ifm-footer-link-horizontal-spacing)}.footer__logo{margin-top:1rem;max-width:var(--ifm-footer-logo-max-width)}.footer__title{color:var(--ifm-footer-title-color);font:700 var(--ifm-h4-font-size)/var(--ifm-heading-line-height) var(--ifm-font-family-base);margin-bottom:var(--ifm-heading-margin-bottom)}.menu,.navbar__link{font-weight:var(--ifm-font-weight-semibold)}.docItemContainer_Djhp article>:first-child,.docItemContainer_Djhp header+*,.footer__item{margin-top:0}.admonitionContent_BuS1>:last-child,.collapsibleContent_i85q p:last-child,.details_lb9f>summary>p:last-child,.footer__items,.searchResultItem_U687>h2,.tabItem_Ymn6>:last-child{margin-bottom:0}.codeBlockStandalone_MEMb,[type=checkbox]{padding:0}.hero{align-items:center;background-color:var(--ifm-hero-background-color);color:var(--ifm-hero-text-color);display:flex;padding:4rem 2rem}.hero--primary{--ifm-hero-background-color:var(--ifm-color-primary);--ifm-hero-text-color:var(--ifm-font-color-base-inverse)}.hero--dark{--ifm-hero-background-color:#303846;--ifm-hero-text-color:var(--ifm-color-white)}.hero__title,.title_f1Hy{font-size:3rem}.hero__subtitle{font-size:1.5rem}.menu__list{margin:0;padding-left:0}.menu__caret,.menu__link{padding:var(--ifm-menu-link-padding-vertical) var(--ifm-menu-link-padding-horizontal)}.menu__list .menu__list{flex:0 0 100%;margin-top:.25rem;padding-left:var(--ifm-menu-link-padding-horizontal)}.menu__list-item:not(:first-child){margin-top:.25rem}.menu__list-item--collapsed .menu__list{height:0;overflow:hidden}.details_lb9f[data-collapsed=false].isBrowser_bmU9>summary:before,.details_lb9f[open]:not(.isBrowser_bmU9)>summary:before,.menu__list-item--collapsed .menu__caret:before,.menu__list-item--collapsed .menu__link--sublist:after{transform:rotate(90deg)}.menu__list-item-collapsible{display:flex;flex-wrap:wrap;position:relative}.menu__caret:hover,.menu__link:hover,.menu__list-item-collapsible--active,.menu__list-item-collapsible:hover{background:var(--ifm-menu-color-background-hover)}.menu__list-item-collapsible .menu__link--active,.menu__list-item-collapsible .menu__link:hover{background:none!important}.menu__caret,.menu__link{align-items:center;display:flex}.menu__link{color:var(--ifm-menu-color);flex:1;line-height:1.25}.menu__link:hover{color:var(--ifm-menu-color);text-decoration:none}.menu__caret:before,.menu__link--sublist-caret:after{height:1.25rem;transform:rotate(180deg);transition:transform var(--ifm-transition-fast) linear;width:1.25rem;content:"";filter:var(--ifm-menu-link-sublist-icon-filter)}.menu__link--sublist-caret:after{background:var(--ifm-menu-link-sublist-icon) 50%/2rem 2rem;margin-left:auto;min-width:1.25rem}.menu__link--active,.menu__link--active:hover{color:var(--ifm-menu-color-active)}.navbar__brand,.navbar__link{color:var(--ifm-navbar-link-color)}.menu__link--active:not(.menu__link--sublist){background-color:var(--ifm-menu-color-background-active)}.menu__caret:before{background:var(--ifm-menu-link-sublist-icon) 50%/2rem 2rem}.navbar--dark,html[data-theme=dark]{--ifm-menu-link-sublist-icon-filter:invert(100%) sepia(94%) saturate(17%) hue-rotate(223deg) brightness(104%) contrast(98%)}.navbar{background-color:var(--ifm-navbar-background-color);box-shadow:var(--ifm-navbar-shadow);height:var(--ifm-navbar-height);padding:var(--ifm-navbar-padding-vertical) var(--ifm-navbar-padding-horizontal)}.navbar,.navbar>.container,.navbar>.container-fluid{display:flex}.navbar--fixed-top{position:sticky;top:0;z-index:var(--ifm-z-index-fixed)}.navbar-sidebar,.navbar-sidebar__backdrop{bottom:0;opacity:0;position:fixed;transition-duration:var(--ifm-transition-fast);transition-timing-function:ease-in-out;left:0;top:0;visibility:hidden}.navbar__inner{display:flex;flex-wrap:wrap;justify-content:space-between;width:100%}.navbar__brand{align-items:center;display:flex;margin-right:1rem;min-width:0}.navbar__brand:hover{color:var(--ifm-navbar-link-hover-color);text-decoration:none}.announcementBarContent_xLdY,.navbar__title{flex:1 1 auto}.navbar__toggle{display:none;margin-right:.5rem}.navbar__logo{flex:0 0 auto;height:2rem;margin-right:.5rem}.navbar__items{align-items:center;display:flex;flex:1;min-width:0}.navbar__items--center{flex:0 0 auto}.navbar__items--center .navbar__brand{margin:0}.navbar__items--center+.navbar__items--right{flex:1}.navbar__items--right{flex:0 0 auto;justify-content:flex-end}.navbar__items--right>:last-child{padding-right:0}.navbar__item{display:inline-block;padding:var(--ifm-navbar-item-padding-vertical) var(--ifm-navbar-item-padding-horizontal)}#nprogress,.navbar__item.dropdown .navbar__link:not([href]){pointer-events:none}.navbar__link--active,.navbar__link:hover{color:var(--ifm-navbar-link-hover-color);text-decoration:none}.navbar--dark,.navbar--primary{--ifm-menu-color:var(--ifm-color-gray-300);--ifm-navbar-link-color:var(--ifm-color-gray-100);--ifm-navbar-search-input-background-color:#ffffff1a;--ifm-navbar-search-input-placeholder-color:#ffffff80;color:var(--ifm-color-white)}.navbar--dark{--ifm-navbar-background-color:#242526;--ifm-menu-color-background-active:#ffffff0d;--ifm-navbar-search-input-color:var(--ifm-color-white)}.navbar--primary{--ifm-navbar-background-color:var(--ifm-color-primary);--ifm-navbar-link-hover-color:var(--ifm-color-white);--ifm-menu-color-active:var(--ifm-color-white);--ifm-navbar-search-input-color:var(--ifm-color-emphasis-500)}.navbar__search-input{-webkit-appearance:none;appearance:none;background:var(--ifm-navbar-search-input-background-color) var(--ifm-navbar-search-input-icon) no-repeat .75rem center/1rem 1rem;border:none;border-radius:2rem;color:var(--ifm-navbar-search-input-color);cursor:text;display:inline-block;font-size:1rem;height:2rem;padding:0 .5rem 0 2.25rem;width:12.5rem}.navbar__search-input::placeholder{color:var(--ifm-navbar-search-input-placeholder-color)}.navbar-sidebar{background-color:var(--ifm-navbar-background-color);box-shadow:var(--ifm-global-shadow-md);transform:translate3d(-100%,0,0);transition-property:opacity,visibility,transform;width:var(--ifm-navbar-sidebar-width)}.navbar-sidebar--show .navbar-sidebar,.navbar-sidebar__items{transform:translateZ(0)}.navbar-sidebar--show .navbar-sidebar,.navbar-sidebar--show .navbar-sidebar__backdrop{opacity:1;visibility:visible}.navbar-sidebar__backdrop{background-color:#0009;right:0;transition-property:opacity,visibility}.navbar-sidebar__brand{align-items:center;box-shadow:var(--ifm-navbar-shadow);display:flex;flex:1;height:var(--ifm-navbar-height);padding:var(--ifm-navbar-padding-vertical) var(--ifm-navbar-padding-horizontal)}.navbar-sidebar__items{display:flex;height:calc(100% - var(--ifm-navbar-height));transition:transform var(--ifm-transition-fast) ease-in-out}.navbar-sidebar__items--show-secondary{transform:translate3d(calc((var(--ifm-navbar-sidebar-width))*-1),0,0)}.navbar-sidebar__item{flex-shrink:0;padding:.5rem;width:calc(var(--ifm-navbar-sidebar-width))}.navbar-sidebar__back{background:var(--ifm-menu-color-background-active);font-size:15px;font-weight:var(--ifm-button-font-weight);margin:0 0 .2rem -.5rem;padding:.6rem 1.5rem;position:relative;text-align:left;top:-.5rem;width:calc(100% + 1rem)}.navbar-sidebar__close{display:flex;margin-left:auto}.pagination{column-gap:var(--ifm-pagination-page-spacing);display:flex;font-size:var(--ifm-pagination-font-size);padding-left:0}.pagination--sm{--ifm-pagination-font-size:0.8rem;--ifm-pagination-padding-horizontal:0.8rem;--ifm-pagination-padding-vertical:0.2rem}.pagination--lg{--ifm-pagination-font-size:1.2rem;--ifm-pagination-padding-horizontal:1.2rem;--ifm-pagination-padding-vertical:0.3rem}.pagination__item{display:inline-flex}.pagination__item>span{padding:var(--ifm-pagination-padding-vertical)}.pagination__item--active .pagination__link{color:var(--ifm-pagination-color-active)}.pagination__item--active .pagination__link,.pagination__item:not(.pagination__item--active):hover .pagination__link{background:var(--ifm-pagination-item-active-background)}.pagination__item--disabled,.pagination__item[disabled]{opacity:.25;pointer-events:none}.pagination__link{border-radius:var(--ifm-pagination-border-radius);color:var(--ifm-font-color-base);display:inline-block;padding:var(--ifm-pagination-padding-vertical) var(--ifm-pagination-padding-horizontal);transition:background var(--ifm-transition-fast) var(--ifm-transition-timing-default)}.pagination__link:hover,.sidebarItemLink_mo7H:hover{text-decoration:none}.pagination-nav{display:grid;grid-gap:var(--ifm-spacing-horizontal);gap:var(--ifm-spacing-horizontal);grid-template-columns:repeat(2,1fr)}.pagination-nav__link{border:1px solid var(--ifm-color-emphasis-300);border-radius:var(--ifm-pagination-nav-border-radius);display:block;height:100%;line-height:var(--ifm-heading-line-height);padding:var(--ifm-global-spacing);transition:border-color var(--ifm-transition-fast) var(--ifm-transition-timing-default)}.pagination-nav__link:hover{border-color:var(--ifm-pagination-nav-color-hover);text-decoration:none}.pagination-nav__link--next{grid-column:2/3;text-align:right}.pagination-nav__label{font-size:var(--ifm-h4-font-size);font-weight:var(--ifm-heading-font-weight);word-break:break-word}.pagination-nav__link--prev .pagination-nav__label:before{content:"« "}.pagination-nav__link--next .pagination-nav__label:after{content:" »"}.pagination-nav__sublabel{color:var(--ifm-color-content-secondary);font-size:var(--ifm-h5-font-size);font-weight:var(--ifm-font-weight-semibold);margin-bottom:.25rem}.pills__item,.tabs{font-weight:var(--ifm-font-weight-bold)}.pills{display:flex;gap:var(--ifm-pills-spacing);padding-left:0}.pills__item{border-radius:.5rem;cursor:pointer;display:inline-block;padding:.25rem 1rem;transition:background var(--ifm-transition-fast) var(--ifm-transition-timing-default)}.tabs,:not(.containsTaskList_mC6p>li)>.containsTaskList_mC6p{padding-left:0}.pills__item--active{color:var(--ifm-pills-color-active)}.pills__item--active,.pills__item:not(.pills__item--active):hover{background:var(--ifm-pills-color-background-active)}.pills--block{justify-content:stretch}.pills--block .pills__item{flex-grow:1;text-align:center}.tabs{color:var(--ifm-tabs-color);display:flex;margin-bottom:0;overflow-x:auto}.tabs__item{border-bottom:3px solid #0000;border-radius:var(--ifm-global-radius);cursor:pointer;display:inline-flex;padding:var(--ifm-tabs-padding-vertical) var(--ifm-tabs-padding-horizontal);transition:background-color var(--ifm-transition-fast) var(--ifm-transition-timing-default)}.tabs__item--active{border-bottom-color:var(--ifm-tabs-color-active-border);border-bottom-left-radius:0;border-bottom-right-radius:0;color:var(--ifm-tabs-color-active)}.tabs__item:hover{background-color:var(--ifm-hover-overlay)}.tabs--block{justify-content:stretch}.tabs--block .tabs__item{flex-grow:1;justify-content:center}html[data-theme=dark]{--ifm-color-scheme:dark;--ifm-color-emphasis-0:var(--ifm-color-gray-1000);--ifm-color-emphasis-100:var(--ifm-color-gray-900);--ifm-color-emphasis-200:var(--ifm-color-gray-800);--ifm-color-emphasis-300:var(--ifm-color-gray-700);--ifm-color-emphasis-400:var(--ifm-color-gray-600);--ifm-color-emphasis-600:var(--ifm-color-gray-400);--ifm-color-emphasis-700:var(--ifm-color-gray-300);--ifm-color-emphasis-800:var(--ifm-color-gray-200);--ifm-color-emphasis-900:var(--ifm-color-gray-100);--ifm-color-emphasis-1000:var(--ifm-color-gray-0);--ifm-background-color:#1b1b1d;--ifm-background-surface-color:#242526;--ifm-hover-overlay:#ffffff0d;--ifm-color-content:#e3e3e3;--ifm-color-content-secondary:#fff;--ifm-breadcrumb-separator-filter:invert(64%) sepia(11%) saturate(0%) hue-rotate(149deg) brightness(99%) contrast(95%);--ifm-code-background:#ffffff1a;--ifm-scrollbar-track-background-color:#444;--ifm-scrollbar-thumb-background-color:#686868;--ifm-scrollbar-thumb-hover-background-color:#7a7a7a;--ifm-table-stripe-background:#ffffff12;--ifm-toc-border-color:var(--ifm-color-emphasis-200);--ifm-color-primary-contrast-background:#102445;--ifm-color-primary-contrast-foreground:#ebf2fc;--ifm-color-secondary-contrast-background:#474748;--ifm-color-secondary-contrast-foreground:#fdfdfe;--ifm-color-success-contrast-background:#003100;--ifm-color-success-contrast-foreground:#e6f6e6;--ifm-color-info-contrast-background:#193c47;--ifm-color-info-contrast-foreground:#eef9fd;--ifm-color-warning-contrast-background:#4d3800;--ifm-color-warning-contrast-foreground:#fff8e6;--ifm-color-danger-contrast-background:#4b1113;--ifm-color-danger-contrast-foreground:#ffebec}#nprogress .bar{background:var(--docusaurus-progress-bar-color);height:2px;left:0;position:fixed;top:0;width:100%;z-index:1031}#nprogress .peg{box-shadow:0 0 10px var(--docusaurus-progress-bar-color),0 0 5px var(--docusaurus-progress-bar-color);height:100%;opacity:1;position:absolute;right:0;transform:rotate(3deg) translateY(-4px);width:100px}@font-face{font-family:Mona Sans;font-stretch:75% 125%;font-weight:500 900;src:url(/assets/fonts/Mona-Sans-2f40792e491758879b8530661f90743a.woff2) format("woff2 supports variations"),url(/assets/fonts/Mona-Sans-2f40792e491758879b8530661f90743a.woff2) format("woff2-variations")}@font-face{font-family:Inter;font-stretch:75% 125%;font-weight:200 900;src:url(/assets/fonts/Inter.var-c2fe3cb2b7c746f7966a973d869d21c3.woff2) format("woff2 supports variations"),url(/assets/fonts/Inter.var-c2fe3cb2b7c746f7966a973d869d21c3.woff2) format("woff2-variations")}@font-face{font-family:Monaspace Neon;font-stretch:100% 100%;font-weight:200 900;src:url(/assets/fonts/Monaspace-Neon-d42b5dfd306f7308ea84dbc6980c5140.woff2) format("woff2 supports variations"),url(/assets/fonts/Monaspace-Neon-d42b5dfd306f7308ea84dbc6980c5140.woff2) format("woff2-variations")}h4,h5,h6,html{font-family:Inter,sans-serif}h1,h2,h3{font-family:Mona Sans,sans-serif}code *{font-family:Monaspace Neon,monospace;font-variant-ligatures:discretionary-ligatures}[data-theme=dark],[data-theme=light]{--ifm-color-primary-darkest:oklch(66.47% 0.298 7);--ifm-color-primary-darker:oklch(66.47% 0.298 7);--ifm-color-primary-dark:oklch(66.47% 0.298 7);--ifm-color-primary:oklch(66.47% 0.298 7);--ifm-color-primary-light:oklch(66.47% 0.298 7);--ifm-color-primary-lighter:oklch(66.47% 0.298 7);--ifm-color-primary-lightest:oklch(66.47% 0.298 7)}.header-discord-link{height:24px}.header-discord-link:before{background:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 127.14 96.36'%3E%3Cpath fill='%235865F2' d='M107.7 8.07A105.2 105.2 0 0 0 81.47 0a72 72 0 0 0-3.36 6.83 97.7 97.7 0 0 0-29.11 0A72 72 0 0 0 45.64 0a106 106 0 0 0-26.25 8.09C2.79 32.65-1.71 56.6.54 80.21a105.7 105.7 0 0 0 32.17 16.15 77.7 77.7 0 0 0 6.89-11.11 68.4 68.4 0 0 1-10.85-5.18c.91-.66 1.8-1.34 2.66-2a75.57 75.57 0 0 0 64.32 0c.87.71 1.76 1.39 2.66 2a68.7 68.7 0 0 1-10.87 5.19 77 77 0 0 0 6.89 11.1 105.3 105.3 0 0 0 32.19-16.14c2.64-27.38-4.51-51.11-18.9-72.15M42.45 65.69C36.18 65.69 31 60 31 53s5-12.74 11.43-12.74S54 46 53.89 53s-5.05 12.69-11.44 12.69m42.24 0C78.41 65.69 73.25 60 73.25 53s5-12.74 11.44-12.74S96.23 46 96.12 53s-5.04 12.69-11.43 12.69'/%3E%3C/svg%3E") no-repeat;content:"";display:flex;height:24px;right:550px;width:24px}.header-github-link:before{background:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath d='M12 .297c-6.63 0-12 5.373-12 12 0 5.303 3.438 9.8 8.205 11.385.6.113.82-.258.82-.577 0-.285-.01-1.04-.015-2.04-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729 1.205.084 1.838 1.236 1.838 1.236 1.07 1.835 2.809 1.305 3.495.998.108-.776.417-1.305.76-1.605-2.665-.3-5.466-1.332-5.466-5.93 0-1.31.465-2.38 1.235-3.22-.135-.303-.54-1.523.105-3.176 0 0 1.005-.322 3.3 1.23.96-.267 1.98-.399 3-.405 1.02.006 2.04.138 3 .405 2.28-1.552 3.285-1.23 3.285-1.23.645 1.653.24 2.873.12 3.176.765.84 1.23 1.91 1.23 3.22 0 4.61-2.805 5.625-5.475 5.92.42.36.81 1.096.81 2.22 0 1.606-.015 2.896-.015 3.286 0 .315.21.69.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12'/%3E%3C/svg%3E") no-repeat;content:"";display:flex;height:24px;width:24px}html[data-theme=dark] .header-github-link:before{background:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath fill='%23fff' d='M12 .297c-6.63 0-12 5.373-12 12 0 5.303 3.438 9.8 8.205 11.385.6.113.82-.258.82-.577 0-.285-.01-1.04-.015-2.04-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729 1.205.084 1.838 1.236 1.838 1.236 1.07 1.835 2.809 1.305 3.495.998.108-.776.417-1.305.76-1.605-2.665-.3-5.466-1.332-5.466-5.93 0-1.31.465-2.38 1.235-3.22-.135-.303-.54-1.523.105-3.176 0 0 1.005-.322 3.3 1.23.96-.267 1.98-.399 3-.405 1.02.006 2.04.138 3 .405 2.28-1.552 3.285-1.23 3.285-1.23.645 1.653.24 2.873.12 3.176.765.84 1.23 1.91 1.23 3.22 0 4.61-2.805 5.625-5.475 5.92.42.36.81 1.096.81 2.22 0 1.606-.015 2.896-.015 3.286 0 .315.21.69.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12'/%3E%3C/svg%3E") no-repeat}.backToTopButton_sjWU{background-color:var(--ifm-color-emphasis-200);border-radius:50%;bottom:1.3rem;box-shadow:var(--ifm-global-shadow-lw);height:3rem;opacity:0;position:fixed;right:1.3rem;transform:scale(0);transition:all var(--ifm-transition-fast) var(--ifm-transition-timing-default);visibility:hidden;width:3rem;z-index:calc(var(--ifm-z-index-fixed) - 1)}.backToTopButton_sjWU:after{background-color:var(--ifm-color-emphasis-1000);content:" ";display:inline-block;height:100%;-webkit-mask:var(--ifm-menu-link-sublist-icon) 50%/2rem 2rem no-repeat;mask:var(--ifm-menu-link-sublist-icon) 50%/2rem 2rem no-repeat;width:100%}.backToTopButtonShow_xfvO{opacity:1;transform:scale(1);visibility:visible}.skipToContent_fXgn{background-color:var(--ifm-background-surface-color);color:var(--ifm-color-emphasis-900);left:100%;padding:calc(var(--ifm-global-spacing)/2) var(--ifm-global-spacing);position:fixed;top:1rem;z-index:calc(var(--ifm-z-index-fixed) + 1)}.skipToContent_fXgn:focus{box-shadow:var(--ifm-global-shadow-md);left:1rem}.closeButton_CVFx{line-height:0;padding:0}.content_knG7{font-size:85%;padding:5px 0;text-align:center}.content_knG7 a{color:inherit}.announcementBar_mb4j{align-items:center;background-color:var(--ifm-color-white);border-bottom:1px solid var(--ifm-color-emphasis-100);color:var(--ifm-color-black);display:flex;height:var(--docusaurus-announcement-bar-height)}#__docusaurus-base-url-issue-banner-container,.docSidebarContainer_YfHR,.hideAction_vcyE>svg,.navbarSearchContainer_Bca1:empty,.sidebarLogo_isFc,.themedComponent_mlkZ,[data-theme=dark] .lightToggleIcon_pyhR,[data-theme=light] .darkToggleIcon_wfgR,html[data-announcement-bar-initially-dismissed=true] .announcementBar_mb4j{display:none}.announcementBarPlaceholder_vyr4{flex:0 0 10px}.announcementBarClose_gvF7{align-self:stretch;flex:0 0 30px}.toggle_vylO{height:2rem;width:2rem}.toggleButton_gllP{align-items:center;border-radius:50%;display:flex;height:100%;justify-content:center;transition:background var(--ifm-transition-fast);width:100%}.toggleButton_gllP:hover{background:var(--ifm-color-emphasis-200)}.toggleButtonDisabled_aARS{cursor:not-allowed}.darkNavbarColorModeToggle_X3D1:hover{background:var(--ifm-color-gray-800)}[data-theme=dark] .themedComponent--dark_xIcU,[data-theme=light] .themedComponent--light_NVdE,html:not([data-theme]) .themedComponent--light_NVdE{display:initial}[data-theme=dark]:root{--docusaurus-collapse-button-bg:#ffffff0d;--docusaurus-collapse-button-bg-hover:#ffffff1a}.collapseSidebarButton_PEFL{display:none;margin:0}.iconExternalLink_nPIU{margin-left:.3rem}.docMainContainer_TBSr,.docRoot_UBD9{display:flex;width:100%}.docsWrapper_hBAB{display:flex;flex:1 0 auto}.dropdownNavbarItemMobile_S0Fm{cursor:pointer}.iconLanguage_nlXk{margin-right:5px;vertical-align:text-bottom}.searchBar_RVTs .dropdownMenu_qbY6{background:var(--search-local-modal-background,#f5f6f7);border-radius:6px;box-shadow:var(--search-local-modal-shadow,inset 1px 1px 0 0 #ffffff80,0 3px 8px 0 #555a64);left:auto!important;margin-top:8px;padding:var(--search-local-spacing,12px);position:relative;right:0!important;width:var(--search-local-modal-width,560px)}html[data-theme=dark] .searchBar_RVTs .dropdownMenu_qbY6{background:var(--search-local-modal-background,var(--ifm-background-color));box-shadow:var(--search-local-modal-shadow,inset 1px 1px 0 0 #2c2e40,0 3px 8px 0 #000309)}.searchBar_RVTs .dropdownMenu_qbY6 .suggestion_fB_2{align-items:center;background:var(--search-local-hit-background,#fff);border-radius:4px;box-shadow:var(--search-local-hit-shadow,0 1px 3px 0 #d4d9e1);color:var(--search-local-hit-color,#444950);cursor:pointer;display:flex;flex-direction:row;height:var(--search-local-hit-height,56px);padding:0 var(--search-local-spacing,12px);width:100%}.hitTree_kk6K,.noResults_l6Q3{align-items:center;display:flex}html[data-theme=dark] .dropdownMenu_qbY6 .suggestion_fB_2{background:var(--search-local-hit-background,var(--ifm-color-emphasis-100));box-shadow:var(--search-local-hit-shadow,none);color:var(--search-local-hit-color,var(--ifm-font-color-base))}.searchBar_RVTs .dropdownMenu_qbY6 .suggestion_fB_2:not(:last-child){margin-bottom:4px}.searchBar_RVTs .dropdownMenu_qbY6 .suggestion_fB_2.cursor_eG29{background-color:var(--search-local-highlight-color,var(--ifm-color-primary))}.hitFooter_E9YW a,.hitIcon_a7Zy,.hitPath_ieM4,.hitTree_kk6K,.noResultsIcon_EBY5{color:var(--search-local-muted-color,#969faf)}html[data-theme=dark] .hitIcon_a7Zy,html[data-theme=dark] .hitPath_ieM4,html[data-theme=dark] .hitTree_kk6K,html[data-theme=dark] .noResultsIcon_EBY5{color:var(--search-local-muted-color,var(--ifm-color-secondary-darkest))}.hitTree_kk6K>svg{height:var(--search-local-hit-height,56px);opacity:.5;width:24px}.hitIcon_a7Zy,.hitTree_kk6K>svg{stroke-width:var(--search-local-icon-stroke-width,1.4)}.hitAction_NqkB,.hitIcon_a7Zy{height:20px;width:20px}.hitWrapper_sAK8{display:flex;flex:1 1 auto;flex-direction:column;font-weight:500;justify-content:center;margin:0 8px;overflow-x:hidden;width:80%}.hitWrapper_sAK8 mark{background:none;color:var(--search-local-highlight-color,var(--ifm-color-primary))}.hitTitle_vyVt{font-size:.9em}.hitPath_ieM4{font-size:.75em}.hitPath_ieM4,.hitTitle_vyVt{overflow-x:hidden;text-overflow:ellipsis;white-space:nowrap}.noResults_l6Q3{flex-direction:column;justify-content:center;padding:var(--search-local-spacing,12px) 0}.noResultsIcon_EBY5{margin-bottom:var(--search-local-spacing,12px)}.hitFooter_E9YW{font-size:.85em;margin-top:var(--search-local-spacing,12px);text-align:center}.cursor_eG29 .hideAction_vcyE>svg,.tocCollapsibleContent_vkbj a{display:block}.suggestion_fB_2.cursor_eG29,.suggestion_fB_2.cursor_eG29 .hitIcon_a7Zy,.suggestion_fB_2.cursor_eG29 .hitPath_ieM4,.suggestion_fB_2.cursor_eG29 .hitTree_kk6K,.suggestion_fB_2.cursor_eG29 mark{color:var(--search-local-hit-active-color,var(--ifm-color-white))!important}.searchBarContainer_NW3z{margin-left:16px}.searchBarContainer_NW3z .searchBarLoadingRing_YnHq{display:none;left:10px;position:absolute;top:6px}.searchBarContainer_NW3z .searchClearButton_qk4g{background:none;border:none;line-height:1rem;padding:0;position:absolute;right:.8rem;top:50%;transform:translateY(-50%)}.navbar__search{position:relative}.searchIndexLoading_EJ1f .navbar__search-input{background-image:none}.searchHintContainer_Pkmr{align-items:center;display:flex;gap:4px;height:100%;justify-content:center;pointer-events:none;position:absolute;right:10px;top:0}.searchHint_iIMx{background-color:var(--ifm-navbar-search-input-background-color);border:1px solid var(--ifm-color-emphasis-500);box-shadow:inset 0 -1px 0 var(--ifm-color-emphasis-500);color:var(--ifm-navbar-search-input-placeholder-color)}.loadingRing_RJI3{display:inline-block;height:20px;opacity:var(--search-local-loading-icon-opacity,.5);position:relative;width:20px}.authorSocialIcon_XYv3,.authorSocialLink_owbf,.authorSocials_rSDt{height:var(--docusaurus-blog-social-icon-size)}.loadingRing_RJI3 div{animation:1.2s cubic-bezier(.5,0,.5,1) infinite a;border:2px solid var(--search-load-loading-icon-color,var(--ifm-navbar-search-input-color));border-color:var(--search-load-loading-icon-color,var(--ifm-navbar-search-input-color)) #0000 #0000 #0000;border-radius:50%;display:block;height:16px;margin:2px;position:absolute;width:16px}.loadingRing_RJI3 div:first-child{animation-delay:-.45s}.loadingRing_RJI3 div:nth-child(2){animation-delay:-.3s}.loadingRing_RJI3 div:nth-child(3){animation-delay:-.15s}@keyframes a{0%{transform:rotate(0)}to{transform:rotate(1turn)}}.navbarHideable_m1mJ{transition:transform var(--ifm-transition-fast) ease}.navbarHidden_jGov{transform:translate3d(0,calc(-100% - 2px),0)}.errorBoundaryError_a6uf{color:red;white-space:pre-wrap}.errorBoundaryFallback_VBag{color:red;padding:.55rem}.footerLogoLink_BH7S{opacity:.5;transition:opacity var(--ifm-transition-fast) var(--ifm-transition-timing-default)}.footerLogoLink_BH7S:hover,.hash-link:focus,:hover>.hash-link{opacity:1}body:not(.navigation-with-keyboard) :not(input):focus{outline:0}.anchorWithStickyNavbar_LWe7{scroll-margin-top:calc(var(--ifm-navbar-height) + .5rem)}.anchorWithHideOnScrollNavbar_WYt5{scroll-margin-top:.5rem}.hash-link{opacity:0;padding-left:.5rem;transition:opacity var(--ifm-transition-fast);-webkit-user-select:none;user-select:none}.hash-link:before{content:"#"}.mainWrapper_z2l0{display:flex;flex:1 0 auto;flex-direction:column}.docusaurus-mt-lg{margin-top:3rem}#__docusaurus{display:flex;flex-direction:column;min-height:100%}.sidebar_re4s{overflow-y:auto;position:sticky;top:calc(var(--ifm-navbar-height) + 2rem)}.sidebarItemTitle_pO2u{font-size:var(--ifm-h3-font-size);font-weight:var(--ifm-font-weight-bold)}.container_mt6G,.sidebarItemList_Yudw{font-size:.9rem}.sidebarItem__DBe{margin-top:.7rem}.sidebarItemLink_mo7H{color:var(--ifm-font-color-base);display:block}.sidebarItemLinkActive_I1ZP{color:var(--ifm-color-primary)!important}.yearGroupHeading_rMGB{margin-bottom:.4rem;margin-top:1.6rem}.yearGroupHeading_QT03{margin:1rem .75rem .5rem}.searchContextInput_mXoe,.searchQueryInput_CFBF{background:var(--ifm-background-color);border:var(--ifm-global-border-width) solid var(--ifm-color-content-secondary);border-radius:var(--ifm-global-radius);color:var(--ifm-font-color-base);font-size:var(--ifm-font-size-base);margin-bottom:1rem;padding:.5rem;width:100%}.authorSocialIcon_XYv3,.authorSocialLink_owbf{width:var(--docusaurus-blog-social-icon-size)}.searchResultItem_U687{border-bottom:1px solid #dfe3e8;padding:1rem 0}.searchResultItemPath_uIbk{color:var(--ifm-color-content-secondary);font-size:.8rem;margin:.5rem 0 0}.searchResultItemSummary_oZHr{font-style:italic;margin:.5rem 0 0}[data-theme=dark] .githubSvg_Uu4N,[data-theme=dark] .xSvg_y3PF{fill:var(--light)}[data-theme=light] .githubSvg_Uu4N,[data-theme=light] .xSvg_y3PF{fill:var(--dark)}.authorSocials_rSDt{align-items:center;display:flex;flex-wrap:wrap;line-clamp:1;-webkit-line-clamp:1}.authorSocialLink_owbf,.authorSocials_rSDt{line-height:0}.authorSocialLink_owbf{margin-right:.4rem}.authorImage_XqGP{--ifm-avatar-photo-size:3.6rem}.author-as-h1_n9oJ .authorImage_XqGP{--ifm-avatar-photo-size:7rem}.author-as-h2_gXvM .authorImage_XqGP{--ifm-avatar-photo-size:5.4rem}.authorDetails_lV9A{align-items:flex-start;display:flex;flex-direction:column;justify-content:space-around}.authorName_yefp{display:flex;flex-direction:row;font-size:1.1rem;line-height:1.1rem}.author-as-h1_n9oJ .authorName_yefp{display:inline;font-size:2.4rem;line-height:2.4rem}.author-as-h2_gXvM .authorName_yefp{display:inline;font-size:1.4rem;line-height:1.4rem}.authorTitle_nd0D{display:-webkit-box;font-size:.8rem;line-height:1rem;line-clamp:1;-webkit-line-clamp:1}.author-as-h1_n9oJ .authorTitle_nd0D{font-size:1.2rem;line-height:1.6rem}.author-as-h2_gXvM .authorTitle_nd0D{font-size:1rem;line-height:1.3rem}.authorBlogPostCount_iiJ5{background:var(--ifm-color-secondary);border-radius:var(--ifm-global-radius);color:var(--ifm-color-black);font-size:.8rem;line-height:1.2;margin-left:.3rem;padding:.1rem .4rem}.buttonGroup__atx button,.codeBlockContainer_Ckt0{background:var(--prism-background-color);color:var(--prism-color)}.authorCol_Hf19{max-width:inherit!important}.imageOnlyAuthorRow_pa_O{display:flex;flex-flow:row wrap}.imageOnlyAuthorCol_G86a{margin-left:.3rem;margin-right:.3rem}.heroBanner_qdFl{overflow:hidden;padding:4rem 0;position:relative;text-align:center}.buttons_AeoN{align-items:center;display:flex;justify-content:center}.codeBlockContainer_Ckt0{border-radius:var(--ifm-code-border-radius);box-shadow:var(--ifm-global-shadow-lw);margin-bottom:var(--ifm-leading)}.codeBlockContent_biex{border-radius:inherit;direction:ltr;position:relative}.codeBlockTitle_Ktv7{border-bottom:1px solid var(--ifm-color-emphasis-300);border-top-left-radius:inherit;border-top-right-radius:inherit;font-size:var(--ifm-code-font-size);font-weight:500;padding:.75rem var(--ifm-pre-padding)}.codeBlock_bY9V{--ifm-pre-background:var(--prism-background-color);margin:0;padding:0}.codeBlockTitle_Ktv7+.codeBlockContent_biex .codeBlock_bY9V{border-top-left-radius:0;border-top-right-radius:0}.codeBlockLines_e6Vv{float:left;font:inherit;min-width:100%;padding:var(--ifm-pre-padding)}.codeBlockLinesWithNumbering_o6Pm{display:table;padding:var(--ifm-pre-padding) 0}.buttonGroup__atx{column-gap:.2rem;display:flex;position:absolute;right:calc(var(--ifm-pre-padding)/2);top:calc(var(--ifm-pre-padding)/2)}.buttonGroup__atx button{align-items:center;border:1px solid var(--ifm-color-emphasis-300);border-radius:var(--ifm-global-radius);display:flex;line-height:0;opacity:0;padding:.4rem;transition:opacity var(--ifm-transition-fast) ease-in-out}.buttonGroup__atx button:focus-visible,.buttonGroup__atx button:hover{opacity:1!important}.theme-code-block:hover .buttonGroup__atx button{opacity:.4}:where(:root){--docusaurus-highlighted-code-line-bg:#484d5b}:where([data-theme=dark]){--docusaurus-highlighted-code-line-bg:#646464}.theme-code-block-highlighted-line{background-color:var(--docusaurus-highlighted-code-line-bg);display:block;margin:0 calc(var(--ifm-pre-padding)*-1);padding:0 var(--ifm-pre-padding)}.codeLine_lJS_{counter-increment:a;display:table-row}.codeLineNumber_Tfdd{background:var(--ifm-pre-background);display:table-cell;left:0;overflow-wrap:normal;padding:0 var(--ifm-pre-padding);position:sticky;text-align:right;width:1%}.codeLineNumber_Tfdd:before{content:counter(a);opacity:.4}.codeLineContent_feaV{padding-right:var(--ifm-pre-padding)}.theme-code-block:hover .copyButtonCopied_obH4{opacity:1!important}.copyButtonIcons_eSgA{height:1.125rem;position:relative;width:1.125rem}.copyButtonIcon_y97N,.copyButtonSuccessIcon_LjdS{left:0;position:absolute;top:0;fill:currentColor;height:inherit;opacity:inherit;transition:all var(--ifm-transition-fast) ease;width:inherit}.copyButtonSuccessIcon_LjdS{color:#00d600;left:50%;opacity:0;top:50%;transform:translate(-50%,-50%) scale(.33)}.copyButtonCopied_obH4 .copyButtonIcon_y97N{opacity:0;transform:scale(.33)}.copyButtonCopied_obH4 .copyButtonSuccessIcon_LjdS{opacity:1;transform:translate(-50%,-50%) scale(1);transition-delay:75ms}.tag_zVej{border:1px solid var(--docusaurus-tag-list-border);transition:border var(--ifm-transition-fast)}.tag_zVej:hover{--docusaurus-tag-list-border:var(--ifm-link-color);text-decoration:none}.tagRegular_sFm0{border-radius:var(--ifm-global-radius);font-size:90%;padding:.2rem .5rem .3rem}.tagWithCount_h2kH{align-items:center;border-left:0;display:flex;padding:0 .5rem 0 1rem;position:relative}.tagWithCount_h2kH:after,.tagWithCount_h2kH:before{border:1px solid var(--docusaurus-tag-list-border);content:"";position:absolute;top:50%;transition:inherit}.tagWithCount_h2kH:before{border-bottom:0;border-right:0;height:1.18rem;right:100%;transform:translate(50%,-50%) rotate(-45deg);width:1.18rem}.tagWithCount_h2kH:after{border-radius:50%;height:.5rem;left:0;transform:translateY(-50%);width:.5rem}.tagWithCount_h2kH span{background:var(--ifm-color-secondary);border-radius:var(--ifm-global-radius);color:var(--ifm-color-black);font-size:.7rem;line-height:1.2;margin-left:.3rem;padding:.1rem .4rem}.tag_Nnez{display:inline-block;margin:.5rem .5rem 0 1rem}.wordWrapButtonIcon_Bwma{height:1.2rem;width:1.2rem}.tags_jXut{display:inline}.tag_QGVx{display:inline-block;margin:0 .4rem .5rem 0}.iconEdit_Z9Sw{margin-right:.3em;vertical-align:sub}.details_lb9f{--docusaurus-details-summary-arrow-size:0.38rem;--docusaurus-details-transition:transform 200ms ease;--docusaurus-details-decoration-color:grey}.details_lb9f>summary{cursor:pointer;padding-left:1rem;position:relative}.details_lb9f>summary::-webkit-details-marker{display:none}.details_lb9f>summary:before{border-color:#0000 #0000 #0000 var(--docusaurus-details-decoration-color);border-style:solid;border-width:var(--docusaurus-details-summary-arrow-size);content:"";left:0;position:absolute;top:.45rem;transform:rotate(0);transform-origin:calc(var(--docusaurus-details-summary-arrow-size)/2) 50%;transition:var(--docusaurus-details-transition)}.collapsibleContent_i85q{border-top:1px solid var(--docusaurus-details-decoration-color);margin-top:1rem;padding-top:1rem}.lastUpdated_JAkA{font-size:smaller;font-style:italic;margin-top:.2rem}.tocCollapsibleButton_TO0P{align-items:center;display:flex;font-size:inherit;justify-content:space-between;padding:.4rem .8rem;width:100%}.tocCollapsibleButton_TO0P:after{background:var(--ifm-menu-link-sublist-icon) 50% 50%/2rem 2rem no-repeat;content:"";filter:var(--ifm-menu-link-sublist-icon-filter);height:1.25rem;transform:rotate(180deg);transition:transform var(--ifm-transition-fast);width:1.25rem}.tocCollapsibleButtonExpanded_MG3E:after,.tocCollapsibleExpanded_sAul{transform:none}.tocCollapsible_ETCw{background-color:var(--ifm-menu-color-background-active);border-radius:var(--ifm-global-radius);margin:1rem 0}.tocCollapsibleContent_vkbj>ul{border-left:none;border-top:1px solid var(--ifm-color-emphasis-300);font-size:15px;padding:.2rem 0}.tocCollapsibleContent_vkbj ul li{margin:.4rem .8rem}.details_b_Ee{--docusaurus-details-decoration-color:var(--ifm-alert-border-color);--docusaurus-details-transition:transform var(--ifm-transition-fast) ease;border:1px solid var(--ifm-alert-border-color);margin:0 0 var(--ifm-spacing-vertical)}.img_ev3q{height:auto}.tableOfContents_bqdL{overflow-y:auto;position:sticky;top:calc(var(--ifm-navbar-height) + 1rem)}.admonition_xJq3{margin-bottom:1em}.admonitionHeading_Gvgb{font:var(--ifm-heading-font-weight) var(--ifm-h5-font-size)/var(--ifm-heading-line-height) var(--ifm-heading-font-family)}.admonitionHeading_Gvgb:not(:last-child){margin-bottom:.3rem}.admonitionHeading_Gvgb code{text-transform:none}.admonitionIcon_Rf37{display:inline-block;margin-right:.4em;vertical-align:middle}.admonitionIcon_Rf37 svg{display:inline-block;height:1.6em;width:1.6em;fill:var(--ifm-alert-foreground-color)}.breadcrumbHomeIcon_YNFT{height:1.1rem;position:relative;top:1px;vertical-align:top;width:1.1rem}.breadcrumbsContainer_Z_bl{--ifm-breadcrumb-size-multiplier:0.8;margin-bottom:.8rem}.mdxPageWrapper_j9I6{justify-content:center}@media (min-width:997px){.collapseSidebarButton_PEFL,.expandButton_TmdG{background-color:var(--docusaurus-collapse-button-bg)}:root{--docusaurus-announcement-bar-height:30px}.announcementBarClose_gvF7,.announcementBarPlaceholder_vyr4{flex-basis:50px}.collapseSidebarButton_PEFL{border:1px solid var(--ifm-toc-border-color);border-radius:0;bottom:0;display:block!important;height:40px;position:sticky}.collapseSidebarButtonIcon_kv0_{margin-top:4px;transform:rotate(180deg)}.expandButtonIcon_i1dp,[dir=rtl] .collapseSidebarButtonIcon_kv0_{transform:rotate(0)}.collapseSidebarButton_PEFL:focus,.collapseSidebarButton_PEFL:hover,.expandButton_TmdG:focus,.expandButton_TmdG:hover{background-color:var(--docusaurus-collapse-button-bg-hover)}.menuHtmlItem_M9Kj{padding:var(--ifm-menu-link-padding-vertical) var(--ifm-menu-link-padding-horizontal)}.menu_SIkG{flex-grow:1;padding:.5rem}@supports (scrollbar-gutter:stable){.menu_SIkG{padding:.5rem 0 .5rem .5rem;scrollbar-gutter:stable}}.menuWithAnnouncementBar_GW3s{margin-bottom:var(--docusaurus-announcement-bar-height)}.sidebar_njMd{display:flex;flex-direction:column;height:100%;padding-top:var(--ifm-navbar-height);width:var(--doc-sidebar-width)}.sidebarWithHideableNavbar_wUlq{padding-top:0}.sidebarHidden_VK0M{opacity:0;visibility:hidden}.sidebarLogo_isFc{align-items:center;color:inherit!important;display:flex!important;margin:0 var(--ifm-navbar-padding-horizontal);max-height:var(--ifm-navbar-height);min-height:var(--ifm-navbar-height);text-decoration:none!important}.sidebarLogo_isFc img{height:2rem;margin-right:.5rem}.expandButton_TmdG{align-items:center;display:flex;height:100%;justify-content:center;position:absolute;right:0;top:0;transition:background-color var(--ifm-transition-fast) ease;width:100%}[dir=rtl] .expandButtonIcon_i1dp{transform:rotate(180deg)}.docSidebarContainer_YfHR{border-right:1px solid var(--ifm-toc-border-color);-webkit-clip-path:inset(0);clip-path:inset(0);display:block;margin-top:calc(var(--ifm-navbar-height)*-1);transition:width var(--ifm-transition-fast) ease;width:var(--doc-sidebar-width);will-change:width}.docSidebarContainerHidden_DPk8{cursor:pointer;width:var(--doc-sidebar-hidden-width)}.sidebarViewport_aRkj{height:100%;max-height:100vh;position:sticky;top:0}.docMainContainer_TBSr{flex-grow:1;max-width:calc(100% - var(--doc-sidebar-width))}.docMainContainerEnhanced_lQrH{max-width:calc(100% - var(--doc-sidebar-hidden-width))}.docItemWrapperEnhanced_JWYK{max-width:calc(var(--ifm-container-width) + var(--doc-sidebar-width))!important}.navbarSearchContainer_Bca1{padding:var(--ifm-navbar-item-padding-vertical) var(--ifm-navbar-item-padding-horizontal)}.lastUpdated_JAkA{text-align:right}.tocMobile_ITEo{display:none}.docItemCol_VOVn{max-width:75%!important}}@media (min-width:1440px){.container{max-width:var(--ifm-container-width-xl)}}@media (max-width:996px){.col{--ifm-col-width:100%;flex-basis:var(--ifm-col-width);margin-left:0}.footer{--ifm-footer-padding-horizontal:0}.colorModeToggle_DEke,.footer__link-separator,.navbar__item,.sidebar_re4s,.tableOfContents_bqdL{display:none}.footer__col{margin-bottom:calc(var(--ifm-spacing-vertical)*3)}.footer__link-item{display:block}.hero{padding-left:0;padding-right:0}.navbar>.container,.navbar>.container-fluid{padding:0}.navbar__toggle{display:inherit}.navbar__search-input{width:9rem}.pills--block,.tabs--block{flex-direction:column}.navbarSearchContainer_Bca1{position:absolute;right:var(--ifm-navbar-padding-horizontal)}.docItemContainer_F8PC{padding:0 .3rem}}@media not (max-width:996px){.searchBar_RVTs.searchBarLeft_MXDe .dropdownMenu_qbY6{left:0!important;right:auto!important}}@media only screen and (max-width:996px){.searchQueryColumn_q7nx{max-width:60%!important}.searchContextColumn_oWAF{max-width:40%!important}}@media screen and (max-width:996px){.heroBanner_qdFl{padding:2rem}}@media (max-width:576px){.markdown h1:first-child{--ifm-h1-font-size:2rem}.markdown>h2{--ifm-h2-font-size:1.5rem}.markdown>h3{--ifm-h3-font-size:1.25rem}.navbar__search-input:not(:focus){width:2rem}.searchBar_RVTs .dropdownMenu_qbY6{max-width:calc(100vw - var(--ifm-navbar-padding-horizontal)*2);width:var(--search-local-modal-width-sm,340px)}.searchBarContainer_NW3z:not(.focused_OWtg) .searchClearButton_qk4g,.searchHintContainer_Pkmr{display:none}.title_f1Hy{font-size:2rem}}@media screen and (max-width:576px){.searchQueryColumn_q7nx{max-width:100%!important}.searchContextColumn_oWAF{max-width:100%!important;padding-left:var(--ifm-spacing-horizontal)!important}}@media (hover:hover){.backToTopButton_sjWU:hover{background-color:var(--ifm-color-emphasis-300)}}@media (pointer:fine){.thin-scrollbar{scrollbar-width:thin}.thin-scrollbar::-webkit-scrollbar{height:var(--ifm-scrollbar-size);width:var(--ifm-scrollbar-size)}.thin-scrollbar::-webkit-scrollbar-track{background:var(--ifm-scrollbar-track-background-color);border-radius:10px}.thin-scrollbar::-webkit-scrollbar-thumb{background:var(--ifm-scrollbar-thumb-background-color);border-radius:10px}.thin-scrollbar::-webkit-scrollbar-thumb:hover{background:var(--ifm-scrollbar-thumb-hover-background-color)}}@media (prefers-reduced-motion:reduce){:root{--ifm-transition-fast:0ms;--ifm-transition-slow:0ms}}@media print{.announcementBar_mb4j,.footer,.menu,.navbar,.pagination-nav,.table-of-contents,.tocMobile_ITEo{display:none}.tabs{page-break-inside:avoid}.codeBlockLines_e6Vv{white-space:pre-wrap}} \ No newline at end of file diff --git a/assets/js/0058b4c6.feb02692.js b/assets/js/0058b4c6.8524d6e5.js similarity index 57% rename from assets/js/0058b4c6.feb02692.js rename to assets/js/0058b4c6.8524d6e5.js index 9a7276b0..f541a1f9 100644 --- a/assets/js/0058b4c6.feb02692.js +++ b/assets/js/0058b4c6.8524d6e5.js @@ -1 +1 @@ -"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[849],{6164:e=>{e.exports=JSON.parse('{"version":{"pluginId":"default","version":"current","label":"Next","banner":null,"badge":false,"noIndex":false,"className":"docs-version-current","isLast":true,"docsSidebars":{"tutorialSidebar":[{"type":"category","label":"\ud83d\udca1 Introduction","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Prologue","href":"/docs/introduction/prologue","docId":"introduction/prologue","unlisted":false},{"type":"link","label":"Terminology","href":"/docs/introduction/terminology","docId":"introduction/terminology","unlisted":false},{"type":"link","label":"Lossless Compression","href":"/docs/introduction/lossless","docId":"introduction/lossless","unlisted":false},{"type":"link","label":"Lossy Compression","href":"/docs/introduction/lossy","docId":"introduction/lossy","unlisted":false},{"type":"link","label":"Spotting Video Artifacts","href":"/docs/introduction/video-artifacts","docId":"introduction/video-artifacts","unlisted":false},{"type":"link","label":"Psychovisual","href":"/docs/introduction/psychovisual","docId":"introduction/psychovisual","unlisted":false},{"type":"link","label":"High Dynamic Range","href":"/docs/introduction/high-dynamic-range","docId":"introduction/high-dynamic-range","unlisted":false}]},{"type":"category","label":"\ud83d\udd0a Audio","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Intro","href":"/docs/audio/intro","docId":"audio/intro","unlisted":false},{"type":"link","label":"AAC","href":"/docs/audio/AAC","docId":"audio/AAC","unlisted":false},{"type":"link","label":"Opus","href":"/docs/audio/Opus","docId":"audio/Opus","unlisted":false},{"type":"link","label":"Dolby Digital","href":"/docs/audio/Dolby","docId":"audio/Dolby","unlisted":false},{"type":"link","label":"MP3","href":"/docs/audio/MP3","docId":"audio/MP3","unlisted":false},{"type":"link","label":"Vorbis","href":"/docs/audio/Vorbis","docId":"audio/Vorbis","unlisted":false},{"type":"link","label":"Speex","href":"/docs/audio/Speex","docId":"audio/Speex","unlisted":false},{"type":"link","label":"ALAC","href":"/docs/audio/ALAC","docId":"audio/ALAC","unlisted":false},{"type":"link","label":"FLAC","href":"/docs/audio/FLAC","docId":"audio/FLAC","unlisted":false},{"type":"link","label":"WavPack","href":"/docs/audio/WavPack","docId":"audio/WavPack","unlisted":false}]},{"type":"category","label":"\ud83d\udcf9\ufe0f Video","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"AVC / H.264","href":"/docs/video/AVC","docId":"video/AVC","unlisted":false},{"type":"link","label":"HEVC / H.265","href":"/docs/video/HEVC","docId":"video/HEVC","unlisted":false},{"type":"link","label":"VVC / H.266","href":"/docs/video/VVC","docId":"video/VVC","unlisted":false},{"type":"link","label":"VP8","href":"/docs/video/VP8","docId":"video/VP8","unlisted":false},{"type":"link","label":"VP9","href":"/docs/video/VP9","docId":"video/VP9","unlisted":false},{"type":"link","label":"AV1","href":"/docs/video/AV1","docId":"video/AV1","unlisted":false},{"type":"link","label":"AVS3","href":"/docs/video/AVS3","docId":"video/AVS3","unlisted":false},{"type":"link","label":"VC-1","href":"/docs/video/VC-1","docId":"video/VC-1","unlisted":false},{"type":"link","label":"Theora","href":"/docs/video/Theora","docId":"video/Theora","unlisted":false},{"type":"link","label":"FFV1","href":"/docs/video/FFV1","docId":"video/FFV1","unlisted":false},{"type":"link","label":"UT Video","href":"/docs/video/utvideo","docId":"video/utvideo","unlisted":false},{"type":"link","label":"ProRes","href":"/docs/video/prores","docId":"video/prores","unlisted":false},{"type":"link","label":"ECM","href":"/docs/video/ECM","docId":"video/ECM","unlisted":false}]},{"type":"category","label":"\ud83d\udcbd Data","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"ZIP","href":"/docs/data/zip","docId":"data/zip","unlisted":false},{"type":"link","label":"gzip","href":"/docs/data/gzip","docId":"data/gzip","unlisted":false},{"type":"link","label":"bzip2","href":"/docs/data/bzip2","docId":"data/bzip2","unlisted":false},{"type":"link","label":"7z","href":"/docs/data/7z","docId":"data/7z","unlisted":false},{"type":"link","label":"xz","href":"/docs/data/xz","docId":"data/xz","unlisted":false},{"type":"link","label":"brotli","href":"/docs/data/brotli","docId":"data/brotli","unlisted":false},{"type":"link","label":"zpaq","href":"/docs/data/zpaq","docId":"data/zpaq","unlisted":false},{"type":"link","label":"zstd","href":"/docs/data/zstd","docId":"data/zstd","unlisted":false},{"type":"link","label":"tar","href":"/docs/data/tar","docId":"data/tar","unlisted":false}]},{"type":"category","label":"\ud83c\udfde\ufe0f Images","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"JPEG","href":"/docs/images/JPEG","docId":"images/JPEG","unlisted":false},{"type":"link","label":"PNG","href":"/docs/images/PNG","docId":"images/PNG","unlisted":false},{"type":"link","label":"GIF","href":"/docs/images/GIF","docId":"images/GIF","unlisted":false},{"type":"link","label":"HEIC","href":"/docs/images/HEIC","docId":"images/HEIC","unlisted":false},{"type":"link","label":"WebP","href":"/docs/images/WebP","docId":"images/WebP","unlisted":false},{"type":"link","label":"JPEG 2000","href":"/docs/images/JPEG2000","docId":"images/JPEG2000","unlisted":false},{"type":"link","label":"AVIF","href":"/docs/images/AVIF","docId":"images/AVIF","unlisted":false},{"type":"link","label":"JPEG-XL","href":"/docs/images/JXL","docId":"images/JXL","unlisted":false},{"type":"link","label":"QOI","href":"/docs/images/QOI","docId":"images/QOI","unlisted":false}]},{"type":"category","label":"\ud83d\udcbe Encoders","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"x264","href":"/docs/encoders/x264","docId":"encoders/x264","unlisted":false},{"type":"link","label":"x265","href":"/docs/encoders/x265","docId":"encoders/x265","unlisted":false},{"type":"link","label":"x266","href":"/docs/encoders/x266","docId":"encoders/x266","unlisted":false},{"type":"link","label":"aomenc","href":"/docs/encoders/aomenc","docId":"encoders/aomenc","unlisted":false},{"type":"link","label":"SVT-AV1-PSY","href":"/docs/encoders/SVT-AV1-PSY","docId":"encoders/SVT-AV1-PSY","unlisted":false},{"type":"link","label":"SVT-AV1","href":"/docs/encoders/SVT-AV1","docId":"encoders/SVT-AV1","unlisted":false},{"type":"link","label":"rav1e","href":"/docs/encoders/rav1e","docId":"encoders/rav1e","unlisted":false},{"type":"link","label":"Aurora1 AV1","href":"/docs/encoders/Aurora1","docId":"encoders/Aurora1","unlisted":false},{"type":"link","label":"vpxenc","href":"/docs/encoders/vpxenc","docId":"encoders/vpxenc","unlisted":false},{"type":"link","label":"SVT-VP9","href":"/docs/encoders/SVT-VP9","docId":"encoders/SVT-VP9","unlisted":false},{"type":"link","label":"SVT-HEVC","href":"/docs/encoders/SVT-HEVC","docId":"encoders/SVT-HEVC","unlisted":false},{"type":"link","label":"Kvazaar","href":"/docs/encoders/Kvazaar","docId":"encoders/Kvazaar","unlisted":false},{"type":"link","label":"VVenC","href":"/docs/encoders/VVenC","docId":"encoders/VVenC","unlisted":false},{"type":"link","label":"uvg266","href":"/docs/encoders/uvg266","docId":"encoders/uvg266","unlisted":false},{"type":"link","label":"VTM","href":"/docs/encoders/VTM","docId":"encoders/VTM","unlisted":false},{"type":"link","label":"AVM","href":"/docs/encoders/AVM","docId":"encoders/AVM","unlisted":false},{"type":"link","label":"HM","href":"/docs/encoders/HM","docId":"encoders/HM","unlisted":false},{"type":"link","label":"JM","href":"/docs/encoders/JM","docId":"encoders/JM","unlisted":false},{"type":"link","label":"aom-av1-lavish","href":"/docs/encoders/aom-av1-lavish","docId":"encoders/aom-av1-lavish","unlisted":false},{"type":"link","label":"aom-psy101","href":"/docs/encoders/aom-psy101","docId":"encoders/aom-psy101","unlisted":false},{"type":"link","label":"uavs3e","href":"/docs/encoders/uavs3e","docId":"encoders/uavs3e","unlisted":false}]},{"type":"category","label":"\ud83d\ude80 Hardware Encoders","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"NVENC","href":"/docs/encoders_hw/nvenc","docId":"encoders_hw/nvenc","unlisted":false},{"type":"link","label":"QSV","href":"/docs/encoders_hw/qsv","docId":"encoders_hw/qsv","unlisted":false},{"type":"link","label":"AMF","href":"/docs/encoders_hw/amf","docId":"encoders_hw/amf","unlisted":false},{"type":"link","label":"VideoToolbox","href":"/docs/encoders_hw/videotoolbox","docId":"encoders_hw/videotoolbox","unlisted":false},{"type":"link","label":"Mediacodec","href":"/docs/encoders_hw/mediacodec","docId":"encoders_hw/mediacodec","unlisted":false}]},{"type":"category","label":"\ud83d\udcac Subtitles","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"SRT","href":"/docs/subtitles/SRT","docId":"subtitles/SRT","unlisted":false},{"type":"link","label":"SubStation Alpha","href":"/docs/subtitles/SSA","docId":"subtitles/SSA","unlisted":false},{"type":"link","label":"WebVTT","href":"/docs/subtitles/webvtt","docId":"subtitles/webvtt","unlisted":false}]},{"type":"category","label":"\ud83c\udf9e\ufe0f Filtering","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Vapoursynth","href":"/docs/filtering/vapoursynth","docId":"filtering/vapoursynth","unlisted":false},{"type":"link","label":"Basics of Filtering","href":"/docs/filtering/basics","docId":"filtering/basics","unlisted":false},{"type":"link","label":"Inverse Telecine","href":"/docs/filtering/ivtc","docId":"filtering/ivtc","unlisted":false},{"type":"link","label":"Deinterlace","href":"/docs/filtering/deinterlace","docId":"filtering/deinterlace","unlisted":false},{"type":"link","label":"Decombing","href":"/docs/filtering/decombing","docId":"filtering/decombing","unlisted":false},{"type":"link","label":"Stabilizing","href":"/docs/filtering/stabilizing","docId":"filtering/stabilizing","unlisted":false},{"type":"link","label":"Denoise","href":"/docs/filtering/denoise","docId":"filtering/denoise","unlisted":false},{"type":"link","label":"Dehalo","href":"/docs/filtering/dehalo","docId":"filtering/dehalo","unlisted":false},{"type":"link","label":"Antialiasing","href":"/docs/filtering/antialiasing","docId":"filtering/antialiasing","unlisted":false},{"type":"link","label":"Deband","href":"/docs/filtering/deband","docId":"filtering/deband","unlisted":false},{"type":"link","label":"Graining","href":"/docs/filtering/graining","docId":"filtering/graining","unlisted":false}]},{"type":"category","label":"\ud83c\udfa8 Colorimetry","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Intro","href":"/docs/colorimetry/intro","docId":"colorimetry/intro","unlisted":false},{"type":"link","label":"Color Formats","href":"/docs/colorimetry/format","docId":"colorimetry/format","unlisted":false},{"type":"link","label":"Color Range","href":"/docs/colorimetry/range","docId":"colorimetry/range","unlisted":false},{"type":"link","label":"Color Primaries","href":"/docs/colorimetry/primaries","docId":"colorimetry/primaries","unlisted":false},{"type":"link","label":"Transfer Characteristics","href":"/docs/colorimetry/transfer","docId":"colorimetry/transfer","unlisted":false},{"type":"link","label":"Matrix Coefficients","href":"/docs/colorimetry/matrix","docId":"colorimetry/matrix","unlisted":false}]},{"type":"category","label":"\ud83d\udee0\ufe0f Utilities","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Aviator","href":"/docs/utilities/Aviator","docId":"utilities/Aviator","unlisted":false},{"type":"link","label":"Av1an","href":"/docs/utilities/av1an","docId":"utilities/av1an","unlisted":false},{"type":"link","label":"ffmpeg","href":"/docs/utilities/ffmpeg","docId":"utilities/ffmpeg","unlisted":false},{"type":"link","label":"MKVToolNix","href":"/docs/utilities/MKVToolNix","docId":"utilities/MKVToolNix","unlisted":false},{"type":"link","label":"rAV1ator","href":"/docs/utilities/rAV1ator","docId":"utilities/rAV1ator","unlisted":false},{"type":"link","label":"rav1ator-cli","href":"/docs/utilities/rav1ator-cli","docId":"utilities/rav1ator-cli","unlisted":false},{"type":"link","label":"NMKODER","href":"/docs/utilities/nmkoder","docId":"utilities/nmkoder","unlisted":false},{"type":"link","label":"FFMetrics","href":"/docs/utilities/FFMetrics","docId":"utilities/FFMetrics","unlisted":false},{"type":"link","label":"dovi_tool","href":"/docs/utilities/dovi_tool","docId":"utilities/dovi_tool","unlisted":false},{"type":"link","label":"eac3to","href":"/docs/utilities/eac3to","docId":"utilities/eac3to","unlisted":false},{"type":"link","label":"hdr10plus_tool","href":"/docs/utilities/hdr10plus_tool","docId":"utilities/hdr10plus_tool","unlisted":false},{"type":"link","label":"MP4Box","href":"/docs/utilities/mp4box","docId":"utilities/mp4box","unlisted":false},{"type":"link","label":"YUView","href":"/docs/utilities/YUView","docId":"utilities/YUView","unlisted":false},{"type":"link","label":"Discord","href":"/docs/utilities/Discord","docId":"utilities/Discord","unlisted":false},{"type":"link","label":"av1an-command-gen","href":"/docs/utilities/av1an-command-gen","docId":"utilities/av1an-command-gen","unlisted":false},{"type":"link","label":"autocompressor","href":"/docs/utilities/autocompressor","docId":"utilities/autocompressor","unlisted":false}]},{"type":"category","label":"\ud83d\udc41\ufe0f Metrics","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"PSNR","href":"/docs/metrics/PSNR","docId":"metrics/PSNR","unlisted":false},{"type":"link","label":"SSIM","href":"/docs/metrics/SSIM","docId":"metrics/SSIM","unlisted":false},{"type":"link","label":"SSIMULACRA2","href":"/docs/metrics/SSIMULACRA2","docId":"metrics/SSIMULACRA2","unlisted":false},{"type":"link","label":"VMAF","href":"/docs/metrics/VMAF","docId":"metrics/VMAF","unlisted":false},{"type":"link","label":"XPSNR","href":"/docs/metrics/XPSNR","docId":"metrics/XPSNR","unlisted":false},{"type":"link","label":"Butteraugli","href":"/docs/metrics/butteraugli","docId":"metrics/butteraugli","unlisted":false}]},{"type":"link","label":"\u25b6\ufe0f Video Players","href":"/docs/video-players","docId":"video-players","unlisted":false},{"type":"link","label":"\ud83d\uddc3\ufe0f Resources","href":"/docs/resources","docId":"resources","unlisted":false},{"type":"link","label":"\u2712\ufe0f Contribution Guide","href":"/docs/contribution-guide","docId":"contribution-guide","unlisted":false},{"type":"link","label":"\u2753 FAQ","href":"/docs/FAQ","docId":"FAQ","unlisted":false},{"type":"link","label":"\ud83d\udd0f Privacy Policy","href":"/docs/privacy-policy","docId":"privacy-policy","unlisted":false},{"type":"link","label":"\ud83e\udd1d Terms of Use","href":"/docs/terms-of-use","docId":"terms-of-use","unlisted":false}]},"docs":{"audio/AAC":{"id":"audio/AAC","title":"AAC","description":"Explore the AAC audio codec, including its various profiles, encoders, & use cases.","sidebar":"tutorialSidebar"},"audio/ALAC":{"id":"audio/ALAC","title":"ALAC","description":"This section is in need of contributions. If you believe you can help, please see our Contribution Guide to get started as a contributor!","sidebar":"tutorialSidebar"},"audio/Dolby":{"id":"audio/Dolby","title":"Dolby Digital","description":"The content in this entry is incomplete & is in the process of being completed.","sidebar":"tutorialSidebar"},"audio/FLAC":{"id":"audio/FLAC","title":"FLAC","description":"This section is in need of contributions. If you believe you can help, please see our Contribution Guide to get started as a contributor!","sidebar":"tutorialSidebar"},"audio/intro":{"id":"audio/intro","title":"Intro","description":"What is lossless audio? What is lossy audio? What is an audio codec? This entry serves as an intro to digital audio processing.","sidebar":"tutorialSidebar"},"audio/MP3":{"id":"audio/MP3","title":"MP3","description":"This section is in need of contributions. If you believe you can help, please see our Contribution Guide to get started as a contributor!","sidebar":"tutorialSidebar"},"audio/Opus":{"id":"audio/Opus","title":"Opus","description":"The content in this entry is incomplete & is in the process of being completed.","sidebar":"tutorialSidebar"},"audio/Speex":{"id":"audio/Speex","title":"Speex","description":"This section is in need of contributions. If you believe you can help, please see our Contribution Guide to get started as a contributor!","sidebar":"tutorialSidebar"},"audio/Vorbis":{"id":"audio/Vorbis","title":"Vorbis","description":"This section is in need of contributions. If you believe you can help, please see our Contribution Guide to get started as a contributor!","sidebar":"tutorialSidebar"},"audio/WavPack":{"id":"audio/WavPack","title":"WavPack","description":"This section is in need of contributions. If you believe you can help, please see our Contribution Guide to get started as a contributor!","sidebar":"tutorialSidebar"},"colorimetry/format":{"id":"colorimetry/format","title":"Color Formats","description":"To represent color values, a format is agreed upon. Color formats are","sidebar":"tutorialSidebar"},"colorimetry/intro":{"id":"colorimetry/intro","title":"Intro","description":"There are many aspects which determine how the color information","sidebar":"tutorialSidebar"},"colorimetry/matrix":{"id":"colorimetry/matrix","title":"Matrix Coefficients","description":"Matrix coefficients represent the multiplication matrix that is used when","sidebar":"tutorialSidebar"},"colorimetry/primaries":{"id":"colorimetry/primaries","title":"Color Primaries","description":"This section details the first of three settings that are important","sidebar":"tutorialSidebar"},"colorimetry/range":{"id":"colorimetry/range","title":"Color Range","description":"Range is a concept that describes the valid values for a pixel.","sidebar":"tutorialSidebar"},"colorimetry/transfer":{"id":"colorimetry/transfer","title":"Transfer Characteristics","description":"Transfer characteristics, also known as transfer functions, represent the","sidebar":"tutorialSidebar"},"contribution-guide":{"id":"contribution-guide","title":"Contribution Guide","description":"Codec Wiki - community-maintained wiki for all things encoding.","sidebar":"tutorialSidebar"},"data/7z":{"id":"data/7z","title":"7z","description":"This section is in need of contributions. If you believe you can help, please see our Contribution Guide to get started as a contributor!","sidebar":"tutorialSidebar"},"data/brotli":{"id":"data/brotli","title":"brotli","description":"This section is in need of contributions. If you believe you can help, please see our Contribution Guide to get started as a contributor!","sidebar":"tutorialSidebar"},"data/bzip2":{"id":"data/bzip2","title":"bzip2","description":"This section is in need of contributions. If you believe you can help, please see our Contribution Guide to get started as a contributor!","sidebar":"tutorialSidebar"},"data/gzip":{"id":"data/gzip","title":"gzip","description":"Gzip is a DEFLATE implementation for use with individual files. It is popular on Unix-like systems such as Linux & macOS, and is often seen paired with tar to create .tar.gz archives. Formats like ZIP & PNG also use Deflate to different effects.","sidebar":"tutorialSidebar"},"data/tar":{"id":"data/tar","title":"tar","description":"This section is in need of contributions. If you believe you can help, please see our Contribution Guide to get started as a contributor!","sidebar":"tutorialSidebar"},"data/xz":{"id":"data/xz","title":"xz","description":"This section is in need of contributions. If you believe you can help, please see our Contribution Guide to get started as a contributor!","sidebar":"tutorialSidebar"},"data/zip":{"id":"data/zip","title":"ZIP","description":"The content in this entry may not be entirely accurate, & is pending further review to assess the quality of the information.","sidebar":"tutorialSidebar"},"data/zpaq":{"id":"data/zpaq","title":"zpaq","description":"This section is in need of contributions. If you believe you can help, please see our Contribution Guide to get started as a contributor!","sidebar":"tutorialSidebar"},"data/zstd":{"id":"data/zstd","title":"zstd","description":"This section is in need of contributions. If you believe you can help, please see our Contribution Guide to get started as a contributor!","sidebar":"tutorialSidebar"},"encoders_hw/amf":{"id":"encoders_hw/amf","title":"AMF","description":"The content in this entry may not be entirely accurate, & is pending further review to assess the quality of the information.","sidebar":"tutorialSidebar"},"encoders_hw/mediacodec":{"id":"encoders_hw/mediacodec","title":"Mediacodec","description":"The Android\'s MediaCodec framework is a part of Android\'s multimedia framework that provides access to low-level media encoder & decoder components. It is similar to VideoToolbox on Apple devices. Hardware acceleration with MediaCodec is used for processing audio, video, and compressed data.","sidebar":"tutorialSidebar"},"encoders_hw/nvenc":{"id":"encoders_hw/nvenc","title":"NVENC","description":"The content in this entry may not be entirely accurate, & is pending further review to assess the quality of the information.","sidebar":"tutorialSidebar"},"encoders_hw/qsv":{"id":"encoders_hw/qsv","title":"QSV","description":"The content in this entry may not be entirely accurate, & is pending further review to assess the quality of the information.","sidebar":"tutorialSidebar"},"encoders_hw/videotoolbox":{"id":"encoders_hw/videotoolbox","title":"VideoToolbox","description":"The content in this entry is incomplete & is in the process of being completed.","sidebar":"tutorialSidebar"},"encoders/aom-av1-lavish":{"id":"encoders/aom-av1-lavish","title":"aom-av1-lavish","description":"This entry is about a fork of aomenc called aom-psy101. If you\'d like to learn about the mainline aomenc encoder before reading, visit our aomenc wiki entry.","sidebar":"tutorialSidebar"},"encoders/aom-psy101":{"id":"encoders/aom-psy101","title":"aom-psy101","description":"The content in this entry is incomplete & is in the process of being completed.","sidebar":"tutorialSidebar"},"encoders/aomenc":{"id":"encoders/aomenc","title":"aomenc","description":"aomenc, AOM-AV1, or just libaom is a command line application for encoding AV1 written in C and Assembly developed by AOMedia, which is also the reference encoder for AV1.","sidebar":"tutorialSidebar"},"encoders/Aurora1":{"id":"encoders/Aurora1","title":"Aurora1 AV1","description":"Aurora1 AV1 is a proprietary and paid software AV1 encoder developed by Visionular. Although they do provide a contact form to get a free trial, not much is known about this encoder other than cherry-picked claims and proof provided by the company themselves that it is supposedly \\"better\\" than public, FOSS encoders.","sidebar":"tutorialSidebar"},"encoders/AVM":{"id":"encoders/AVM","title":"AVM","description":"AVM (AOM Video Model) is the reference software for next codec from Alliance for Open Media.","sidebar":"tutorialSidebar"},"encoders/HM":{"id":"encoders/HM","title":"HM","description":"The content in this entry may not be entirely accurate, & is pending further review to assess the quality of the information.","sidebar":"tutorialSidebar"},"encoders/JM":{"id":"encoders/JM","title":"JM","description":"This section is in need of contributions. If you believe you can help, please see our Contribution Guide to get started as a contributor!","sidebar":"tutorialSidebar"},"encoders/Kvazaar":{"id":"encoders/Kvazaar","title":"Kvazaar","description":"Kvazaar is an open-source H.265 / HEVC software encoder Written in C, developed by Ultra Video Group and licensed under BSD 3-clause.","sidebar":"tutorialSidebar"},"encoders/rav1e":{"id":"encoders/rav1e","title":"rav1e","description":"rav1e is an open source command line application for encoding AV1 written in Assembly & Rust, co-developed by Xiph.org and Mozilla and licensed under BSD-2 Clause.","sidebar":"tutorialSidebar"},"encoders/SVT-AV1":{"id":"encoders/SVT-AV1","title":"SVT-AV1","description":"The content in this entry is incomplete & is in the process of being completed.","sidebar":"tutorialSidebar"},"encoders/SVT-AV1-PSY":{"id":"encoders/SVT-AV1-PSY","title":"SVT-AV1-PSY","description":"This entry is about a fork of SVT-AV1 called SVT-AV1-PSY. If you\'d like to learn about the mainline SVT-AV1 encoder before reading, visit our SVT-AV1 wiki entry.","sidebar":"tutorialSidebar"},"encoders/SVT-HEVC":{"id":"encoders/SVT-HEVC","title":"SVT-HEVC","description":"SVT-HEVC (Scalable Video Technology for HEVC) is an open source H.265 / HEVC software encoder developed by Intel made specifically to only support x86. As the name suggests, it is part of the \\"Scalable Video Technology\\" project lineup by Intel.","sidebar":"tutorialSidebar"},"encoders/SVT-VP9":{"id":"encoders/SVT-VP9","title":"SVT-VP9","description":"The content in this entry is incomplete & is in the process of being completed.","sidebar":"tutorialSidebar"},"encoders/uavs3e":{"id":"encoders/uavs3e","title":"uavs3e","description":"uavs3e is an open-source encoder for the AVS3 codec. It was developed by Chinese research institutions, including Peking University Shenzhen Graduate School, Peng Cheng Laboratory, and Guangdong Bohua UHD Innovation Corporation.","sidebar":"tutorialSidebar"},"encoders/uvg266":{"id":"encoders/uvg266","title":"uvg266","description":"uvg266 is an open-source software encoder for encoding to the H.266 / VVC codec. Developed by the Ultra Video Group, written in C and licensed under BSD 3-clause.","sidebar":"tutorialSidebar"},"encoders/vpxenc":{"id":"encoders/vpxenc","title":"vpxenc","description":"The content in this entry is incomplete & is in the process of being completed.","sidebar":"tutorialSidebar"},"encoders/VTM":{"id":"encoders/VTM","title":"VTM","description":"This section is in need of contributions. If you believe you can help, please see our Contribution Guide to get started as a contributor!","sidebar":"tutorialSidebar"},"encoders/VVenC":{"id":"encoders/VVenC","title":"VVenC","description":"{e.exports=JSON.parse('{"version":{"pluginId":"default","version":"current","label":"Next","banner":null,"badge":false,"noIndex":false,"className":"docs-version-current","isLast":true,"docsSidebars":{"tutorialSidebar":[{"type":"category","label":"\ud83d\udca1 Introduction","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Prologue","href":"/docs/introduction/prologue","docId":"introduction/prologue","unlisted":false},{"type":"link","label":"Terminology","href":"/docs/introduction/terminology","docId":"introduction/terminology","unlisted":false},{"type":"link","label":"Lossless Compression","href":"/docs/introduction/lossless","docId":"introduction/lossless","unlisted":false},{"type":"link","label":"Lossy Compression","href":"/docs/introduction/lossy","docId":"introduction/lossy","unlisted":false},{"type":"link","label":"Spotting Video Artifacts","href":"/docs/introduction/video-artifacts","docId":"introduction/video-artifacts","unlisted":false},{"type":"link","label":"Psychovisual","href":"/docs/introduction/psychovisual","docId":"introduction/psychovisual","unlisted":false},{"type":"link","label":"High Dynamic Range","href":"/docs/introduction/high-dynamic-range","docId":"introduction/high-dynamic-range","unlisted":false}]},{"type":"category","label":"\ud83d\udd0a Audio","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Intro","href":"/docs/audio/intro","docId":"audio/intro","unlisted":false},{"type":"link","label":"AAC","href":"/docs/audio/AAC","docId":"audio/AAC","unlisted":false},{"type":"link","label":"Opus","href":"/docs/audio/Opus","docId":"audio/Opus","unlisted":false},{"type":"link","label":"Dolby Digital","href":"/docs/audio/Dolby","docId":"audio/Dolby","unlisted":false},{"type":"link","label":"MP3","href":"/docs/audio/MP3","docId":"audio/MP3","unlisted":false},{"type":"link","label":"Vorbis","href":"/docs/audio/Vorbis","docId":"audio/Vorbis","unlisted":false},{"type":"link","label":"Speex","href":"/docs/audio/Speex","docId":"audio/Speex","unlisted":false},{"type":"link","label":"ALAC","href":"/docs/audio/ALAC","docId":"audio/ALAC","unlisted":false},{"type":"link","label":"FLAC","href":"/docs/audio/FLAC","docId":"audio/FLAC","unlisted":false},{"type":"link","label":"WavPack","href":"/docs/audio/WavPack","docId":"audio/WavPack","unlisted":false}]},{"type":"category","label":"\ud83d\udcf9\ufe0f Video","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"AVC / H.264","href":"/docs/video/AVC","docId":"video/AVC","unlisted":false},{"type":"link","label":"HEVC / H.265","href":"/docs/video/HEVC","docId":"video/HEVC","unlisted":false},{"type":"link","label":"VVC / H.266","href":"/docs/video/VVC","docId":"video/VVC","unlisted":false},{"type":"link","label":"VP8","href":"/docs/video/VP8","docId":"video/VP8","unlisted":false},{"type":"link","label":"VP9","href":"/docs/video/VP9","docId":"video/VP9","unlisted":false},{"type":"link","label":"AV1","href":"/docs/video/AV1","docId":"video/AV1","unlisted":false},{"type":"link","label":"AVS3","href":"/docs/video/AVS3","docId":"video/AVS3","unlisted":false},{"type":"link","label":"VC-1","href":"/docs/video/VC-1","docId":"video/VC-1","unlisted":false},{"type":"link","label":"Theora","href":"/docs/video/Theora","docId":"video/Theora","unlisted":false},{"type":"link","label":"FFV1","href":"/docs/video/FFV1","docId":"video/FFV1","unlisted":false},{"type":"link","label":"UT Video","href":"/docs/video/utvideo","docId":"video/utvideo","unlisted":false},{"type":"link","label":"ProRes","href":"/docs/video/prores","docId":"video/prores","unlisted":false},{"type":"link","label":"ECM","href":"/docs/video/ECM","docId":"video/ECM","unlisted":false}]},{"type":"category","label":"\ud83d\udcbd Data","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"ZIP","href":"/docs/data/zip","docId":"data/zip","unlisted":false},{"type":"link","label":"gzip","href":"/docs/data/gzip","docId":"data/gzip","unlisted":false},{"type":"link","label":"bzip2","href":"/docs/data/bzip2","docId":"data/bzip2","unlisted":false},{"type":"link","label":"7z","href":"/docs/data/7z","docId":"data/7z","unlisted":false},{"type":"link","label":"xz","href":"/docs/data/xz","docId":"data/xz","unlisted":false},{"type":"link","label":"brotli","href":"/docs/data/brotli","docId":"data/brotli","unlisted":false},{"type":"link","label":"zpaq","href":"/docs/data/zpaq","docId":"data/zpaq","unlisted":false},{"type":"link","label":"zstd","href":"/docs/data/zstd","docId":"data/zstd","unlisted":false},{"type":"link","label":"tar","href":"/docs/data/tar","docId":"data/tar","unlisted":false}]},{"type":"category","label":"\ud83c\udfde\ufe0f Images","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"JPEG","href":"/docs/images/JPEG","docId":"images/JPEG","unlisted":false},{"type":"link","label":"PNG","href":"/docs/images/PNG","docId":"images/PNG","unlisted":false},{"type":"link","label":"GIF","href":"/docs/images/GIF","docId":"images/GIF","unlisted":false},{"type":"link","label":"HEIC","href":"/docs/images/HEIC","docId":"images/HEIC","unlisted":false},{"type":"link","label":"WebP","href":"/docs/images/WebP","docId":"images/WebP","unlisted":false},{"type":"link","label":"JPEG 2000","href":"/docs/images/JPEG2000","docId":"images/JPEG2000","unlisted":false},{"type":"link","label":"AVIF","href":"/docs/images/AVIF","docId":"images/AVIF","unlisted":false},{"type":"link","label":"JPEG XL","href":"/docs/images/JXL","docId":"images/JXL","unlisted":false},{"type":"link","label":"QOI","href":"/docs/images/QOI","docId":"images/QOI","unlisted":false}]},{"type":"category","label":"\ud83d\udcbe Encoders","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"x264","href":"/docs/encoders/x264","docId":"encoders/x264","unlisted":false},{"type":"link","label":"x265","href":"/docs/encoders/x265","docId":"encoders/x265","unlisted":false},{"type":"link","label":"x266","href":"/docs/encoders/x266","docId":"encoders/x266","unlisted":false},{"type":"link","label":"aomenc","href":"/docs/encoders/aomenc","docId":"encoders/aomenc","unlisted":false},{"type":"link","label":"SVT-AV1-PSY","href":"/docs/encoders/SVT-AV1-PSY","docId":"encoders/SVT-AV1-PSY","unlisted":false},{"type":"link","label":"SVT-AV1","href":"/docs/encoders/SVT-AV1","docId":"encoders/SVT-AV1","unlisted":false},{"type":"link","label":"rav1e","href":"/docs/encoders/rav1e","docId":"encoders/rav1e","unlisted":false},{"type":"link","label":"Aurora1 AV1","href":"/docs/encoders/Aurora1","docId":"encoders/Aurora1","unlisted":false},{"type":"link","label":"vpxenc","href":"/docs/encoders/vpxenc","docId":"encoders/vpxenc","unlisted":false},{"type":"link","label":"SVT-VP9","href":"/docs/encoders/SVT-VP9","docId":"encoders/SVT-VP9","unlisted":false},{"type":"link","label":"SVT-HEVC","href":"/docs/encoders/SVT-HEVC","docId":"encoders/SVT-HEVC","unlisted":false},{"type":"link","label":"Kvazaar","href":"/docs/encoders/Kvazaar","docId":"encoders/Kvazaar","unlisted":false},{"type":"link","label":"VVenC","href":"/docs/encoders/VVenC","docId":"encoders/VVenC","unlisted":false},{"type":"link","label":"uvg266","href":"/docs/encoders/uvg266","docId":"encoders/uvg266","unlisted":false},{"type":"link","label":"VTM","href":"/docs/encoders/VTM","docId":"encoders/VTM","unlisted":false},{"type":"link","label":"AVM","href":"/docs/encoders/AVM","docId":"encoders/AVM","unlisted":false},{"type":"link","label":"HM","href":"/docs/encoders/HM","docId":"encoders/HM","unlisted":false},{"type":"link","label":"JM","href":"/docs/encoders/JM","docId":"encoders/JM","unlisted":false},{"type":"link","label":"aom-av1-lavish","href":"/docs/encoders/aom-av1-lavish","docId":"encoders/aom-av1-lavish","unlisted":false},{"type":"link","label":"aom-psy101","href":"/docs/encoders/aom-psy101","docId":"encoders/aom-psy101","unlisted":false},{"type":"link","label":"uavs3e","href":"/docs/encoders/uavs3e","docId":"encoders/uavs3e","unlisted":false}]},{"type":"category","label":"\ud83d\ude80 Hardware Encoders","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"NVENC","href":"/docs/encoders_hw/nvenc","docId":"encoders_hw/nvenc","unlisted":false},{"type":"link","label":"QSV","href":"/docs/encoders_hw/qsv","docId":"encoders_hw/qsv","unlisted":false},{"type":"link","label":"AMF","href":"/docs/encoders_hw/amf","docId":"encoders_hw/amf","unlisted":false},{"type":"link","label":"VideoToolbox","href":"/docs/encoders_hw/videotoolbox","docId":"encoders_hw/videotoolbox","unlisted":false},{"type":"link","label":"Mediacodec","href":"/docs/encoders_hw/mediacodec","docId":"encoders_hw/mediacodec","unlisted":false}]},{"type":"category","label":"\ud83d\udcac Subtitles","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"SRT","href":"/docs/subtitles/SRT","docId":"subtitles/SRT","unlisted":false},{"type":"link","label":"SubStation Alpha","href":"/docs/subtitles/SSA","docId":"subtitles/SSA","unlisted":false},{"type":"link","label":"WebVTT","href":"/docs/subtitles/webvtt","docId":"subtitles/webvtt","unlisted":false}]},{"type":"category","label":"\ud83c\udf9e\ufe0f Filtering","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Vapoursynth","href":"/docs/filtering/vapoursynth","docId":"filtering/vapoursynth","unlisted":false},{"type":"link","label":"Basics of Filtering","href":"/docs/filtering/basics","docId":"filtering/basics","unlisted":false},{"type":"link","label":"Inverse Telecine","href":"/docs/filtering/ivtc","docId":"filtering/ivtc","unlisted":false},{"type":"link","label":"Deinterlace","href":"/docs/filtering/deinterlace","docId":"filtering/deinterlace","unlisted":false},{"type":"link","label":"Decombing","href":"/docs/filtering/decombing","docId":"filtering/decombing","unlisted":false},{"type":"link","label":"Stabilizing","href":"/docs/filtering/stabilizing","docId":"filtering/stabilizing","unlisted":false},{"type":"link","label":"Denoise","href":"/docs/filtering/denoise","docId":"filtering/denoise","unlisted":false},{"type":"link","label":"Dehalo","href":"/docs/filtering/dehalo","docId":"filtering/dehalo","unlisted":false},{"type":"link","label":"Antialiasing","href":"/docs/filtering/antialiasing","docId":"filtering/antialiasing","unlisted":false},{"type":"link","label":"Deband","href":"/docs/filtering/deband","docId":"filtering/deband","unlisted":false},{"type":"link","label":"Graining","href":"/docs/filtering/graining","docId":"filtering/graining","unlisted":false}]},{"type":"category","label":"\ud83c\udfa8 Colorimetry","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Intro","href":"/docs/colorimetry/intro","docId":"colorimetry/intro","unlisted":false},{"type":"link","label":"Color Formats","href":"/docs/colorimetry/format","docId":"colorimetry/format","unlisted":false},{"type":"link","label":"Color Range","href":"/docs/colorimetry/range","docId":"colorimetry/range","unlisted":false},{"type":"link","label":"Color Primaries","href":"/docs/colorimetry/primaries","docId":"colorimetry/primaries","unlisted":false},{"type":"link","label":"Transfer Characteristics","href":"/docs/colorimetry/transfer","docId":"colorimetry/transfer","unlisted":false},{"type":"link","label":"Matrix Coefficients","href":"/docs/colorimetry/matrix","docId":"colorimetry/matrix","unlisted":false}]},{"type":"category","label":"\ud83d\udee0\ufe0f Utilities","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Aviator","href":"/docs/utilities/Aviator","docId":"utilities/Aviator","unlisted":false},{"type":"link","label":"Av1an","href":"/docs/utilities/av1an","docId":"utilities/av1an","unlisted":false},{"type":"link","label":"ffmpeg","href":"/docs/utilities/ffmpeg","docId":"utilities/ffmpeg","unlisted":false},{"type":"link","label":"MKVToolNix","href":"/docs/utilities/MKVToolNix","docId":"utilities/MKVToolNix","unlisted":false},{"type":"link","label":"rAV1ator","href":"/docs/utilities/rAV1ator","docId":"utilities/rAV1ator","unlisted":false},{"type":"link","label":"rav1ator-cli","href":"/docs/utilities/rav1ator-cli","docId":"utilities/rav1ator-cli","unlisted":false},{"type":"link","label":"NMKODER","href":"/docs/utilities/nmkoder","docId":"utilities/nmkoder","unlisted":false},{"type":"link","label":"FFMetrics","href":"/docs/utilities/FFMetrics","docId":"utilities/FFMetrics","unlisted":false},{"type":"link","label":"dovi_tool","href":"/docs/utilities/dovi_tool","docId":"utilities/dovi_tool","unlisted":false},{"type":"link","label":"eac3to","href":"/docs/utilities/eac3to","docId":"utilities/eac3to","unlisted":false},{"type":"link","label":"hdr10plus_tool","href":"/docs/utilities/hdr10plus_tool","docId":"utilities/hdr10plus_tool","unlisted":false},{"type":"link","label":"MP4Box","href":"/docs/utilities/mp4box","docId":"utilities/mp4box","unlisted":false},{"type":"link","label":"YUView","href":"/docs/utilities/YUView","docId":"utilities/YUView","unlisted":false},{"type":"link","label":"Discord","href":"/docs/utilities/Discord","docId":"utilities/Discord","unlisted":false},{"type":"link","label":"av1an-command-gen","href":"/docs/utilities/av1an-command-gen","docId":"utilities/av1an-command-gen","unlisted":false},{"type":"link","label":"autocompressor","href":"/docs/utilities/autocompressor","docId":"utilities/autocompressor","unlisted":false}]},{"type":"category","label":"\ud83d\udc41\ufe0f Metrics","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"PSNR","href":"/docs/metrics/PSNR","docId":"metrics/PSNR","unlisted":false},{"type":"link","label":"SSIM","href":"/docs/metrics/SSIM","docId":"metrics/SSIM","unlisted":false},{"type":"link","label":"SSIMULACRA2","href":"/docs/metrics/SSIMULACRA2","docId":"metrics/SSIMULACRA2","unlisted":false},{"type":"link","label":"VMAF","href":"/docs/metrics/VMAF","docId":"metrics/VMAF","unlisted":false},{"type":"link","label":"XPSNR","href":"/docs/metrics/XPSNR","docId":"metrics/XPSNR","unlisted":false},{"type":"link","label":"Butteraugli","href":"/docs/metrics/butteraugli","docId":"metrics/butteraugli","unlisted":false}]},{"type":"link","label":"\u25b6\ufe0f Video Players","href":"/docs/video-players","docId":"video-players","unlisted":false},{"type":"link","label":"\ud83d\uddc3\ufe0f Resources","href":"/docs/resources","docId":"resources","unlisted":false},{"type":"link","label":"\u2712\ufe0f Contribution Guide","href":"/docs/contribution-guide","docId":"contribution-guide","unlisted":false},{"type":"link","label":"\u2753 FAQ","href":"/docs/FAQ","docId":"FAQ","unlisted":false},{"type":"link","label":"\ud83d\udd0f Privacy Policy","href":"/docs/privacy-policy","docId":"privacy-policy","unlisted":false},{"type":"link","label":"\ud83e\udd1d Terms of Use","href":"/docs/terms-of-use","docId":"terms-of-use","unlisted":false}]},"docs":{"audio/AAC":{"id":"audio/AAC","title":"AAC","description":"Explore the AAC audio codec, including its various profiles, encoders, & use cases.","sidebar":"tutorialSidebar"},"audio/ALAC":{"id":"audio/ALAC","title":"ALAC","description":"This section is in need of contributions. If you believe you can help, please see our Contribution Guide to get started as a contributor!","sidebar":"tutorialSidebar"},"audio/Dolby":{"id":"audio/Dolby","title":"Dolby Digital","description":"The content in this entry is incomplete & is in the process of being completed.","sidebar":"tutorialSidebar"},"audio/FLAC":{"id":"audio/FLAC","title":"FLAC","description":"This section is in need of contributions. If you believe you can help, please see our Contribution Guide to get started as a contributor!","sidebar":"tutorialSidebar"},"audio/intro":{"id":"audio/intro","title":"Intro","description":"What is lossless audio? What is lossy audio? What is an audio codec? This entry serves as an intro to digital audio processing.","sidebar":"tutorialSidebar"},"audio/MP3":{"id":"audio/MP3","title":"MP3","description":"This section is in need of contributions. If you believe you can help, please see our Contribution Guide to get started as a contributor!","sidebar":"tutorialSidebar"},"audio/Opus":{"id":"audio/Opus","title":"Opus","description":"The content in this entry is incomplete & is in the process of being completed.","sidebar":"tutorialSidebar"},"audio/Speex":{"id":"audio/Speex","title":"Speex","description":"This section is in need of contributions. If you believe you can help, please see our Contribution Guide to get started as a contributor!","sidebar":"tutorialSidebar"},"audio/Vorbis":{"id":"audio/Vorbis","title":"Vorbis","description":"This section is in need of contributions. If you believe you can help, please see our Contribution Guide to get started as a contributor!","sidebar":"tutorialSidebar"},"audio/WavPack":{"id":"audio/WavPack","title":"WavPack","description":"This section is in need of contributions. If you believe you can help, please see our Contribution Guide to get started as a contributor!","sidebar":"tutorialSidebar"},"colorimetry/format":{"id":"colorimetry/format","title":"Color Formats","description":"To represent color values, a format is agreed upon. Color formats are","sidebar":"tutorialSidebar"},"colorimetry/intro":{"id":"colorimetry/intro","title":"Intro","description":"There are many aspects which determine how the color information","sidebar":"tutorialSidebar"},"colorimetry/matrix":{"id":"colorimetry/matrix","title":"Matrix Coefficients","description":"Matrix coefficients represent the multiplication matrix that is used when","sidebar":"tutorialSidebar"},"colorimetry/primaries":{"id":"colorimetry/primaries","title":"Color Primaries","description":"This section details the first of three settings that are important","sidebar":"tutorialSidebar"},"colorimetry/range":{"id":"colorimetry/range","title":"Color Range","description":"Range is a concept that describes the valid values for a pixel.","sidebar":"tutorialSidebar"},"colorimetry/transfer":{"id":"colorimetry/transfer","title":"Transfer Characteristics","description":"Transfer characteristics, also known as transfer functions, represent the","sidebar":"tutorialSidebar"},"contribution-guide":{"id":"contribution-guide","title":"Contribution Guide","description":"Codec Wiki - community-maintained wiki for all things encoding.","sidebar":"tutorialSidebar"},"data/7z":{"id":"data/7z","title":"7z","description":"This section is in need of contributions. If you believe you can help, please see our Contribution Guide to get started as a contributor!","sidebar":"tutorialSidebar"},"data/brotli":{"id":"data/brotli","title":"brotli","description":"This section is in need of contributions. If you believe you can help, please see our Contribution Guide to get started as a contributor!","sidebar":"tutorialSidebar"},"data/bzip2":{"id":"data/bzip2","title":"bzip2","description":"This section is in need of contributions. If you believe you can help, please see our Contribution Guide to get started as a contributor!","sidebar":"tutorialSidebar"},"data/gzip":{"id":"data/gzip","title":"gzip","description":"Gzip is a DEFLATE implementation for use with individual files. It is popular on Unix-like systems such as Linux & macOS, and is often seen paired with tar to create .tar.gz archives. Formats like ZIP & PNG also use Deflate to different effects.","sidebar":"tutorialSidebar"},"data/tar":{"id":"data/tar","title":"tar","description":"This section is in need of contributions. If you believe you can help, please see our Contribution Guide to get started as a contributor!","sidebar":"tutorialSidebar"},"data/xz":{"id":"data/xz","title":"xz","description":"This section is in need of contributions. If you believe you can help, please see our Contribution Guide to get started as a contributor!","sidebar":"tutorialSidebar"},"data/zip":{"id":"data/zip","title":"ZIP","description":"The content in this entry may not be entirely accurate, & is pending further review to assess the quality of the information.","sidebar":"tutorialSidebar"},"data/zpaq":{"id":"data/zpaq","title":"zpaq","description":"This section is in need of contributions. If you believe you can help, please see our Contribution Guide to get started as a contributor!","sidebar":"tutorialSidebar"},"data/zstd":{"id":"data/zstd","title":"zstd","description":"This section is in need of contributions. If you believe you can help, please see our Contribution Guide to get started as a contributor!","sidebar":"tutorialSidebar"},"encoders_hw/amf":{"id":"encoders_hw/amf","title":"AMF","description":"The content in this entry may not be entirely accurate, & is pending further review to assess the quality of the information.","sidebar":"tutorialSidebar"},"encoders_hw/mediacodec":{"id":"encoders_hw/mediacodec","title":"Mediacodec","description":"The Android\'s MediaCodec framework is a part of Android\'s multimedia framework that provides access to low-level media encoder & decoder components. It is similar to VideoToolbox on Apple devices. Hardware acceleration with MediaCodec is used for processing audio, video, and compressed data.","sidebar":"tutorialSidebar"},"encoders_hw/nvenc":{"id":"encoders_hw/nvenc","title":"NVENC","description":"The content in this entry may not be entirely accurate, & is pending further review to assess the quality of the information.","sidebar":"tutorialSidebar"},"encoders_hw/qsv":{"id":"encoders_hw/qsv","title":"QSV","description":"The content in this entry may not be entirely accurate, & is pending further review to assess the quality of the information.","sidebar":"tutorialSidebar"},"encoders_hw/videotoolbox":{"id":"encoders_hw/videotoolbox","title":"VideoToolbox","description":"The content in this entry is incomplete & is in the process of being completed.","sidebar":"tutorialSidebar"},"encoders/aom-av1-lavish":{"id":"encoders/aom-av1-lavish","title":"aom-av1-lavish","description":"This entry is about a fork of aomenc called aom-psy101. If you\'d like to learn about the mainline aomenc encoder before reading, visit our aomenc wiki entry.","sidebar":"tutorialSidebar"},"encoders/aom-psy101":{"id":"encoders/aom-psy101","title":"aom-psy101","description":"The content in this entry is incomplete & is in the process of being completed.","sidebar":"tutorialSidebar"},"encoders/aomenc":{"id":"encoders/aomenc","title":"aomenc","description":"aomenc, AOM-AV1, or just libaom is a command line application for encoding AV1 written in C and Assembly developed by AOMedia, which is also the reference encoder for AV1.","sidebar":"tutorialSidebar"},"encoders/Aurora1":{"id":"encoders/Aurora1","title":"Aurora1 AV1","description":"Aurora1 AV1 is a proprietary and paid software AV1 encoder developed by Visionular. Although they do provide a contact form to get a free trial, not much is known about this encoder other than cherry-picked claims and proof provided by the company themselves that it is supposedly \\"better\\" than public, FOSS encoders.","sidebar":"tutorialSidebar"},"encoders/AVM":{"id":"encoders/AVM","title":"AVM","description":"AVM (AOM Video Model) is the reference software for next codec from Alliance for Open Media.","sidebar":"tutorialSidebar"},"encoders/HM":{"id":"encoders/HM","title":"HM","description":"The content in this entry may not be entirely accurate, & is pending further review to assess the quality of the information.","sidebar":"tutorialSidebar"},"encoders/JM":{"id":"encoders/JM","title":"JM","description":"This section is in need of contributions. If you believe you can help, please see our Contribution Guide to get started as a contributor!","sidebar":"tutorialSidebar"},"encoders/Kvazaar":{"id":"encoders/Kvazaar","title":"Kvazaar","description":"Kvazaar is an open-source H.265 / HEVC software encoder Written in C, developed by Ultra Video Group and licensed under BSD 3-clause.","sidebar":"tutorialSidebar"},"encoders/rav1e":{"id":"encoders/rav1e","title":"rav1e","description":"rav1e is an open source command line application for encoding AV1 written in Assembly & Rust, co-developed by Xiph.org and Mozilla and licensed under BSD-2 Clause.","sidebar":"tutorialSidebar"},"encoders/SVT-AV1":{"id":"encoders/SVT-AV1","title":"SVT-AV1","description":"The content in this entry is incomplete & is in the process of being completed.","sidebar":"tutorialSidebar"},"encoders/SVT-AV1-PSY":{"id":"encoders/SVT-AV1-PSY","title":"SVT-AV1-PSY","description":"This entry is about a fork of SVT-AV1 called SVT-AV1-PSY. If you\'d like to learn about the mainline SVT-AV1 encoder before reading, visit our SVT-AV1 wiki entry.","sidebar":"tutorialSidebar"},"encoders/SVT-HEVC":{"id":"encoders/SVT-HEVC","title":"SVT-HEVC","description":"SVT-HEVC (Scalable Video Technology for HEVC) is an open source H.265 / HEVC software encoder developed by Intel made specifically to only support x86. As the name suggests, it is part of the \\"Scalable Video Technology\\" project lineup by Intel.","sidebar":"tutorialSidebar"},"encoders/SVT-VP9":{"id":"encoders/SVT-VP9","title":"SVT-VP9","description":"The content in this entry is incomplete & is in the process of being completed.","sidebar":"tutorialSidebar"},"encoders/uavs3e":{"id":"encoders/uavs3e","title":"uavs3e","description":"uavs3e is an open-source encoder for the AVS3 codec, developed by Chinese research institutions including Peking University Shenzhen Graduate School, Peng Cheng Laboratory, and Guangdong Bohua UHD Innovation Corporation.","sidebar":"tutorialSidebar"},"encoders/uvg266":{"id":"encoders/uvg266","title":"uvg266","description":"uvg266 is an open-source software encoder for encoding to the H.266 / VVC codec. Developed by the Ultra Video Group, written in C and licensed under BSD 3-clause.","sidebar":"tutorialSidebar"},"encoders/vpxenc":{"id":"encoders/vpxenc","title":"vpxenc","description":"The content in this entry is incomplete & is in the process of being completed.","sidebar":"tutorialSidebar"},"encoders/VTM":{"id":"encoders/VTM","title":"VTM","description":"This section is in need of contributions. If you believe you can help, please see our Contribution Guide to get started as a contributor!","sidebar":"tutorialSidebar"},"encoders/VVenC":{"id":"encoders/VVenC","title":"VVenC","description":"{t.r(n),t.d(n,{assets:()=>u,contentTitle:()=>o,default:()=>p,frontMatter:()=>l,metadata:()=>c,toc:()=>d});var a=t(4848),r=t(8453),i=t(1470),s=t(9365);const l={title:"VVenC",sidebar_position:12},o="VVenC",c={id:"encoders/VVenC",title:"VVenC",description:'{t.d(n,{A:()=>s});t(6540);var a=t(4164);const r={tabItem:"tabItem_Ymn6"};var i=t(4848);function s(e){let{children:n,hidden:t,className:s}=e;return(0,i.jsx)("div",{role:"tabpanel",className:(0,a.A)(r.tabItem,s),hidden:t,children:n})}},1470:(e,n,t)=>{t.d(n,{A:()=>w});var a=t(6540),r=t(4164),i=t(3104),s=t(6347),l=t(205),o=t(7485),c=t(1682),u=t(679);function d(e){return a.Children.toArray(e).filter((e=>"\n"!==e)).map((e=>{if(!e||(0,a.isValidElement)(e)&&function(e){const{props:n}=e;return!!n&&"object"==typeof n&&"value"in n}(e))return e;throw new Error(`Docusaurus error: Bad child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the component should be , and every should have a unique "value" prop.`)}))?.filter(Boolean)??[]}function h(e){const{values:n,children:t}=e;return(0,a.useMemo)((()=>{const e=n??function(e){return d(e).map((e=>{let{props:{value:n,label:t,attributes:a,default:r}}=e;return{value:n,label:t,attributes:a,default:r}}))}(t);return function(e){const n=(0,c.XI)(e,((e,n)=>e.value===n.value));if(n.length>0)throw new Error(`Docusaurus error: Duplicate values "${n.map((e=>e.value)).join(", ")}" found in . Every value needs to be unique.`)}(e),e}),[n,t])}function p(e){let{value:n,tabValues:t}=e;return t.some((e=>e.value===n))}function m(e){let{queryString:n=!1,groupId:t}=e;const r=(0,s.W6)(),i=function(e){let{queryString:n=!1,groupId:t}=e;if("string"==typeof n)return n;if(!1===n)return null;if(!0===n&&!t)throw new Error('Docusaurus error: The component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return t??null}({queryString:n,groupId:t});return[(0,o.aZ)(i),(0,a.useCallback)((e=>{if(!i)return;const n=new URLSearchParams(r.location.search);n.set(i,e),r.replace({...r.location,search:n.toString()})}),[i,r])]}function f(e){const{defaultValue:n,queryString:t=!1,groupId:r}=e,i=h(e),[s,o]=(0,a.useState)((()=>function(e){let{defaultValue:n,tabValues:t}=e;if(0===t.length)throw new Error("Docusaurus error: the component requires at least one children component");if(n){if(!p({value:n,tabValues:t}))throw new Error(`Docusaurus error: The has a defaultValue "${n}" but none of its children has the corresponding value. Available values are: ${t.map((e=>e.value)).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return n}const a=t.find((e=>e.default))??t[0];if(!a)throw new Error("Unexpected error: 0 tabValues");return a.value}({defaultValue:n,tabValues:i}))),[c,d]=m({queryString:t,groupId:r}),[f,b]=function(e){let{groupId:n}=e;const t=function(e){return e?`docusaurus.tab.${e}`:null}(n),[r,i]=(0,u.Dv)(t);return[r,(0,a.useCallback)((e=>{t&&i.set(e)}),[t,i])]}({groupId:r}),g=(()=>{const e=c??f;return p({value:e,tabValues:i})?e:null})();(0,l.A)((()=>{g&&o(g)}),[g]);return{selectedValue:s,selectValue:(0,a.useCallback)((e=>{if(!p({value:e,tabValues:i}))throw new Error(`Can't select invalid tab value=${e}`);o(e),d(e),b(e)}),[d,b,i]),tabValues:i}}var b=t(2303);const g={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};var v=t(4848);function x(e){let{className:n,block:t,selectedValue:a,selectValue:s,tabValues:l}=e;const o=[],{blockElementScrollPositionUntilNextRender:c}=(0,i.a_)(),u=e=>{const n=e.currentTarget,t=o.indexOf(n),r=l[t].value;r!==a&&(c(n),s(r))},d=e=>{let n=null;switch(e.key){case"Enter":u(e);break;case"ArrowRight":{const t=o.indexOf(e.currentTarget)+1;n=o[t]??o[0];break}case"ArrowLeft":{const t=o.indexOf(e.currentTarget)-1;n=o[t]??o[o.length-1];break}}n?.focus()};return(0,v.jsx)("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,r.A)("tabs",{"tabs--block":t},n),children:l.map((e=>{let{value:n,label:t,attributes:i}=e;return(0,v.jsx)("li",{role:"tab",tabIndex:a===n?0:-1,"aria-selected":a===n,ref:e=>o.push(e),onKeyDown:d,onClick:u,...i,className:(0,r.A)("tabs__item",g.tabItem,i?.className,{"tabs__item--active":a===n}),children:t??n},n)}))})}function V(e){let{lazy:n,children:t,selectedValue:i}=e;const s=(Array.isArray(t)?t:[t]).filter(Boolean);if(n){const e=s.find((e=>e.props.value===i));return e?(0,a.cloneElement)(e,{className:(0,r.A)("margin-top--md",e.props.className)}):null}return(0,v.jsx)("div",{className:"margin-top--md",children:s.map(((e,n)=>(0,a.cloneElement)(e,{key:n,hidden:e.props.value!==i})))})}function j(e){const n=f(e);return(0,v.jsxs)("div",{className:(0,r.A)("tabs-container",g.tabList),children:[(0,v.jsx)(x,{...n,...e}),(0,v.jsx)(V,{...n,...e})]})}function w(e){const n=(0,b.A)();return(0,v.jsx)(j,{...e,children:d(e.children)},String(n))}},8453:(e,n,t)=>{t.d(n,{R:()=>s,x:()=>l});var a=t(6540);const r={},i=a.createContext(r);function s(e){const n=a.useContext(i);return a.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function l(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:s(e.components),a.createElement(i.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/03af419f.85fed8d0.js b/assets/js/03af419f.85fed8d0.js new file mode 100644 index 00000000..5cb20329 --- /dev/null +++ b/assets/js/03af419f.85fed8d0.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[9305],{1865:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>u,contentTitle:()=>o,default:()=>p,frontMatter:()=>l,metadata:()=>c,toc:()=>d});var a=t(4848),r=t(8453),i=t(1470),s=t(9365);const l={title:"VVenC",sidebar_position:12},o="VVenC",c={id:"encoders/VVenC",title:"VVenC",description:'{t.d(n,{A:()=>s});t(6540);var a=t(4164);const r={tabItem:"tabItem_Ymn6"};var i=t(4848);function s(e){let{children:n,hidden:t,className:s}=e;return(0,i.jsx)("div",{role:"tabpanel",className:(0,a.A)(r.tabItem,s),hidden:t,children:n})}},1470:(e,n,t)=>{t.d(n,{A:()=>w});var a=t(6540),r=t(4164),i=t(3104),s=t(6347),l=t(205),o=t(7485),c=t(1682),u=t(679);function d(e){return a.Children.toArray(e).filter((e=>"\n"!==e)).map((e=>{if(!e||(0,a.isValidElement)(e)&&function(e){const{props:n}=e;return!!n&&"object"==typeof n&&"value"in n}(e))return e;throw new Error(`Docusaurus error: Bad child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the component should be , and every should have a unique "value" prop.`)}))?.filter(Boolean)??[]}function h(e){const{values:n,children:t}=e;return(0,a.useMemo)((()=>{const e=n??function(e){return d(e).map((e=>{let{props:{value:n,label:t,attributes:a,default:r}}=e;return{value:n,label:t,attributes:a,default:r}}))}(t);return function(e){const n=(0,c.XI)(e,((e,n)=>e.value===n.value));if(n.length>0)throw new Error(`Docusaurus error: Duplicate values "${n.map((e=>e.value)).join(", ")}" found in . Every value needs to be unique.`)}(e),e}),[n,t])}function p(e){let{value:n,tabValues:t}=e;return t.some((e=>e.value===n))}function m(e){let{queryString:n=!1,groupId:t}=e;const r=(0,s.W6)(),i=function(e){let{queryString:n=!1,groupId:t}=e;if("string"==typeof n)return n;if(!1===n)return null;if(!0===n&&!t)throw new Error('Docusaurus error: The component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return t??null}({queryString:n,groupId:t});return[(0,o.aZ)(i),(0,a.useCallback)((e=>{if(!i)return;const n=new URLSearchParams(r.location.search);n.set(i,e),r.replace({...r.location,search:n.toString()})}),[i,r])]}function f(e){const{defaultValue:n,queryString:t=!1,groupId:r}=e,i=h(e),[s,o]=(0,a.useState)((()=>function(e){let{defaultValue:n,tabValues:t}=e;if(0===t.length)throw new Error("Docusaurus error: the component requires at least one children component");if(n){if(!p({value:n,tabValues:t}))throw new Error(`Docusaurus error: The has a defaultValue "${n}" but none of its children has the corresponding value. Available values are: ${t.map((e=>e.value)).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return n}const a=t.find((e=>e.default))??t[0];if(!a)throw new Error("Unexpected error: 0 tabValues");return a.value}({defaultValue:n,tabValues:i}))),[c,d]=m({queryString:t,groupId:r}),[f,b]=function(e){let{groupId:n}=e;const t=function(e){return e?`docusaurus.tab.${e}`:null}(n),[r,i]=(0,u.Dv)(t);return[r,(0,a.useCallback)((e=>{t&&i.set(e)}),[t,i])]}({groupId:r}),g=(()=>{const e=c??f;return p({value:e,tabValues:i})?e:null})();(0,l.A)((()=>{g&&o(g)}),[g]);return{selectedValue:s,selectValue:(0,a.useCallback)((e=>{if(!p({value:e,tabValues:i}))throw new Error(`Can't select invalid tab value=${e}`);o(e),d(e),b(e)}),[d,b,i]),tabValues:i}}var b=t(2303);const g={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};var v=t(4848);function x(e){let{className:n,block:t,selectedValue:a,selectValue:s,tabValues:l}=e;const o=[],{blockElementScrollPositionUntilNextRender:c}=(0,i.a_)(),u=e=>{const n=e.currentTarget,t=o.indexOf(n),r=l[t].value;r!==a&&(c(n),s(r))},d=e=>{let n=null;switch(e.key){case"Enter":u(e);break;case"ArrowRight":{const t=o.indexOf(e.currentTarget)+1;n=o[t]??o[0];break}case"ArrowLeft":{const t=o.indexOf(e.currentTarget)-1;n=o[t]??o[o.length-1];break}}n?.focus()};return(0,v.jsx)("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,r.A)("tabs",{"tabs--block":t},n),children:l.map((e=>{let{value:n,label:t,attributes:i}=e;return(0,v.jsx)("li",{role:"tab",tabIndex:a===n?0:-1,"aria-selected":a===n,ref:e=>o.push(e),onKeyDown:d,onClick:u,...i,className:(0,r.A)("tabs__item",g.tabItem,i?.className,{"tabs__item--active":a===n}),children:t??n},n)}))})}function V(e){let{lazy:n,children:t,selectedValue:i}=e;const s=(Array.isArray(t)?t:[t]).filter(Boolean);if(n){const e=s.find((e=>e.props.value===i));return e?(0,a.cloneElement)(e,{className:(0,r.A)("margin-top--md",e.props.className)}):null}return(0,v.jsx)("div",{className:"margin-top--md",children:s.map(((e,n)=>(0,a.cloneElement)(e,{key:n,hidden:e.props.value!==i})))})}function j(e){const n=f(e);return(0,v.jsxs)("div",{className:(0,r.A)("tabs-container",g.tabList),children:[(0,v.jsx)(x,{...n,...e}),(0,v.jsx)(V,{...n,...e})]})}function w(e){const n=(0,b.A)();return(0,v.jsx)(j,{...e,children:d(e.children)},String(n))}},8453:(e,n,t)=>{t.d(n,{R:()=>s,x:()=>l});var a=t(6540);const r={},i=a.createContext(r);function s(e){const n=a.useContext(i);return a.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function l(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:s(e.components),a.createElement(i.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/12df3b9e.b3e0523b.js b/assets/js/12df3b9e.1600344c.js similarity index 99% rename from assets/js/12df3b9e.b3e0523b.js rename to assets/js/12df3b9e.1600344c.js index bf966bcf..cd10da33 100644 --- a/assets/js/12df3b9e.b3e0523b.js +++ b/assets/js/12df3b9e.1600344c.js @@ -1 +1 @@ -"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[9993],{1793:(e,n,s)=>{s.r(n),s.d(n,{assets:()=>l,contentTitle:()=>a,default:()=>h,frontMatter:()=>r,metadata:()=>o,toc:()=>d});var i=s(4848),t=s(8453);const r={title:"QOI",sidebar_position:8},a="QOI",o={id:"images/QOI",title:"QOI",description:"QOI (Quite OK Image Format) is an image compression format that aims to provide a simple, fast, and efficient way to compress and decompress images losslessly. It was designed to be easy to implement while offering better compression ratios than the widely used but more complex PNG format while achieving much faster encoding & decoding speeds.",source:"@site/docs/images/QOI.mdx",sourceDirName:"images",slug:"/images/QOI",permalink:"/docs/images/QOI",draft:!1,unlisted:!1,editUrl:"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/images/QOI.mdx",tags:[],version:"current",sidebarPosition:8,frontMatter:{title:"QOI",sidebar_position:8},sidebar:"tutorialSidebar",previous:{title:"JPEG-XL",permalink:"/docs/images/JXL"},next:{title:"x264",permalink:"/docs/encoders/x264"}},l={},d=[{value:"Performance Checklist",id:"performance-checklist",level:2},{value:"Format Breakdown",id:"format-breakdown",level:2},{value:"Benchmarks",id:"benchmarks",level:3},{value:"Advantages",id:"advantages",level:3},{value:"Limitations",id:"limitations",level:3}];function c(e){const n={a:"a",code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",ol:"ol",p:"p",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,t.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(n.header,{children:(0,i.jsx)(n.h1,{id:"qoi",children:"QOI"})}),"\n",(0,i.jsxs)(n.p,{children:["QOI (Quite OK Image Format) is an image compression format that aims to provide a simple, fast, and efficient way to compress and decompress images losslessly. It was designed to be easy to implement while offering better compression ratios than the widely used but more complex ",(0,i.jsx)(n.a,{href:"/docs/images/PNG",children:"PNG"})," format while achieving much faster encoding & decoding speeds."]}),"\n",(0,i.jsx)(n.h2,{id:"performance-checklist",children:"Performance Checklist"}),"\n",(0,i.jsxs)(n.p,{children:["Lossless? ",(0,i.jsx)(n.em,{children:"Yes"})]}),"\n",(0,i.jsxs)(n.p,{children:["Lossy? ",(0,i.jsx)(n.em,{children:"No"})]}),"\n",(0,i.jsxs)(n.p,{children:["Supported Bit Depths:\n",(0,i.jsx)(n.em,{children:"8 BPC"})]}),"\n",(0,i.jsxs)(n.p,{children:["HDR/Wide Gamut? ",(0,i.jsx)(n.em,{children:"No"})]}),"\n",(0,i.jsxs)(n.p,{children:["Animation? ",(0,i.jsx)(n.em,{children:"No"})]}),"\n",(0,i.jsxs)(n.p,{children:["Transparency? ",(0,i.jsx)(n.em,{children:"Yes"})]}),"\n",(0,i.jsxs)(n.p,{children:["Progressive Decode? ",(0,i.jsx)(n.em,{children:"No"})]}),"\n",(0,i.jsxs)(n.p,{children:["Royalty Free? ",(0,i.jsx)(n.em,{children:"Yes"})]}),"\n",(0,i.jsx)(n.h2,{id:"format-breakdown",children:"Format Breakdown"}),"\n",(0,i.jsx)(n.p,{children:"QOI compression is based on a simple and fast algorithm that exploits spatial redundancy in images. The algorithm uses a combination of run-length encoding (RLE), a small lookup table, delta encoding, and full-color pixel storage to achieve efficient compression. Depending on the algorithm's decision, a chunk (pixel) can take up one to five bytes."}),"\n",(0,i.jsx)(n.p,{children:"The QOI format supports images with 3 or 4 channels (RGB or RGBA) and 8 bits per channel. The format supports two colorspaces: Linear RGB & sRGB with linear alpha. These do not affect the way pixels are encoded."}),"\n",(0,i.jsx)(n.p,{children:"Here is a breakdown of the various chunk types in QOI:"}),"\n",(0,i.jsxs)(n.ol,{children:["\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.strong,{children:(0,i.jsx)(n.code,{children:"QOI_OP_RGB"})}),": Full RGB pixel value using 8 bits (1 byte) for each of the red, green, and blue channels. The alpha channel is 255 in RGB images, and always remains unchanged."]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.strong,{children:(0,i.jsx)(n.code,{children:"QOI_OP_RGBA"})}),": Full RGBA pixel value using 8 bits for each of the red, green, blue, & alpha channels."]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.strong,{children:(0,i.jsx)(n.code,{children:"QOI_OP_DIFF"})}),": The difference between the current pixel and the previous pixel for the red, green, and blue channels are stored using 2 bits for each channel. The differences are stored with a bias of 2 and wrap (so 1 minus 2 would be 255). The alpha channel remains unchanged."]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.strong,{children:(0,i.jsx)(n.code,{children:"QOI_OP_LUMA"})}),": These pixels encode the green channel difference from the previous pixel using 6 bits, and then encode the red and blue channel differences relative to the green channel difference using 4 bits each. This allows for more efficient encoding of small color changes. The alpha channel remains unchanged."]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.strong,{children:(0,i.jsx)(n.code,{children:"QOI_OP_RUN"})}),": These are the simplest, encoding a run-length of pixels that are identical to the previous pixel. The run length is stored using 6 bits with a bias of -1, allowing for runs of 1 to 62 pixels."]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.strong,{children:(0,i.jsx)(n.code,{children:"QOI_OP_INDEX"})}),": These are stored by referencing a previously seen pixel value from a rolling array of 64 recent pixel values by using a simple hash on each pixel as it is identified. If another pixel matches a previously seen hash value in the array, the index of the referenced pixel is stored."]}),"\n"]}),"\n"]}),"\n",(0,i.jsx)(n.p,{children:"The QOI format also includes a simple 14-byte header that stores the image dimensions, color space, and channel depth information. The end of file is signaled by an 8-byte end marker."}),"\n",(0,i.jsx)(n.h3,{id:"benchmarks",children:"Benchmarks"}),"\n",(0,i.jsxs)(n.p,{children:["The creator of QOI benchmarked the format against libpng & ",(0,i.jsx)(n.code,{children:"stbi_image_write"})," using the C implementation in QOI via ",(0,i.jsx)(n.a,{href:"https://github.com/phoboslab/qoi/blob/master/qoibench.c",children:(0,i.jsx)(n.code,{children:"qoibench.c"})})," on a collection of 2,879 screenshots, icons, photos, & textures (",(0,i.jsx)(n.a,{href:"https://qoiformat.org/benchmark/qoi_benchmark_suite.tar",children:"source"}),"). The results are as follows:"]}),"\n",(0,i.jsxs)(n.table,{children:[(0,i.jsx)(n.thead,{children:(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.th,{children:(0,i.jsx)(n.strong,{children:"Library"})}),(0,i.jsx)(n.th,{children:(0,i.jsx)(n.strong,{children:"Decode (ms)"})}),(0,i.jsx)(n.th,{children:(0,i.jsx)(n.strong,{children:"Encode (ms)"})}),(0,i.jsx)(n.th,{children:(0,i.jsx)(n.strong,{children:"Decode MP/s"})}),(0,i.jsx)(n.th,{children:(0,i.jsx)(n.strong,{children:"Encode MP/s"})}),(0,i.jsx)(n.th,{children:(0,i.jsx)(n.strong,{children:"Size (kb)"})}),(0,i.jsx)(n.th,{style:{textAlign:"right"},children:(0,i.jsx)(n.strong,{children:"Compression Rate"})})]})}),(0,i.jsxs)(n.tbody,{children:[(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"libpng"})}),(0,i.jsx)(n.td,{children:"7.0"}),(0,i.jsx)(n.td,{children:"83.8"}),(0,i.jsx)(n.td,{children:"66.56"}),(0,i.jsx)(n.td,{children:"5.54"}),(0,i.jsx)(n.td,{children:"398"}),(0,i.jsx)(n.td,{style:{textAlign:"right"},children:"24.2%"})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"stbi"})}),(0,i.jsx)(n.td,{children:"7.0"}),(0,i.jsx)(n.td,{children:"60.5"}),(0,i.jsx)(n.td,{children:"66.63"}),(0,i.jsx)(n.td,{children:"7.67"}),(0,i.jsx)(n.td,{children:"561"}),(0,i.jsx)(n.td,{style:{textAlign:"right"},children:"34.2%"})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"qoi"})}),(0,i.jsx)(n.td,{children:"2.1"}),(0,i.jsx)(n.td,{children:"2.9"}),(0,i.jsx)(n.td,{children:"226.03"}),(0,i.jsx)(n.td,{children:"161.99"}),(0,i.jsx)(n.td,{children:"463"}),(0,i.jsx)(n.td,{style:{textAlign:"right"},children:"28.2%"})]})]})]}),"\n",(0,i.jsxs)(n.p,{children:["The results show that QOI is significantly faster than libpng and ",(0,i.jsx)(n.code,{children:"stb_image_write"}),", and it also achieves better compression ratios than libpng on average."]}),"\n",(0,i.jsx)(n.h3,{id:"advantages",children:"Advantages"}),"\n",(0,i.jsx)(n.p,{children:"Some of the key advantages of QOI include:"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:["Super simple: ",(0,i.jsx)(n.a,{href:"https://qoiformat.org/qoi-specification.pdf",children:"the spec"})," is only one page"]}),"\n",(0,i.jsx)(n.li,{children:"Extremely fast encoding & decoding speeds"}),"\n",(0,i.jsx)(n.li,{children:"Data chunks are byte-aligned, so data can be streamed to a decoder one byte at a time"}),"\n",(0,i.jsx)(n.li,{children:"Better compression ratios compared to PNG for many types of images"}),"\n",(0,i.jsx)(n.li,{children:"Supports transparency"}),"\n",(0,i.jsx)(n.li,{children:"Royalty-free, open-source (CC0), & easy to integrate into any application"}),"\n"]}),"\n",(0,i.jsx)(n.h3,{id:"limitations",children:"Limitations"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:"Limited to 8 bits per channel (no support for higher bit depths)"}),"\n",(0,i.jsx)(n.li,{children:"Not suitable for images with high-frequency noise or very little spatial redundancy"}),"\n",(0,i.jsx)(n.li,{children:"Lacks advanced features like progressive loading, interlacing, or custom metadata"}),"\n"]}),"\n",(0,i.jsx)(n.p,{children:"Despite its limitations, QOI provides a compelling alternative to PNG for many use cases where simplicity, speed, and good compression ratios are desired. QOI is not especially well supported at present, but adoption is rapidly growing as developers can easily integrate support into their applications due to the format's simplicity."})]})}function h(e={}){const{wrapper:n}={...(0,t.R)(),...e.components};return n?(0,i.jsx)(n,{...e,children:(0,i.jsx)(c,{...e})}):c(e)}},8453:(e,n,s)=>{s.d(n,{R:()=>a,x:()=>o});var i=s(6540);const t={},r=i.createContext(t);function a(e){const n=i.useContext(r);return i.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function o(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:a(e.components),i.createElement(r.Provider,{value:n},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[9993],{1793:(e,n,s)=>{s.r(n),s.d(n,{assets:()=>l,contentTitle:()=>a,default:()=>h,frontMatter:()=>r,metadata:()=>o,toc:()=>d});var i=s(4848),t=s(8453);const r={title:"QOI",sidebar_position:8},a="QOI",o={id:"images/QOI",title:"QOI",description:"QOI (Quite OK Image Format) is an image compression format that aims to provide a simple, fast, and efficient way to compress and decompress images losslessly. It was designed to be easy to implement while offering better compression ratios than the widely used but more complex PNG format while achieving much faster encoding & decoding speeds.",source:"@site/docs/images/QOI.mdx",sourceDirName:"images",slug:"/images/QOI",permalink:"/docs/images/QOI",draft:!1,unlisted:!1,editUrl:"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/images/QOI.mdx",tags:[],version:"current",sidebarPosition:8,frontMatter:{title:"QOI",sidebar_position:8},sidebar:"tutorialSidebar",previous:{title:"JPEG XL",permalink:"/docs/images/JXL"},next:{title:"x264",permalink:"/docs/encoders/x264"}},l={},d=[{value:"Performance Checklist",id:"performance-checklist",level:2},{value:"Format Breakdown",id:"format-breakdown",level:2},{value:"Benchmarks",id:"benchmarks",level:3},{value:"Advantages",id:"advantages",level:3},{value:"Limitations",id:"limitations",level:3}];function c(e){const n={a:"a",code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",ol:"ol",p:"p",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,t.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(n.header,{children:(0,i.jsx)(n.h1,{id:"qoi",children:"QOI"})}),"\n",(0,i.jsxs)(n.p,{children:["QOI (Quite OK Image Format) is an image compression format that aims to provide a simple, fast, and efficient way to compress and decompress images losslessly. It was designed to be easy to implement while offering better compression ratios than the widely used but more complex ",(0,i.jsx)(n.a,{href:"/docs/images/PNG",children:"PNG"})," format while achieving much faster encoding & decoding speeds."]}),"\n",(0,i.jsx)(n.h2,{id:"performance-checklist",children:"Performance Checklist"}),"\n",(0,i.jsxs)(n.p,{children:["Lossless? ",(0,i.jsx)(n.em,{children:"Yes"})]}),"\n",(0,i.jsxs)(n.p,{children:["Lossy? ",(0,i.jsx)(n.em,{children:"No"})]}),"\n",(0,i.jsxs)(n.p,{children:["Supported Bit Depths:\n",(0,i.jsx)(n.em,{children:"8 BPC"})]}),"\n",(0,i.jsxs)(n.p,{children:["HDR/Wide Gamut? ",(0,i.jsx)(n.em,{children:"No"})]}),"\n",(0,i.jsxs)(n.p,{children:["Animation? ",(0,i.jsx)(n.em,{children:"No"})]}),"\n",(0,i.jsxs)(n.p,{children:["Transparency? ",(0,i.jsx)(n.em,{children:"Yes"})]}),"\n",(0,i.jsxs)(n.p,{children:["Progressive Decode? ",(0,i.jsx)(n.em,{children:"No"})]}),"\n",(0,i.jsxs)(n.p,{children:["Royalty Free? ",(0,i.jsx)(n.em,{children:"Yes"})]}),"\n",(0,i.jsx)(n.h2,{id:"format-breakdown",children:"Format Breakdown"}),"\n",(0,i.jsx)(n.p,{children:"QOI compression is based on a simple and fast algorithm that exploits spatial redundancy in images. The algorithm uses a combination of run-length encoding (RLE), a small lookup table, delta encoding, and full-color pixel storage to achieve efficient compression. Depending on the algorithm's decision, a chunk (pixel) can take up one to five bytes."}),"\n",(0,i.jsx)(n.p,{children:"The QOI format supports images with 3 or 4 channels (RGB or RGBA) and 8 bits per channel. The format supports two colorspaces: Linear RGB & sRGB with linear alpha. These do not affect the way pixels are encoded."}),"\n",(0,i.jsx)(n.p,{children:"Here is a breakdown of the various chunk types in QOI:"}),"\n",(0,i.jsxs)(n.ol,{children:["\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.strong,{children:(0,i.jsx)(n.code,{children:"QOI_OP_RGB"})}),": Full RGB pixel value using 8 bits (1 byte) for each of the red, green, and blue channels. The alpha channel is 255 in RGB images, and always remains unchanged."]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.strong,{children:(0,i.jsx)(n.code,{children:"QOI_OP_RGBA"})}),": Full RGBA pixel value using 8 bits for each of the red, green, blue, & alpha channels."]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.strong,{children:(0,i.jsx)(n.code,{children:"QOI_OP_DIFF"})}),": The difference between the current pixel and the previous pixel for the red, green, and blue channels are stored using 2 bits for each channel. The differences are stored with a bias of 2 and wrap (so 1 minus 2 would be 255). The alpha channel remains unchanged."]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.strong,{children:(0,i.jsx)(n.code,{children:"QOI_OP_LUMA"})}),": These pixels encode the green channel difference from the previous pixel using 6 bits, and then encode the red and blue channel differences relative to the green channel difference using 4 bits each. This allows for more efficient encoding of small color changes. The alpha channel remains unchanged."]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.strong,{children:(0,i.jsx)(n.code,{children:"QOI_OP_RUN"})}),": These are the simplest, encoding a run-length of pixels that are identical to the previous pixel. The run length is stored using 6 bits with a bias of -1, allowing for runs of 1 to 62 pixels."]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.strong,{children:(0,i.jsx)(n.code,{children:"QOI_OP_INDEX"})}),": These are stored by referencing a previously seen pixel value from a rolling array of 64 recent pixel values by using a simple hash on each pixel as it is identified. If another pixel matches a previously seen hash value in the array, the index of the referenced pixel is stored."]}),"\n"]}),"\n"]}),"\n",(0,i.jsx)(n.p,{children:"The QOI format also includes a simple 14-byte header that stores the image dimensions, color space, and channel depth information. The end of file is signaled by an 8-byte end marker."}),"\n",(0,i.jsx)(n.h3,{id:"benchmarks",children:"Benchmarks"}),"\n",(0,i.jsxs)(n.p,{children:["The creator of QOI benchmarked the format against libpng & ",(0,i.jsx)(n.code,{children:"stbi_image_write"})," using the C implementation in QOI via ",(0,i.jsx)(n.a,{href:"https://github.com/phoboslab/qoi/blob/master/qoibench.c",children:(0,i.jsx)(n.code,{children:"qoibench.c"})})," on a collection of 2,879 screenshots, icons, photos, & textures (",(0,i.jsx)(n.a,{href:"https://qoiformat.org/benchmark/qoi_benchmark_suite.tar",children:"source"}),"). The results are as follows:"]}),"\n",(0,i.jsxs)(n.table,{children:[(0,i.jsx)(n.thead,{children:(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.th,{children:(0,i.jsx)(n.strong,{children:"Library"})}),(0,i.jsx)(n.th,{children:(0,i.jsx)(n.strong,{children:"Decode (ms)"})}),(0,i.jsx)(n.th,{children:(0,i.jsx)(n.strong,{children:"Encode (ms)"})}),(0,i.jsx)(n.th,{children:(0,i.jsx)(n.strong,{children:"Decode MP/s"})}),(0,i.jsx)(n.th,{children:(0,i.jsx)(n.strong,{children:"Encode MP/s"})}),(0,i.jsx)(n.th,{children:(0,i.jsx)(n.strong,{children:"Size (kb)"})}),(0,i.jsx)(n.th,{style:{textAlign:"right"},children:(0,i.jsx)(n.strong,{children:"Compression Rate"})})]})}),(0,i.jsxs)(n.tbody,{children:[(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"libpng"})}),(0,i.jsx)(n.td,{children:"7.0"}),(0,i.jsx)(n.td,{children:"83.8"}),(0,i.jsx)(n.td,{children:"66.56"}),(0,i.jsx)(n.td,{children:"5.54"}),(0,i.jsx)(n.td,{children:"398"}),(0,i.jsx)(n.td,{style:{textAlign:"right"},children:"24.2%"})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"stbi"})}),(0,i.jsx)(n.td,{children:"7.0"}),(0,i.jsx)(n.td,{children:"60.5"}),(0,i.jsx)(n.td,{children:"66.63"}),(0,i.jsx)(n.td,{children:"7.67"}),(0,i.jsx)(n.td,{children:"561"}),(0,i.jsx)(n.td,{style:{textAlign:"right"},children:"34.2%"})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"qoi"})}),(0,i.jsx)(n.td,{children:"2.1"}),(0,i.jsx)(n.td,{children:"2.9"}),(0,i.jsx)(n.td,{children:"226.03"}),(0,i.jsx)(n.td,{children:"161.99"}),(0,i.jsx)(n.td,{children:"463"}),(0,i.jsx)(n.td,{style:{textAlign:"right"},children:"28.2%"})]})]})]}),"\n",(0,i.jsxs)(n.p,{children:["The results show that QOI is significantly faster than libpng and ",(0,i.jsx)(n.code,{children:"stb_image_write"}),", and it also achieves better compression ratios than libpng on average."]}),"\n",(0,i.jsx)(n.h3,{id:"advantages",children:"Advantages"}),"\n",(0,i.jsx)(n.p,{children:"Some of the key advantages of QOI include:"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:["Super simple: ",(0,i.jsx)(n.a,{href:"https://qoiformat.org/qoi-specification.pdf",children:"the spec"})," is only one page"]}),"\n",(0,i.jsx)(n.li,{children:"Extremely fast encoding & decoding speeds"}),"\n",(0,i.jsx)(n.li,{children:"Data chunks are byte-aligned, so data can be streamed to a decoder one byte at a time"}),"\n",(0,i.jsx)(n.li,{children:"Better compression ratios compared to PNG for many types of images"}),"\n",(0,i.jsx)(n.li,{children:"Supports transparency"}),"\n",(0,i.jsx)(n.li,{children:"Royalty-free, open-source (CC0), & easy to integrate into any application"}),"\n"]}),"\n",(0,i.jsx)(n.h3,{id:"limitations",children:"Limitations"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:"Limited to 8 bits per channel (no support for higher bit depths)"}),"\n",(0,i.jsx)(n.li,{children:"Not suitable for images with high-frequency noise or very little spatial redundancy"}),"\n",(0,i.jsx)(n.li,{children:"Lacks advanced features like progressive loading, interlacing, or custom metadata"}),"\n"]}),"\n",(0,i.jsx)(n.p,{children:"Despite its limitations, QOI provides a compelling alternative to PNG for many use cases where simplicity, speed, and good compression ratios are desired. QOI is not especially well supported at present, but adoption is rapidly growing as developers can easily integrate support into their applications due to the format's simplicity."})]})}function h(e={}){const{wrapper:n}={...(0,t.R)(),...e.components};return n?(0,i.jsx)(n,{...e,children:(0,i.jsx)(c,{...e})}):c(e)}},8453:(e,n,s)=>{s.d(n,{R:()=>a,x:()=>o});var i=s(6540);const t={},r=i.createContext(t);function a(e){const n=i.useContext(r);return i.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function o(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:a(e.components),i.createElement(r.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/1ec3ce74.5591587e.js b/assets/js/1ec3ce74.4c398aa5.js similarity index 99% rename from assets/js/1ec3ce74.5591587e.js rename to assets/js/1ec3ce74.4c398aa5.js index 89599ea6..fcbda791 100644 --- a/assets/js/1ec3ce74.5591587e.js +++ b/assets/js/1ec3ce74.4c398aa5.js @@ -1 +1 @@ -"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[2142],{5780:(e,t,r)=>{r.r(t),r.d(t,{assets:()=>d,contentTitle:()=>o,default:()=>p,frontMatter:()=>l,metadata:()=>c,toc:()=>u});var n=r(4848),i=r(8453),s=r(1470),a=r(9365);const l={title:"rav1e",keywords:["AV1","encoding","video encoding"],sidebar_position:5},o="rav1e",c={id:"encoders/rav1e",title:"rav1e",description:"rav1e is an open source command line application for encoding AV1 written in Assembly & Rust, co-developed by Xiph.org and Mozilla and licensed under BSD-2 Clause.",source:"@site/docs/encoders/rav1e.mdx",sourceDirName:"encoders",slug:"/encoders/rav1e",permalink:"/docs/encoders/rav1e",draft:!1,unlisted:!1,editUrl:"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/encoders/rav1e.mdx",tags:[],version:"current",sidebarPosition:5,frontMatter:{title:"rav1e",keywords:["AV1","encoding","video encoding"],sidebar_position:5},sidebar:"tutorialSidebar",previous:{title:"SVT-AV1",permalink:"/docs/encoders/SVT-AV1"},next:{title:"Aurora1 AV1",permalink:"/docs/encoders/Aurora1"}},d={},u=[{value:"FFmpeg",id:"ffmpeg",level:2},{value:"Supported Color Space",id:"supported-color-space",level:2},{value:"Installation",id:"installation",level:2},{value:"Patched Installation with HDR10+ support",id:"patched-installation-with-hdr10-support",level:3},{value:"Usage",id:"usage",level:2},{value:"Tips & Tricks",id:"tips--tricks",level:2}];function h(e){const t={a:"a",admonition:"admonition",code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",ol:"ol",p:"p",pre:"pre",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,i.R)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(t.header,{children:(0,n.jsx)(t.h1,{id:"rav1e",children:"rav1e"})}),"\n",(0,n.jsxs)(t.p,{children:[(0,n.jsx)(t.a,{href:"https://github.com/xiph/rav1e",children:"rav1e"})," is an open source command line application for encoding AV1 written in Assembly & Rust, co-developed by Xiph.org and Mozilla and licensed under BSD-2 Clause."]}),"\n",(0,n.jsx)(t.h2,{id:"ffmpeg",children:"FFmpeg"}),"\n",(0,n.jsxs)(t.p,{children:["rav1e is available in FFmpeg via ",(0,n.jsx)(t.code,{children:"librav1e"}),", to check if you have it, run ",(0,n.jsx)(t.code,{children:"ffmpeg -h encoder=librav1e"}),". You can input non-FFmpeg standard rav1e parameters via ",(0,n.jsx)(t.code,{children:"-rav1e-params"}),"."]}),"\n",(0,n.jsx)(t.h2,{id:"supported-color-space",children:"Supported Color Space"}),"\n",(0,n.jsx)(t.p,{children:"rav1e supports the following color spaces:"}),"\n",(0,n.jsxs)(t.table,{children:[(0,n.jsx)(t.thead,{children:(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.th,{children:"Format"}),(0,n.jsx)(t.th,{style:{textAlign:"center"},children:"Chroma Subsampling"}),(0,n.jsx)(t.th,{children:"Supported Bit Depth(s)"})]})}),(0,n.jsxs)(t.tbody,{children:[(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:"YUV420P"}),(0,n.jsx)(t.td,{style:{textAlign:"center"},children:"4:2:0"}),(0,n.jsx)(t.td,{children:"8-bit"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:"YUVJ420P"}),(0,n.jsx)(t.td,{style:{textAlign:"center"},children:"4:2:0"}),(0,n.jsx)(t.td,{children:"8-bit (Full range)"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:"YUV422P"}),(0,n.jsx)(t.td,{style:{textAlign:"center"},children:"4:2:2"}),(0,n.jsx)(t.td,{children:"8-bit"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:"YUVJ422P"}),(0,n.jsx)(t.td,{style:{textAlign:"center"},children:"4:2:2"}),(0,n.jsx)(t.td,{children:"8-bit (Full range)"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:"YUV444P"}),(0,n.jsx)(t.td,{style:{textAlign:"center"},children:"4:4:4"}),(0,n.jsx)(t.td,{children:"8-bit"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:"YUVJ444P"}),(0,n.jsx)(t.td,{style:{textAlign:"center"},children:"4:4:4"}),(0,n.jsx)(t.td,{children:"8-bit (Full range)"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:"YUV420P10LE"}),(0,n.jsx)(t.td,{style:{textAlign:"center"},children:"4:2:0"}),(0,n.jsx)(t.td,{children:"10-bit"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:"YUV422P10LE"}),(0,n.jsx)(t.td,{style:{textAlign:"center"},children:"4:2:2"}),(0,n.jsx)(t.td,{children:"10-bit"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:"YUV444P10LE"}),(0,n.jsx)(t.td,{style:{textAlign:"center"},children:"4:4:4"}),(0,n.jsx)(t.td,{children:"10-bit"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:"YUV420P12LE"}),(0,n.jsx)(t.td,{style:{textAlign:"center"},children:"4:2:0"}),(0,n.jsx)(t.td,{children:"12-bit"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:"YUV422P12LE"}),(0,n.jsx)(t.td,{style:{textAlign:"center"},children:"4:2:2"}),(0,n.jsx)(t.td,{children:"12-bit"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:"YUV444P12LE"}),(0,n.jsx)(t.td,{style:{textAlign:"center"},children:"4:4:4"}),(0,n.jsx)(t.td,{children:"12-bit"})]})]})]}),"\n",(0,n.jsx)(t.h2,{id:"installation",children:"Installation"}),"\n",(0,n.jsxs)(s.A,{children:[(0,n.jsxs)(a.A,{value:"unixlike",label:"Linux & macOS",children:[(0,n.jsxs)(t.p,{children:["Official pre-built rav1e binaries can be found on the ",(0,n.jsx)(t.a,{href:"https://github.com/xiph/rav1e/releases",children:"releases page"})," in rav1e's Github repository. Unofficially, the ",(0,n.jsx)(t.a,{href:"/docs/utilities/rav1ator-cli",children:"rAV1ator CLI"})," command line tool can automatically download and install rav1e to ",(0,n.jsx)(t.code,{children:"/usr/local/bin"}),". rav1e can also be installed with Cargo by running ",(0,n.jsx)(t.code,{children:"cargo install rav1e"}),"."]}),(0,n.jsx)(t.admonition,{title:"Stable Release",type:"info",children:(0,n.jsxs)(t.p,{children:["For stability & a proper version number, please reset the source to the correct release commit. In the releases page, click the icon to the right of the release tag & copy the commit in the url bar. Then, in the cloned rav1e directory, ",(0,n.jsx)(t.code,{children:"git reset --hard [commit hash]"})]})}),(0,n.jsxs)(t.p,{children:["Here are instructions for resetting to release 0.7.1 (latest as of 19 Feb 2024) and building. Omit the ",(0,n.jsx)(t.code,{children:"git reset"})," command to use the latest git, if you have a ",(0,n.jsx)(t.em,{children:"specific"})," reason to use the latest git instead of an official tagged release."]}),(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-bash",children:'git clone https://github.com/xiph/rav1e.git\ncd rav1e\ngit reset --hard a8d05d0c43826a465b60dbadd0ab7f1327d75371\nRUSTFLAGS="-C target-cpu=native" cargo build --release\n'})}),(0,n.jsxs)(t.p,{children:["When done, the binary can be found in ",(0,n.jsx)(t.code,{children:"/target/release"}),". You can then copy the binary wherever you desire it to go, like by doing ",(0,n.jsx)(t.code,{children:"cp /target/release/rav1e /usr/local/bin"})," ."]}),(0,n.jsx)(t.h3,{id:"patched-installation-with-hdr10-support",children:"Patched Installation with HDR10+ support"}),(0,n.jsxs)(t.p,{children:["rav1e currently has an ",(0,n.jsx)(t.a,{href:"https://github.com/xiph/rav1e/pull/3000",children:"unmerged pull request"})," by quietvoid, the person behind ",(0,n.jsx)(t.a,{href:"/docs/utilities/hdr10plus_tool",children:"hdr10plus_tool"})," and ",(0,n.jsx)(t.a,{href:"/docs/utilities/dovi_tool",children:"dovi_tool"}),". The PR adds a new parameter called ",(0,n.jsx)(t.code,{children:"--hdr10plus-json"})," for HDR10+ JSON dynamic metadata input. To merge it locally, do the following:"]}),(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-bash",children:"git clone https://github.com/xiph/rav1e.git\ncd rav1e\ngit reset --hard [release commit]\ngit fetch origin pull/3000/head:HDR10+\n"})}),(0,n.jsx)(t.p,{children:"Now the patch should be applied, and you may build as usual."})]}),(0,n.jsxs)(a.A,{value:"windows",label:"Windows",children:[(0,n.jsxs)(t.p,{children:["If you would not like to build from source, official pre-built rav1e binaries can be found on the ",(0,n.jsx)(t.a,{href:"https://github.com/xiph/rav1e/releases",children:"releases page"})," in rav1e's Github repository."]}),(0,n.jsx)(t.admonition,{title:"Stable Release",type:"info",children:(0,n.jsxs)(t.p,{children:["For stability & a proper version number, please reset the source to the correct release commit. In the releases page, click the icon to the right of the release tag & copy the commit in the url bar. Then, in the cloned rav1e directory, ",(0,n.jsx)(t.code,{children:"git reset --hard [commit hash]"})]})}),(0,n.jsxs)(t.p,{children:["Here are instructions for resetting to release 0.7.1 (latest as of 19 Feb 2024) and building. Omit the ",(0,n.jsx)(t.code,{children:"git reset"})," command to use the latest git, if you have a ",(0,n.jsx)(t.em,{children:"specific"})," reason to use the latest git instead of an official tagged release."]}),(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-powershell",children:"git clone https://github.com/xiph/rav1e.git\ncd rav1e\ngit reset --hard a8d05d0c43826a465b60dbadd0ab7f1327d75371\nset RUSTFLAGS=-C target-cpu=native\ncargo build --release\n"})}),(0,n.jsxs)(t.p,{children:["When done, the binary can be found in ",(0,n.jsx)(t.code,{children:"target/release"})]})]})]}),"\n",(0,n.jsx)(t.h2,{id:"usage",children:"Usage"}),"\n",(0,n.jsx)(t.p,{children:"For AV1 encoding, rav1e has very sane defaults. It is very hard to go wrong with parameters if you modify as few as possible."}),"\n",(0,n.jsx)(t.admonition,{type:"tip",children:(0,n.jsxs)(t.p,{children:["To convert ",(0,n.jsx)(t.code,{children:"cq-level"})," in aomenc and ",(0,n.jsx)(t.code,{children:"crf"})," in SVT-AV1 to rav1e's quantizer values, multiply by 4. For example, ",(0,n.jsx)(t.code,{children:"--cq-level 20"})," equals to ",(0,n.jsx)(t.code,{children:"--quantizer 60"}),"."]})}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-bash",metastring:'title="Basic usage"',children:"rav1e -i input.y4m -o output.ivf --quantizer 60 --photon-noise 8\n"})}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-bash",metastring:'title="Basic usage with FFmpeg piping, 10bit input"',children:"ffmpeg -i input.mkv -pix_fmt yuv420p10le -strict -2 -f yuv4mpegpipe - | rav1e - -o output.ivf --quantizer 80 --photon-noise 8\n"})}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-bash",metastring:'title="Basic usage with FFmpeg piping, 10bit input and assuming 4K"',children:"ffmpeg -i input.mkv -pix_fmt yuv420p10le -strict -2 -f yuv4mpegpipe - | rav1e - -o output.ivf --quantizer 68 --tile-columns 2 --tile-rows 1 --photon-noise 8\n"})}),"\n",(0,n.jsx)(t.h2,{id:"tips--tricks",children:"Tips & Tricks"}),"\n",(0,n.jsxs)(t.ol,{children:["\n",(0,n.jsxs)(t.li,{children:["Use 2x1 tiles or ",(0,n.jsx)(t.code,{children:"tile-columns 2"})," and ",(0,n.jsx)(t.code,{children:"tile-rows 1"})," for 4K (2160p) encoding, this will help with both encoding and decoding speeds."]}),"\n"]})]})}function p(e={}){const{wrapper:t}={...(0,i.R)(),...e.components};return t?(0,n.jsx)(t,{...e,children:(0,n.jsx)(h,{...e})}):h(e)}},9365:(e,t,r)=>{r.d(t,{A:()=>a});r(6540);var n=r(4164);const i={tabItem:"tabItem_Ymn6"};var s=r(4848);function a(e){let{children:t,hidden:r,className:a}=e;return(0,s.jsx)("div",{role:"tabpanel",className:(0,n.A)(i.tabItem,a),hidden:r,children:t})}},1470:(e,t,r)=>{r.d(t,{A:()=>w});var n=r(6540),i=r(4164),s=r(3104),a=r(6347),l=r(205),o=r(7485),c=r(1682),d=r(679);function u(e){return n.Children.toArray(e).filter((e=>"\n"!==e)).map((e=>{if(!e||(0,n.isValidElement)(e)&&function(e){const{props:t}=e;return!!t&&"object"==typeof t&&"value"in t}(e))return e;throw new Error(`Docusaurus error: Bad child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the component should be , and every should have a unique "value" prop.`)}))?.filter(Boolean)??[]}function h(e){const{values:t,children:r}=e;return(0,n.useMemo)((()=>{const e=t??function(e){return u(e).map((e=>{let{props:{value:t,label:r,attributes:n,default:i}}=e;return{value:t,label:r,attributes:n,default:i}}))}(r);return function(e){const t=(0,c.XI)(e,((e,t)=>e.value===t.value));if(t.length>0)throw new Error(`Docusaurus error: Duplicate values "${t.map((e=>e.value)).join(", ")}" found in . Every value needs to be unique.`)}(e),e}),[t,r])}function p(e){let{value:t,tabValues:r}=e;return r.some((e=>e.value===t))}function x(e){let{queryString:t=!1,groupId:r}=e;const i=(0,a.W6)(),s=function(e){let{queryString:t=!1,groupId:r}=e;if("string"==typeof t)return t;if(!1===t)return null;if(!0===t&&!r)throw new Error('Docusaurus error: The component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return r??null}({queryString:t,groupId:r});return[(0,o.aZ)(s),(0,n.useCallback)((e=>{if(!s)return;const t=new URLSearchParams(i.location.search);t.set(s,e),i.replace({...i.location,search:t.toString()})}),[s,i])]}function m(e){const{defaultValue:t,queryString:r=!1,groupId:i}=e,s=h(e),[a,o]=(0,n.useState)((()=>function(e){let{defaultValue:t,tabValues:r}=e;if(0===r.length)throw new Error("Docusaurus error: the component requires at least one children component");if(t){if(!p({value:t,tabValues:r}))throw new Error(`Docusaurus error: The has a defaultValue "${t}" but none of its children has the corresponding value. Available values are: ${r.map((e=>e.value)).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return t}const n=r.find((e=>e.default))??r[0];if(!n)throw new Error("Unexpected error: 0 tabValues");return n.value}({defaultValue:t,tabValues:s}))),[c,u]=x({queryString:r,groupId:i}),[m,g]=function(e){let{groupId:t}=e;const r=function(e){return e?`docusaurus.tab.${e}`:null}(t),[i,s]=(0,d.Dv)(r);return[i,(0,n.useCallback)((e=>{r&&s.set(e)}),[r,s])]}({groupId:i}),b=(()=>{const e=c??m;return p({value:e,tabValues:s})?e:null})();(0,l.A)((()=>{b&&o(b)}),[b]);return{selectedValue:a,selectValue:(0,n.useCallback)((e=>{if(!p({value:e,tabValues:s}))throw new Error(`Can't select invalid tab value=${e}`);o(e),u(e),g(e)}),[u,g,s]),tabValues:s}}var g=r(2303);const b={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};var v=r(4848);function f(e){let{className:t,block:r,selectedValue:n,selectValue:a,tabValues:l}=e;const o=[],{blockElementScrollPositionUntilNextRender:c}=(0,s.a_)(),d=e=>{const t=e.currentTarget,r=o.indexOf(t),i=l[r].value;i!==n&&(c(t),a(i))},u=e=>{let t=null;switch(e.key){case"Enter":d(e);break;case"ArrowRight":{const r=o.indexOf(e.currentTarget)+1;t=o[r]??o[0];break}case"ArrowLeft":{const r=o.indexOf(e.currentTarget)-1;t=o[r]??o[o.length-1];break}}t?.focus()};return(0,v.jsx)("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,i.A)("tabs",{"tabs--block":r},t),children:l.map((e=>{let{value:t,label:r,attributes:s}=e;return(0,v.jsx)("li",{role:"tab",tabIndex:n===t?0:-1,"aria-selected":n===t,ref:e=>o.push(e),onKeyDown:u,onClick:d,...s,className:(0,i.A)("tabs__item",b.tabItem,s?.className,{"tabs__item--active":n===t}),children:r??t},t)}))})}function j(e){let{lazy:t,children:r,selectedValue:s}=e;const a=(Array.isArray(r)?r:[r]).filter(Boolean);if(t){const e=a.find((e=>e.props.value===s));return e?(0,n.cloneElement)(e,{className:(0,i.A)("margin-top--md",e.props.className)}):null}return(0,v.jsx)("div",{className:"margin-top--md",children:a.map(((e,t)=>(0,n.cloneElement)(e,{key:t,hidden:e.props.value!==s})))})}function y(e){const t=m(e);return(0,v.jsxs)("div",{className:(0,i.A)("tabs-container",b.tabList),children:[(0,v.jsx)(f,{...t,...e}),(0,v.jsx)(j,{...t,...e})]})}function w(e){const t=(0,g.A)();return(0,v.jsx)(y,{...e,children:u(e.children)},String(t))}},8453:(e,t,r)=>{r.d(t,{R:()=>a,x:()=>l});var n=r(6540);const i={},s=n.createContext(i);function a(e){const t=n.useContext(s);return n.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function l(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:a(e.components),n.createElement(s.Provider,{value:t},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[2142],{5780:(e,t,r)=>{r.r(t),r.d(t,{assets:()=>d,contentTitle:()=>o,default:()=>p,frontMatter:()=>l,metadata:()=>c,toc:()=>u});var n=r(4848),i=r(8453),s=r(1470),a=r(9365);const l={title:"rav1e",keywords:["AV1","encoding","video encoding"],sidebar_position:5},o="rav1e",c={id:"encoders/rav1e",title:"rav1e",description:"rav1e is an open source command line application for encoding AV1 written in Assembly & Rust, co-developed by Xiph.org and Mozilla and licensed under BSD-2 Clause.",source:"@site/docs/encoders/rav1e.mdx",sourceDirName:"encoders",slug:"/encoders/rav1e",permalink:"/docs/encoders/rav1e",draft:!1,unlisted:!1,editUrl:"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/encoders/rav1e.mdx",tags:[],version:"current",sidebarPosition:5,frontMatter:{title:"rav1e",keywords:["AV1","encoding","video encoding"],sidebar_position:5},sidebar:"tutorialSidebar",previous:{title:"SVT-AV1",permalink:"/docs/encoders/SVT-AV1"},next:{title:"Aurora1 AV1",permalink:"/docs/encoders/Aurora1"}},d={},u=[{value:"FFmpeg",id:"ffmpeg",level:2},{value:"Supported Color Space",id:"supported-color-space",level:2},{value:"Installation",id:"installation",level:2},{value:"Patched Installation with HDR10+ support",id:"patched-installation-with-hdr10-support",level:3},{value:"Usage",id:"usage",level:2},{value:"Tips & Tricks",id:"tips--tricks",level:2}];function h(e){const t={a:"a",admonition:"admonition",code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",ol:"ol",p:"p",pre:"pre",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,i.R)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(t.header,{children:(0,n.jsx)(t.h1,{id:"rav1e",children:"rav1e"})}),"\n",(0,n.jsxs)(t.p,{children:[(0,n.jsx)(t.a,{href:"https://github.com/xiph/rav1e",children:"rav1e"})," is an open source command line application for encoding AV1 written in Assembly & Rust, co-developed by Xiph.org and Mozilla and licensed under BSD-2 Clause."]}),"\n",(0,n.jsx)(t.h2,{id:"ffmpeg",children:"FFmpeg"}),"\n",(0,n.jsxs)(t.p,{children:["rav1e is available in FFmpeg via ",(0,n.jsx)(t.code,{children:"librav1e"}),", to check if you have it, run ",(0,n.jsx)(t.code,{children:"ffmpeg -h encoder=librav1e"}),". You can input non-FFmpeg standard rav1e parameters via ",(0,n.jsx)(t.code,{children:"-rav1e-params"}),"."]}),"\n",(0,n.jsx)(t.h2,{id:"supported-color-space",children:"Supported Color Space"}),"\n",(0,n.jsx)(t.p,{children:"rav1e supports the following color spaces:"}),"\n",(0,n.jsxs)(t.table,{children:[(0,n.jsx)(t.thead,{children:(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.th,{children:"Format"}),(0,n.jsx)(t.th,{style:{textAlign:"center"},children:"Chroma Subsampling"}),(0,n.jsx)(t.th,{children:"Supported Bit Depth(s)"})]})}),(0,n.jsxs)(t.tbody,{children:[(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:"YUV420P"}),(0,n.jsx)(t.td,{style:{textAlign:"center"},children:"4:2:0"}),(0,n.jsx)(t.td,{children:"8-bit"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:"YUVJ420P"}),(0,n.jsx)(t.td,{style:{textAlign:"center"},children:"4:2:0"}),(0,n.jsx)(t.td,{children:"8-bit (Full range)"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:"YUV422P"}),(0,n.jsx)(t.td,{style:{textAlign:"center"},children:"4:2:2"}),(0,n.jsx)(t.td,{children:"8-bit"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:"YUVJ422P"}),(0,n.jsx)(t.td,{style:{textAlign:"center"},children:"4:2:2"}),(0,n.jsx)(t.td,{children:"8-bit (Full range)"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:"YUV444P"}),(0,n.jsx)(t.td,{style:{textAlign:"center"},children:"4:4:4"}),(0,n.jsx)(t.td,{children:"8-bit"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:"YUVJ444P"}),(0,n.jsx)(t.td,{style:{textAlign:"center"},children:"4:4:4"}),(0,n.jsx)(t.td,{children:"8-bit (Full range)"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:"YUV420P10LE"}),(0,n.jsx)(t.td,{style:{textAlign:"center"},children:"4:2:0"}),(0,n.jsx)(t.td,{children:"10-bit"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:"YUV422P10LE"}),(0,n.jsx)(t.td,{style:{textAlign:"center"},children:"4:2:2"}),(0,n.jsx)(t.td,{children:"10-bit"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:"YUV444P10LE"}),(0,n.jsx)(t.td,{style:{textAlign:"center"},children:"4:4:4"}),(0,n.jsx)(t.td,{children:"10-bit"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:"YUV420P12LE"}),(0,n.jsx)(t.td,{style:{textAlign:"center"},children:"4:2:0"}),(0,n.jsx)(t.td,{children:"12-bit"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:"YUV422P12LE"}),(0,n.jsx)(t.td,{style:{textAlign:"center"},children:"4:2:2"}),(0,n.jsx)(t.td,{children:"12-bit"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:"YUV444P12LE"}),(0,n.jsx)(t.td,{style:{textAlign:"center"},children:"4:4:4"}),(0,n.jsx)(t.td,{children:"12-bit"})]})]})]}),"\n",(0,n.jsx)(t.h2,{id:"installation",children:"Installation"}),"\n",(0,n.jsxs)(s.A,{children:[(0,n.jsxs)(a.A,{value:"unixlike",label:"Linux & macOS",children:[(0,n.jsxs)(t.p,{children:["Official pre-built rav1e binaries can be found on the ",(0,n.jsx)(t.a,{href:"https://github.com/xiph/rav1e/releases",children:"releases page"})," in rav1e's Github repository. Unofficially, the ",(0,n.jsx)(t.a,{href:"/docs/utilities/rav1ator-cli",children:"rAV1ator CLI"})," command line tool can automatically download and install rav1e to ",(0,n.jsx)(t.code,{children:"/usr/local/bin"}),". rav1e can also be installed with Cargo by running ",(0,n.jsx)(t.code,{children:"cargo install rav1e"}),"."]}),(0,n.jsx)(t.admonition,{title:"Stable Release",type:"info",children:(0,n.jsxs)(t.p,{children:["For stability & a proper version number, please reset the source to the correct release commit. In the releases page, click the icon to the right of the release tag & copy the commit in the url bar. Then, in the cloned rav1e directory, ",(0,n.jsx)(t.code,{children:"git reset --hard [commit hash]"})]})}),(0,n.jsxs)(t.p,{children:["Here are instructions for resetting to release 0.7.1 (latest as of 19 Feb 2024) and building. Omit the ",(0,n.jsx)(t.code,{children:"git reset"})," command to use the latest git, if you have a ",(0,n.jsx)(t.em,{children:"specific"})," reason to use the latest git instead of an official tagged release."]}),(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-bash",children:'git clone https://github.com/xiph/rav1e.git\ncd rav1e\ngit reset --hard a8d05d0c43826a465b60dbadd0ab7f1327d75371\nRUSTFLAGS="-C target-cpu=native" cargo build --release\n'})}),(0,n.jsxs)(t.p,{children:["When done, the binary can be found in ",(0,n.jsx)(t.code,{children:"/target/release"}),". You can then copy the binary wherever you desire it to go, like by doing ",(0,n.jsx)(t.code,{children:"cp /target/release/rav1e /usr/local/bin"})," ."]}),(0,n.jsx)(t.h3,{id:"patched-installation-with-hdr10-support",children:"Patched Installation with HDR10+ support"}),(0,n.jsxs)(t.p,{children:["rav1e currently has an ",(0,n.jsx)(t.a,{href:"https://github.com/xiph/rav1e/pull/3000",children:"unmerged pull request"})," by quietvoid, the person behind ",(0,n.jsx)(t.a,{href:"/docs/utilities/hdr10plus_tool",children:"hdr10plus_tool"})," and ",(0,n.jsx)(t.a,{href:"/docs/utilities/dovi_tool",children:"dovi_tool"}),". The PR adds a new parameter called ",(0,n.jsx)(t.code,{children:"--hdr10plus-json"})," for HDR10+ JSON dynamic metadata input. To merge it locally, do the following:"]}),(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-bash",children:"git clone https://github.com/xiph/rav1e.git\ncd rav1e\ngit reset --hard [release commit]\ngit fetch origin pull/3000/head:HDR10+\n"})}),(0,n.jsx)(t.p,{children:"Now the patch should be applied, and you may build as usual."})]}),(0,n.jsxs)(a.A,{value:"windows",label:"Windows",children:[(0,n.jsxs)(t.p,{children:["If you would not like to build from source, official pre-built rav1e binaries can be found on the ",(0,n.jsx)(t.a,{href:"https://github.com/xiph/rav1e/releases",children:"releases page"})," in rav1e's Github repository."]}),(0,n.jsx)(t.admonition,{title:"Stable Release",type:"info",children:(0,n.jsxs)(t.p,{children:["For stability & a proper version number, please reset the source to the correct release commit. In the releases page, click the icon to the right of the release tag & copy the commit in the url bar. Then, in the cloned rav1e directory, ",(0,n.jsx)(t.code,{children:"git reset --hard [commit hash]"})]})}),(0,n.jsxs)(t.p,{children:["Here are instructions for resetting to release 0.7.1 (latest as of 19 Feb 2024) and building. Omit the ",(0,n.jsx)(t.code,{children:"git reset"})," command to use the latest git, if you have a ",(0,n.jsx)(t.em,{children:"specific"})," reason to use the latest git instead of an official tagged release."]}),(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-powershell",children:"git clone https://github.com/xiph/rav1e.git\ncd rav1e\ngit reset --hard a8d05d0c43826a465b60dbadd0ab7f1327d75371\nset RUSTFLAGS=-C target-cpu=native\ncargo build --release\n"})}),(0,n.jsxs)(t.p,{children:["When done, the binary can be found in ",(0,n.jsx)(t.code,{children:"target/release"})]})]})]}),"\n",(0,n.jsx)(t.h2,{id:"usage",children:"Usage"}),"\n",(0,n.jsx)(t.p,{children:"For AV1 encoding, rav1e has very sane defaults. It is very hard to go wrong with parameters if you modify as few as possible."}),"\n",(0,n.jsx)(t.admonition,{type:"tip",children:(0,n.jsxs)(t.p,{children:["To convert ",(0,n.jsx)(t.code,{children:"cq-level"})," in aomenc and ",(0,n.jsx)(t.code,{children:"crf"})," in SVT-AV1 to rav1e's quantizer values, multiply by 4. For example, ",(0,n.jsx)(t.code,{children:"--cq-level 20"})," equals to ",(0,n.jsx)(t.code,{children:"--quantizer 80"}),"."]})}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-bash",metastring:'title="Basic usage"',children:"rav1e -i input.y4m -o output.ivf --quantizer 60 --photon-noise 8\n"})}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-bash",metastring:'title="Basic usage with FFmpeg piping, 10bit input"',children:"ffmpeg -i input.mkv -pix_fmt yuv420p10le -strict -2 -f yuv4mpegpipe - | rav1e - -o output.ivf --quantizer 80 --photon-noise 8\n"})}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-bash",metastring:'title="Basic usage with FFmpeg piping, 10bit input and assuming 4K"',children:"ffmpeg -i input.mkv -pix_fmt yuv420p10le -strict -2 -f yuv4mpegpipe - | rav1e - -o output.ivf --quantizer 68 --tile-columns 2 --tile-rows 1 --photon-noise 8\n"})}),"\n",(0,n.jsx)(t.h2,{id:"tips--tricks",children:"Tips & Tricks"}),"\n",(0,n.jsxs)(t.ol,{children:["\n",(0,n.jsxs)(t.li,{children:["Use 2x1 tiles or ",(0,n.jsx)(t.code,{children:"tile-columns 2"})," and ",(0,n.jsx)(t.code,{children:"tile-rows 1"})," for 4K (2160p) encoding, this will help with both encoding and decoding speeds."]}),"\n"]})]})}function p(e={}){const{wrapper:t}={...(0,i.R)(),...e.components};return t?(0,n.jsx)(t,{...e,children:(0,n.jsx)(h,{...e})}):h(e)}},9365:(e,t,r)=>{r.d(t,{A:()=>a});r(6540);var n=r(4164);const i={tabItem:"tabItem_Ymn6"};var s=r(4848);function a(e){let{children:t,hidden:r,className:a}=e;return(0,s.jsx)("div",{role:"tabpanel",className:(0,n.A)(i.tabItem,a),hidden:r,children:t})}},1470:(e,t,r)=>{r.d(t,{A:()=>w});var n=r(6540),i=r(4164),s=r(3104),a=r(6347),l=r(205),o=r(7485),c=r(1682),d=r(679);function u(e){return n.Children.toArray(e).filter((e=>"\n"!==e)).map((e=>{if(!e||(0,n.isValidElement)(e)&&function(e){const{props:t}=e;return!!t&&"object"==typeof t&&"value"in t}(e))return e;throw new Error(`Docusaurus error: Bad child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the component should be , and every should have a unique "value" prop.`)}))?.filter(Boolean)??[]}function h(e){const{values:t,children:r}=e;return(0,n.useMemo)((()=>{const e=t??function(e){return u(e).map((e=>{let{props:{value:t,label:r,attributes:n,default:i}}=e;return{value:t,label:r,attributes:n,default:i}}))}(r);return function(e){const t=(0,c.XI)(e,((e,t)=>e.value===t.value));if(t.length>0)throw new Error(`Docusaurus error: Duplicate values "${t.map((e=>e.value)).join(", ")}" found in . Every value needs to be unique.`)}(e),e}),[t,r])}function p(e){let{value:t,tabValues:r}=e;return r.some((e=>e.value===t))}function x(e){let{queryString:t=!1,groupId:r}=e;const i=(0,a.W6)(),s=function(e){let{queryString:t=!1,groupId:r}=e;if("string"==typeof t)return t;if(!1===t)return null;if(!0===t&&!r)throw new Error('Docusaurus error: The component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return r??null}({queryString:t,groupId:r});return[(0,o.aZ)(s),(0,n.useCallback)((e=>{if(!s)return;const t=new URLSearchParams(i.location.search);t.set(s,e),i.replace({...i.location,search:t.toString()})}),[s,i])]}function m(e){const{defaultValue:t,queryString:r=!1,groupId:i}=e,s=h(e),[a,o]=(0,n.useState)((()=>function(e){let{defaultValue:t,tabValues:r}=e;if(0===r.length)throw new Error("Docusaurus error: the component requires at least one children component");if(t){if(!p({value:t,tabValues:r}))throw new Error(`Docusaurus error: The has a defaultValue "${t}" but none of its children has the corresponding value. Available values are: ${r.map((e=>e.value)).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return t}const n=r.find((e=>e.default))??r[0];if(!n)throw new Error("Unexpected error: 0 tabValues");return n.value}({defaultValue:t,tabValues:s}))),[c,u]=x({queryString:r,groupId:i}),[m,g]=function(e){let{groupId:t}=e;const r=function(e){return e?`docusaurus.tab.${e}`:null}(t),[i,s]=(0,d.Dv)(r);return[i,(0,n.useCallback)((e=>{r&&s.set(e)}),[r,s])]}({groupId:i}),b=(()=>{const e=c??m;return p({value:e,tabValues:s})?e:null})();(0,l.A)((()=>{b&&o(b)}),[b]);return{selectedValue:a,selectValue:(0,n.useCallback)((e=>{if(!p({value:e,tabValues:s}))throw new Error(`Can't select invalid tab value=${e}`);o(e),u(e),g(e)}),[u,g,s]),tabValues:s}}var g=r(2303);const b={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};var v=r(4848);function f(e){let{className:t,block:r,selectedValue:n,selectValue:a,tabValues:l}=e;const o=[],{blockElementScrollPositionUntilNextRender:c}=(0,s.a_)(),d=e=>{const t=e.currentTarget,r=o.indexOf(t),i=l[r].value;i!==n&&(c(t),a(i))},u=e=>{let t=null;switch(e.key){case"Enter":d(e);break;case"ArrowRight":{const r=o.indexOf(e.currentTarget)+1;t=o[r]??o[0];break}case"ArrowLeft":{const r=o.indexOf(e.currentTarget)-1;t=o[r]??o[o.length-1];break}}t?.focus()};return(0,v.jsx)("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,i.A)("tabs",{"tabs--block":r},t),children:l.map((e=>{let{value:t,label:r,attributes:s}=e;return(0,v.jsx)("li",{role:"tab",tabIndex:n===t?0:-1,"aria-selected":n===t,ref:e=>o.push(e),onKeyDown:u,onClick:d,...s,className:(0,i.A)("tabs__item",b.tabItem,s?.className,{"tabs__item--active":n===t}),children:r??t},t)}))})}function j(e){let{lazy:t,children:r,selectedValue:s}=e;const a=(Array.isArray(r)?r:[r]).filter(Boolean);if(t){const e=a.find((e=>e.props.value===s));return e?(0,n.cloneElement)(e,{className:(0,i.A)("margin-top--md",e.props.className)}):null}return(0,v.jsx)("div",{className:"margin-top--md",children:a.map(((e,t)=>(0,n.cloneElement)(e,{key:t,hidden:e.props.value!==s})))})}function y(e){const t=m(e);return(0,v.jsxs)("div",{className:(0,i.A)("tabs-container",b.tabList),children:[(0,v.jsx)(f,{...t,...e}),(0,v.jsx)(j,{...t,...e})]})}function w(e){const t=(0,g.A)();return(0,v.jsx)(y,{...e,children:u(e.children)},String(t))}},8453:(e,t,r)=>{r.d(t,{R:()=>a,x:()=>l});var n=r(6540);const i={},s=n.createContext(i);function a(e){const t=n.useContext(s);return n.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function l(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:a(e.components),n.createElement(s.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/299beccc.7f375df6.js b/assets/js/299beccc.de7d8920.js similarity index 71% rename from assets/js/299beccc.7f375df6.js rename to assets/js/299beccc.de7d8920.js index 501957b3..3c634353 100644 --- a/assets/js/299beccc.7f375df6.js +++ b/assets/js/299beccc.de7d8920.js @@ -1 +1 @@ -"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[5479],{1531:(e,t,i)=>{i.r(t),i.d(t,{assets:()=>c,contentTitle:()=>r,default:()=>p,frontMatter:()=>n,metadata:()=>a,toc:()=>d});var s=i(4848),o=i(8453);const n={title:"7z",sidebar_position:4},r="7-zip (7z)",a={id:"data/7z",title:"7z",description:"This section is in need of contributions. If you believe you can help, please see our Contribution Guide to get started as a contributor!",source:"@site/docs/data/7z.mdx",sourceDirName:"data",slug:"/data/7z",permalink:"/docs/data/7z",draft:!1,unlisted:!1,editUrl:"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/data/7z.mdx",tags:[],version:"current",sidebarPosition:4,frontMatter:{title:"7z",sidebar_position:4},sidebar:"tutorialSidebar",previous:{title:"bzip2",permalink:"/docs/data/bzip2"},next:{title:"xz",permalink:"/docs/data/xz"}},c={},d=[];function l(e){const t={a:"a",admonition:"admonition",h1:"h1",header:"header",li:"li",p:"p",ul:"ul",...(0,o.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(t.header,{children:(0,s.jsx)(t.h1,{id:"7-zip-7z",children:"7-zip (7z)"})}),"\n",(0,s.jsx)(t.admonition,{title:"Help Wanted",type:"danger",children:(0,s.jsxs)(t.p,{children:["This section is in need of contributions. If you believe you can help, please see our ",(0,s.jsx)(t.a,{href:"/docs/contribution-guide",children:"Contribution Guide"})," to get started as a contributor!"]})}),"\n",(0,s.jsxs)(t.p,{children:["7-zip (7z) is a file format that supports several different data compression, encryption, & pre-processing algorithms. It was created by the 7-Zip archiver, which is free and open-source software for dealing with various data compression formats including formats similar to 7z like ",(0,s.jsx)(t.a,{href:"/docs/data/xz",children:"XZ"}),"."]}),"\n",(0,s.jsxs)(t.p,{children:["The 7-zip format has some noteworthy advantages over the popular ",(0,s.jsx)(t.a,{href:"/docs/data/zip",children:"ZIP"})," format."]}),"\n",(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsx)(t.li,{children:'The 7-zip utility can compress files to the 7z format "30-70% better" than to ZIP format despite having a highly efficient ZIP encoder. It mainly uses the LZMA & LZMA2 algorithms, which are more modern than DEFLATE and usually compress better.'}),"\n",(0,s.jsx)(t.li,{children:"7-zip can encrypt files with AES-256 using a user provided password. AES-256 is more secure than the ZipCrypto encryption often used by ZIP."}),"\n",(0,s.jsx)(t.li,{children:"7-zip can support files up to 16 exabytes in size, while traditional ZIP has a 4 GB limit (ZIP64, which is commonly used, does not suffer from this 4 GB limitation so this is less relevant now). 7-zip also supports various pre-processing filters, which can improve compression for certain types of data like executables and binaries."}),"\n"]}),"\n",(0,s.jsx)(t.p,{children:"However, 7-zip also has some drawbacks and limitations."}),"\n",(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsx)(t.li,{children:"7-zip is not as widely supported as ZIP by other software and platforms. Some users may need to install additional programs or plugins to open or extract 7z files45."}),"\n",(0,s.jsx)(t.li,{children:"Slower speed: 7-zip archives may take longer to compress or decompress compared to ZIP. This is somewhat mitigated by the 7-zip utility's effective parallelization when decoding, but this only affects real time as opposed to user time meaning it is still likely going to be more expensive to decompress than ZIP."}),"\n",(0,s.jsx)(t.li,{children:"7-zip does not have any built-in mechanism to repair corrupted or damaged archives. Users may need to use third-party tools or backup copies to recover their data1"}),"\n"]}),"\n",(0,s.jsx)(t.p,{children:"7z archives are supported natively by macOS & many Linux distributions."})]})}function p(e={}){const{wrapper:t}={...(0,o.R)(),...e.components};return t?(0,s.jsx)(t,{...e,children:(0,s.jsx)(l,{...e})}):l(e)}},8453:(e,t,i)=>{i.d(t,{R:()=>r,x:()=>a});var s=i(6540);const o={},n=s.createContext(o);function r(e){const t=s.useContext(n);return s.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function a(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:r(e.components),s.createElement(n.Provider,{value:t},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[5479],{1531:(e,t,i)=>{i.r(t),i.d(t,{assets:()=>c,contentTitle:()=>r,default:()=>p,frontMatter:()=>n,metadata:()=>a,toc:()=>d});var s=i(4848),o=i(8453);const n={title:"7z",sidebar_position:4},r="7-zip (7z)",a={id:"data/7z",title:"7z",description:"This section is in need of contributions. If you believe you can help, please see our Contribution Guide to get started as a contributor!",source:"@site/docs/data/7z.mdx",sourceDirName:"data",slug:"/data/7z",permalink:"/docs/data/7z",draft:!1,unlisted:!1,editUrl:"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/data/7z.mdx",tags:[],version:"current",sidebarPosition:4,frontMatter:{title:"7z",sidebar_position:4},sidebar:"tutorialSidebar",previous:{title:"bzip2",permalink:"/docs/data/bzip2"},next:{title:"xz",permalink:"/docs/data/xz"}},c={},d=[];function l(e){const t={a:"a",admonition:"admonition",h1:"h1",header:"header",li:"li",p:"p",ul:"ul",...(0,o.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(t.header,{children:(0,s.jsx)(t.h1,{id:"7-zip-7z",children:"7-zip (7z)"})}),"\n",(0,s.jsx)(t.admonition,{title:"Help Wanted",type:"danger",children:(0,s.jsxs)(t.p,{children:["This section is in need of contributions. If you believe you can help, please see our ",(0,s.jsx)(t.a,{href:"/docs/contribution-guide",children:"Contribution Guide"})," to get started as a contributor!"]})}),"\n",(0,s.jsxs)(t.p,{children:["7-zip (7z) is a file format that supports several different data compression, encryption, & pre-processing algorithms. It was created by the 7-Zip archiver, which is free and open-source software for dealing with various data compression formats including formats similar to 7z like ",(0,s.jsx)(t.a,{href:"/docs/data/xz",children:"XZ"}),"."]}),"\n",(0,s.jsxs)(t.p,{children:["The 7-zip format has some noteworthy advantages over the popular ",(0,s.jsx)(t.a,{href:"/docs/data/zip",children:"ZIP"})," format."]}),"\n",(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsx)(t.li,{children:'The 7-zip utility can compress files to the 7z format "30-70% better" than to ZIP format despite having a highly efficient ZIP encoder. It mainly uses the LZMA & LZMA2 algorithms, which are more modern than DEFLATE and usually compress better.'}),"\n",(0,s.jsx)(t.li,{children:"7-zip can encrypt files with AES-256 using a user provided password. AES-256 is more secure than the ZipCrypto encryption often used by ZIP."}),"\n",(0,s.jsx)(t.li,{children:"7-zip can support files up to 16 exabytes in size, while traditional ZIP has a 4 GB limit (ZIP64, which is commonly used, does not suffer from this 4 GB limitation so this is less relevant now). 7-zip also supports various pre-processing filters, which can improve compression for certain types of data like executables and binaries."}),"\n"]}),"\n",(0,s.jsx)(t.p,{children:"However, 7-zip also has some drawbacks and limitations."}),"\n",(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsx)(t.li,{children:"7-zip is not as widely supported as ZIP by other software and platforms. Some users may need to install additional programs or plugins to open or extract 7z files."}),"\n",(0,s.jsx)(t.li,{children:"Slower speed: 7-zip archives may take longer to compress or decompress compared to ZIP. This is somewhat mitigated by the 7-zip utility's effective parallelization when decoding, but this only affects real time as opposed to user time meaning it is still likely going to be more expensive to decompress than ZIP."}),"\n",(0,s.jsx)(t.li,{children:"7-zip does not have any built-in mechanism to repair corrupted or damaged archives. Users may need to use third-party tools or backup copies to recover their data1"}),"\n"]}),"\n",(0,s.jsx)(t.p,{children:"7z archives are supported natively by macOS & many Linux distributions."})]})}function p(e={}){const{wrapper:t}={...(0,o.R)(),...e.components};return t?(0,s.jsx)(t,{...e,children:(0,s.jsx)(l,{...e})}):l(e)}},8453:(e,t,i)=>{i.d(t,{R:()=>r,x:()=>a});var s=i(6540);const o={},n=s.createContext(o);function r(e){const t=s.useContext(n);return s.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function a(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:r(e.components),s.createElement(n.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/2e23a845.f2ffc655.js b/assets/js/2e23a845.996efb55.js similarity index 53% rename from assets/js/2e23a845.f2ffc655.js rename to assets/js/2e23a845.996efb55.js index 9b112e03..8833091b 100644 --- a/assets/js/2e23a845.f2ffc655.js +++ b/assets/js/2e23a845.996efb55.js @@ -1 +1 @@ -"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[5147],{2914:(e,n,i)=>{i.r(n),i.d(n,{assets:()=>d,contentTitle:()=>o,default:()=>m,frontMatter:()=>l,metadata:()=>c,toc:()=>h});var t=i(4848),r=i(8453),a=i(1470),s=i(9365);const l={title:"SVT-AV1-PSY",sidebar_position:5},o="SVT-AV1-PSY",c={id:"encoders/SVT-AV1-PSY",title:"SVT-AV1-PSY",description:"This entry is about a fork of SVT-AV1 called SVT-AV1-PSY. If you'd like to learn about the mainline SVT-AV1 encoder before reading, visit our SVT-AV1 wiki entry.",source:"@site/docs/encoders/SVT-AV1-PSY.mdx",sourceDirName:"encoders",slug:"/encoders/SVT-AV1-PSY",permalink:"/docs/encoders/SVT-AV1-PSY",draft:!1,unlisted:!1,editUrl:"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/encoders/SVT-AV1-PSY.mdx",tags:[],version:"current",sidebarPosition:5,frontMatter:{title:"SVT-AV1-PSY",sidebar_position:5},sidebar:"tutorialSidebar",previous:{title:"aomenc",permalink:"/docs/encoders/aomenc"},next:{title:"SVT-AV1",permalink:"/docs/encoders/SVT-AV1"}},d={},h=[{value:"Micro-Release Framework",id:"micro-release-framework",level:2},{value:"Feature Additions",id:"feature-additions",level:2},{value:"Modified Defaults",id:"modified-defaults",level:2},{value:"Other Changes",id:"other-changes",level:3},{value:"Installation",id:"installation",level:2},{value:"Projects Featuring SVT-AV1-PSY",id:"projects-featuring-svt-av1-psy",level:2},{value:"License",id:"license",level:2}];function u(e){const n={a:"a",admonition:"admonition",code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",ol:"ol",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,r.R)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(n.header,{children:(0,t.jsx)(n.h1,{id:"svt-av1-psy",children:"SVT-AV1-PSY"})}),"\n",(0,t.jsx)(n.admonition,{title:"Community Fork",type:"info",children:(0,t.jsxs)(n.p,{children:["This entry is about a fork of SVT-AV1 called SVT-AV1-PSY. If you'd like to learn about the mainline SVT-AV1 encoder before reading, visit our ",(0,t.jsx)(n.a,{href:"/docs/encoders/SVT-AV1",children:"SVT-AV1 wiki entry"}),"."]})}),"\n",(0,t.jsx)(n.p,{children:"SVT-AV1-PSY is a project that aims to enhance the Scalable Video Technology for AV1 Encoder with perceptual enhancements for psychovisually optimal AV1 encoding. The ultimate goal is to create the best encoding implementation for perceptual quality with AV1. The development of this project involves a collaborative effort from a team of dedicated developers and contributors who are committed to improving the perceptual quality of AV1 encoding."}),"\n",(0,t.jsxs)(n.p,{children:["The SVT-AV1-PSY project is maintained by ",(0,t.jsx)(n.a,{href:"https://github.com/gianni-rosato",children:"Gianni Rosato"}),", ",(0,t.jsx)(n.a,{href:"https://github.com/juliobbv",children:"Julio Barba"}),", & ",(0,t.jsx)(n.a,{href:"https://github.com/Clybius",children:"Clybius"}),", as well as a number of community contributors including ",(0,t.jsx)(n.a,{href:"https://github.com/BlueSwordM",children:"BlueSwordM"}),", the maintainer of the ",(0,t.jsx)(n.a,{href:"https://aur.archlinux.org/packages/svt-av1-psy-git",children:"SVT-AV1-PSY AUR package"})," & the original author of ",(0,t.jsx)(n.a,{href:"https://github.com/BlueSwordM/aom-av1-psy",children:"aom-av1-psy"}),"."]}),"\n",(0,t.jsxs)(n.p,{children:["The development process involves community testing and optimization to ensure that the encoder and decoder deliver optimal performance. The team uses a variety of tools and methodologies to analyze and improve the performance of the encoder and decoder, including subjective analyses. ",(0,t.jsx)(n.a,{href:"/docs/metrics/SSIMULACRA2",children:"SSIMULACRA2"})," and ",(0,t.jsx)(n.a,{href:"/docs/metrics/XPSNR",children:"XPSNR"})," are used extensively for metrics testing, and the team is committed to improving the overall quality and performance of the encoder using these two metrics as general guidelines and benchmarks. However, the stated goal is not to improve metric scores but to improve the overall perceptual quality of the encoder; naturally, changes are often made to SVT-AV1-PSY that end up degrading metric performance in favor of perceptual fidelity per bit."]}),"\n",(0,t.jsx)(n.p,{children:"SVT-AV1-PSY is a superset of SVT-AV1, meaning any valid SVT-AV1 command will work with SVT-AV1-PSY given the modified defaults do not conflict with the settings provided."}),"\n",(0,t.jsxs)(n.p,{children:["SVT-AV1-PSY is used by default in ",(0,t.jsx)(n.a,{href:"/docs/utilities/Aviator",children:"Aviator"})," and can be used in ",(0,t.jsx)(n.a,{href:"/docs/utilities/rav1ator-cli",children:"rAV1ator CLI"})," by using the pre-compiled binaries available with the tool or by building a binary yourself."]}),"\n",(0,t.jsx)(n.p,{children:"SVT-AV1-PSY contributors are not in any way affiliated with the Alliance for Open Media or any upstream SVT-AV1 project contributors who have not also contributed to the SVT-AV1-PSY project."}),"\n",(0,t.jsx)(n.h2,{id:"micro-release-framework",children:"Micro-Release Framework"}),"\n",(0,t.jsx)(n.p,{children:"SVT-AV1-PSY features additions outside of mainline SVT-AV1 that are often considered to be significant, but don't line up with a major mainline release. Therefore, the SVT-AV1-PSY release framework is different, and the encoder is currently being developed around micro-releases to make this clear."}),"\n",(0,t.jsxs)(n.p,{children:["Micro-releases are tagged with letters starting at ",(0,t.jsx)(n.code,{children:"A"})," to indicate that they contain significant new features and aren't equivalent to mainline releases; for example, ",(0,t.jsx)(n.code,{children:"v2.0.0-A"})," was a micro-release with significant new features exclusive to SVT-AV1-PSY that followed the prior ",(0,t.jsx)(n.code,{children:"v2.0.0"})," release (which came out with PSY + mainline features in tandem with mainline ",(0,t.jsx)(n.code,{children:"v2.0.0"}),"). Releases without letters are in-line with mainline SVT-AV1 releases, and may contain significant PSY feature additions as well."]}),"\n",(0,t.jsx)(n.h2,{id:"feature-additions",children:"Feature Additions"}),"\n",(0,t.jsx)(n.p,{children:"SVT-AV1-PSY includes a number of new features that are not present in mainline SVT-AV1. These features are designed to improve the visual quality of AV1 encodes, and offer more flexibility when configuring the encoder for a wide range of encoding scenarios. Many of these changes are being integrated into mainline SVT-AV1 as the project matures."}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"--variance-boost-strength"})," ",(0,t.jsx)(n.em,{children:"1 to 4"})," (",(0,t.jsx)(n.strong,{children:(0,t.jsx)(n.a,{href:"https://gitlab.com/AOMediaCodec/SVT-AV1/-/merge_requests/2195",children:"Merged to Mainline"})}),")"]}),"\n"]}),"\n",(0,t.jsx)(n.p,{children:"Provides control over our augmented AQ Modes 0 and 2 which can utilize variance information in each frame for more consistent quality under high/low contrast scenes. Four curve options are provided, and the default is curve 2. 1: mild, 2: gentle, 3: medium, 4: aggressive"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"--variance-octile"})," ",(0,t.jsx)(n.em,{children:"1 to 8"})," (",(0,t.jsx)(n.strong,{children:(0,t.jsx)(n.a,{href:"https://gitlab.com/AOMediaCodec/SVT-AV1/-/merge_requests/2195",children:"Merged to Mainline"})}),")"]}),"\n"]}),"\n",(0,t.jsxs)(n.p,{children:['Controls how "selective" the algorithm is when boosting superblocks, based on their low/high 8x8 variance ratio. A value of 1 is the least selective, and will readily boost a superblock if only 1/8th of the superblock is low variance. Conversely, a value of 8 will only boost if the ',(0,t.jsx)(n.em,{children:"entire"})," superblock is low variance. Lower values increase bitrate. The default value is 6."]}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"--enable-alt-curve"})," ",(0,t.jsx)(n.em,{children:"0 and 1"})]}),"\n"]}),"\n",(0,t.jsx)(n.p,{children:"Enable an alternative variance boost curve, with different bit allocation and visual characteristics. The default is 0."}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.code,{children:"Presets -2 & -3"})}),"\n"]}),"\n",(0,t.jsx)(n.p,{children:"Terrifically slow encoding modes for research purposes."}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.code,{children:"Tune 3"})}),"\n"]}),"\n",(0,t.jsx)(n.p,{children:"A new tune based on Tune 2 (SSIM) called SSIM with Subjective Quality Tuning. Generally harms metric performance in exchange for better visual fidelity."}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"--sharpness"})," ",(0,t.jsx)(n.em,{children:"-7 to 7"})]}),"\n"]}),"\n",(0,t.jsx)(n.p,{children:"A parameter for modifying loopfilter deblock sharpness and rate distortion to improve visual fidelity. The default is 0 (no sharpness)."}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"--dolby-vision-rpu"})," ",(0,t.jsx)(n.em,{children:"path to file"})]}),"\n"]}),"\n",(0,t.jsxs)(n.p,{children:["Set the path to a Dolby Vision RPU for encoding Dolby Vision video. SVT-AV1-PSY needs to be built with the ",(0,t.jsx)(n.code,{children:"enable-libdovi"})," flag enabled in build.sh (see ",(0,t.jsx)(n.code,{children:"./Build/linux/build.sh --help"})," for more info) (Thank you @quietvoid !)"]}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.code,{children:"Progress 3"})}),"\n"]}),"\n",(0,t.jsx)(n.p,{children:"A new progress mode that provides more detailed information about the encoding process."}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"--fgs-table"})," ",(0,t.jsx)(n.em,{children:"path to file"})," (",(0,t.jsx)(n.strong,{children:(0,t.jsx)(n.a,{href:"https://gitlab.com/AOMediaCodec/SVT-AV1/-/commit/ae7ce1abc5f3f7913624f728ae123f8b8c1e30de",children:"Merged to Mainline"})}),")"]}),"\n"]}),"\n",(0,t.jsx)(n.p,{children:"Argument for providing a film grain table for synthetic film grain (similar to aomenc's '--film-grain-table=' argument)."}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.code,{children:"Extended CRF"})}),"\n"]}),"\n",(0,t.jsx)(n.p,{children:"Provides a more versatile and granular way to set CRF. Range has been expanded to 70 (from 63) to help with ultra-low bitrate encodes, and can now be set in quarter-step (0.25) increments."}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"--qp-scale-compress-strength"})," ",(0,t.jsx)(n.em,{children:"0 to 3"})]}),"\n"]}),"\n",(0,t.jsx)(n.p,{children:"Increases video quality temporal consistency, especially with clips that contain film grain and/or contain fast-moving objects."}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.code,{children:"--enable-dlf 2"})}),"\n"]}),"\n",(0,t.jsx)(n.p,{children:"Enables a more accurate loop filter that prevents blocking, for a modest increase in compute time (most noticeable at presets 7 to 9)"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.code,{children:"Higher-quality presets for 8K"})}),"\n"]}),"\n",(0,t.jsx)(n.p,{children:"Lowers the minimum available preset from 8 to 2 for higher-quality 8K encoding (64 GB of RAM recommended per encoding instance)"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"--frame-luma-bias"})," ",(0,t.jsx)(n.em,{children:"0 to 100"})]}),"\n"]}),"\n",(0,t.jsx)(n.p,{children:"Enables frame-level luma bias to improve quality in dark scenes by adjusting frame-level QP based on average luminance across each frame"}),"\n",(0,t.jsx)(n.h2,{id:"modified-defaults",children:"Modified Defaults"}),"\n",(0,t.jsx)(n.p,{children:"SVT-AV1-PSY has different defaults than mainline SVT-AV1 in order to provide better visual fidelity out of the box. They include:"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:"Default 10-bit color depth when given a 10-bit input."}),"\n",(0,t.jsxs)(n.li,{children:["Disable film grain denoising by default, as it often harms visual fidelity. (",(0,t.jsx)(n.strong,{children:(0,t.jsx)(n.a,{href:"https://gitlab.com/AOMediaCodec/SVT-AV1/-/commit/8b39b41df9e07bbcdbd19ea618762c5db3353c03",children:"Merged to Mainline"})}),")"]}),"\n",(0,t.jsx)(n.li,{children:"Default to Tune 2 instead of Tune 1, as it reliably outperforms Tune 1 perceptually."}),"\n",(0,t.jsx)(n.li,{children:"Enable quantization matrices by default."}),"\n",(0,t.jsx)(n.li,{children:"Set minimum QM level to 0 by default."}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"--enable-variance-boost"})," enabled by default."]}),"\n"]}),"\n",(0,t.jsx)(n.h3,{id:"other-changes",children:"Other Changes"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.code,{children:"--color-help"})}),"\n"]}),"\n",(0,t.jsx)(n.p,{children:"Prints the information found in Appendix A.2 of the user guide in order to help users more easily understand the Color Description Options in SvtAv1EncApp."}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.code,{children:"Micro-Releases"})}),"\n"]}),"\n",(0,t.jsxs)(n.p,{children:["In order to make SVT-AV1-PSY feature additions more clear, micro-release tags indicate when significant new feature additions have been made. Micro-release tags are letters starting with ",(0,t.jsx)(n.code,{children:"A"}),", so new releases will be tagged as ",(0,t.jsx)(n.code,{children:"v#.#.#-A"}),", ",(0,t.jsx)(n.code,{children:"v#.#.#-B"}),", etc. This is discussed earlier in this entry."]}),"\n",(0,t.jsx)(n.h2,{id:"installation",children:"Installation"}),"\n",(0,t.jsx)(n.p,{children:"Building & installing SVT-AV1-PSY is the same as building & installing mainline SVT-AV1."}),"\n",(0,t.jsxs)(a.A,{children:[(0,t.jsxs)(s.A,{value:"unixlike",label:"Linux & macOS",children:[(0,t.jsx)(n.p,{children:(0,t.jsxs)(n.em,{children:["A precompiled AVX2-optimized binary of SVT-AV1-PSY can be installed for x86_64 Linux via ",(0,t.jsx)(n.a,{href:"/docs/utilities/rav1ator-cli",children:"rAV1ator CLI"}),". However, it is always recommended to build from source."]})}),(0,t.jsx)(n.p,{children:"To build SVT-AV1 from source, first clone the desired SVT-AV1 repository & enter the build directory."}),(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",metastring:'title="Clone SVT-AV1-PSY"',children:"git clone https://github.com/gianni-rosato/svt-av1-psy\ncd SVT-AV1/Build/linux\n"})}),(0,t.jsxs)(n.p,{children:["In the directory, simply run ",(0,t.jsx)(n.code,{children:"./build.sh [flags]"})," to build. Be aware that building requires CMake version 3.16 or higher and either GCC or Clang. It is recommended to use Clang."]}),(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",metastring:'title="Build release"',children:"./build.sh release\n"})}),(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",metastring:'title="Statically build just the encoder with clang and enable link-time optimization"',children:"./build.sh jobs=8 all cc=clang cxx=clang++ no-dec enable-lto static native\n"})}),(0,t.jsxs)(n.p,{children:["The compiled binaries will be in the ",(0,t.jsx)(n.code,{children:"Bin/Release"})," directory, including SvtAv1EncApp. If you just want the encoder, adding the ",(0,t.jsx)(n.code,{children:"no-dec"})," flag will skip building SvtAv1DecApp and save on compilation time."]}),(0,t.jsxs)(n.p,{children:["If you'd like to build from the latest release (2.1.0 at the time of writing - last updated 23 May 2024) please run ",(0,t.jsx)(n.code,{children:"git reset --hard 5471bd78311d70ab4691af1ae54fd80e25f214f5"})," in the cloned directory. It is recommended that you do this, as new changes to git aren't always stable right away & a release will guarantee more stability."]}),(0,t.jsxs)(n.p,{children:["If you want extra performance, it is possible to build SVT-AV1 using PGO (Profile-guided Optimization). ",(0,t.jsxs)(n.strong,{children:["Be aware that this particular script infers that you have a .y4m file (or multiple) in ",(0,t.jsx)(n.code,{children:"/dev/shm"})," for transcoding"]}),". You can compile statically linked SVT-AV1 with PGO (and LTO, or link-time optimization) by following this script:"]}),(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",metastring:'title="Bulding SVT-AV1 with profile guided optimization"',children:"git clone https://gitlab.com/AOMediaCodec/SVT-AV1/\ncd SVT-AV1/Build/linux\n./build.sh cc=gcc cxx=g++ enable-lto enable-pgo static native jobs=$(nproc) pgo-dir=/dev/shm pgo-videos=/dev/shm release\n"})}),(0,t.jsx)(n.p,{children:"If you wish to store videos elsewhere or provide custom parameters to the SvtAv1EncApp binary, try this script:"}),(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"git clone https://gitlab.com/AOMediaCodec/SVT-AV1/\ncd SVT-AV1/Build/linux\n./build.sh cc=gcc cxx=g++ enable-lto enable-pgo static native jobs=$(nproc) pgo-dir=/dev/shm pgo-compile-gen release\n../../Bin/Release/SvtAv1EncApp # Run this binary as many times as you'd like with arguments of your choice to collect data\n./build.sh cc=gcc cxx=g++ enable-lto enable-pgo static native jobs=$(nproc) pgo-dir=/dev/shm pgo-compile-use release\n"})})]}),(0,t.jsxs)(s.A,{value:"windows",label:"Windows",children:[(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.strong,{children:"MSYS2"})," is the best option for building in Windows, as it provides a Unix-like environment for building SVT-AV1-PSY. This makes the compilation procedure the same as described for Linux & macOS. The full build process is detailed here."]}),(0,t.jsxs)(n.ol,{start:"0",children:["\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:["Make sure you have downloaded & installed MSYS2 from ",(0,t.jsx)(n.a,{href:"https://www.msys2.org/",children:"the MSYS2 website"})," before beginning the build process."]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsx)(n.p,{children:"Start the UCRT64 console & install the required dependencies:"}),"\n"]}),"\n"]}),(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"pacman -Syu --needed git mingw-w64-ucrt-x86_64-toolchain mingw-w64-ucrt-x86_64-cmake mingw-w64-ucrt-x86_64-ninja mingw-w64-ucrt-x86_64-yasm\n"})}),(0,t.jsxs)(n.ol,{start:"2",children:["\n",(0,t.jsx)(n.li,{children:"[Optional] Clang is the recommended compiler for SVT-AV1 & SVT-AV1-PSY, so you may wish to download it with the following command:"}),"\n"]}),(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"pacman -Syu --needed mingw-w64-ucrt-x86_64-clang\n"})}),(0,t.jsxs)(n.ol,{start:"3",children:["\n",(0,t.jsxs)(n.li,{children:["Now, we may follow the steps for Linux & macOS to complete building. Please note that CMake may require you to include ",(0,t.jsx)(n.code,{children:'-G "Ninja"'})," in any CMake commands."]}),"\n"]}),(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",metastring:'title="Clone SVT-AV1-PSY"',children:"git clone https://github.com/gianni-rosato/svt-av1-psy\ncd SVT-AV1/Build/linux\n"})}),(0,t.jsxs)(n.p,{children:["In the directory, simply run ",(0,t.jsx)(n.code,{children:"./build.sh [flags]"})," to build. Be aware that building requires CMake version 3.16 or higher and either GCC or Clang. It is recommended to use Clang, and ideally it will be installed as per Step 2."]}),(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",metastring:'title="Build release"',children:"./build.sh release\n"})}),(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",metastring:'title="Statically build just the encoder with clang and enable link-time optimization"',children:"./build.sh jobs=8 all cc=clang cxx=clang++ no-dec enable-lto static native\n"})}),(0,t.jsxs)(n.p,{children:["The compiled binaries will be in the ",(0,t.jsx)(n.code,{children:"Bin/Release"})," directory, including SvtAv1EncApp. If you just want the encoder, adding the ",(0,t.jsx)(n.code,{children:"no-dec"})," flag will skip building SvtAv1DecApp and save on compilation time."]}),(0,t.jsxs)(n.p,{children:["If you'd like to build from the latest release (2.1.0 at the time of writing - last updated 23 May 2024) please run ",(0,t.jsx)(n.code,{children:"git reset --hard 5471bd78311d70ab4691af1ae54fd80e25f214f5"})," in the cloned directory."]})]})]}),"\n",(0,t.jsx)(n.h2,{id:"projects-featuring-svt-av1-psy",children:"Projects Featuring SVT-AV1-PSY"}),"\n",(0,t.jsx)(n.p,{children:"Some projects that feature SVT-AV1-PSY include:"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.a,{href:"/docs/utilities/Aviator",children:"Aviator"})," ~ an AV1 encoding GUI by @gianni-rosato"]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.a,{href:"/docs/utilities/rav1ator-cli",children:"rAV1ator CLI"})," ~ a TUI for video encoding with Av1an by @gianni-rosato"]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.a,{href:"https://aur.archlinux.org/packages/svt-av1-psy-git",children:"SVT-AV1-PSY on the AUR"})," ~ by @BlueSwordM"]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.a,{href:"https://github.com/CachyOS/CachyOS-PKGBUILDS/pull/144",children:"SVT-AV1-PSY in CachyOS"})," ~ by @BlueSwordM"]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.a,{href:"https://github.com/vincejv/docker-handbrake",children:"Custom Handbrake Builds"})," ~ by @vincejv"]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.a,{href:"https://github.com/staxrip/staxrip",children:"Staxrip"})," ~ a video & audio encoding GUI for Windows by @Dendraspis"]}),"\n"]}),"\n",(0,t.jsx)(n.h2,{id:"license",children:"License"}),"\n",(0,t.jsx)(n.p,{children:"Up to v0.8.7, SVT-AV1 is licensed under the BSD-2-clause license and the\nAlliance for Open Media Patent License 1.0. Starting from v0.9, SVT-AV1 is licensed\nunder the BSD-3-clause clear license and the Alliance for Open Media Patent\nLicense 1.0."}),"\n",(0,t.jsx)(n.p,{children:"SVT-AV1-PSY does not feature license modifications from mainline SVT-AV1."})]})}function m(e={}){const{wrapper:n}={...(0,r.R)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(u,{...e})}):u(e)}},9365:(e,n,i)=>{i.d(n,{A:()=>s});i(6540);var t=i(4164);const r={tabItem:"tabItem_Ymn6"};var a=i(4848);function s(e){let{children:n,hidden:i,className:s}=e;return(0,a.jsx)("div",{role:"tabpanel",className:(0,t.A)(r.tabItem,s),hidden:i,children:n})}},1470:(e,n,i)=>{i.d(n,{A:()=>S});var t=i(6540),r=i(4164),a=i(3104),s=i(6347),l=i(205),o=i(7485),c=i(1682),d=i(679);function h(e){return t.Children.toArray(e).filter((e=>"\n"!==e)).map((e=>{if(!e||(0,t.isValidElement)(e)&&function(e){const{props:n}=e;return!!n&&"object"==typeof n&&"value"in n}(e))return e;throw new Error(`Docusaurus error: Bad child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the component should be , and every should have a unique "value" prop.`)}))?.filter(Boolean)??[]}function u(e){const{values:n,children:i}=e;return(0,t.useMemo)((()=>{const e=n??function(e){return h(e).map((e=>{let{props:{value:n,label:i,attributes:t,default:r}}=e;return{value:n,label:i,attributes:t,default:r}}))}(i);return function(e){const n=(0,c.XI)(e,((e,n)=>e.value===n.value));if(n.length>0)throw new Error(`Docusaurus error: Duplicate values "${n.map((e=>e.value)).join(", ")}" found in . Every value needs to be unique.`)}(e),e}),[n,i])}function m(e){let{value:n,tabValues:i}=e;return i.some((e=>e.value===n))}function p(e){let{queryString:n=!1,groupId:i}=e;const r=(0,s.W6)(),a=function(e){let{queryString:n=!1,groupId:i}=e;if("string"==typeof n)return n;if(!1===n)return null;if(!0===n&&!i)throw new Error('Docusaurus error: The component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return i??null}({queryString:n,groupId:i});return[(0,o.aZ)(a),(0,t.useCallback)((e=>{if(!a)return;const n=new URLSearchParams(r.location.search);n.set(a,e),r.replace({...r.location,search:n.toString()})}),[a,r])]}function f(e){const{defaultValue:n,queryString:i=!1,groupId:r}=e,a=u(e),[s,o]=(0,t.useState)((()=>function(e){let{defaultValue:n,tabValues:i}=e;if(0===i.length)throw new Error("Docusaurus error: the component requires at least one children component");if(n){if(!m({value:n,tabValues:i}))throw new Error(`Docusaurus error: The has a defaultValue "${n}" but none of its children has the corresponding value. Available values are: ${i.map((e=>e.value)).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return n}const t=i.find((e=>e.default))??i[0];if(!t)throw new Error("Unexpected error: 0 tabValues");return t.value}({defaultValue:n,tabValues:a}))),[c,h]=p({queryString:i,groupId:r}),[f,g]=function(e){let{groupId:n}=e;const i=function(e){return e?`docusaurus.tab.${e}`:null}(n),[r,a]=(0,d.Dv)(i);return[r,(0,t.useCallback)((e=>{i&&a.set(e)}),[i,a])]}({groupId:r}),b=(()=>{const e=c??f;return m({value:e,tabValues:a})?e:null})();(0,l.A)((()=>{b&&o(b)}),[b]);return{selectedValue:s,selectValue:(0,t.useCallback)((e=>{if(!m({value:e,tabValues:a}))throw new Error(`Can't select invalid tab value=${e}`);o(e),h(e),g(e)}),[h,g,a]),tabValues:a}}var g=i(2303);const b={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};var x=i(4848);function j(e){let{className:n,block:i,selectedValue:t,selectValue:s,tabValues:l}=e;const o=[],{blockElementScrollPositionUntilNextRender:c}=(0,a.a_)(),d=e=>{const n=e.currentTarget,i=o.indexOf(n),r=l[i].value;r!==t&&(c(n),s(r))},h=e=>{let n=null;switch(e.key){case"Enter":d(e);break;case"ArrowRight":{const i=o.indexOf(e.currentTarget)+1;n=o[i]??o[0];break}case"ArrowLeft":{const i=o.indexOf(e.currentTarget)-1;n=o[i]??o[o.length-1];break}}n?.focus()};return(0,x.jsx)("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,r.A)("tabs",{"tabs--block":i},n),children:l.map((e=>{let{value:n,label:i,attributes:a}=e;return(0,x.jsx)("li",{role:"tab",tabIndex:t===n?0:-1,"aria-selected":t===n,ref:e=>o.push(e),onKeyDown:h,onClick:d,...a,className:(0,r.A)("tabs__item",b.tabItem,a?.className,{"tabs__item--active":t===n}),children:i??n},n)}))})}function v(e){let{lazy:n,children:i,selectedValue:a}=e;const s=(Array.isArray(i)?i:[i]).filter(Boolean);if(n){const e=s.find((e=>e.props.value===a));return e?(0,t.cloneElement)(e,{className:(0,r.A)("margin-top--md",e.props.className)}):null}return(0,x.jsx)("div",{className:"margin-top--md",children:s.map(((e,n)=>(0,t.cloneElement)(e,{key:n,hidden:e.props.value!==a})))})}function V(e){const n=f(e);return(0,x.jsxs)("div",{className:(0,r.A)("tabs-container",b.tabList),children:[(0,x.jsx)(j,{...n,...e}),(0,x.jsx)(v,{...n,...e})]})}function S(e){const n=(0,g.A)();return(0,x.jsx)(V,{...e,children:h(e.children)},String(n))}},8453:(e,n,i)=>{i.d(n,{R:()=>s,x:()=>l});var t=i(6540);const r={},a=t.createContext(r);function s(e){const n=t.useContext(a);return t.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function l(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:s(e.components),t.createElement(a.Provider,{value:n},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[5147],{2914:(e,n,i)=>{i.r(n),i.d(n,{assets:()=>d,contentTitle:()=>o,default:()=>m,frontMatter:()=>l,metadata:()=>c,toc:()=>h});var t=i(4848),r=i(8453),a=i(1470),s=i(9365);const l={title:"SVT-AV1-PSY",sidebar_position:5},o="SVT-AV1-PSY",c={id:"encoders/SVT-AV1-PSY",title:"SVT-AV1-PSY",description:"This entry is about a fork of SVT-AV1 called SVT-AV1-PSY. If you'd like to learn about the mainline SVT-AV1 encoder before reading, visit our SVT-AV1 wiki entry.",source:"@site/docs/encoders/SVT-AV1-PSY.mdx",sourceDirName:"encoders",slug:"/encoders/SVT-AV1-PSY",permalink:"/docs/encoders/SVT-AV1-PSY",draft:!1,unlisted:!1,editUrl:"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/encoders/SVT-AV1-PSY.mdx",tags:[],version:"current",sidebarPosition:5,frontMatter:{title:"SVT-AV1-PSY",sidebar_position:5},sidebar:"tutorialSidebar",previous:{title:"aomenc",permalink:"/docs/encoders/aomenc"},next:{title:"SVT-AV1",permalink:"/docs/encoders/SVT-AV1"}},d={},h=[{value:"Micro-Release Framework",id:"micro-release-framework",level:2},{value:"Feature Additions",id:"feature-additions",level:2},{value:"Modified Defaults",id:"modified-defaults",level:2},{value:"Other Changes",id:"other-changes",level:3},{value:"Installation",id:"installation",level:2},{value:"Projects Featuring SVT-AV1-PSY",id:"projects-featuring-svt-av1-psy",level:2},{value:"License",id:"license",level:2}];function u(e){const n={a:"a",admonition:"admonition",code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",ol:"ol",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,r.R)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(n.header,{children:(0,t.jsx)(n.h1,{id:"svt-av1-psy",children:"SVT-AV1-PSY"})}),"\n",(0,t.jsx)(n.admonition,{title:"Community Fork",type:"info",children:(0,t.jsxs)(n.p,{children:["This entry is about a fork of SVT-AV1 called SVT-AV1-PSY. If you'd like to learn about the mainline SVT-AV1 encoder before reading, visit our ",(0,t.jsx)(n.a,{href:"/docs/encoders/SVT-AV1",children:"SVT-AV1 wiki entry"}),"."]})}),"\n",(0,t.jsx)(n.p,{children:"SVT-AV1-PSY is a project that aims to enhance the Scalable Video Technology for AV1 Encoder with perceptual enhancements for psychovisually optimal AV1 encoding. The ultimate goal is to create the best encoding implementation for perceptual quality with AV1. The development of this project involves a collaborative effort from a team of dedicated developers and contributors who are committed to improving the perceptual quality of AV1 encoding."}),"\n",(0,t.jsxs)(n.p,{children:["The SVT-AV1-PSY project is maintained by ",(0,t.jsx)(n.a,{href:"https://github.com/gianni-rosato",children:"Gianni Rosato"}),", ",(0,t.jsx)(n.a,{href:"https://github.com/juliobbv",children:"Julio Barba"}),", & ",(0,t.jsx)(n.a,{href:"https://github.com/Clybius",children:"Clybius"}),", as well as a number of community contributors including ",(0,t.jsx)(n.a,{href:"https://github.com/BlueSwordM",children:"BlueSwordM"}),", the maintainer of the ",(0,t.jsx)(n.a,{href:"https://aur.archlinux.org/packages/svt-av1-psy-git",children:"SVT-AV1-PSY AUR package"})," & the original author of ",(0,t.jsx)(n.a,{href:"https://github.com/BlueSwordM/aom-av1-psy",children:"aom-av1-psy"}),"."]}),"\n",(0,t.jsxs)(n.p,{children:["The development process involves community testing and optimization to ensure that the encoder and decoder deliver optimal performance. The team uses a variety of tools and methodologies to analyze and improve the performance of the encoder and decoder, including subjective analyses. ",(0,t.jsx)(n.a,{href:"/docs/metrics/SSIMULACRA2",children:"SSIMULACRA2"})," and ",(0,t.jsx)(n.a,{href:"/docs/metrics/XPSNR",children:"XPSNR"})," are used extensively for metrics testing, and the team is committed to improving the overall quality and performance of the encoder using these two metrics as general guidelines and benchmarks. However, the stated goal is not to improve metric scores but to improve the overall perceptual quality of the encoder; naturally, changes are often made to SVT-AV1-PSY that end up degrading metric performance in favor of perceptual fidelity per bit."]}),"\n",(0,t.jsx)(n.p,{children:"SVT-AV1-PSY is a superset of SVT-AV1, meaning any valid SVT-AV1 command will work with SVT-AV1-PSY given the modified defaults do not conflict with the settings provided."}),"\n",(0,t.jsxs)(n.p,{children:["SVT-AV1-PSY is used by default in ",(0,t.jsx)(n.a,{href:"/docs/utilities/Aviator",children:"Aviator"})," and can be used in ",(0,t.jsx)(n.a,{href:"/docs/utilities/rav1ator-cli",children:"rAV1ator CLI"})," by using the pre-compiled binaries available with the tool or by building a binary yourself."]}),"\n",(0,t.jsx)(n.p,{children:"SVT-AV1-PSY contributors are not in any way affiliated with the Alliance for Open Media or any upstream SVT-AV1 project contributors who have not also contributed to the SVT-AV1-PSY project."}),"\n",(0,t.jsx)(n.h2,{id:"micro-release-framework",children:"Micro-Release Framework"}),"\n",(0,t.jsx)(n.p,{children:"SVT-AV1-PSY features additions outside of mainline SVT-AV1 that are often considered to be significant, but don't line up with a major mainline release. Therefore, the SVT-AV1-PSY release framework is different, and the encoder is currently being developed around micro-releases to make this clear."}),"\n",(0,t.jsxs)(n.p,{children:["Micro-releases are tagged with letters starting at ",(0,t.jsx)(n.code,{children:"A"})," to indicate that they contain significant new features and aren't equivalent to mainline releases; for example, ",(0,t.jsx)(n.code,{children:"v2.0.0-A"})," was a micro-release with significant new features exclusive to SVT-AV1-PSY that followed the prior ",(0,t.jsx)(n.code,{children:"v2.0.0"})," release (which came out with PSY + mainline features in tandem with mainline ",(0,t.jsx)(n.code,{children:"v2.0.0"}),"). Releases without letters are in-line with mainline SVT-AV1 releases, and may contain significant PSY feature additions as well."]}),"\n",(0,t.jsx)(n.h2,{id:"feature-additions",children:"Feature Additions"}),"\n",(0,t.jsx)(n.p,{children:"SVT-AV1-PSY includes a number of new features that are not present in mainline SVT-AV1. These features are designed to improve the visual quality of AV1 encodes, and offer more flexibility when configuring the encoder for a wide range of encoding scenarios. Many of these changes are being integrated into mainline SVT-AV1 as the project matures."}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"--variance-boost-strength"})," ",(0,t.jsx)(n.em,{children:"1 to 4"})," (",(0,t.jsx)(n.strong,{children:(0,t.jsx)(n.a,{href:"https://gitlab.com/AOMediaCodec/SVT-AV1/-/merge_requests/2195",children:"Merged to Mainline"})}),")"]}),"\n"]}),"\n",(0,t.jsx)(n.p,{children:"Provides control over our augmented AQ Modes 0 and 2 which can utilize variance information in each frame for more consistent quality under high/low contrast scenes. Four curve options are provided, and the default is curve 2. 1: mild, 2: gentle, 3: medium, 4: aggressive"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"--variance-octile"})," ",(0,t.jsx)(n.em,{children:"1 to 8"})," (",(0,t.jsx)(n.strong,{children:(0,t.jsx)(n.a,{href:"https://gitlab.com/AOMediaCodec/SVT-AV1/-/merge_requests/2195",children:"Merged to Mainline"})}),")"]}),"\n"]}),"\n",(0,t.jsxs)(n.p,{children:['Controls how "selective" the algorithm is when boosting superblocks, based on their low/high 8x8 variance ratio. A value of 1 is the least selective, and will readily boost a superblock if only 1/8th of the superblock is low variance. Conversely, a value of 8 will only boost if the ',(0,t.jsx)(n.em,{children:"entire"})," superblock is low variance. Lower values increase bitrate. The default value is 6."]}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"--enable-alt-curve"})," ",(0,t.jsx)(n.em,{children:"0 and 1"})]}),"\n"]}),"\n",(0,t.jsx)(n.p,{children:"Enable an alternative variance boost curve, with different bit allocation and visual characteristics. The default is 0."}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.code,{children:"Presets -2 & -3"})}),"\n"]}),"\n",(0,t.jsx)(n.p,{children:"Terrifically slow encoding modes for research purposes."}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.code,{children:"Tune 3"})}),"\n"]}),"\n",(0,t.jsx)(n.p,{children:"A new tune based on Tune 2 (SSIM) called SSIM with Subjective Quality Tuning. Generally harms metric performance in exchange for better visual fidelity."}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"--sharpness"})," ",(0,t.jsx)(n.em,{children:"-7 to 7"})]}),"\n"]}),"\n",(0,t.jsx)(n.p,{children:"A parameter for modifying loopfilter deblock sharpness and rate distortion to improve visual fidelity. The default is 0 (no sharpness)."}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"--dolby-vision-rpu"})," ",(0,t.jsx)(n.em,{children:"path to file"})]}),"\n"]}),"\n",(0,t.jsxs)(n.p,{children:["Set the path to a Dolby Vision RPU for encoding Dolby Vision video. SVT-AV1-PSY needs to be built with the ",(0,t.jsx)(n.code,{children:"enable-libdovi"})," flag enabled in build.sh (see ",(0,t.jsx)(n.code,{children:"./Build/linux/build.sh --help"})," for more info) (Thank you @quietvoid !)"]}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.code,{children:"Progress 3"})}),"\n"]}),"\n",(0,t.jsx)(n.p,{children:"A new progress mode that provides more detailed information about the encoding process."}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"--fgs-table"})," ",(0,t.jsx)(n.em,{children:"path to file"})," (",(0,t.jsx)(n.strong,{children:(0,t.jsx)(n.a,{href:"https://gitlab.com/AOMediaCodec/SVT-AV1/-/commit/ae7ce1abc5f3f7913624f728ae123f8b8c1e30de",children:"Merged to Mainline"})}),")"]}),"\n"]}),"\n",(0,t.jsx)(n.p,{children:"Argument for providing a film grain table for synthetic film grain (similar to aomenc's '--film-grain-table=' argument)."}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.code,{children:"Extended CRF"})}),"\n"]}),"\n",(0,t.jsx)(n.p,{children:"Provides a more versatile and granular way to set CRF. Range has been expanded to 70 (from 63) to help with ultra-low bitrate encodes, and can now be set in quarter-step (0.25) increments."}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"--qp-scale-compress-strength"})," ",(0,t.jsx)(n.em,{children:"0 to 3"})]}),"\n"]}),"\n",(0,t.jsx)(n.p,{children:"Increases video quality temporal consistency, especially with clips that contain film grain and/or contain fast-moving objects."}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.code,{children:"--enable-dlf 2"})}),"\n"]}),"\n",(0,t.jsx)(n.p,{children:"Enables a more accurate loop filter that prevents blocking, for a modest increase in compute time (most noticeable at presets 7 to 9)"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.code,{children:"Higher-quality presets for 8K"})}),"\n"]}),"\n",(0,t.jsx)(n.p,{children:"Lowers the minimum available preset from 8 to 2 for higher-quality 8K encoding (64 GB of RAM recommended per encoding instance)"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"--frame-luma-bias"})," ",(0,t.jsx)(n.em,{children:"0 to 100"})]}),"\n"]}),"\n",(0,t.jsx)(n.p,{children:"Enables frame-level luma bias to improve quality in dark scenes by adjusting frame-level QP based on average luminance across each frame"}),"\n",(0,t.jsx)(n.h2,{id:"modified-defaults",children:"Modified Defaults"}),"\n",(0,t.jsx)(n.p,{children:"SVT-AV1-PSY has different defaults than mainline SVT-AV1 in order to provide better visual fidelity out of the box. They include:"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:"Default 10-bit color depth when given a 10-bit input."}),"\n",(0,t.jsxs)(n.li,{children:["Disable film grain denoising by default, as it often harms visual fidelity. (",(0,t.jsx)(n.strong,{children:(0,t.jsx)(n.a,{href:"https://gitlab.com/AOMediaCodec/SVT-AV1/-/commit/8b39b41df9e07bbcdbd19ea618762c5db3353c03",children:"Merged to Mainline"})}),")"]}),"\n",(0,t.jsx)(n.li,{children:"Default to Tune 2 instead of Tune 1, as it reliably outperforms Tune 1 perceptually."}),"\n",(0,t.jsx)(n.li,{children:"Enable quantization matrices by default."}),"\n",(0,t.jsx)(n.li,{children:"Set minimum QM level to 0 by default."}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"--enable-variance-boost"})," enabled by default."]}),"\n"]}),"\n",(0,t.jsx)(n.h3,{id:"other-changes",children:"Other Changes"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.code,{children:"--color-help"})}),"\n"]}),"\n",(0,t.jsx)(n.p,{children:"Prints the information found in Appendix A.2 of the user guide in order to help users more easily understand the Color Description Options in SvtAv1EncApp."}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.code,{children:"Micro-Releases"})}),"\n"]}),"\n",(0,t.jsxs)(n.p,{children:["In order to make SVT-AV1-PSY feature additions more clear, micro-release tags indicate when significant new feature additions have been made. Micro-release tags are letters starting with ",(0,t.jsx)(n.code,{children:"A"}),", so new releases will be tagged as ",(0,t.jsx)(n.code,{children:"v#.#.#-A"}),", ",(0,t.jsx)(n.code,{children:"v#.#.#-B"}),", etc. This is discussed earlier in this entry."]}),"\n",(0,t.jsx)(n.h2,{id:"installation",children:"Installation"}),"\n",(0,t.jsx)(n.p,{children:"Building & installing SVT-AV1-PSY is the same as building & installing mainline SVT-AV1."}),"\n",(0,t.jsxs)(a.A,{children:[(0,t.jsxs)(s.A,{value:"unixlike",label:"Linux & macOS",children:[(0,t.jsx)(n.p,{children:(0,t.jsxs)(n.em,{children:["A precompiled AVX2-optimized binary of SVT-AV1-PSY can be installed for x86_64 Linux via ",(0,t.jsx)(n.a,{href:"/docs/utilities/rav1ator-cli",children:"rAV1ator CLI"}),". However, it is always recommended to build from source."]})}),(0,t.jsx)(n.p,{children:"To build SVT-AV1 from source, first clone the desired SVT-AV1 repository & enter the build directory."}),(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",metastring:'title="Clone SVT-AV1-PSY"',children:"git clone https://github.com/gianni-rosato/svt-av1-psy\ncd svt-av1-psy/Build/linux\n"})}),(0,t.jsxs)(n.p,{children:["In the directory, simply run ",(0,t.jsx)(n.code,{children:"./build.sh [flags]"})," to build. Be aware that building requires CMake version 3.16 or higher and either GCC or Clang. It is recommended to use Clang."]}),(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",metastring:'title="Build release"',children:"./build.sh release\n"})}),(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",metastring:'title="Statically build just the encoder with clang and enable link-time optimization"',children:"./build.sh jobs=8 all cc=clang cxx=clang++ no-dec enable-lto static native\n"})}),(0,t.jsxs)(n.p,{children:["The compiled binaries will be in the ",(0,t.jsx)(n.code,{children:"Bin/Release"})," directory, including SvtAv1EncApp. If you just want the encoder, adding the ",(0,t.jsx)(n.code,{children:"no-dec"})," flag will skip building SvtAv1DecApp and save on compilation time."]}),(0,t.jsxs)(n.p,{children:["If you'd like to build from the latest release (2.1.0 at the time of writing - last updated 23 May 2024) please run ",(0,t.jsx)(n.code,{children:"git reset --hard 5471bd78311d70ab4691af1ae54fd80e25f214f5"})," in the cloned directory. It is recommended that you do this, as new changes to git aren't always stable right away & a release will guarantee more stability."]}),(0,t.jsxs)(n.p,{children:["If you want extra performance, it is possible to build SVT-AV1 using PGO (Profile-guided Optimization). ",(0,t.jsxs)(n.strong,{children:["Be aware that this particular script infers that you have a .y4m file (or multiple) in ",(0,t.jsx)(n.code,{children:"/dev/shm"})," for transcoding"]}),". You can compile statically linked SVT-AV1 with PGO (and LTO, or link-time optimization) by following this script:"]}),(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",metastring:'title="Bulding SVT-AV1 with profile guided optimization"',children:"git clone https://gitlab.com/AOMediaCodec/SVT-AV1/\ncd SVT-AV1/Build/linux\n./build.sh cc=gcc cxx=g++ enable-lto enable-pgo static native jobs=$(nproc) pgo-dir=/dev/shm pgo-videos=/dev/shm release\n"})}),(0,t.jsx)(n.p,{children:"If you wish to store videos elsewhere or provide custom parameters to the SvtAv1EncApp binary, try this script:"}),(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"git clone https://gitlab.com/AOMediaCodec/SVT-AV1/\ncd SVT-AV1/Build/linux\n./build.sh cc=gcc cxx=g++ enable-lto enable-pgo static native jobs=$(nproc) pgo-dir=/dev/shm pgo-compile-gen release\n../../Bin/Release/SvtAv1EncApp # Run this binary as many times as you'd like with arguments of your choice to collect data\n./build.sh cc=gcc cxx=g++ enable-lto enable-pgo static native jobs=$(nproc) pgo-dir=/dev/shm pgo-compile-use release\n"})})]}),(0,t.jsxs)(s.A,{value:"windows",label:"Windows",children:[(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.strong,{children:"MSYS2"})," is the best option for building in Windows, as it provides a Unix-like environment for building SVT-AV1-PSY. This makes the compilation procedure the same as described for Linux & macOS. The full build process is detailed here."]}),(0,t.jsxs)(n.ol,{start:"0",children:["\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:["Make sure you have downloaded & installed MSYS2 from ",(0,t.jsx)(n.a,{href:"https://www.msys2.org/",children:"the MSYS2 website"})," before beginning the build process."]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsx)(n.p,{children:"Start the UCRT64 console & install the required dependencies:"}),"\n"]}),"\n"]}),(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"pacman -Syu --needed git mingw-w64-ucrt-x86_64-toolchain mingw-w64-ucrt-x86_64-cmake mingw-w64-ucrt-x86_64-ninja mingw-w64-ucrt-x86_64-yasm\n"})}),(0,t.jsxs)(n.ol,{start:"2",children:["\n",(0,t.jsx)(n.li,{children:"[Optional] Clang is the recommended compiler for SVT-AV1 & SVT-AV1-PSY, so you may wish to download it with the following command:"}),"\n"]}),(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"pacman -Syu --needed mingw-w64-ucrt-x86_64-clang\n"})}),(0,t.jsxs)(n.ol,{start:"3",children:["\n",(0,t.jsxs)(n.li,{children:["Now, we may follow the steps for Linux & macOS to complete building. Please note that CMake may require you to include ",(0,t.jsx)(n.code,{children:'-G "Ninja"'})," in any CMake commands."]}),"\n"]}),(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",metastring:'title="Clone SVT-AV1-PSY"',children:"git clone https://github.com/gianni-rosato/svt-av1-psy\ncd SVT-AV1/Build/linux\n"})}),(0,t.jsxs)(n.p,{children:["In the directory, simply run ",(0,t.jsx)(n.code,{children:"./build.sh [flags]"})," to build. Be aware that building requires CMake version 3.16 or higher and either GCC or Clang. It is recommended to use Clang, and ideally it will be installed as per Step 2."]}),(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",metastring:'title="Build release"',children:"./build.sh release\n"})}),(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",metastring:'title="Statically build just the encoder with clang and enable link-time optimization"',children:"./build.sh jobs=8 all cc=clang cxx=clang++ no-dec enable-lto static native\n"})}),(0,t.jsxs)(n.p,{children:["The compiled binaries will be in the ",(0,t.jsx)(n.code,{children:"Bin/Release"})," directory, including SvtAv1EncApp. If you just want the encoder, adding the ",(0,t.jsx)(n.code,{children:"no-dec"})," flag will skip building SvtAv1DecApp and save on compilation time."]}),(0,t.jsxs)(n.p,{children:["If you'd like to build from the latest release (2.1.0 at the time of writing - last updated 23 May 2024) please run ",(0,t.jsx)(n.code,{children:"git reset --hard 5471bd78311d70ab4691af1ae54fd80e25f214f5"})," in the cloned directory."]})]})]}),"\n",(0,t.jsx)(n.h2,{id:"projects-featuring-svt-av1-psy",children:"Projects Featuring SVT-AV1-PSY"}),"\n",(0,t.jsx)(n.p,{children:"Some projects that feature SVT-AV1-PSY include:"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.a,{href:"/docs/utilities/Aviator",children:"Aviator"})," ~ an AV1 encoding GUI by @gianni-rosato"]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.a,{href:"/docs/utilities/rav1ator-cli",children:"rAV1ator CLI"})," ~ a TUI for video encoding with Av1an by @gianni-rosato"]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.a,{href:"https://aur.archlinux.org/packages/svt-av1-psy-git",children:"SVT-AV1-PSY on the AUR"})," ~ by @BlueSwordM"]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.a,{href:"https://github.com/CachyOS/CachyOS-PKGBUILDS/pull/144",children:"SVT-AV1-PSY in CachyOS"})," ~ by @BlueSwordM"]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.a,{href:"https://github.com/vincejv/docker-handbrake",children:"Custom Handbrake Builds"})," ~ by @vincejv"]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.a,{href:"https://github.com/staxrip/staxrip",children:"Staxrip"})," ~ a video & audio encoding GUI for Windows by @Dendraspis"]}),"\n"]}),"\n",(0,t.jsx)(n.h2,{id:"license",children:"License"}),"\n",(0,t.jsx)(n.p,{children:"Up to v0.8.7, SVT-AV1 is licensed under the BSD-2-clause license and the\nAlliance for Open Media Patent License 1.0. Starting from v0.9, SVT-AV1 is licensed\nunder the BSD-3-clause clear license and the Alliance for Open Media Patent\nLicense 1.0."}),"\n",(0,t.jsx)(n.p,{children:"SVT-AV1-PSY does not feature license modifications from mainline SVT-AV1."})]})}function m(e={}){const{wrapper:n}={...(0,r.R)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(u,{...e})}):u(e)}},9365:(e,n,i)=>{i.d(n,{A:()=>s});i(6540);var t=i(4164);const r={tabItem:"tabItem_Ymn6"};var a=i(4848);function s(e){let{children:n,hidden:i,className:s}=e;return(0,a.jsx)("div",{role:"tabpanel",className:(0,t.A)(r.tabItem,s),hidden:i,children:n})}},1470:(e,n,i)=>{i.d(n,{A:()=>S});var t=i(6540),r=i(4164),a=i(3104),s=i(6347),l=i(205),o=i(7485),c=i(1682),d=i(679);function h(e){return t.Children.toArray(e).filter((e=>"\n"!==e)).map((e=>{if(!e||(0,t.isValidElement)(e)&&function(e){const{props:n}=e;return!!n&&"object"==typeof n&&"value"in n}(e))return e;throw new Error(`Docusaurus error: Bad child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the component should be , and every should have a unique "value" prop.`)}))?.filter(Boolean)??[]}function u(e){const{values:n,children:i}=e;return(0,t.useMemo)((()=>{const e=n??function(e){return h(e).map((e=>{let{props:{value:n,label:i,attributes:t,default:r}}=e;return{value:n,label:i,attributes:t,default:r}}))}(i);return function(e){const n=(0,c.XI)(e,((e,n)=>e.value===n.value));if(n.length>0)throw new Error(`Docusaurus error: Duplicate values "${n.map((e=>e.value)).join(", ")}" found in . Every value needs to be unique.`)}(e),e}),[n,i])}function m(e){let{value:n,tabValues:i}=e;return i.some((e=>e.value===n))}function p(e){let{queryString:n=!1,groupId:i}=e;const r=(0,s.W6)(),a=function(e){let{queryString:n=!1,groupId:i}=e;if("string"==typeof n)return n;if(!1===n)return null;if(!0===n&&!i)throw new Error('Docusaurus error: The component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return i??null}({queryString:n,groupId:i});return[(0,o.aZ)(a),(0,t.useCallback)((e=>{if(!a)return;const n=new URLSearchParams(r.location.search);n.set(a,e),r.replace({...r.location,search:n.toString()})}),[a,r])]}function f(e){const{defaultValue:n,queryString:i=!1,groupId:r}=e,a=u(e),[s,o]=(0,t.useState)((()=>function(e){let{defaultValue:n,tabValues:i}=e;if(0===i.length)throw new Error("Docusaurus error: the component requires at least one children component");if(n){if(!m({value:n,tabValues:i}))throw new Error(`Docusaurus error: The has a defaultValue "${n}" but none of its children has the corresponding value. Available values are: ${i.map((e=>e.value)).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return n}const t=i.find((e=>e.default))??i[0];if(!t)throw new Error("Unexpected error: 0 tabValues");return t.value}({defaultValue:n,tabValues:a}))),[c,h]=p({queryString:i,groupId:r}),[f,g]=function(e){let{groupId:n}=e;const i=function(e){return e?`docusaurus.tab.${e}`:null}(n),[r,a]=(0,d.Dv)(i);return[r,(0,t.useCallback)((e=>{i&&a.set(e)}),[i,a])]}({groupId:r}),b=(()=>{const e=c??f;return m({value:e,tabValues:a})?e:null})();(0,l.A)((()=>{b&&o(b)}),[b]);return{selectedValue:s,selectValue:(0,t.useCallback)((e=>{if(!m({value:e,tabValues:a}))throw new Error(`Can't select invalid tab value=${e}`);o(e),h(e),g(e)}),[h,g,a]),tabValues:a}}var g=i(2303);const b={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};var x=i(4848);function j(e){let{className:n,block:i,selectedValue:t,selectValue:s,tabValues:l}=e;const o=[],{blockElementScrollPositionUntilNextRender:c}=(0,a.a_)(),d=e=>{const n=e.currentTarget,i=o.indexOf(n),r=l[i].value;r!==t&&(c(n),s(r))},h=e=>{let n=null;switch(e.key){case"Enter":d(e);break;case"ArrowRight":{const i=o.indexOf(e.currentTarget)+1;n=o[i]??o[0];break}case"ArrowLeft":{const i=o.indexOf(e.currentTarget)-1;n=o[i]??o[o.length-1];break}}n?.focus()};return(0,x.jsx)("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,r.A)("tabs",{"tabs--block":i},n),children:l.map((e=>{let{value:n,label:i,attributes:a}=e;return(0,x.jsx)("li",{role:"tab",tabIndex:t===n?0:-1,"aria-selected":t===n,ref:e=>o.push(e),onKeyDown:h,onClick:d,...a,className:(0,r.A)("tabs__item",b.tabItem,a?.className,{"tabs__item--active":t===n}),children:i??n},n)}))})}function v(e){let{lazy:n,children:i,selectedValue:a}=e;const s=(Array.isArray(i)?i:[i]).filter(Boolean);if(n){const e=s.find((e=>e.props.value===a));return e?(0,t.cloneElement)(e,{className:(0,r.A)("margin-top--md",e.props.className)}):null}return(0,x.jsx)("div",{className:"margin-top--md",children:s.map(((e,n)=>(0,t.cloneElement)(e,{key:n,hidden:e.props.value!==a})))})}function V(e){const n=f(e);return(0,x.jsxs)("div",{className:(0,r.A)("tabs-container",b.tabList),children:[(0,x.jsx)(j,{...n,...e}),(0,x.jsx)(v,{...n,...e})]})}function S(e){const n=(0,g.A)();return(0,x.jsx)(V,{...e,children:h(e.children)},String(n))}},8453:(e,n,i)=>{i.d(n,{R:()=>s,x:()=>l});var t=i(6540);const r={},a=t.createContext(r);function s(e){const n=t.useContext(a);return t.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function l(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:s(e.components),t.createElement(a.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/44e37655.804c7bd9.js b/assets/js/44e37655.804c7bd9.js new file mode 100644 index 00000000..16a82f6f --- /dev/null +++ b/assets/js/44e37655.804c7bd9.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[5958],{6147:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>u,contentTitle:()=>l,default:()=>m,frontMatter:()=>o,metadata:()=>c,toc:()=>d});var r=n(4848),i=n(8453),s=n(1470),a=n(9365);const o={title:"SSIMULACRA2",sidebar_position:1},l="SSIMULACRA2",c={id:"metrics/SSIMULACRA2",title:"SSIMULACRA2",description:"The content in this entry is incomplete & is in the process of being completed.",source:"@site/docs/metrics/SSIMULACRA2.mdx",sourceDirName:"metrics",slug:"/metrics/SSIMULACRA2",permalink:"/docs/metrics/SSIMULACRA2",draft:!1,unlisted:!1,editUrl:"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/metrics/SSIMULACRA2.mdx",tags:[],version:"current",sidebarPosition:1,frontMatter:{title:"SSIMULACRA2",sidebar_position:1},sidebar:"tutorialSidebar",previous:{title:"SSIM",permalink:"/docs/metrics/SSIM"},next:{title:"VMAF",permalink:"/docs/metrics/VMAF"}},u={},d=[{value:"Installing",id:"installing",level:2},{value:"Running",id:"running",level:2},{value:"On Images",id:"on-images",level:3},{value:"On Videos",id:"on-videos",level:3},{value:"Multithreading",id:"multithreading",level:4},{value:"Frame skipping",id:"frame-skipping",level:4},{value:"Scoring",id:"scoring",level:2}];function h(e){const t={a:"a",admonition:"admonition",code:"code",h1:"h1",h2:"h2",h3:"h3",h4:"h4",header:"header",li:"li",p:"p",pre:"pre",ul:"ul",...(0,i.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(t.header,{children:(0,r.jsx)(t.h1,{id:"ssimulacra2",children:"SSIMULACRA2"})}),"\n",(0,r.jsx)(t.admonition,{title:"Under Maintenance",type:"info",children:(0,r.jsx)(t.p,{children:"The content in this entry is incomplete & is in the process of being completed."})}),"\n",(0,r.jsxs)(t.p,{children:["SSIMULACRA 2 is a visual fidelity metric based on the concept of the multi-scale structural similarity index measure (MS-SSIM), computed in a perceptually relevant color space, adding two other (asymmetric) error maps, and aggregating using two different norms. It is currently the most reputable visual quality metric according to its correlation with subjective results, and is considered a very robust means of comparing encoders. It is debatable whether ",(0,r.jsx)(t.a,{href:"/docs/metrics/butteraugli",children:"Butteraugli"})," is better for very high fidelity, but SSIMULACRA 2 is considered the best for medium/low fidelity comparisons. Although it does not feature any inter-frame temporal awareness, it is still considered a very strong metric for video fidelity comparison nonetheless."]}),"\n",(0,r.jsxs)(t.p,{children:["While a ",(0,r.jsx)(t.a,{href:"https://github.com/cloudinary/ssimulacra2",children:"reference implementation by Cloudinary"})," exists,\nmost people will want to use ",(0,r.jsxs)(t.a,{href:"https://github.com/rust-av/ssimulacra2",children:["the rust implementation ",(0,r.jsx)(t.code,{children:"ssimulacra2_rs"})]}),"."]}),"\n",(0,r.jsx)(t.h2,{id:"installing",children:"Installing"}),"\n",(0,r.jsxs)(s.A,{children:[(0,r.jsxs)(a.A,{value:"cargo",label:"Cargo",default:!0,children:[(0,r.jsx)(t.p,{children:"To install ssimulacra2_rs using cargo, run this:"}),(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-bash",children:"cargo install ssimulacra2_rs\n"})})]}),(0,r.jsxs)(a.A,{value:"archlinux",label:"Archlinux AUR",children:[(0,r.jsxs)(t.p,{children:["On archlinux, you may use the ",(0,r.jsx)(t.a,{href:"https://wiki.archlinux.org/title/Arch_User_Repository",children:"AUR"})," to install.\nSimply use your favorite AUR helper to install ",(0,r.jsx)(t.code,{children:"ssimulacra2_bin-git"})]}),(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-bash",children:"paru -S ssimulacra2_bin-git\n"})})]})]}),"\n",(0,r.jsx)(t.h2,{id:"running",children:"Running"}),"\n",(0,r.jsx)(t.h3,{id:"on-images",children:"On Images"}),"\n",(0,r.jsx)(t.p,{children:"Comparing images is simple, run this:"}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-bash",children:"ssimulacra2_rs image source.png distorted.png\n"})}),"\n",(0,r.jsx)(t.h3,{id:"on-videos",children:"On Videos"}),"\n",(0,r.jsx)(t.p,{children:"If you want to compare videos, run this:"}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-bash",children:"ssimulacra2_rs video source.mkv distorted.mkv\n"})}),"\n",(0,r.jsxs)(t.admonition,{title:"Graphical visualization",type:"tip",children:[(0,r.jsxs)(t.p,{children:["You can optionally output a graph using the ",(0,r.jsx)(t.code,{children:"-g"})," parameter:"]}),(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-bash",children:"ssimulacra2_rs video source.mkv distorted.mkv -g\n"})})]}),"\n",(0,r.jsx)(t.h4,{id:"multithreading",children:"Multithreading"}),"\n",(0,r.jsx)(t.p,{children:"Multithreading with ssimulacra2_rs works, but it scales badly.\nThis is likely due to memory bandwidth limitations.\nHowever, the speedup is worth it."}),"\n",(0,r.jsxs)(t.p,{children:["To run multithreaded, use the ",(0,r.jsx)(t.code,{children:"--frame-threads"})," or ",(0,r.jsx)(t.code,{children:"-f"})," parameters.\nFor example, to run with 16 threads:"]}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-bash",children:"ssimulacra2_rs video source.mkv distorted.mkv -f 16\n"})}),"\n",(0,r.jsx)(t.admonition,{title:"Thread amount",type:"info",children:(0,r.jsx)(t.p,{children:"You should set the amount of threads to half of your actual thread count, as going any higher won't make a difference."})}),"\n",(0,r.jsx)(t.admonition,{title:"Memory limitation",type:"warning",children:(0,r.jsx)(t.p,{children:"If you have a small amount of system memory, you may encounter out of memory errors while running with multi-threading.\nIf that's the case, you need to lower the amount of threads."})}),"\n",(0,r.jsx)(t.h4,{id:"frame-skipping",children:"Frame skipping"}),"\n",(0,r.jsx)(t.p,{children:"SSIMULACRA 2 is, at its core, an image quality assessment metric, not a video quality one.\nThis means that it does not use any temporal information when applied to videos; just the independent scores of each individual frame.\nConsequently, it can be applied to a subset of a video's frames, instead of to all of them, to obtain a meaningful estimate of the score in a reduced time."}),"\n",(0,r.jsxs)(t.p,{children:["To run ssimulacra2_rs with frame skip enabled, use the ",(0,r.jsx)(t.code,{children:"--increment"})," or ",(0,r.jsx)(t.code,{children:"-i"})," parameters.\nFor example, to compute the score for every 3rd frame:"]}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-bash",children:"ssimulacra2_rs video source.mkv distorted.mkv -i 3\n"})}),"\n",(0,r.jsxs)(t.admonition,{title:"Frame skip amount",type:"info",children:[(0,r.jsx)(t.p,{children:"To avoid biased score estimates, it is recommended to sample frames using an odd value as increment.\nPrime numbers further reduce the likelihood of sampling bias.\nThus increments of 3, 5, 7, 11 or 13 frames are good options to compute score estimates with little deviation to the true score."}),(0,r.jsx)(t.p,{children:"In any case, powers of two (2, 4, 8, 16...) should be avoided as increment, due to the way video encoders deal with temporal layers."})]}),"\n",(0,r.jsx)(t.h2,{id:"scoring",children:"Scoring"}),"\n",(0,r.jsx)(t.p,{children:"The score that SSIMULACRA 2 outputs is simple: a number in range -inf..100. According to the developers of the metric, for image quality assessment, SSIMULACRA 2 scores correlate to subjective visual quality as follows:"}),"\n",(0,r.jsxs)(t.ul,{children:["\n",(0,r.jsxs)(t.li,{children:["Very high quality: ",(0,r.jsx)(t.code,{children:"90"})," and above"]}),"\n",(0,r.jsxs)(t.li,{children:["High quality: ",(0,r.jsx)(t.code,{children:"70"})," to ",(0,r.jsx)(t.code,{children:"90"})]}),"\n",(0,r.jsxs)(t.li,{children:["Medium quality: ",(0,r.jsx)(t.code,{children:"50"})," to ",(0,r.jsx)(t.code,{children:"70"})]}),"\n",(0,r.jsxs)(t.li,{children:["Low quality: Below ",(0,r.jsx)(t.code,{children:"50"})]}),"\n"]}),"\n",(0,r.jsxs)(t.p,{children:["For video quality assessment, however, the scores need not be as high for similar subjective visual quality correlation.\nFor example, it is believed that an average score of around ",(0,r.jsx)(t.code,{children:"80"}),' corresponds to a "visually lossless" video.\nNevertheless, this has not been thoroughly verified.']})]})}function m(e={}){const{wrapper:t}={...(0,i.R)(),...e.components};return t?(0,r.jsx)(t,{...e,children:(0,r.jsx)(h,{...e})}):h(e)}},9365:(e,t,n)=>{n.d(t,{A:()=>a});n(6540);var r=n(4164);const i={tabItem:"tabItem_Ymn6"};var s=n(4848);function a(e){let{children:t,hidden:n,className:a}=e;return(0,s.jsx)("div",{role:"tabpanel",className:(0,r.A)(i.tabItem,a),hidden:n,children:t})}},1470:(e,t,n)=>{n.d(t,{A:()=>w});var r=n(6540),i=n(4164),s=n(3104),a=n(6347),o=n(205),l=n(7485),c=n(1682),u=n(679);function d(e){return r.Children.toArray(e).filter((e=>"\n"!==e)).map((e=>{if(!e||(0,r.isValidElement)(e)&&function(e){const{props:t}=e;return!!t&&"object"==typeof t&&"value"in t}(e))return e;throw new Error(`Docusaurus error: Bad child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the component should be , and every should have a unique "value" prop.`)}))?.filter(Boolean)??[]}function h(e){const{values:t,children:n}=e;return(0,r.useMemo)((()=>{const e=t??function(e){return d(e).map((e=>{let{props:{value:t,label:n,attributes:r,default:i}}=e;return{value:t,label:n,attributes:r,default:i}}))}(n);return function(e){const t=(0,c.XI)(e,((e,t)=>e.value===t.value));if(t.length>0)throw new Error(`Docusaurus error: Duplicate values "${t.map((e=>e.value)).join(", ")}" found in . Every value needs to be unique.`)}(e),e}),[t,n])}function m(e){let{value:t,tabValues:n}=e;return n.some((e=>e.value===t))}function p(e){let{queryString:t=!1,groupId:n}=e;const i=(0,a.W6)(),s=function(e){let{queryString:t=!1,groupId:n}=e;if("string"==typeof t)return t;if(!1===t)return null;if(!0===t&&!n)throw new Error('Docusaurus error: The component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return n??null}({queryString:t,groupId:n});return[(0,l.aZ)(s),(0,r.useCallback)((e=>{if(!s)return;const t=new URLSearchParams(i.location.search);t.set(s,e),i.replace({...i.location,search:t.toString()})}),[s,i])]}function f(e){const{defaultValue:t,queryString:n=!1,groupId:i}=e,s=h(e),[a,l]=(0,r.useState)((()=>function(e){let{defaultValue:t,tabValues:n}=e;if(0===n.length)throw new Error("Docusaurus error: the component requires at least one children component");if(t){if(!m({value:t,tabValues:n}))throw new Error(`Docusaurus error: The has a defaultValue "${t}" but none of its children has the corresponding value. Available values are: ${n.map((e=>e.value)).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return t}const r=n.find((e=>e.default))??n[0];if(!r)throw new Error("Unexpected error: 0 tabValues");return r.value}({defaultValue:t,tabValues:s}))),[c,d]=p({queryString:n,groupId:i}),[f,g]=function(e){let{groupId:t}=e;const n=function(e){return e?`docusaurus.tab.${e}`:null}(t),[i,s]=(0,u.Dv)(n);return[i,(0,r.useCallback)((e=>{n&&s.set(e)}),[n,s])]}({groupId:i}),v=(()=>{const e=c??f;return m({value:e,tabValues:s})?e:null})();(0,o.A)((()=>{v&&l(v)}),[v]);return{selectedValue:a,selectValue:(0,r.useCallback)((e=>{if(!m({value:e,tabValues:s}))throw new Error(`Can't select invalid tab value=${e}`);l(e),d(e),g(e)}),[d,g,s]),tabValues:s}}var g=n(2303);const v={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};var b=n(4848);function x(e){let{className:t,block:n,selectedValue:r,selectValue:a,tabValues:o}=e;const l=[],{blockElementScrollPositionUntilNextRender:c}=(0,s.a_)(),u=e=>{const t=e.currentTarget,n=l.indexOf(t),i=o[n].value;i!==r&&(c(t),a(i))},d=e=>{let t=null;switch(e.key){case"Enter":u(e);break;case"ArrowRight":{const n=l.indexOf(e.currentTarget)+1;t=l[n]??l[0];break}case"ArrowLeft":{const n=l.indexOf(e.currentTarget)-1;t=l[n]??l[l.length-1];break}}t?.focus()};return(0,b.jsx)("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,i.A)("tabs",{"tabs--block":n},t),children:o.map((e=>{let{value:t,label:n,attributes:s}=e;return(0,b.jsx)("li",{role:"tab",tabIndex:r===t?0:-1,"aria-selected":r===t,ref:e=>l.push(e),onKeyDown:d,onClick:u,...s,className:(0,i.A)("tabs__item",v.tabItem,s?.className,{"tabs__item--active":r===t}),children:n??t},t)}))})}function j(e){let{lazy:t,children:n,selectedValue:s}=e;const a=(Array.isArray(n)?n:[n]).filter(Boolean);if(t){const e=a.find((e=>e.props.value===s));return e?(0,r.cloneElement)(e,{className:(0,i.A)("margin-top--md",e.props.className)}):null}return(0,b.jsx)("div",{className:"margin-top--md",children:a.map(((e,t)=>(0,r.cloneElement)(e,{key:t,hidden:e.props.value!==s})))})}function y(e){const t=f(e);return(0,b.jsxs)("div",{className:(0,i.A)("tabs-container",v.tabList),children:[(0,b.jsx)(x,{...t,...e}),(0,b.jsx)(j,{...t,...e})]})}function w(e){const t=(0,g.A)();return(0,b.jsx)(y,{...e,children:d(e.children)},String(t))}},8453:(e,t,n)=>{n.d(t,{R:()=>a,x:()=>o});var r=n(6540);const i={},s=r.createContext(i);function a(e){const t=r.useContext(s);return r.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function o(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:a(e.components),r.createElement(s.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/44e37655.e5c01d46.js b/assets/js/44e37655.e5c01d46.js deleted file mode 100644 index 73f3f9ee..00000000 --- a/assets/js/44e37655.e5c01d46.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[5958],{6147:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>u,contentTitle:()=>o,default:()=>m,frontMatter:()=>l,metadata:()=>c,toc:()=>d});var r=n(4848),i=n(8453),s=n(1470),a=n(9365);const l={title:"SSIMULACRA2",sidebar_position:1},o="SSIMULACRA2",c={id:"metrics/SSIMULACRA2",title:"SSIMULACRA2",description:"The content in this entry is incomplete & is in the process of being completed.",source:"@site/docs/metrics/SSIMULACRA2.mdx",sourceDirName:"metrics",slug:"/metrics/SSIMULACRA2",permalink:"/docs/metrics/SSIMULACRA2",draft:!1,unlisted:!1,editUrl:"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/metrics/SSIMULACRA2.mdx",tags:[],version:"current",sidebarPosition:1,frontMatter:{title:"SSIMULACRA2",sidebar_position:1},sidebar:"tutorialSidebar",previous:{title:"SSIM",permalink:"/docs/metrics/SSIM"},next:{title:"VMAF",permalink:"/docs/metrics/VMAF"}},u={},d=[{value:"Installing",id:"installing",level:2},{value:"Running",id:"running",level:2},{value:"On Images",id:"on-images",level:3},{value:"On Videos",id:"on-videos",level:3},{value:"Multithreading",id:"multithreading",level:4},{value:"Scoring",id:"scoring",level:2}];function h(e){const t={a:"a",admonition:"admonition",br:"br",code:"code",h1:"h1",h2:"h2",h3:"h3",h4:"h4",header:"header",li:"li",p:"p",pre:"pre",ul:"ul",...(0,i.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(t.header,{children:(0,r.jsx)(t.h1,{id:"ssimulacra2",children:"SSIMULACRA2"})}),"\n",(0,r.jsx)(t.admonition,{title:"Under Maintenance",type:"info",children:(0,r.jsx)(t.p,{children:"The content in this entry is incomplete & is in the process of being completed."})}),"\n",(0,r.jsxs)(t.p,{children:["SSIMULACRA 2 is a visual fidelity metric based on the concept of the multi-scale structural similarity index measure (MS-SSIM), computed in a perceptually relevant color space, adding two other (asymmetric) error maps, and aggregating using two different norms. It is currently the most reputable visual quality metric according to its correlation with subjective results, and is considered a very robust means of comparing encoders. It is debatable whether ",(0,r.jsx)(t.a,{href:"/docs/metrics/butteraugli",children:"Butteraugli"})," is better for very high fidelity, but SSIMULACRA 2 is considered the best for medium/low fidelity comparisons. Although it does not feature any inter-frame temporal awareness, it is still considered a very strong metric for video fidelity comparison nonetheless."]}),"\n",(0,r.jsxs)(t.p,{children:["While a ",(0,r.jsx)(t.a,{href:"https://github.com/cloudinary/ssimulacra2",children:"reference implementation by Cloudinary"})," exists,\nmost people will want to use ",(0,r.jsxs)(t.a,{href:"https://github.com/rust-av/ssimulacra2",children:["the rust implementation ",(0,r.jsx)(t.code,{children:"ssimulacra2_rs"})]}),"."]}),"\n",(0,r.jsx)(t.h2,{id:"installing",children:"Installing"}),"\n",(0,r.jsxs)(s.A,{children:[(0,r.jsxs)(a.A,{value:"cargo",label:"Cargo",default:!0,children:[(0,r.jsx)(t.p,{children:"To install ssimulacra2_rs using cargo, run this:"}),(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-bash",children:"cargo install ssimulacra2_rs\n"})})]}),(0,r.jsxs)(a.A,{value:"archlinux",label:"Archlinux AUR",children:[(0,r.jsxs)(t.p,{children:["On archlinux, you may use the ",(0,r.jsx)(t.a,{href:"https://wiki.archlinux.org/title/Arch_User_Repository",children:"AUR"})," to install.\nSimply use your favorite AUR helper to install ",(0,r.jsx)(t.code,{children:"ssimulacra2_bin-git"})]}),(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-bash",children:"paru -S ssimulacra2_bin-git\n"})})]})]}),"\n",(0,r.jsx)(t.h2,{id:"running",children:"Running"}),"\n",(0,r.jsx)(t.h3,{id:"on-images",children:"On Images"}),"\n",(0,r.jsx)(t.p,{children:"Comparing images is simple, run this:"}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-bash",children:"ssimulacra2_rs image source.png distorted.png\n"})}),"\n",(0,r.jsx)(t.h3,{id:"on-videos",children:"On Videos"}),"\n",(0,r.jsx)(t.p,{children:"If you want to compare videos, run this:"}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-bash",children:"ssimulacra2_rs video source.mkv distorted.mkv\n"})}),"\n",(0,r.jsxs)(t.admonition,{title:"Graphical visualization",type:"tip",children:[(0,r.jsxs)(t.p,{children:["You can optionally output a graph using the ",(0,r.jsx)(t.code,{children:"-g"})," parameter:"]}),(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-bash",children:"ssimulacra2_rs video source.mkv distorted.mkv -g\n"})})]}),"\n",(0,r.jsx)(t.h4,{id:"multithreading",children:"Multithreading"}),"\n",(0,r.jsxs)(t.p,{children:["Multithreading with ssimulacra2_rs works, but it scales badly.\nThis is likely due to memory bandwidth limitations.",(0,r.jsx)(t.br,{}),"\n","However, the speedup is worth it."]}),"\n",(0,r.jsxs)(t.p,{children:["To run multithreaded, use the ",(0,r.jsx)(t.code,{children:"--frame-threads"})," or ",(0,r.jsx)(t.code,{children:"-f"})," parameters.\nFor example, to run with 16 threads:"]}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-bash",children:"ssimulacra2_rs video source.mkv distorted.mkv -f 16\n"})}),"\n",(0,r.jsx)(t.admonition,{title:"Thread amount",type:"info",children:(0,r.jsx)(t.p,{children:"You should set the amount of threads to half of your actual thread count, as going any higher won't make a difference."})}),"\n",(0,r.jsx)(t.admonition,{title:"Memory limitation",type:"warning",children:(0,r.jsx)(t.p,{children:"If you have a small amount of system memory, you may encounter out of memory errors while running with multi-threading.\nIf that's the case, you need to lower the amount of threads."})}),"\n",(0,r.jsx)(t.h2,{id:"scoring",children:"Scoring"}),"\n",(0,r.jsx)(t.p,{children:"The score that ssimulacra2 outputs is simple:"}),"\n",(0,r.jsxs)(t.ul,{children:["\n",(0,r.jsxs)(t.li,{children:["Very high quality: ",(0,r.jsx)(t.code,{children:"90"})," and above"]}),"\n",(0,r.jsxs)(t.li,{children:["High quality: ",(0,r.jsx)(t.code,{children:"70"})," to ",(0,r.jsx)(t.code,{children:"90"})]}),"\n",(0,r.jsxs)(t.li,{children:["Medium quality: ",(0,r.jsx)(t.code,{children:"50"})," to ",(0,r.jsx)(t.code,{children:"70"})]}),"\n",(0,r.jsxs)(t.li,{children:["Low quality: Below ",(0,r.jsx)(t.code,{children:"50"})]}),"\n"]})]})}function m(e={}){const{wrapper:t}={...(0,i.R)(),...e.components};return t?(0,r.jsx)(t,{...e,children:(0,r.jsx)(h,{...e})}):h(e)}},9365:(e,t,n)=>{n.d(t,{A:()=>a});n(6540);var r=n(4164);const i={tabItem:"tabItem_Ymn6"};var s=n(4848);function a(e){let{children:t,hidden:n,className:a}=e;return(0,s.jsx)("div",{role:"tabpanel",className:(0,r.A)(i.tabItem,a),hidden:n,children:t})}},1470:(e,t,n)=>{n.d(t,{A:()=>A});var r=n(6540),i=n(4164),s=n(3104),a=n(6347),l=n(205),o=n(7485),c=n(1682),u=n(679);function d(e){return r.Children.toArray(e).filter((e=>"\n"!==e)).map((e=>{if(!e||(0,r.isValidElement)(e)&&function(e){const{props:t}=e;return!!t&&"object"==typeof t&&"value"in t}(e))return e;throw new Error(`Docusaurus error: Bad child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the component should be , and every should have a unique "value" prop.`)}))?.filter(Boolean)??[]}function h(e){const{values:t,children:n}=e;return(0,r.useMemo)((()=>{const e=t??function(e){return d(e).map((e=>{let{props:{value:t,label:n,attributes:r,default:i}}=e;return{value:t,label:n,attributes:r,default:i}}))}(n);return function(e){const t=(0,c.XI)(e,((e,t)=>e.value===t.value));if(t.length>0)throw new Error(`Docusaurus error: Duplicate values "${t.map((e=>e.value)).join(", ")}" found in . Every value needs to be unique.`)}(e),e}),[t,n])}function m(e){let{value:t,tabValues:n}=e;return n.some((e=>e.value===t))}function p(e){let{queryString:t=!1,groupId:n}=e;const i=(0,a.W6)(),s=function(e){let{queryString:t=!1,groupId:n}=e;if("string"==typeof t)return t;if(!1===t)return null;if(!0===t&&!n)throw new Error('Docusaurus error: The component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return n??null}({queryString:t,groupId:n});return[(0,o.aZ)(s),(0,r.useCallback)((e=>{if(!s)return;const t=new URLSearchParams(i.location.search);t.set(s,e),i.replace({...i.location,search:t.toString()})}),[s,i])]}function f(e){const{defaultValue:t,queryString:n=!1,groupId:i}=e,s=h(e),[a,o]=(0,r.useState)((()=>function(e){let{defaultValue:t,tabValues:n}=e;if(0===n.length)throw new Error("Docusaurus error: the component requires at least one children component");if(t){if(!m({value:t,tabValues:n}))throw new Error(`Docusaurus error: The has a defaultValue "${t}" but none of its children has the corresponding value. Available values are: ${n.map((e=>e.value)).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return t}const r=n.find((e=>e.default))??n[0];if(!r)throw new Error("Unexpected error: 0 tabValues");return r.value}({defaultValue:t,tabValues:s}))),[c,d]=p({queryString:n,groupId:i}),[f,g]=function(e){let{groupId:t}=e;const n=function(e){return e?`docusaurus.tab.${e}`:null}(t),[i,s]=(0,u.Dv)(n);return[i,(0,r.useCallback)((e=>{n&&s.set(e)}),[n,s])]}({groupId:i}),b=(()=>{const e=c??f;return m({value:e,tabValues:s})?e:null})();(0,l.A)((()=>{b&&o(b)}),[b]);return{selectedValue:a,selectValue:(0,r.useCallback)((e=>{if(!m({value:e,tabValues:s}))throw new Error(`Can't select invalid tab value=${e}`);o(e),d(e),g(e)}),[d,g,s]),tabValues:s}}var g=n(2303);const b={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};var x=n(4848);function v(e){let{className:t,block:n,selectedValue:r,selectValue:a,tabValues:l}=e;const o=[],{blockElementScrollPositionUntilNextRender:c}=(0,s.a_)(),u=e=>{const t=e.currentTarget,n=o.indexOf(t),i=l[n].value;i!==r&&(c(t),a(i))},d=e=>{let t=null;switch(e.key){case"Enter":u(e);break;case"ArrowRight":{const n=o.indexOf(e.currentTarget)+1;t=o[n]??o[0];break}case"ArrowLeft":{const n=o.indexOf(e.currentTarget)-1;t=o[n]??o[o.length-1];break}}t?.focus()};return(0,x.jsx)("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,i.A)("tabs",{"tabs--block":n},t),children:l.map((e=>{let{value:t,label:n,attributes:s}=e;return(0,x.jsx)("li",{role:"tab",tabIndex:r===t?0:-1,"aria-selected":r===t,ref:e=>o.push(e),onKeyDown:d,onClick:u,...s,className:(0,i.A)("tabs__item",b.tabItem,s?.className,{"tabs__item--active":r===t}),children:n??t},t)}))})}function j(e){let{lazy:t,children:n,selectedValue:s}=e;const a=(Array.isArray(n)?n:[n]).filter(Boolean);if(t){const e=a.find((e=>e.props.value===s));return e?(0,r.cloneElement)(e,{className:(0,i.A)("margin-top--md",e.props.className)}):null}return(0,x.jsx)("div",{className:"margin-top--md",children:a.map(((e,t)=>(0,r.cloneElement)(e,{key:t,hidden:e.props.value!==s})))})}function y(e){const t=f(e);return(0,x.jsxs)("div",{className:(0,i.A)("tabs-container",b.tabList),children:[(0,x.jsx)(v,{...t,...e}),(0,x.jsx)(j,{...t,...e})]})}function A(e){const t=(0,g.A)();return(0,x.jsx)(y,{...e,children:d(e.children)},String(t))}},8453:(e,t,n)=>{n.d(t,{R:()=>a,x:()=>l});var r=n(6540);const i={},s=r.createContext(i);function a(e){const t=r.useContext(s);return r.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function l(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:a(e.components),r.createElement(s.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/6875c492.06721b70.js b/assets/js/6875c492.f3f253c5.js similarity index 96% rename from assets/js/6875c492.06721b70.js rename to assets/js/6875c492.f3f253c5.js index ad0afa26..95f47548 100644 --- a/assets/js/6875c492.06721b70.js +++ b/assets/js/6875c492.f3f253c5.js @@ -1 +1 @@ -"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[4813],{7713:(e,t,n)=>{n.d(t,{A:()=>r});n(6540);var i=n(1312),s=n(9022),a=n(4848);function r(e){const{metadata:t}=e,{previousPage:n,nextPage:r}=t;return(0,a.jsxs)("nav",{className:"pagination-nav","aria-label":(0,i.T)({id:"theme.blog.paginator.navAriaLabel",message:"Blog list page navigation",description:"The ARIA label for the blog pagination"}),children:[n&&(0,a.jsx)(s.A,{permalink:n,title:(0,a.jsx)(i.A,{id:"theme.blog.paginator.newerEntries",description:"The label used to navigate to the newer blog posts page (previous page)",children:"Newer Entries"})}),r&&(0,a.jsx)(s.A,{permalink:r,title:(0,a.jsx)(i.A,{id:"theme.blog.paginator.olderEntries",description:"The label used to navigate to the older blog posts page (next page)",children:"Older Entries"}),isNext:!0})]})}},3892:(e,t,n)=>{n.d(t,{A:()=>r});n(6540);var i=n(4096),s=n(1240),a=n(4848);function r(e){let{items:t,component:n=s.A}=e;return(0,a.jsx)(a.Fragment,{children:t.map((e=>{let{content:t}=e;return(0,a.jsx)(i.in,{content:t,children:(0,a.jsx)(n,{children:(0,a.jsx)(t,{})})},t.metadata.permalink)}))})}},1086:(e,t,n)=>{n.r(t),n.d(t,{default:()=>A});n(6540);var i=n(4164),s=n(1312),a=n(1213),r=n(7559),l=n(5846),o=n(4848);function c(){const{selectMessage:e}=(0,l.W)();return t=>e(t,(0,s.T)({id:"theme.blog.post.plurals",description:'Pluralized label for "{count} posts". Use as much plural forms (separated by "|") as your language support (see https://www.unicode.org/cldr/cldr-aux/charts/34/supplemental/language_plural_rules.html)',message:"One post|{count} posts"},{count:t}))}function d(e){const t=c();return(0,s.T)({id:"theme.blog.tagTitle",description:"The title of the page for a blog tag",message:'{nPosts} tagged with "{tagName}"'},{nPosts:t(e.count),tagName:e.label})}var g=n(8774),u=n(8027),h=n(7713),p=n(1463),m=n(3892),x=n(2234),b=n(1107);function j(e){let{tag:t}=e;const n=d(t);return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(a.be,{title:n,description:t.description}),(0,o.jsx)(p.A,{tag:"blog_tags_posts"})]})}function f(e){let{tag:t,items:n,sidebar:i,listMetadata:a}=e;const r=d(t);return(0,o.jsxs)(u.A,{sidebar:i,children:[t.unlisted&&(0,o.jsx)(x.A,{}),(0,o.jsxs)("header",{className:"margin-bottom--xl",children:[(0,o.jsx)(b.A,{as:"h1",children:r}),t.description&&(0,o.jsx)("p",{children:t.description}),(0,o.jsx)(g.A,{href:t.allTagsPath,children:(0,o.jsx)(s.A,{id:"theme.tags.tagsPageLink",description:"The label of the link targeting the tag list page",children:"View All Tags"})})]}),(0,o.jsx)(m.A,{items:n}),(0,o.jsx)(h.A,{metadata:a})]})}function A(e){return(0,o.jsxs)(a.e3,{className:(0,i.A)(r.G.wrapper.blogPages,r.G.page.blogTagPostListPage),children:[(0,o.jsx)(j,{...e}),(0,o.jsx)(f,{...e})]})}},2234:(e,t,n)=>{n.d(t,{A:()=>c});n(6540);var i=n(4164),s=n(4084),a=n(7559),r=n(7293),l=n(4848);function o(e){let{className:t}=e;return(0,l.jsx)(r.A,{type:"caution",title:(0,l.jsx)(s.Rc,{}),className:(0,i.A)(t,a.G.common.unlistedBanner),children:(0,l.jsx)(s.Uh,{})})}function c(e){return(0,l.jsxs)(l.Fragment,{children:[(0,l.jsx)(s.AE,{}),(0,l.jsx)(o,{...e})]})}},4084:(e,t,n)=>{n.d(t,{AE:()=>o,Rc:()=>r,TT:()=>d,Uh:()=>l,Yh:()=>c});n(6540);var i=n(1312),s=n(5260),a=n(4848);function r(){return(0,a.jsx)(i.A,{id:"theme.contentVisibility.unlistedBanner.title",description:"The unlisted content banner title",children:"Unlisted page"})}function l(){return(0,a.jsx)(i.A,{id:"theme.contentVisibility.unlistedBanner.message",description:"The unlisted content banner message",children:"This page is unlisted. Search engines will not index it, and only users having a direct link can access it."})}function o(){return(0,a.jsx)(s.A,{children:(0,a.jsx)("meta",{name:"robots",content:"noindex, nofollow"})})}function c(){return(0,a.jsx)(i.A,{id:"theme.contentVisibility.draftBanner.title",description:"The draft content banner title",children:"Draft page"})}function d(){return(0,a.jsx)(i.A,{id:"theme.contentVisibility.draftBanner.message",description:"The draft content banner message",children:"This page is a draft. It will only be visible in dev and be excluded from the production build."})}}}]); \ No newline at end of file +"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[4813],{7713:(e,t,n)=>{n.d(t,{A:()=>r});n(6540);var i=n(1312),s=n(9022),a=n(4848);function r(e){const{metadata:t}=e,{previousPage:n,nextPage:r}=t;return(0,a.jsxs)("nav",{className:"pagination-nav","aria-label":(0,i.T)({id:"theme.blog.paginator.navAriaLabel",message:"Blog list page navigation",description:"The ARIA label for the blog pagination"}),children:[n&&(0,a.jsx)(s.A,{permalink:n,title:(0,a.jsx)(i.A,{id:"theme.blog.paginator.newerEntries",description:"The label used to navigate to the newer blog posts page (previous page)",children:"Newer entries"})}),r&&(0,a.jsx)(s.A,{permalink:r,title:(0,a.jsx)(i.A,{id:"theme.blog.paginator.olderEntries",description:"The label used to navigate to the older blog posts page (next page)",children:"Older entries"}),isNext:!0})]})}},3892:(e,t,n)=>{n.d(t,{A:()=>r});n(6540);var i=n(4096),s=n(1240),a=n(4848);function r(e){let{items:t,component:n=s.A}=e;return(0,a.jsx)(a.Fragment,{children:t.map((e=>{let{content:t}=e;return(0,a.jsx)(i.in,{content:t,children:(0,a.jsx)(n,{children:(0,a.jsx)(t,{})})},t.metadata.permalink)}))})}},1086:(e,t,n)=>{n.r(t),n.d(t,{default:()=>A});n(6540);var i=n(4164),s=n(1312),a=n(1213),r=n(7559),l=n(5846),o=n(4848);function c(){const{selectMessage:e}=(0,l.W)();return t=>e(t,(0,s.T)({id:"theme.blog.post.plurals",description:'Pluralized label for "{count} posts". Use as much plural forms (separated by "|") as your language support (see https://www.unicode.org/cldr/cldr-aux/charts/34/supplemental/language_plural_rules.html)',message:"One post|{count} posts"},{count:t}))}function d(e){const t=c();return(0,s.T)({id:"theme.blog.tagTitle",description:"The title of the page for a blog tag",message:'{nPosts} tagged with "{tagName}"'},{nPosts:t(e.count),tagName:e.label})}var g=n(8774),u=n(8027),h=n(7713),p=n(1463),m=n(3892),x=n(2234),b=n(1107);function j(e){let{tag:t}=e;const n=d(t);return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(a.be,{title:n,description:t.description}),(0,o.jsx)(p.A,{tag:"blog_tags_posts"})]})}function f(e){let{tag:t,items:n,sidebar:i,listMetadata:a}=e;const r=d(t);return(0,o.jsxs)(u.A,{sidebar:i,children:[t.unlisted&&(0,o.jsx)(x.A,{}),(0,o.jsxs)("header",{className:"margin-bottom--xl",children:[(0,o.jsx)(b.A,{as:"h1",children:r}),t.description&&(0,o.jsx)("p",{children:t.description}),(0,o.jsx)(g.A,{href:t.allTagsPath,children:(0,o.jsx)(s.A,{id:"theme.tags.tagsPageLink",description:"The label of the link targeting the tag list page",children:"View All Tags"})})]}),(0,o.jsx)(m.A,{items:n}),(0,o.jsx)(h.A,{metadata:a})]})}function A(e){return(0,o.jsxs)(a.e3,{className:(0,i.A)(r.G.wrapper.blogPages,r.G.page.blogTagPostListPage),children:[(0,o.jsx)(j,{...e}),(0,o.jsx)(f,{...e})]})}},2234:(e,t,n)=>{n.d(t,{A:()=>c});n(6540);var i=n(4164),s=n(4084),a=n(7559),r=n(7293),l=n(4848);function o(e){let{className:t}=e;return(0,l.jsx)(r.A,{type:"caution",title:(0,l.jsx)(s.Rc,{}),className:(0,i.A)(t,a.G.common.unlistedBanner),children:(0,l.jsx)(s.Uh,{})})}function c(e){return(0,l.jsxs)(l.Fragment,{children:[(0,l.jsx)(s.AE,{}),(0,l.jsx)(o,{...e})]})}},4084:(e,t,n)=>{n.d(t,{AE:()=>o,Rc:()=>r,TT:()=>d,Uh:()=>l,Yh:()=>c});n(6540);var i=n(1312),s=n(5260),a=n(4848);function r(){return(0,a.jsx)(i.A,{id:"theme.contentVisibility.unlistedBanner.title",description:"The unlisted content banner title",children:"Unlisted page"})}function l(){return(0,a.jsx)(i.A,{id:"theme.contentVisibility.unlistedBanner.message",description:"The unlisted content banner message",children:"This page is unlisted. Search engines will not index it, and only users having a direct link can access it."})}function o(){return(0,a.jsx)(s.A,{children:(0,a.jsx)("meta",{name:"robots",content:"noindex, nofollow"})})}function c(){return(0,a.jsx)(i.A,{id:"theme.contentVisibility.draftBanner.title",description:"The draft content banner title",children:"Draft page"})}function d(){return(0,a.jsx)(i.A,{id:"theme.contentVisibility.draftBanner.message",description:"The draft content banner message",children:"This page is a draft. It will only be visible in dev and be excluded from the production build."})}}}]); \ No newline at end of file diff --git a/assets/js/7385c97b.466c08e3.js b/assets/js/7385c97b.052a7324.js similarity index 99% rename from assets/js/7385c97b.466c08e3.js rename to assets/js/7385c97b.052a7324.js index 451ce7e1..3026f83f 100644 --- a/assets/js/7385c97b.466c08e3.js +++ b/assets/js/7385c97b.052a7324.js @@ -1 +1 @@ -"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[8415],{5322:(e,i,s)=>{s.r(i),s.d(i,{assets:()=>l,contentTitle:()=>r,default:()=>h,frontMatter:()=>o,metadata:()=>a,toc:()=>c});var n=s(4848),t=s(8453);const o={title:"AVIF",sidebar_position:6},r="AVIF",a={id:"images/AVIF",title:"AVIF",description:"The content in this entry is incomplete & is in the process of being completed.",source:"@site/docs/images/AVIF.mdx",sourceDirName:"images",slug:"/images/AVIF",permalink:"/docs/images/AVIF",draft:!1,unlisted:!1,editUrl:"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/images/AVIF.mdx",tags:[],version:"current",sidebarPosition:6,frontMatter:{title:"AVIF",sidebar_position:6},sidebar:"tutorialSidebar",previous:{title:"JPEG 2000",permalink:"/docs/images/JPEG2000"},next:{title:"JPEG-XL",permalink:"/docs/images/JXL"}},l={},c=[{value:"Performance Checklist",id:"performance-checklist",level:2},{value:"Format Breakdown",id:"format-breakdown",level:2},{value:"Advantages",id:"advantages",level:3},{value:"Limitations",id:"limitations",level:3},{value:"Conclusion",id:"conclusion",level:2}];function d(e){const i={a:"a",admonition:"admonition",code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",p:"p",strong:"strong",ul:"ul",...(0,t.R)(),...e.components},{Details:s}=i;return s||function(e,i){throw new Error("Expected "+(i?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}("Details",!0),(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(i.header,{children:(0,n.jsx)(i.h1,{id:"avif",children:"AVIF"})}),"\n",(0,n.jsx)(i.admonition,{title:"Under Maintenance",type:"info",children:(0,n.jsx)(i.p,{children:"The content in this entry is incomplete & is in the process of being completed."})}),"\n",(0,n.jsxs)(i.p,{children:["AVIF, which stands for AV1 Image File Format, is a newer image codec that is based on the ",(0,n.jsx)(i.a,{href:"/docs/video/AV1",children:"AV1"})," video codec. AVIF supersedes ",(0,n.jsx)(i.a,{href:"/docs/images/HEIC",children:"HEIC"}),", & uses the same HEIF container as HEIC. AVIF is designed to have a better featureset & better general lossy compression than older image codecs, including ",(0,n.jsx)(i.a,{href:"/docs/images/WebP",children:"WebP"}),", HEIC, & ",(0,n.jsx)(i.a,{href:"/docs/images/JPEG",children:"JPEG"}),". AVIF is often compared to ",(0,n.jsx)(i.a,{href:"/docs/images/JXL",children:"JPEG-XL"}),", though in practice, the two have very different strengths."]}),"\n",(0,n.jsx)(i.p,{children:"There are two AVIF profiles available for encoding: Baseline & Advanced, which are based on AV1's Main & High profiles respectively. The AVIF Baseline profile supports up to 8,192*4,352 resolution specified by the requirement of using AV1 Level 5.1 or lower. Using tiling, it is possible to increase the maximum resolution of the AVIF Baseline profile to 65536*65536, although this hurts coding efficiency as visual anomalies may be encountered along the edges of the tile boundaries. AVIF is also limited to 10 bit color precision in its Baseline profile."}),"\n",(0,n.jsx)(i.p,{children:"In the AVIF Advanced profile, the maximum image dimensions extend to 16,384*8,704. Tiling may be used in the Advanced profile to create larger images, but the same limitations regarding visual artifacts apply. The AVIF Advanced profile extends the allowed AV1 Level to 6.0 or lower, & the highest bit depth offered by this profile is 12 BPC. It is worth noting that while it is currently a near certainty that AVIF implementations will support both the Baseline & Advanced profiles, this may not always be the case. This is a problem that affects HEIC currently, & is a known potential weakness of video-based image codecs."}),"\n",(0,n.jsx)(i.h2,{id:"performance-checklist",children:"Performance Checklist"}),"\n",(0,n.jsxs)(i.p,{children:["Lossless? ",(0,n.jsx)(i.em,{children:"Poorly"})]}),"\n",(0,n.jsxs)(i.p,{children:["Lossy? ",(0,n.jsx)(i.em,{children:"Yes"})]}),"\n",(0,n.jsxs)(i.p,{children:["Supported Bit Depths:\n",(0,n.jsx)(i.em,{children:"8 BPC, 10 BPC, 12 BPC"})]}),"\n",(0,n.jsxs)(i.p,{children:["HDR/Wide Gamut? ",(0,n.jsx)(i.em,{children:"Yes"})]}),"\n",(0,n.jsxs)(i.p,{children:["Animation? ",(0,n.jsx)(i.em,{children:"Yes"})]}),"\n",(0,n.jsxs)(i.p,{children:["Transparency? ",(0,n.jsx)(i.em,{children:"Yes"})]}),"\n",(0,n.jsxs)(i.p,{children:["Progressive Decode? ",(0,n.jsx)(i.em,{children:"No"})]}),"\n",(0,n.jsxs)(i.p,{children:["Royalty Free? ",(0,n.jsx)(i.em,{children:"Yes"})]}),"\n",(0,n.jsxs)(i.p,{children:[(0,n.jsx)(i.strong,{children:"Compatible Browsers"})," (full support)"]}),"\n",(0,n.jsxs)(i.ul,{children:["\n",(0,n.jsxs)(i.li,{children:["\n",(0,n.jsxs)(i.p,{children:[(0,n.jsx)(i.a,{href:"https://www.google.com/chrome/",children:"Google Chrome"})," 85+"]}),"\n"]}),"\n",(0,n.jsxs)(i.li,{children:["\n",(0,n.jsxs)(i.p,{children:[(0,n.jsx)(i.a,{href:"https://www.apple.com/safari/",children:"Safari"})," 16.4+"]}),"\n"]}),"\n",(0,n.jsxs)(i.li,{children:["\n",(0,n.jsxs)(i.p,{children:[(0,n.jsx)(i.a,{href:"https://www.mozilla.org/en-US/firefox/new/",children:"Firefox"})," 113+"]}),"\n"]}),"\n",(0,n.jsxs)(i.li,{children:["\n",(0,n.jsxs)(i.p,{children:[(0,n.jsx)(i.a,{href:"https://www.opera.com/",children:"Opera"})," 71+"]}),"\n"]}),"\n",(0,n.jsxs)(i.li,{children:["\n",(0,n.jsx)(i.p,{children:(0,n.jsx)(i.a,{href:"https://apps.gnome.org/app/org.gnome.Epiphany/",children:"GNOME Web"})}),"\n"]}),"\n",(0,n.jsxs)(i.li,{children:["\n",(0,n.jsx)(i.p,{children:(0,n.jsx)(i.a,{href:"https://thorium.rocks/",children:"Thorium"})}),"\n"]}),"\n",(0,n.jsxs)(i.li,{children:["\n",(0,n.jsx)(i.p,{children:(0,n.jsx)(i.a,{href:"https://thorium.rocks/mercury",children:"Mercury"})}),"\n"]}),"\n"]}),"\n",(0,n.jsx)(i.h2,{id:"format-breakdown",children:"Format Breakdown"}),"\n",(0,n.jsx)(i.h3,{id:"advantages",children:"Advantages"}),"\n",(0,n.jsx)(i.p,{children:"AVIF is known for its extremely strong lossy compression performance for non-photographic images as well as photographic images in the low to medium fidelity range. AVIF is consistently better than JPEG visually, except for with complex images that contain a lot of highly entropic data like random noise."}),"\n",(0,n.jsx)(i.p,{children:"AVIF compatibility has grown rapidly since its adoption in Google Chrome in 2020. For a relatively new image format, its level of penetration has been stellar, especially in the browser market. At this point in time, it would be a safe bet to ship AVIF images for your site given they compress better than JPEG & have older formats provided as fallbacks."}),"\n",(0,n.jsx)(i.p,{children:"AVIF's wider featureset enables new experiences through images, including HDR. AVIF also presents astonishing animation prowess, as it is capable of using AV1's inter-frame coding techniques which make it easily the best animated image format for most use cases where it is compatible."}),"\n",(0,n.jsx)(i.h3,{id:"limitations",children:"Limitations"}),"\n",(0,n.jsx)(i.p,{children:"AVIF encoding implementations are difficult to use, and images require much longer encoding times for what can be considered competitive quality. Making encoding more difficult, AVIF's use of intra-frame coding techniques that share data between blocks reduces parallelization capability & worsens generation loss. Theoretically, this improves coding efficiency, though. Via the AVIF Encoding section of the aomenc page:"}),"\n",(0,n.jsxs)(s,{children:[(0,n.jsx)("summary",{children:"AVIF Encoding with aomenc through avifenc"}),(0,n.jsxs)("div",{children:[(0,n.jsx)("p",{children:"Using aomenc through avifenc is widely considered to be the best way to encode AVIF images, as SVT-AV1 only supports 4:2:0 chroma subsampling, rav1e isn't fast enough for still images, & the libaom team have put more effort into intra coding than the teams responsible for producing the other prominent open source AV1 encoders."}),(0,n.jsx)("p",{children:"A sample command for encoding AVIF looks like this:"}),(0,n.jsx)("pre",{children:(0,n.jsx)("code",{children:"avifenc -c aom -s 4 -j 8 -d 10 -y 444 --min 1 --max 63 -a end-usage=q -a cq-level=16 -a tune=ssim [input] output.avif"})}),(0,n.jsx)("p",{children:"Where:"}),(0,n.jsxs)("ul",{children:[(0,n.jsxs)("li",{children:[(0,n.jsx)(i.code,{children:"-c aom"})," is the encoder"]}),(0,n.jsxs)("li",{children:[(0,n.jsx)(i.code,{children:"-s 4"})," is the speed. Speeds 4 & below offer the best compression quality at the expense of longer encode times."]}),(0,n.jsxs)("li",{children:[(0,n.jsx)(i.code,{children:"-j 8"})," is the number of threads the encoder is allowed to use. Increasing this past 12 will sometimes hurt encode times, as AVIF encoding via aomenc doesn't paralellize perfectly. Test using a speed benchmark to verify which value works best for you."]}),(0,n.jsxs)("li",{children:[(0,n.jsx)(i.code,{children:"-d 10"})," is the bit depth. Specifying a value below 10 isn't recommended, as it will hurt coding efficiency even with an 8 bit source image."]}),(0,n.jsxs)("li",{children:[(0,n.jsx)(i.code,{children:"-y 444"})," is the chroma subsampling mode. 4:4:4 chroma subsampling tends to provide better compression than 4:2:0 with AVIF, though on some images 4:2:0 chroma subsampling might be the better choice."]}),(0,n.jsxs)("li",{children:[(0,n.jsx)(i.code,{children:"cq-level=16"})," is how you specify quality. Lower values correspond to higher quality & filesize, while higher values mean a smaller, lower-quality output is desired. This is preceded by ",(0,n.jsx)(i.code,{children:"-a"})," because it is an aomenc option, not an avifenc one."]}),(0,n.jsxs)("li",{children:[(0,n.jsx)(i.code,{children:"tune=ssim"})," is how the encoder handles RDO (rate-distortion optimization). This may be redundant with the default aomenc parameters, but specifying doesn't hurt to avoid an unintended change if a default is modified sometime in the future."]})]})]})]}),"\n",(0,n.jsx)(i.p,{children:"Additionally, AVIF tends to be underwhelming at high fidelity with photographic images. Compared to older codecs it usually outperforms the competition, but since medium to high fidelity tends to be the target for a lot of modern web delivery, it is disappointing to see AVIF not performing as well here."}),"\n",(0,n.jsx)(i.p,{children:"AVIF also does not have progressive decode. This is a common weakness of video-based image codecs. While there is a hacky way to do progressive AVIF by encoding a low fidelity frame & then a high fidelity frame in an animated AVIF at a high framerate so the low fidelity frame is loaded & plays first, this is far from ideal for the average user & adds to an already burdensome encoding process. Additionally, this has issues with Firefox, which only recently got support for animated AVIF."}),"\n",(0,n.jsx)(i.p,{children:"Finally, AVIF's lossless mode is incredibly underwhelming, often producing larger files than PNG. When compressing losslessly, avoid AVIF entirely."}),"\n",(0,n.jsx)(i.h2,{id:"conclusion",children:"Conclusion"}),"\n",(0,n.jsx)(i.p,{children:"While AVIF is certainly promising, its shortcomings"})]})}function h(e={}){const{wrapper:i}={...(0,t.R)(),...e.components};return i?(0,n.jsx)(i,{...e,children:(0,n.jsx)(d,{...e})}):d(e)}},8453:(e,i,s)=>{s.d(i,{R:()=>r,x:()=>a});var n=s(6540);const t={},o=n.createContext(t);function r(e){const i=n.useContext(o);return n.useMemo((function(){return"function"==typeof e?e(i):{...i,...e}}),[i,e])}function a(e){let i;return i=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:r(e.components),n.createElement(o.Provider,{value:i},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[8415],{5322:(e,i,s)=>{s.r(i),s.d(i,{assets:()=>l,contentTitle:()=>r,default:()=>h,frontMatter:()=>o,metadata:()=>a,toc:()=>c});var n=s(4848),t=s(8453);const o={title:"AVIF",sidebar_position:6},r="AVIF",a={id:"images/AVIF",title:"AVIF",description:"The content in this entry is incomplete & is in the process of being completed.",source:"@site/docs/images/AVIF.mdx",sourceDirName:"images",slug:"/images/AVIF",permalink:"/docs/images/AVIF",draft:!1,unlisted:!1,editUrl:"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/images/AVIF.mdx",tags:[],version:"current",sidebarPosition:6,frontMatter:{title:"AVIF",sidebar_position:6},sidebar:"tutorialSidebar",previous:{title:"JPEG 2000",permalink:"/docs/images/JPEG2000"},next:{title:"JPEG XL",permalink:"/docs/images/JXL"}},l={},c=[{value:"Performance Checklist",id:"performance-checklist",level:2},{value:"Format Breakdown",id:"format-breakdown",level:2},{value:"Advantages",id:"advantages",level:3},{value:"Limitations",id:"limitations",level:3},{value:"Conclusion",id:"conclusion",level:2}];function d(e){const i={a:"a",admonition:"admonition",code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",p:"p",strong:"strong",ul:"ul",...(0,t.R)(),...e.components},{Details:s}=i;return s||function(e,i){throw new Error("Expected "+(i?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}("Details",!0),(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(i.header,{children:(0,n.jsx)(i.h1,{id:"avif",children:"AVIF"})}),"\n",(0,n.jsx)(i.admonition,{title:"Under Maintenance",type:"info",children:(0,n.jsx)(i.p,{children:"The content in this entry is incomplete & is in the process of being completed."})}),"\n",(0,n.jsxs)(i.p,{children:["AVIF, which stands for AV1 Image File Format, is a newer image codec that is based on the ",(0,n.jsx)(i.a,{href:"/docs/video/AV1",children:"AV1"})," video codec. AVIF supersedes ",(0,n.jsx)(i.a,{href:"/docs/images/HEIC",children:"HEIC"}),", & uses the same HEIF container as HEIC. AVIF is designed to have a better featureset & better general lossy compression than older image codecs, including ",(0,n.jsx)(i.a,{href:"/docs/images/WebP",children:"WebP"}),", HEIC, & ",(0,n.jsx)(i.a,{href:"/docs/images/JPEG",children:"JPEG"}),". AVIF is often compared to ",(0,n.jsx)(i.a,{href:"/docs/images/JXL",children:"JPEG-XL"}),", though in practice, the two have very different strengths."]}),"\n",(0,n.jsx)(i.p,{children:"There are two AVIF profiles available for encoding: Baseline & Advanced, which are based on AV1's Main & High profiles respectively. The AVIF Baseline profile supports up to 8,192*4,352 resolution specified by the requirement of using AV1 Level 5.1 or lower. Using tiling, it is possible to increase the maximum resolution of the AVIF Baseline profile to 65536*65536, although this hurts coding efficiency as visual anomalies may be encountered along the edges of the tile boundaries. AVIF is also limited to 10 bit color precision in its Baseline profile."}),"\n",(0,n.jsx)(i.p,{children:"In the AVIF Advanced profile, the maximum image dimensions extend to 16,384*8,704. Tiling may be used in the Advanced profile to create larger images, but the same limitations regarding visual artifacts apply. The AVIF Advanced profile extends the allowed AV1 Level to 6.0 or lower, & the highest bit depth offered by this profile is 12 BPC. It is worth noting that while it is currently a near certainty that AVIF implementations will support both the Baseline & Advanced profiles, this may not always be the case. This is a problem that affects HEIC currently, & is a known potential weakness of video-based image codecs."}),"\n",(0,n.jsx)(i.h2,{id:"performance-checklist",children:"Performance Checklist"}),"\n",(0,n.jsxs)(i.p,{children:["Lossless? ",(0,n.jsx)(i.em,{children:"Poorly"})]}),"\n",(0,n.jsxs)(i.p,{children:["Lossy? ",(0,n.jsx)(i.em,{children:"Yes"})]}),"\n",(0,n.jsxs)(i.p,{children:["Supported Bit Depths:\n",(0,n.jsx)(i.em,{children:"8 BPC, 10 BPC, 12 BPC"})]}),"\n",(0,n.jsxs)(i.p,{children:["HDR/Wide Gamut? ",(0,n.jsx)(i.em,{children:"Yes"})]}),"\n",(0,n.jsxs)(i.p,{children:["Animation? ",(0,n.jsx)(i.em,{children:"Yes"})]}),"\n",(0,n.jsxs)(i.p,{children:["Transparency? ",(0,n.jsx)(i.em,{children:"Yes"})]}),"\n",(0,n.jsxs)(i.p,{children:["Progressive Decode? ",(0,n.jsx)(i.em,{children:"No"})]}),"\n",(0,n.jsxs)(i.p,{children:["Royalty Free? ",(0,n.jsx)(i.em,{children:"Yes"})]}),"\n",(0,n.jsxs)(i.p,{children:[(0,n.jsx)(i.strong,{children:"Compatible Browsers"})," (full support)"]}),"\n",(0,n.jsxs)(i.ul,{children:["\n",(0,n.jsxs)(i.li,{children:["\n",(0,n.jsxs)(i.p,{children:[(0,n.jsx)(i.a,{href:"https://www.google.com/chrome/",children:"Google Chrome"})," 85+"]}),"\n"]}),"\n",(0,n.jsxs)(i.li,{children:["\n",(0,n.jsxs)(i.p,{children:[(0,n.jsx)(i.a,{href:"https://www.apple.com/safari/",children:"Safari"})," 16.4+"]}),"\n"]}),"\n",(0,n.jsxs)(i.li,{children:["\n",(0,n.jsxs)(i.p,{children:[(0,n.jsx)(i.a,{href:"https://www.mozilla.org/en-US/firefox/new/",children:"Firefox"})," 113+"]}),"\n"]}),"\n",(0,n.jsxs)(i.li,{children:["\n",(0,n.jsxs)(i.p,{children:[(0,n.jsx)(i.a,{href:"https://www.opera.com/",children:"Opera"})," 71+"]}),"\n"]}),"\n",(0,n.jsxs)(i.li,{children:["\n",(0,n.jsx)(i.p,{children:(0,n.jsx)(i.a,{href:"https://apps.gnome.org/app/org.gnome.Epiphany/",children:"GNOME Web"})}),"\n"]}),"\n",(0,n.jsxs)(i.li,{children:["\n",(0,n.jsx)(i.p,{children:(0,n.jsx)(i.a,{href:"https://thorium.rocks/",children:"Thorium"})}),"\n"]}),"\n",(0,n.jsxs)(i.li,{children:["\n",(0,n.jsx)(i.p,{children:(0,n.jsx)(i.a,{href:"https://thorium.rocks/mercury",children:"Mercury"})}),"\n"]}),"\n"]}),"\n",(0,n.jsx)(i.h2,{id:"format-breakdown",children:"Format Breakdown"}),"\n",(0,n.jsx)(i.h3,{id:"advantages",children:"Advantages"}),"\n",(0,n.jsx)(i.p,{children:"AVIF is known for its extremely strong lossy compression performance for non-photographic images as well as photographic images in the low to medium fidelity range. AVIF is consistently better than JPEG visually, except for with complex images that contain a lot of highly entropic data like random noise."}),"\n",(0,n.jsx)(i.p,{children:"AVIF compatibility has grown rapidly since its adoption in Google Chrome in 2020. For a relatively new image format, its level of penetration has been stellar, especially in the browser market. At this point in time, it would be a safe bet to ship AVIF images for your site given they compress better than JPEG & have older formats provided as fallbacks."}),"\n",(0,n.jsx)(i.p,{children:"AVIF's wider featureset enables new experiences through images, including HDR. AVIF also presents astonishing animation prowess, as it is capable of using AV1's inter-frame coding techniques which make it easily the best animated image format for most use cases where it is compatible."}),"\n",(0,n.jsx)(i.h3,{id:"limitations",children:"Limitations"}),"\n",(0,n.jsx)(i.p,{children:"AVIF encoding implementations are difficult to use, and images require much longer encoding times for what can be considered competitive quality. Making encoding more difficult, AVIF's use of intra-frame coding techniques that share data between blocks reduces parallelization capability & worsens generation loss. Theoretically, this improves coding efficiency, though. Via the AVIF Encoding section of the aomenc page:"}),"\n",(0,n.jsxs)(s,{children:[(0,n.jsx)("summary",{children:"AVIF Encoding with aomenc through avifenc"}),(0,n.jsxs)("div",{children:[(0,n.jsx)("p",{children:"Using aomenc through avifenc is widely considered to be the best way to encode AVIF images, as SVT-AV1 only supports 4:2:0 chroma subsampling, rav1e isn't fast enough for still images, & the libaom team have put more effort into intra coding than the teams responsible for producing the other prominent open source AV1 encoders."}),(0,n.jsx)("p",{children:"A sample command for encoding AVIF looks like this:"}),(0,n.jsx)("pre",{children:(0,n.jsx)("code",{children:"avifenc -c aom -s 4 -j 8 -d 10 -y 444 --min 1 --max 63 -a end-usage=q -a cq-level=16 -a tune=ssim [input] output.avif"})}),(0,n.jsx)("p",{children:"Where:"}),(0,n.jsxs)("ul",{children:[(0,n.jsxs)("li",{children:[(0,n.jsx)(i.code,{children:"-c aom"})," is the encoder"]}),(0,n.jsxs)("li",{children:[(0,n.jsx)(i.code,{children:"-s 4"})," is the speed. Speeds 4 & below offer the best compression quality at the expense of longer encode times."]}),(0,n.jsxs)("li",{children:[(0,n.jsx)(i.code,{children:"-j 8"})," is the number of threads the encoder is allowed to use. Increasing this past 12 will sometimes hurt encode times, as AVIF encoding via aomenc doesn't paralellize perfectly. Test using a speed benchmark to verify which value works best for you."]}),(0,n.jsxs)("li",{children:[(0,n.jsx)(i.code,{children:"-d 10"})," is the bit depth. Specifying a value below 10 isn't recommended, as it will hurt coding efficiency even with an 8 bit source image."]}),(0,n.jsxs)("li",{children:[(0,n.jsx)(i.code,{children:"-y 444"})," is the chroma subsampling mode. 4:4:4 chroma subsampling tends to provide better compression than 4:2:0 with AVIF, though on some images 4:2:0 chroma subsampling might be the better choice."]}),(0,n.jsxs)("li",{children:[(0,n.jsx)(i.code,{children:"cq-level=16"})," is how you specify quality. Lower values correspond to higher quality & filesize, while higher values mean a smaller, lower-quality output is desired. This is preceded by ",(0,n.jsx)(i.code,{children:"-a"})," because it is an aomenc option, not an avifenc one."]}),(0,n.jsxs)("li",{children:[(0,n.jsx)(i.code,{children:"tune=ssim"})," is how the encoder handles RDO (rate-distortion optimization). This may be redundant with the default aomenc parameters, but specifying doesn't hurt to avoid an unintended change if a default is modified sometime in the future."]})]})]})]}),"\n",(0,n.jsx)(i.p,{children:"Additionally, AVIF tends to be underwhelming at high fidelity with photographic images. Compared to older codecs it usually outperforms the competition, but since medium to high fidelity tends to be the target for a lot of modern web delivery, it is disappointing to see AVIF not performing as well here."}),"\n",(0,n.jsx)(i.p,{children:"AVIF also does not have progressive decode. This is a common weakness of video-based image codecs. While there is a hacky way to do progressive AVIF by encoding a low fidelity frame & then a high fidelity frame in an animated AVIF at a high framerate so the low fidelity frame is loaded & plays first, this is far from ideal for the average user & adds to an already burdensome encoding process. Additionally, this has issues with Firefox, which only recently got support for animated AVIF."}),"\n",(0,n.jsx)(i.p,{children:"Finally, AVIF's lossless mode is incredibly underwhelming, often producing larger files than PNG. When compressing losslessly, avoid AVIF entirely."}),"\n",(0,n.jsx)(i.h2,{id:"conclusion",children:"Conclusion"}),"\n",(0,n.jsx)(i.p,{children:"While AVIF is certainly promising, its shortcomings"})]})}function h(e={}){const{wrapper:i}={...(0,t.R)(),...e.components};return i?(0,n.jsx)(i,{...e,children:(0,n.jsx)(d,{...e})}):d(e)}},8453:(e,i,s)=>{s.d(i,{R:()=>r,x:()=>a});var n=s(6540);const t={},o=n.createContext(t);function r(e){const i=n.useContext(o);return n.useMemo((function(){return"function"==typeof e?e(i):{...i,...e}}),[i,e])}function a(e){let i;return i=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:r(e.components),n.createElement(o.Provider,{value:i},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/841b1305.53ef11ac.js b/assets/js/841b1305.53ef11ac.js deleted file mode 100644 index 01981291..00000000 --- a/assets/js/841b1305.53ef11ac.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[9939],{7026:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>u,contentTitle:()=>l,default:()=>p,frontMatter:()=>o,metadata:()=>c,toc:()=>d});var s=t(4848),r=t(8453),i=t(1470),a=t(9365);const o={title:"uavs3e",sidebar_position:20,keywords:["avs3","encoding","video encoding"]},l="uavs3e",c={id:"encoders/uavs3e",title:"uavs3e",description:"uavs3e is an open-source encoder for the AVS3 codec. It was developed by Chinese research institutions, including Peking University Shenzhen Graduate School, Peng Cheng Laboratory, and Guangdong Bohua UHD Innovation Corporation.",source:"@site/docs/encoders/uavs3e.mdx",sourceDirName:"encoders",slug:"/encoders/uavs3e",permalink:"/docs/encoders/uavs3e",draft:!1,unlisted:!1,editUrl:"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/encoders/uavs3e.mdx",tags:[],version:"current",sidebarPosition:20,frontMatter:{title:"uavs3e",sidebar_position:20,keywords:["avs3","encoding","video encoding"]},sidebar:"tutorialSidebar",previous:{title:"aom-psy101",permalink:"/docs/encoders/aom-psy101"},next:{title:"NVENC",permalink:"/docs/encoders_hw/nvenc"}},u={},d=[{value:"Installation",id:"installation",level:2},{value:"10-bit Support",id:"10-bit-support",level:3},{value:"10-bit Support",id:"10-bit-support-1",level:3},{value:"Usage",id:"usage",level:2},{value:"Notes",id:"notes",level:2}];function h(e){const n={a:"a",code:"code",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",ol:"ol",p:"p",pre:"pre",ul:"ul",...(0,r.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(n.header,{children:(0,s.jsx)(n.h1,{id:"uavs3e",children:"uavs3e"})}),"\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.code,{children:"[uavs3e](https://github.com/uavs3/uavs3e/)"})," is an open-source encoder for the ",(0,s.jsx)(n.a,{href:"/docs/video/AVS3",children:"AVS3"})," codec. It was developed by Chinese research institutions, including Peking University Shenzhen Graduate School, Peng Cheng Laboratory, and Guangdong Bohua UHD Innovation Corporation."]}),"\n",(0,s.jsx)(n.p,{children:"The encoder is infrequently updated, which may lead to bugs & compilation issues. It supports AMD64 with AVX2, ARM with NEON, and LoongArch CPUs."}),"\n",(0,s.jsx)(n.h2,{id:"installation",children:"Installation"}),"\n",(0,s.jsxs)(i.A,{children:[(0,s.jsxs)(a.A,{value:"unixlike",label:"Linux & macOS",children:[(0,s.jsx)(n.p,{children:"The developers do not provide pre-built binaries of their encoder, so you'll need to compile it yourself."}),(0,s.jsxs)(n.p,{children:["Compilation requires GNU Make and CMake. As of August 2024, ",(0,s.jsx)(n.code,{children:"uavs3e"})," doesn't compile with GCC 14. Using Clang 18 instead of GCC resolves this issue."]}),(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"git clone https://github.com/uavs3/uavs3e.git\ncd uavs3e\nmkdir build/linux && cd build/linux\ncmake ../.. -DCOMPILE_10BIT=0 -DCMAKE_C_COMPILER=clang -DCMAKE_CXX_COMPILER=clang++\nmake -j 8\n"})}),(0,s.jsxs)(n.p,{children:["If you encounter undefined calls to ",(0,s.jsx)(n.code,{children:"close"})," or ",(0,s.jsx)(n.code,{children:"lseek64"})," functions, add the following two lines at the top of the ",(0,s.jsx)(n.code,{children:"test/utest.c"})," file:"]}),(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-c",children:"#define _LARGEFILE64_SOURCE\n#include \n"})}),(0,s.jsxs)(n.p,{children:["Binaries will be available in the ",(0,s.jsx)(n.code,{children:"build/linux"})," folder. On Linux, you can run ",(0,s.jsx)(n.code,{children:"make install"})," to install the encoder (may require elevated permissions)."]}),(0,s.jsx)(n.h3,{id:"10-bit-support",children:"10-bit Support"}),(0,s.jsxs)(n.p,{children:["To enable 10-bit support, set ",(0,s.jsx)(n.code,{children:"-DCOMPILE_10BIT=1"})," in the CMake command. However, the encoder compiled with this flag has been reported to ",(0,s.jsx)(n.a,{href:"https://github.com/uavs3/uavs3e/issues/53",children:"cause segmentation faults on some systems"}),"."]})]}),(0,s.jsxs)(a.A,{value:"windows",label:"Windows",children:[(0,s.jsxs)(n.ol,{children:["\n",(0,s.jsx)(n.li,{children:"Ensure you have the following prerequisites installed before starting the build process:"}),"\n"]}),(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.a,{href:"https://visualstudio.microsoft.com/visual-cpp-build-tools/",children:"Microsoft C++ Build Tools"}),': Select "Desktop development with C++".']}),"\n",(0,s.jsx)(n.li,{children:(0,s.jsx)(n.a,{href:"https://git-scm.com/download/win",children:"Git"})}),"\n"]}),(0,s.jsxs)(n.ol,{start:"2",children:["\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsx)(n.p,{children:"Open Developer PowerShell for VS 2022."}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsx)(n.p,{children:"Run the following commands:"}),"\n"]}),"\n"]}),(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"git clone https://github.com/uavs3/uavs3e.git\ncd uavs3e\n.\\version.bat\ncd build\\x86_windows\ndevenv uavs3e.sln /Upgrade\nmsbuild uavs3e.sln /p:Configuration=Release /p:WindowsTargetPlatformVersion=10.0\n"})}),(0,s.jsxs)(n.p,{children:["Binaries will be available in the ",(0,s.jsx)(n.code,{children:"bin"})," folder."]}),(0,s.jsx)(n.h3,{id:"10-bit-support-1",children:"10-bit Support"}),(0,s.jsxs)(n.p,{children:["To enable 10-bit support, change the line ",(0,s.jsx)(n.code,{children:"#define COMPILE_10BIT 0"})," to ",(0,s.jsx)(n.code,{children:"#define COMPILE_10BIT 1"})," in the ",(0,s.jsx)(n.code,{children:"inc/com_api.h"})," file."]})]})]}),"\n",(0,s.jsx)(n.h2,{id:"usage",children:"Usage"}),"\n",(0,s.jsxs)(n.p,{children:["The encoder cannot parse ",(0,s.jsx)(n.code,{children:".y4m"})," files, so they need to be converted to the raw video (",(0,s.jsx)(n.code,{children:".yuv"}),") format."]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",metastring:'title="Simple 8-bit FHD 23.976 fps input with QP 20 and raw avs3 bitstream output"',children:"uavs3enc -i input.yuv -w 1920 -h 1080 -d 8 --fps_num 24000 --fps_den 1001 -q 20 -o output.avs3\n"})}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",metastring:'title="Speed 2, CRF 20, intra period 120, multithreaded"',children:"uavs3enc -i input.yuv -w 1920 -h 1080 -d 8 --fps_num 24000 --fps_den 1001 -p 120 --wpp_threads 8 --frm_threads 8 --speed_level 2 --rc_type 1 -q 20 -o output.avs3\n"})}),"\n",(0,s.jsxs)(n.p,{children:["Currently, uavs3e ",(0,s.jsx)(n.a,{href:"https://github.com/uavs3/uavs3e/issues/2",children:"does not support piping"}),"."]}),"\n",(0,s.jsx)(n.h2,{id:"notes",children:"Notes"}),"\n",(0,s.jsxs)(n.ol,{children:["\n",(0,s.jsx)(n.li,{children:"Usable speed presets range from 0 to 4, where 0 is the slowest and 4 is the fastest."}),"\n",(0,s.jsxs)(n.li,{children:["The encoder can be quite competitive, even compared to the newest ",(0,s.jsx)(n.a,{href:"/docs/video/AV1",children:"AV1"})," and ",(0,s.jsx)(n.a,{href:"/docs/video/VVC",children:"VVC"})," encoders in terms of visual fidelity."]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"uavs3d"})," can be used to decode the output bitstream. For real-time playback, you need to have ",(0,s.jsx)(n.a,{href:"/docs/utilities/ffmpeg",children:"FFmpeg"})," compiled with ",(0,s.jsx)(n.code,{children:"--enable-libuavs3d"}),"."]}),"\n"]})]})}function p(e={}){const{wrapper:n}={...(0,r.R)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(h,{...e})}):h(e)}},9365:(e,n,t)=>{t.d(n,{A:()=>a});t(6540);var s=t(4164);const r={tabItem:"tabItem_Ymn6"};var i=t(4848);function a(e){let{children:n,hidden:t,className:a}=e;return(0,i.jsx)("div",{role:"tabpanel",className:(0,s.A)(r.tabItem,a),hidden:t,children:n})}},1470:(e,n,t)=>{t.d(n,{A:()=>y});var s=t(6540),r=t(4164),i=t(3104),a=t(6347),o=t(205),l=t(7485),c=t(1682),u=t(679);function d(e){return s.Children.toArray(e).filter((e=>"\n"!==e)).map((e=>{if(!e||(0,s.isValidElement)(e)&&function(e){const{props:n}=e;return!!n&&"object"==typeof n&&"value"in n}(e))return e;throw new Error(`Docusaurus error: Bad child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the component should be , and every should have a unique "value" prop.`)}))?.filter(Boolean)??[]}function h(e){const{values:n,children:t}=e;return(0,s.useMemo)((()=>{const e=n??function(e){return d(e).map((e=>{let{props:{value:n,label:t,attributes:s,default:r}}=e;return{value:n,label:t,attributes:s,default:r}}))}(t);return function(e){const n=(0,c.XI)(e,((e,n)=>e.value===n.value));if(n.length>0)throw new Error(`Docusaurus error: Duplicate values "${n.map((e=>e.value)).join(", ")}" found in . Every value needs to be unique.`)}(e),e}),[n,t])}function p(e){let{value:n,tabValues:t}=e;return t.some((e=>e.value===n))}function v(e){let{queryString:n=!1,groupId:t}=e;const r=(0,a.W6)(),i=function(e){let{queryString:n=!1,groupId:t}=e;if("string"==typeof n)return n;if(!1===n)return null;if(!0===n&&!t)throw new Error('Docusaurus error: The component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return t??null}({queryString:n,groupId:t});return[(0,l.aZ)(i),(0,s.useCallback)((e=>{if(!i)return;const n=new URLSearchParams(r.location.search);n.set(i,e),r.replace({...r.location,search:n.toString()})}),[i,r])]}function m(e){const{defaultValue:n,queryString:t=!1,groupId:r}=e,i=h(e),[a,l]=(0,s.useState)((()=>function(e){let{defaultValue:n,tabValues:t}=e;if(0===t.length)throw new Error("Docusaurus error: the component requires at least one children component");if(n){if(!p({value:n,tabValues:t}))throw new Error(`Docusaurus error: The has a defaultValue "${n}" but none of its children has the corresponding value. Available values are: ${t.map((e=>e.value)).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return n}const s=t.find((e=>e.default))??t[0];if(!s)throw new Error("Unexpected error: 0 tabValues");return s.value}({defaultValue:n,tabValues:i}))),[c,d]=v({queryString:t,groupId:r}),[m,b]=function(e){let{groupId:n}=e;const t=function(e){return e?`docusaurus.tab.${e}`:null}(n),[r,i]=(0,u.Dv)(t);return[r,(0,s.useCallback)((e=>{t&&i.set(e)}),[t,i])]}({groupId:r}),f=(()=>{const e=c??m;return p({value:e,tabValues:i})?e:null})();(0,o.A)((()=>{f&&l(f)}),[f]);return{selectedValue:a,selectValue:(0,s.useCallback)((e=>{if(!p({value:e,tabValues:i}))throw new Error(`Can't select invalid tab value=${e}`);l(e),d(e),b(e)}),[d,b,i]),tabValues:i}}var b=t(2303);const f={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};var x=t(4848);function g(e){let{className:n,block:t,selectedValue:s,selectValue:a,tabValues:o}=e;const l=[],{blockElementScrollPositionUntilNextRender:c}=(0,i.a_)(),u=e=>{const n=e.currentTarget,t=l.indexOf(n),r=o[t].value;r!==s&&(c(n),a(r))},d=e=>{let n=null;switch(e.key){case"Enter":u(e);break;case"ArrowRight":{const t=l.indexOf(e.currentTarget)+1;n=l[t]??l[0];break}case"ArrowLeft":{const t=l.indexOf(e.currentTarget)-1;n=l[t]??l[l.length-1];break}}n?.focus()};return(0,x.jsx)("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,r.A)("tabs",{"tabs--block":t},n),children:o.map((e=>{let{value:n,label:t,attributes:i}=e;return(0,x.jsx)("li",{role:"tab",tabIndex:s===n?0:-1,"aria-selected":s===n,ref:e=>l.push(e),onKeyDown:d,onClick:u,...i,className:(0,r.A)("tabs__item",f.tabItem,i?.className,{"tabs__item--active":s===n}),children:t??n},n)}))})}function j(e){let{lazy:n,children:t,selectedValue:i}=e;const a=(Array.isArray(t)?t:[t]).filter(Boolean);if(n){const e=a.find((e=>e.props.value===i));return e?(0,s.cloneElement)(e,{className:(0,r.A)("margin-top--md",e.props.className)}):null}return(0,x.jsx)("div",{className:"margin-top--md",children:a.map(((e,n)=>(0,s.cloneElement)(e,{key:n,hidden:e.props.value!==i})))})}function w(e){const n=m(e);return(0,x.jsxs)("div",{className:(0,r.A)("tabs-container",f.tabList),children:[(0,x.jsx)(g,{...n,...e}),(0,x.jsx)(j,{...n,...e})]})}function y(e){const n=(0,b.A)();return(0,x.jsx)(w,{...e,children:d(e.children)},String(n))}},8453:(e,n,t)=>{t.d(n,{R:()=>a,x:()=>o});var s=t(6540);const r={},i=s.createContext(r);function a(e){const n=s.useContext(i);return s.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function o(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:a(e.components),s.createElement(i.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/841b1305.92aedeb8.js b/assets/js/841b1305.92aedeb8.js new file mode 100644 index 00000000..02fb8454 --- /dev/null +++ b/assets/js/841b1305.92aedeb8.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[9939],{7026:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>u,contentTitle:()=>l,default:()=>p,frontMatter:()=>o,metadata:()=>c,toc:()=>d});var s=t(4848),r=t(8453),i=t(1470),a=t(9365);const o={title:"uavs3e",sidebar_position:20,keywords:["avs3","encoding","video encoding"]},l="uavs3e",c={id:"encoders/uavs3e",title:"uavs3e",description:"uavs3e is an open-source encoder for the AVS3 codec, developed by Chinese research institutions including Peking University Shenzhen Graduate School, Peng Cheng Laboratory, and Guangdong Bohua UHD Innovation Corporation.",source:"@site/docs/encoders/uavs3e.mdx",sourceDirName:"encoders",slug:"/encoders/uavs3e",permalink:"/docs/encoders/uavs3e",draft:!1,unlisted:!1,editUrl:"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/encoders/uavs3e.mdx",tags:[],version:"current",sidebarPosition:20,frontMatter:{title:"uavs3e",sidebar_position:20,keywords:["avs3","encoding","video encoding"]},sidebar:"tutorialSidebar",previous:{title:"aom-psy101",permalink:"/docs/encoders/aom-psy101"},next:{title:"NVENC",permalink:"/docs/encoders_hw/nvenc"}},u={},d=[{value:"Installation",id:"installation",level:2},{value:"10-bit Support",id:"10-bit-support",level:3},{value:"Usage",id:"usage",level:2},{value:"Notes",id:"notes",level:2}];function h(e){const n={a:"a",code:"code",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",ol:"ol",p:"p",pre:"pre",ul:"ul",...(0,r.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(n.header,{children:(0,s.jsx)(n.h1,{id:"uavs3e",children:"uavs3e"})}),"\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.a,{href:"https://github.com/uavs3/uavs3e/",children:"uavs3e"})," is an open-source encoder for the ",(0,s.jsx)(n.a,{href:"/docs/video/AVS3",children:"AVS3"})," codec, developed by Chinese research institutions including Peking University Shenzhen Graduate School, Peng Cheng Laboratory, and Guangdong Bohua UHD Innovation Corporation."]}),"\n",(0,s.jsx)(n.p,{children:"The encoder receives infrequent updates, which may result in bugs and compilation issues. It supports AMD64 with AVX2, ARM with NEON, and LoongArch CPUs."}),"\n",(0,s.jsx)(n.h2,{id:"installation",children:"Installation"}),"\n",(0,s.jsxs)(i.A,{children:[(0,s.jsxs)(a.A,{value:"unixlike",label:"Linux & macOS",children:[(0,s.jsxs)(n.p,{children:["The developers do not provide pre-built binaries, so you'll need to compile it yourself. Compilation requires GNU Make and CMake. As of August 2024, ",(0,s.jsx)(n.code,{children:"uavs3e"})," does not compile with GCC 14, using Clang 18 instead resolves this issue."]}),(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"git clone https://github.com/uavs3/uavs3e.git\ncd uavs3e\nmkdir build/linux && cd build/linux\ncmake ../.. -DCOMPILE_10BIT=0 -DCMAKE_C_COMPILER=clang -DCMAKE_CXX_COMPILER=clang++\nmake -j 8\n"})}),(0,s.jsxs)(n.p,{children:["If you encounter undefined calls to ",(0,s.jsx)(n.code,{children:"close"})," or ",(0,s.jsx)(n.code,{children:"lseek64"})," functions, add the following two lines at the top of the ",(0,s.jsx)(n.code,{children:"test/utest.c"})," file:"]}),(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-c",children:"#define _LARGEFILE64_SOURCE\n#include \n"})}),(0,s.jsxs)(n.p,{children:["Binaries will be available in the ",(0,s.jsx)(n.code,{children:"build/linux"})," folder. On Linux, you can run ",(0,s.jsx)(n.code,{children:"make install"})," to install the encoder (may require elevated permissions)."]})]}),(0,s.jsxs)(a.A,{value:"windows",label:"Windows",children:[(0,s.jsxs)(n.ol,{children:["\n",(0,s.jsx)(n.li,{children:"Ensure you have the following prerequisites installed before starting the build process:"}),"\n"]}),(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.a,{href:"https://visualstudio.microsoft.com/visual-cpp-build-tools/",children:"Microsoft C++ Build Tools"}),': Select "Desktop development with C++".']}),"\n",(0,s.jsx)(n.li,{children:(0,s.jsx)(n.a,{href:"https://git-scm.com/download/win",children:"Git"})}),"\n"]}),(0,s.jsxs)(n.ol,{start:"2",children:["\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsx)(n.p,{children:"Open Developer PowerShell for VS 2022."}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsx)(n.p,{children:"Run the following commands:"}),"\n"]}),"\n"]}),(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"git clone https://github.com/uavs3/uavs3e.git\ncd uavs3e\n.\\version.bat\ncd build\\x86_windows\ndevenv uavs3e.sln /Upgrade\nmsbuild uavs3e.sln /p:Configuration=Release /p:WindowsTargetPlatformVersion=10.0\n"})}),(0,s.jsxs)(n.p,{children:["Binaries will be available in the ",(0,s.jsx)(n.code,{children:"bin"})," folder."]})]})]}),"\n",(0,s.jsx)(n.h3,{id:"10-bit-support",children:"10-bit Support"}),"\n",(0,s.jsxs)(i.A,{children:[(0,s.jsx)(a.A,{value:"unixlike",label:"Linux & macOS",children:(0,s.jsxs)(n.p,{children:["To enable 10-bit support, set ",(0,s.jsx)(n.code,{children:"-DCOMPILE_10BIT=1"})," in the CMake command. However, the encoder compiled with this flag has been reported to cause ",(0,s.jsx)(n.a,{href:"https://github.com/uavs3/uavs3e/issues/53",children:"segmentation faults"})," on some systems."]})}),(0,s.jsx)(a.A,{value:"windows",label:"Windows",children:(0,s.jsxs)(n.p,{children:["To enable 10-bit support, change the line ",(0,s.jsx)(n.code,{children:"#define COMPILE_10BIT 0"})," to ",(0,s.jsx)(n.code,{children:"#define COMPILE_10BIT 1"})," in the ",(0,s.jsx)(n.code,{children:"inc/com_api.h"})," file."]})})]}),"\n",(0,s.jsx)(n.h2,{id:"usage",children:"Usage"}),"\n",(0,s.jsxs)(n.p,{children:["The encoder cannot parse ",(0,s.jsx)(n.code,{children:".y4m"})," files, they need to be converted to raw video (",(0,s.jsx)(n.code,{children:".yuv"}),") format."]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",metastring:'title="Simple 8-bit FHD 23.976 fps input with QP 20 and raw avs3 bitstream output"',children:"uavs3enc -i input.yuv -w 1920 -h 1080 -d 8 --fps_num 24000 --fps_den 1001 -q 20 -o output.avs3\n"})}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",metastring:'title="Speed 2, CRF 20, intra period 120, multithreaded"',children:"uavs3enc -i input.yuv -w 1920 -h 1080 -d 8 --fps_num 24000 --fps_den 1001 -p 120 --wpp_threads 8 --frm_threads 8 --speed_level 2 --rc_type 1 -q 20 -o output.avs3\n"})}),"\n",(0,s.jsxs)(n.p,{children:["Currently, uavs3e ",(0,s.jsx)(n.a,{href:"https://github.com/uavs3/uavs3e/issues/2",children:"does not support piping"}),"."]}),"\n",(0,s.jsx)(n.h2,{id:"notes",children:"Notes"}),"\n",(0,s.jsxs)(n.ol,{children:["\n",(0,s.jsx)(n.li,{children:"Usable speed presets range from 0 to 4, where 0 is the slowest and 4 is the fastest."}),"\n",(0,s.jsxs)(n.li,{children:["The encoder can be quite competitive, even compared with the newest ",(0,s.jsx)(n.a,{href:"/docs/video/AV1",children:"AV1"})," and ",(0,s.jsx)(n.a,{href:"/docs/video/VVC",children:"VVC"})," encoders in terms of visual fidelity."]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"uavs3d"})," can be used to decode the output bitstream. For real-time playback, you need to have ",(0,s.jsx)(n.a,{href:"/docs/utilities/ffmpeg",children:"FFmpeg"})," compiled with ",(0,s.jsx)(n.code,{children:"--enable-libuavs3d"}),"."]}),"\n"]})]})}function p(e={}){const{wrapper:n}={...(0,r.R)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(h,{...e})}):h(e)}},9365:(e,n,t)=>{t.d(n,{A:()=>a});t(6540);var s=t(4164);const r={tabItem:"tabItem_Ymn6"};var i=t(4848);function a(e){let{children:n,hidden:t,className:a}=e;return(0,i.jsx)("div",{role:"tabpanel",className:(0,s.A)(r.tabItem,a),hidden:t,children:n})}},1470:(e,n,t)=>{t.d(n,{A:()=>y});var s=t(6540),r=t(4164),i=t(3104),a=t(6347),o=t(205),l=t(7485),c=t(1682),u=t(679);function d(e){return s.Children.toArray(e).filter((e=>"\n"!==e)).map((e=>{if(!e||(0,s.isValidElement)(e)&&function(e){const{props:n}=e;return!!n&&"object"==typeof n&&"value"in n}(e))return e;throw new Error(`Docusaurus error: Bad child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the component should be , and every should have a unique "value" prop.`)}))?.filter(Boolean)??[]}function h(e){const{values:n,children:t}=e;return(0,s.useMemo)((()=>{const e=n??function(e){return d(e).map((e=>{let{props:{value:n,label:t,attributes:s,default:r}}=e;return{value:n,label:t,attributes:s,default:r}}))}(t);return function(e){const n=(0,c.XI)(e,((e,n)=>e.value===n.value));if(n.length>0)throw new Error(`Docusaurus error: Duplicate values "${n.map((e=>e.value)).join(", ")}" found in . Every value needs to be unique.`)}(e),e}),[n,t])}function p(e){let{value:n,tabValues:t}=e;return t.some((e=>e.value===n))}function v(e){let{queryString:n=!1,groupId:t}=e;const r=(0,a.W6)(),i=function(e){let{queryString:n=!1,groupId:t}=e;if("string"==typeof n)return n;if(!1===n)return null;if(!0===n&&!t)throw new Error('Docusaurus error: The component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return t??null}({queryString:n,groupId:t});return[(0,l.aZ)(i),(0,s.useCallback)((e=>{if(!i)return;const n=new URLSearchParams(r.location.search);n.set(i,e),r.replace({...r.location,search:n.toString()})}),[i,r])]}function m(e){const{defaultValue:n,queryString:t=!1,groupId:r}=e,i=h(e),[a,l]=(0,s.useState)((()=>function(e){let{defaultValue:n,tabValues:t}=e;if(0===t.length)throw new Error("Docusaurus error: the component requires at least one children component");if(n){if(!p({value:n,tabValues:t}))throw new Error(`Docusaurus error: The has a defaultValue "${n}" but none of its children has the corresponding value. Available values are: ${t.map((e=>e.value)).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return n}const s=t.find((e=>e.default))??t[0];if(!s)throw new Error("Unexpected error: 0 tabValues");return s.value}({defaultValue:n,tabValues:i}))),[c,d]=v({queryString:t,groupId:r}),[m,b]=function(e){let{groupId:n}=e;const t=function(e){return e?`docusaurus.tab.${e}`:null}(n),[r,i]=(0,u.Dv)(t);return[r,(0,s.useCallback)((e=>{t&&i.set(e)}),[t,i])]}({groupId:r}),f=(()=>{const e=c??m;return p({value:e,tabValues:i})?e:null})();(0,o.A)((()=>{f&&l(f)}),[f]);return{selectedValue:a,selectValue:(0,s.useCallback)((e=>{if(!p({value:e,tabValues:i}))throw new Error(`Can't select invalid tab value=${e}`);l(e),d(e),b(e)}),[d,b,i]),tabValues:i}}var b=t(2303);const f={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};var x=t(4848);function g(e){let{className:n,block:t,selectedValue:s,selectValue:a,tabValues:o}=e;const l=[],{blockElementScrollPositionUntilNextRender:c}=(0,i.a_)(),u=e=>{const n=e.currentTarget,t=l.indexOf(n),r=o[t].value;r!==s&&(c(n),a(r))},d=e=>{let n=null;switch(e.key){case"Enter":u(e);break;case"ArrowRight":{const t=l.indexOf(e.currentTarget)+1;n=l[t]??l[0];break}case"ArrowLeft":{const t=l.indexOf(e.currentTarget)-1;n=l[t]??l[l.length-1];break}}n?.focus()};return(0,x.jsx)("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,r.A)("tabs",{"tabs--block":t},n),children:o.map((e=>{let{value:n,label:t,attributes:i}=e;return(0,x.jsx)("li",{role:"tab",tabIndex:s===n?0:-1,"aria-selected":s===n,ref:e=>l.push(e),onKeyDown:d,onClick:u,...i,className:(0,r.A)("tabs__item",f.tabItem,i?.className,{"tabs__item--active":s===n}),children:t??n},n)}))})}function j(e){let{lazy:n,children:t,selectedValue:i}=e;const a=(Array.isArray(t)?t:[t]).filter(Boolean);if(n){const e=a.find((e=>e.props.value===i));return e?(0,s.cloneElement)(e,{className:(0,r.A)("margin-top--md",e.props.className)}):null}return(0,x.jsx)("div",{className:"margin-top--md",children:a.map(((e,n)=>(0,s.cloneElement)(e,{key:n,hidden:e.props.value!==i})))})}function w(e){const n=m(e);return(0,x.jsxs)("div",{className:(0,r.A)("tabs-container",f.tabList),children:[(0,x.jsx)(g,{...n,...e}),(0,x.jsx)(j,{...n,...e})]})}function y(e){const n=(0,b.A)();return(0,x.jsx)(w,{...e,children:d(e.children)},String(n))}},8453:(e,n,t)=>{t.d(n,{R:()=>a,x:()=>o});var s=t(6540);const r={},i=s.createContext(r);function a(e){const n=s.useContext(i);return s.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function o(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:a(e.components),s.createElement(i.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/8793.1752beb1.js b/assets/js/8793.6c976fe1.js similarity index 99% rename from assets/js/8793.1752beb1.js rename to assets/js/8793.6c976fe1.js index 03f30896..80e7450a 100644 --- a/assets/js/8793.1752beb1.js +++ b/assets/js/8793.6c976fe1.js @@ -1 +1 @@ -"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[8793],{4096:(e,t,a)=>{a.d(t,{in:()=>c,OU:()=>y,Ki:()=>k,kJ:()=>p,x:()=>i,e7:()=>m,J_:()=>f,Gx:()=>_});var n=a(6540),s=a(9532),r=a(6803),l=a(4848);function i(){const e=(0,r.A)(),t=e?.data?.blogMetadata;if(!t)throw new Error("useBlogMetadata() can't be called on the current route because the blog metadata could not be found in route context");return t}const o=n.createContext(null);function c(e){let{children:t,content:a,isBlogPostPage:s=!1}=e;const r=function(e){let{content:t,isBlogPostPage:a}=e;return(0,n.useMemo)((()=>({metadata:t.metadata,frontMatter:t.frontMatter,assets:t.assets,toc:t.toc,isBlogPostPage:a})),[t,a])}({content:a,isBlogPostPage:s});return(0,l.jsx)(o.Provider,{value:r,children:t})}function m(){const e=(0,n.useContext)(o);if(null===e)throw new s.dV("BlogPostProvider");return e}var u=a(6025),d=a(4586);const h=e=>new Date(e).toISOString();function g(e){const t=e.map(j);return{author:1===t.length?t[0]:t}}function x(e,t,a){return e?{image:v({imageUrl:t(e,{absolute:!0}),caption:`title image for the blog post: ${a}`})}:{}}function p(e){const{siteConfig:t}=(0,d.A)(),{withBaseUrl:a}=(0,u.hH)(),{metadata:{blogDescription:n,blogTitle:s,permalink:r}}=e,l=`${t.url}${r}`;return{"@context":"https://schema.org","@type":"Blog","@id":l,mainEntityOfPage:l,headline:s,description:n,blogPost:e.items.map((e=>function(e,t,a){const{assets:n,frontMatter:s,metadata:r}=e,{date:l,title:i,description:o,lastUpdatedAt:c}=r,m=n.image??s.image,u=s.keywords??[],d=`${t.url}${r.permalink}`,p=c?h(c):void 0;return{"@type":"BlogPosting","@id":d,mainEntityOfPage:d,url:d,headline:i,name:i,description:o,datePublished:l,...p?{dateModified:p}:{},...g(r.authors),...x(m,a,i),...u?{keywords:u}:{}}}(e.content,t,a)))}}function f(){const e=i(),{assets:t,metadata:a}=m(),{siteConfig:n}=(0,d.A)(),{withBaseUrl:s}=(0,u.hH)(),{date:r,title:l,description:o,frontMatter:c,lastUpdatedAt:p}=a,f=t.image??c.image,j=c.keywords??[],v=p?h(p):void 0,b=`${n.url}${a.permalink}`;return{"@context":"https://schema.org","@type":"BlogPosting","@id":b,mainEntityOfPage:b,url:b,headline:l,name:l,description:o,datePublished:r,...v?{dateModified:v}:{},...g(a.authors),...x(f,s,l),...j?{keywords:j}:{},isPartOf:{"@type":"Blog","@id":`${n.url}${e.blogBasePath}`,name:e.blogTitle}}}function j(e){return{"@type":"Person",...e.name?{name:e.name}:{},...e.title?{description:e.title}:{},...e.url?{url:e.url}:{},...e.email?{email:e.email}:{},...e.imageURL?{image:e.imageURL}:{}}}function v(e){let{imageUrl:t,caption:a}=e;return{"@type":"ImageObject","@id":t,url:t,contentUrl:t,caption:a}}var b=a(6347),N=a(8774),w=a(1682),A=a(9169);function _(e){const{pathname:t}=(0,b.zy)();return(0,n.useMemo)((()=>e.filter((e=>function(e,t){return!(e.unlisted&&!(0,A.ys)(e.permalink,t))}(e,t)))),[e,t])}function k(e){const t=(0,w.$z)(e,(e=>`${new Date(e.date).getFullYear()}`)),a=Object.entries(t);return a.reverse(),a}function y(e){let{items:t,ulClassName:a,liClassName:n,linkClassName:s,linkActiveClassName:r}=e;return(0,l.jsx)("ul",{className:a,children:t.map((e=>(0,l.jsx)("li",{className:n,children:(0,l.jsx)(N.A,{isNavLink:!0,to:e.permalink,className:s,activeClassName:r,children:e.title})},e.permalink)))})}},8027:(e,t,a)=>{a.d(t,{A:()=>T});var n=a(6540),s=a(4164),r=a(263),l=a(4581),i=a(1312),o=a(4096),c=a(6342),m=a(1107),u=a(4848);function d(e){let{year:t,yearGroupHeadingClassName:a,children:n}=e;return(0,u.jsxs)("div",{role:"group",children:[(0,u.jsx)(m.A,{as:"h3",className:a,children:t}),n]})}function h(e){let{items:t,yearGroupHeadingClassName:a,ListComponent:n}=e;if((0,c.p)().blog.sidebar.groupByYear){const e=(0,o.Ki)(t);return(0,u.jsx)(u.Fragment,{children:e.map((e=>{let[t,s]=e;return(0,u.jsx)(d,{year:t,yearGroupHeadingClassName:a,children:(0,u.jsx)(n,{items:s})},t)}))})}return(0,u.jsx)(n,{items:t})}const g=(0,n.memo)(h),x="sidebar_re4s",p="sidebarItemTitle_pO2u",f="sidebarItemList_Yudw",j="sidebarItem__DBe",v="sidebarItemLink_mo7H",b="sidebarItemLinkActive_I1ZP",N="yearGroupHeading_rMGB",w=e=>{let{items:t}=e;return(0,u.jsx)(o.OU,{items:t,ulClassName:(0,s.A)(f,"clean-list"),liClassName:j,linkClassName:v,linkActiveClassName:b})};function A(e){let{sidebar:t}=e;const a=(0,o.Gx)(t.items);return(0,u.jsx)("aside",{className:"col col--3",children:(0,u.jsxs)("nav",{className:(0,s.A)(x,"thin-scrollbar"),"aria-label":(0,i.T)({id:"theme.blog.sidebar.navAriaLabel",message:"Blog recent posts navigation",description:"The ARIA label for recent posts in the blog sidebar"}),children:[(0,u.jsx)("div",{className:(0,s.A)(p,"margin-bottom--md"),children:t.title}),(0,u.jsx)(g,{items:a,ListComponent:w,yearGroupHeadingClassName:N})]})})}const _=(0,n.memo)(A);var k=a(5600);const y={yearGroupHeading:"yearGroupHeading_QT03"},C=e=>{let{items:t}=e;return(0,u.jsx)(o.OU,{items:t,ulClassName:"menu__list",liClassName:"menu__list-item",linkClassName:"menu__link",linkActiveClassName:"menu__link--active"})};function M(e){let{sidebar:t}=e;const a=(0,o.Gx)(t.items);return(0,u.jsx)(g,{items:a,ListComponent:C,yearGroupHeadingClassName:y.yearGroupHeading})}function P(e){return(0,u.jsx)(k.GX,{component:M,props:e})}const B=(0,n.memo)(P);function L(e){let{sidebar:t}=e;const a=(0,l.l)();return t?.items.length?"mobile"===a?(0,u.jsx)(B,{sidebar:t}):(0,u.jsx)(_,{sidebar:t}):null}function T(e){const{sidebar:t,toc:a,children:n,...l}=e,i=t&&t.items.length>0;return(0,u.jsx)(r.A,{...l,children:(0,u.jsx)("div",{className:"container margin-vert--lg",children:(0,u.jsxs)("div",{className:"row",children:[(0,u.jsx)(L,{sidebar:t}),(0,u.jsx)("main",{className:(0,s.A)("col",{"col--7":i,"col--9 col--offset-1":!i}),children:n}),a&&(0,u.jsx)("div",{className:"col col--2",children:a})]})})})}},1240:(e,t,a)=>{a.d(t,{A:()=>z});a(6540);var n=a(4164),s=a(4096),r=a(4848);function l(e){let{children:t,className:a}=e;return(0,r.jsx)("article",{className:a,children:t})}var i=a(8774);const o={title:"title_f1Hy"};function c(e){let{className:t}=e;const{metadata:a,isBlogPostPage:l}=(0,s.e7)(),{permalink:c,title:m}=a,u=l?"h1":"h2";return(0,r.jsx)(u,{className:(0,n.A)(o.title,t),children:l?m:(0,r.jsx)(i.A,{to:c,children:m})})}var m=a(1312),u=a(5846),d=a(6266);const h={container:"container_mt6G"};function g(e){let{readingTime:t}=e;const a=function(){const{selectMessage:e}=(0,u.W)();return t=>{const a=Math.ceil(t);return e(a,(0,m.T)({id:"theme.blog.post.readingTime.plurals",description:'Pluralized label for "{readingTime} min read". Use as much plural forms (separated by "|") as your language support (see https://www.unicode.org/cldr/cldr-aux/charts/34/supplemental/language_plural_rules.html)',message:"One min read|{readingTime} min read"},{readingTime:a}))}}();return(0,r.jsx)(r.Fragment,{children:a(t)})}function x(e){let{date:t,formattedDate:a}=e;return(0,r.jsx)("time",{dateTime:t,children:a})}function p(){return(0,r.jsx)(r.Fragment,{children:" \xb7 "})}function f(e){let{className:t}=e;const{metadata:a}=(0,s.e7)(),{date:l,readingTime:i}=a,o=(0,d.i)({day:"numeric",month:"long",year:"numeric",timeZone:"UTC"});return(0,r.jsxs)("div",{className:(0,n.A)(h.container,"margin-vert--md",t),children:[(0,r.jsx)(x,{date:l,formattedDate:(c=l,o.format(new Date(c)))}),void 0!==i&&(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(p,{}),(0,r.jsx)(g,{readingTime:i})]})]});var c}const j="githubSvg_Uu4N";const v="xSvg_y3PF";const b=function(e){return(0,r.jsxs)("svg",{xmlns:"http://www.w3.org/2000/svg",width:"1em",height:"1em",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round",...e,children:[(0,r.jsx)("path",{stroke:"none",d:"M0 0h24v24H0z",fill:"none"}),(0,r.jsx)("path",{d:"M3 12a9 9 0 1 0 18 0a9 9 0 0 0 -18 0"}),(0,r.jsx)("path",{d:"M3.6 9h16.8"}),(0,r.jsx)("path",{d:"M3.6 15h16.8"}),(0,r.jsx)("path",{d:"M11.5 3a17 17 0 0 0 0 18"}),(0,r.jsx)("path",{d:"M12.5 3a17 17 0 0 1 0 18"})]})},N={authorSocials:"authorSocials_rSDt",authorSocialLink:"authorSocialLink_owbf",authorSocialIcon:"authorSocialIcon_XYv3"},w={twitter:{Icon:function(e){return(0,r.jsx)("svg",{viewBox:"0 0 256 209",width:"1em",height:"1em",xmlns:"http://www.w3.org/2000/svg",preserveAspectRatio:"xMidYMid",...e,children:(0,r.jsx)("path",{d:"M256 25.45c-9.42 4.177-19.542 7-30.166 8.27 10.845-6.5 19.172-16.793 23.093-29.057a105.183 105.183 0 0 1-33.351 12.745C205.995 7.201 192.346.822 177.239.822c-29.006 0-52.523 23.516-52.523 52.52 0 4.117.465 8.125 1.36 11.97-43.65-2.191-82.35-23.1-108.255-54.876-4.52 7.757-7.11 16.78-7.11 26.404 0 18.222 9.273 34.297 23.365 43.716a52.312 52.312 0 0 1-23.79-6.57c-.003.22-.003.44-.003.661 0 25.447 18.104 46.675 42.13 51.5a52.592 52.592 0 0 1-23.718.9c6.683 20.866 26.08 36.05 49.062 36.475-17.975 14.086-40.622 22.483-65.228 22.483-4.24 0-8.42-.249-12.529-.734 23.243 14.902 50.85 23.597 80.51 23.597 96.607 0 149.434-80.031 149.434-149.435 0-2.278-.05-4.543-.152-6.795A106.748 106.748 0 0 0 256 25.45",fill:"#55acee"})})},label:"Twitter"},github:{Icon:function(e){return(0,r.jsx)("svg",{viewBox:"0 0 256 250",width:"1em",height:"1em",...e,className:(0,n.A)(e.className,j),xmlns:"http://www.w3.org/2000/svg",style:{"--dark":"#000","--light":"#fff"},preserveAspectRatio:"xMidYMid",children:(0,r.jsx)("path",{d:"M128.001 0C57.317 0 0 57.307 0 128.001c0 56.554 36.676 104.535 87.535 121.46 6.397 1.185 8.746-2.777 8.746-6.158 0-3.052-.12-13.135-.174-23.83-35.61 7.742-43.124-15.103-43.124-15.103-5.823-14.795-14.213-18.73-14.213-18.73-11.613-7.944.876-7.78.876-7.78 12.853.902 19.621 13.19 19.621 13.19 11.417 19.568 29.945 13.911 37.249 10.64 1.149-8.272 4.466-13.92 8.127-17.116-28.431-3.236-58.318-14.212-58.318-63.258 0-13.975 5-25.394 13.188-34.358-1.329-3.224-5.71-16.242 1.24-33.874 0 0 10.749-3.44 35.21 13.121 10.21-2.836 21.16-4.258 32.038-4.307 10.878.049 21.837 1.47 32.066 4.307 24.431-16.56 35.165-13.12 35.165-13.12 6.967 17.63 2.584 30.65 1.255 33.873 8.207 8.964 13.173 20.383 13.173 34.358 0 49.163-29.944 59.988-58.447 63.157 4.591 3.972 8.682 11.762 8.682 23.704 0 17.126-.148 30.91-.148 35.126 0 3.407 2.304 7.398 8.792 6.14C219.37 232.5 256 184.537 256 128.002 256 57.307 198.691 0 128.001 0Zm-80.06 182.34c-.282.636-1.283.827-2.194.39-.929-.417-1.45-1.284-1.15-1.922.276-.655 1.279-.838 2.205-.399.93.418 1.46 1.293 1.139 1.931Zm6.296 5.618c-.61.566-1.804.303-2.614-.591-.837-.892-.994-2.086-.375-2.66.63-.566 1.787-.301 2.626.591.838.903 1 2.088.363 2.66Zm4.32 7.188c-.785.545-2.067.034-2.86-1.104-.784-1.138-.784-2.503.017-3.05.795-.547 2.058-.055 2.861 1.075.782 1.157.782 2.522-.019 3.08Zm7.304 8.325c-.701.774-2.196.566-3.29-.49-1.119-1.032-1.43-2.496-.726-3.27.71-.776 2.213-.558 3.315.49 1.11 1.03 1.45 2.505.701 3.27Zm9.442 2.81c-.31 1.003-1.75 1.459-3.199 1.033-1.448-.439-2.395-1.613-2.103-2.626.301-1.01 1.747-1.484 3.207-1.028 1.446.436 2.396 1.602 2.095 2.622Zm10.744 1.193c.036 1.055-1.193 1.93-2.715 1.95-1.53.034-2.769-.82-2.786-1.86 0-1.065 1.202-1.932 2.733-1.958 1.522-.03 2.768.818 2.768 1.868Zm10.555-.405c.182 1.03-.875 2.088-2.387 2.37-1.485.271-2.861-.365-3.05-1.386-.184-1.056.893-2.114 2.376-2.387 1.514-.263 2.868.356 3.061 1.403Z"})})},label:"GitHub"},stackoverflow:{Icon:function(e){return(0,r.jsxs)("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 169.61 200",width:"1em",height:"1em",...e,children:[(0,r.jsx)("path",{d:"M140.44 178.38v-48.65h21.61V200H0v-70.27h21.61v48.65z",fill:"#bcbbbb"}),(0,r.jsx)("path",{d:"M124.24 140.54l4.32-16.22-86.97-17.83-3.78 17.83zM49.7 82.16L130.72 120l7.56-16.22-81.02-37.83zm22.68-40l68.06 57.3 11.35-13.51-68.6-57.3-11.35 13.51zM116.14 0l-14.59 10.81 53.48 71.89 14.58-10.81zM37.81 162.16h86.43v-16.21H37.81z",fill:"#f48024"})]})},label:"Stack Overflow"},linkedin:{Icon:function(e){return(0,r.jsx)("svg",{width:"1em",height:"1em",xmlns:"http://www.w3.org/2000/svg",preserveAspectRatio:"xMidYMid",viewBox:"0 0 256 256",...e,children:(0,r.jsx)("path",{d:"M218.123 218.127h-37.931v-59.403c0-14.165-.253-32.4-19.728-32.4-19.756 0-22.779 15.434-22.779 31.369v60.43h-37.93V95.967h36.413v16.694h.51a39.907 39.907 0 0 1 35.928-19.733c38.445 0 45.533 25.288 45.533 58.186l-.016 67.013ZM56.955 79.27c-12.157.002-22.014-9.852-22.016-22.009-.002-12.157 9.851-22.014 22.008-22.016 12.157-.003 22.014 9.851 22.016 22.008A22.013 22.013 0 0 1 56.955 79.27m18.966 138.858H37.95V95.967h37.97v122.16ZM237.033.018H18.89C8.58-.098.125 8.161-.001 18.471v219.053c.122 10.315 8.576 18.582 18.89 18.474h218.144c10.336.128 18.823-8.139 18.966-18.474V18.454c-.147-10.33-8.635-18.588-18.966-18.453",fill:"#0A66C2"})})},label:"LinkedIn"},x:{Icon:function(e){return(0,r.jsx)("svg",{xmlns:"http://www.w3.org/2000/svg",width:"1em",height:"1em",fill:"none",viewBox:"0 0 1200 1227",...e,className:(0,n.A)(e.className,v),style:{"--dark":"#000","--light":"#fff"},children:(0,r.jsx)("path",{d:"M714.163 519.284 1160.89 0h-105.86L667.137 450.887 357.328 0H0l468.492 681.821L0 1226.37h105.866l409.625-476.152 327.181 476.152H1200L714.137 519.284h.026ZM569.165 687.828l-47.468-67.894-377.686-540.24h162.604l304.797 435.991 47.468 67.894 396.2 566.721H892.476L569.165 687.854v-.026Z"})})},label:"X"}};function A(e){let{platform:t,link:a}=e;const{Icon:s,label:l}=w[o=t]??{Icon:b,label:o};var o;return(0,r.jsx)(i.A,{className:N.authorSocialLink,href:a,title:l,children:(0,r.jsx)(s,{className:(0,n.A)(N.authorSocialLink)})})}function _(e){let{author:t}=e;const a=Object.entries(t.socials??{});return(0,r.jsx)("div",{className:N.authorSocials,children:a.map((e=>{let[t,a]=e;return(0,r.jsx)(A,{platform:t,link:a},t)}))})}var k=a(1107);const y={authorImage:"authorImage_XqGP","author-as-h1":"author-as-h1_n9oJ","author-as-h2":"author-as-h2_gXvM",authorDetails:"authorDetails_lV9A",authorName:"authorName_yefp",authorTitle:"authorTitle_nd0D",authorBlogPostCount:"authorBlogPostCount_iiJ5"};function C(e){return e.href?(0,r.jsx)(i.A,{...e}):(0,r.jsx)(r.Fragment,{children:e.children})}function M(e){let{title:t}=e;return(0,r.jsx)("small",{className:y.authorTitle,title:t,children:t})}function P(e){let{name:t,as:a}=e;return a?(0,r.jsx)(k.A,{as:a,className:y.authorName,children:t}):(0,r.jsx)("span",{className:y.authorName,children:t})}function B(e){let{count:t}=e;return(0,r.jsx)("span",{className:(0,n.A)(y.authorBlogPostCount),children:t})}function L(e){let{as:t,author:a,className:s,count:l}=e;const{name:i,title:o,url:c,imageURL:m,email:u,page:d}=a,h=d?.permalink||c||u&&`mailto:${u}`||void 0;return(0,r.jsxs)("div",{className:(0,n.A)("avatar margin-bottom--sm",s,y[`author-as-${t}`]),children:[m&&(0,r.jsx)(C,{href:h,className:"avatar__photo-link",children:(0,r.jsx)("img",{className:(0,n.A)("avatar__photo",y.authorImage),src:m,alt:i})}),(i||o)&&(0,r.jsxs)("div",{className:(0,n.A)("avatar__intro",y.authorDetails),children:[(0,r.jsxs)("div",{className:"avatar__name",children:[i&&(0,r.jsx)(C,{href:h,children:(0,r.jsx)(P,{name:i,as:t})}),l&&(0,r.jsx)(B,{count:l})]}),!!o&&(0,r.jsx)(M,{title:o}),(0,r.jsx)(_,{author:a})]})]})}const T={authorCol:"authorCol_Hf19",imageOnlyAuthorRow:"imageOnlyAuthorRow_pa_O",imageOnlyAuthorCol:"imageOnlyAuthorCol_G86a"};function I(e){let{className:t}=e;const{metadata:{authors:a},assets:l}=(0,s.e7)();if(0===a.length)return null;const i=a.every((e=>{let{name:t}=e;return!t})),o=1===a.length;return(0,r.jsx)("div",{className:(0,n.A)("margin-top--md margin-bottom--sm",i?T.imageOnlyAuthorRow:"row",t),children:a.map(((e,t)=>(0,r.jsx)("div",{className:(0,n.A)(!i&&(o?"col col--12":"col col--6"),i?T.imageOnlyAuthorCol:T.authorCol),children:(0,r.jsx)(L,{author:{...e,imageURL:l.authorsImageUrls[t]??e.imageURL}})},t)))})}function U(){return(0,r.jsxs)("header",{children:[(0,r.jsx)(c,{}),(0,r.jsx)(f,{}),(0,r.jsx)(I,{})]})}var H=a(440),O=a(8509);function R(e){let{children:t,className:a}=e;const{isBlogPostPage:l}=(0,s.e7)();return(0,r.jsx)("div",{id:l?H.LU:void 0,className:(0,n.A)("markdown",a),children:(0,r.jsx)(O.A,{children:t})})}var G=a(7559),$=a(4336),F=a(2053);function S(){return(0,r.jsx)("b",{children:(0,r.jsx)(m.A,{id:"theme.blog.post.readMore",description:"The label used in blog post item excerpts to link to full blog posts",children:"Read More"})})}function Z(e){const{blogPostTitle:t,...a}=e;return(0,r.jsx)(i.A,{"aria-label":(0,m.T)({message:"Read more about {title}",id:"theme.blog.post.readMoreLabel",description:"The ARIA label for the link to full blog posts from excerpts"},{title:t}),...a,children:(0,r.jsx)(S,{})})}function D(){const{metadata:e,isBlogPostPage:t}=(0,s.e7)(),{tags:a,title:l,editUrl:i,hasTruncateMarker:o,lastUpdatedBy:c,lastUpdatedAt:m}=e,u=!t&&o,d=a.length>0;if(!(d||u||i))return null;if(t){const e=!!(i||m||c);return(0,r.jsxs)("footer",{className:"docusaurus-mt-lg",children:[d&&(0,r.jsx)("div",{className:(0,n.A)("row","margin-top--sm",G.G.blog.blogFooterEditMetaRow),children:(0,r.jsx)("div",{className:"col",children:(0,r.jsx)(F.A,{tags:a})})}),e&&(0,r.jsx)($.A,{className:(0,n.A)("margin-top--sm",G.G.blog.blogFooterEditMetaRow),editUrl:i,lastUpdatedAt:m,lastUpdatedBy:c})]})}return(0,r.jsxs)("footer",{className:"row docusaurus-mt-lg",children:[d&&(0,r.jsx)("div",{className:(0,n.A)("col",{"col--9":u}),children:(0,r.jsx)(F.A,{tags:a})}),u&&(0,r.jsx)("div",{className:(0,n.A)("col text--right",{"col--3":d}),children:(0,r.jsx)(Z,{blogPostTitle:l,to:e.permalink})})]})}function z(e){let{children:t,className:a}=e;const i=function(){const{isBlogPostPage:e}=(0,s.e7)();return e?void 0:"margin-bottom--xl"}();return(0,r.jsxs)(l,{className:(0,n.A)(i,a),children:[(0,r.jsx)(U,{}),(0,r.jsx)(R,{children:t}),(0,r.jsx)(D,{})]})}},9022:(e,t,a)=>{a.d(t,{A:()=>l});a(6540);var n=a(4164),s=a(8774),r=a(4848);function l(e){const{permalink:t,title:a,subLabel:l,isNext:i}=e;return(0,r.jsxs)(s.A,{className:(0,n.A)("pagination-nav__link",i?"pagination-nav__link--next":"pagination-nav__link--prev"),to:t,children:[l&&(0,r.jsx)("div",{className:"pagination-nav__sublabel",children:l}),(0,r.jsx)("div",{className:"pagination-nav__label",children:a})]})}},6133:(e,t,a)=>{a.d(t,{A:()=>i});a(6540);var n=a(4164),s=a(8774);const r={tag:"tag_zVej",tagRegular:"tagRegular_sFm0",tagWithCount:"tagWithCount_h2kH"};var l=a(4848);function i(e){let{permalink:t,label:a,count:i,description:o}=e;return(0,l.jsxs)(s.A,{href:t,title:o,className:(0,n.A)(r.tag,i?r.tagWithCount:r.tagRegular),children:[a,i&&(0,l.jsx)("span",{children:i})]})}},2053:(e,t,a)=>{a.d(t,{A:()=>o});a(6540);var n=a(4164),s=a(1312),r=a(6133);const l={tags:"tags_jXut",tag:"tag_QGVx"};var i=a(4848);function o(e){let{tags:t}=e;return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)("b",{children:(0,i.jsx)(s.A,{id:"theme.tags.tagsListLabel",description:"The label alongside a tag list",children:"Tags:"})}),(0,i.jsx)("ul",{className:(0,n.A)(l.tags,"padding--none","margin-left--sm"),children:t.map((e=>(0,i.jsx)("li",{className:l.tag,children:(0,i.jsx)(r.A,{...e})},e.permalink)))})]})}},5846:(e,t,a)=>{a.d(t,{W:()=>c});var n=a(6540),s=a(4586);const r=["zero","one","two","few","many","other"];function l(e){return r.filter((t=>e.includes(t)))}const i={locale:"en",pluralForms:l(["one","other"]),select:e=>1===e?"one":"other"};function o(){const{i18n:{currentLocale:e}}=(0,s.A)();return(0,n.useMemo)((()=>{try{return function(e){const t=new Intl.PluralRules(e);return{locale:e,pluralForms:l(t.resolvedOptions().pluralCategories),select:e=>t.select(e)}}(e)}catch(t){return console.error(`Failed to use Intl.PluralRules for locale "${e}".\nDocusaurus will fallback to the default (English) implementation.\nError: ${t.message}\n`),i}}),[e])}function c(){const e=o();return{selectMessage:(t,a)=>function(e,t,a){const n=e.split("|");if(1===n.length)return n[0];n.length>a.pluralForms.length&&console.error(`For locale=${a.locale}, a maximum of ${a.pluralForms.length} plural forms are expected (${a.pluralForms.join(",")}), but the message contains ${n.length}: ${e}`);const s=a.select(t),r=a.pluralForms.indexOf(s);return n[Math.min(r,n.length-1)]}(a,t,e)}}}}]); \ No newline at end of file +"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[8793],{4096:(e,t,a)=>{a.d(t,{in:()=>c,OU:()=>y,Ki:()=>k,kJ:()=>p,x:()=>i,e7:()=>m,J_:()=>f,Gx:()=>_});var n=a(6540),s=a(9532),r=a(6803),l=a(4848);function i(){const e=(0,r.A)(),t=e?.data?.blogMetadata;if(!t)throw new Error("useBlogMetadata() can't be called on the current route because the blog metadata could not be found in route context");return t}const o=n.createContext(null);function c(e){let{children:t,content:a,isBlogPostPage:s=!1}=e;const r=function(e){let{content:t,isBlogPostPage:a}=e;return(0,n.useMemo)((()=>({metadata:t.metadata,frontMatter:t.frontMatter,assets:t.assets,toc:t.toc,isBlogPostPage:a})),[t,a])}({content:a,isBlogPostPage:s});return(0,l.jsx)(o.Provider,{value:r,children:t})}function m(){const e=(0,n.useContext)(o);if(null===e)throw new s.dV("BlogPostProvider");return e}var u=a(6025),d=a(4586);const h=e=>new Date(e).toISOString();function g(e){const t=e.map(j);return{author:1===t.length?t[0]:t}}function x(e,t,a){return e?{image:v({imageUrl:t(e,{absolute:!0}),caption:`title image for the blog post: ${a}`})}:{}}function p(e){const{siteConfig:t}=(0,d.A)(),{withBaseUrl:a}=(0,u.hH)(),{metadata:{blogDescription:n,blogTitle:s,permalink:r}}=e,l=`${t.url}${r}`;return{"@context":"https://schema.org","@type":"Blog","@id":l,mainEntityOfPage:l,headline:s,description:n,blogPost:e.items.map((e=>function(e,t,a){const{assets:n,frontMatter:s,metadata:r}=e,{date:l,title:i,description:o,lastUpdatedAt:c}=r,m=n.image??s.image,u=s.keywords??[],d=`${t.url}${r.permalink}`,p=c?h(c):void 0;return{"@type":"BlogPosting","@id":d,mainEntityOfPage:d,url:d,headline:i,name:i,description:o,datePublished:l,...p?{dateModified:p}:{},...g(r.authors),...x(m,a,i),...u?{keywords:u}:{}}}(e.content,t,a)))}}function f(){const e=i(),{assets:t,metadata:a}=m(),{siteConfig:n}=(0,d.A)(),{withBaseUrl:s}=(0,u.hH)(),{date:r,title:l,description:o,frontMatter:c,lastUpdatedAt:p}=a,f=t.image??c.image,j=c.keywords??[],v=p?h(p):void 0,b=`${n.url}${a.permalink}`;return{"@context":"https://schema.org","@type":"BlogPosting","@id":b,mainEntityOfPage:b,url:b,headline:l,name:l,description:o,datePublished:r,...v?{dateModified:v}:{},...g(a.authors),...x(f,s,l),...j?{keywords:j}:{},isPartOf:{"@type":"Blog","@id":`${n.url}${e.blogBasePath}`,name:e.blogTitle}}}function j(e){return{"@type":"Person",...e.name?{name:e.name}:{},...e.title?{description:e.title}:{},...e.url?{url:e.url}:{},...e.email?{email:e.email}:{},...e.imageURL?{image:e.imageURL}:{}}}function v(e){let{imageUrl:t,caption:a}=e;return{"@type":"ImageObject","@id":t,url:t,contentUrl:t,caption:a}}var b=a(6347),N=a(8774),w=a(1682),A=a(9169);function _(e){const{pathname:t}=(0,b.zy)();return(0,n.useMemo)((()=>e.filter((e=>function(e,t){return!(e.unlisted&&!(0,A.ys)(e.permalink,t))}(e,t)))),[e,t])}function k(e){const t=(0,w.$z)(e,(e=>`${new Date(e.date).getFullYear()}`)),a=Object.entries(t);return a.reverse(),a}function y(e){let{items:t,ulClassName:a,liClassName:n,linkClassName:s,linkActiveClassName:r}=e;return(0,l.jsx)("ul",{className:a,children:t.map((e=>(0,l.jsx)("li",{className:n,children:(0,l.jsx)(N.A,{isNavLink:!0,to:e.permalink,className:s,activeClassName:r,children:e.title})},e.permalink)))})}},8027:(e,t,a)=>{a.d(t,{A:()=>T});var n=a(6540),s=a(4164),r=a(263),l=a(4581),i=a(1312),o=a(4096),c=a(6342),m=a(1107),u=a(4848);function d(e){let{year:t,yearGroupHeadingClassName:a,children:n}=e;return(0,u.jsxs)("div",{role:"group",children:[(0,u.jsx)(m.A,{as:"h3",className:a,children:t}),n]})}function h(e){let{items:t,yearGroupHeadingClassName:a,ListComponent:n}=e;if((0,c.p)().blog.sidebar.groupByYear){const e=(0,o.Ki)(t);return(0,u.jsx)(u.Fragment,{children:e.map((e=>{let[t,s]=e;return(0,u.jsx)(d,{year:t,yearGroupHeadingClassName:a,children:(0,u.jsx)(n,{items:s})},t)}))})}return(0,u.jsx)(n,{items:t})}const g=(0,n.memo)(h),x="sidebar_re4s",p="sidebarItemTitle_pO2u",f="sidebarItemList_Yudw",j="sidebarItem__DBe",v="sidebarItemLink_mo7H",b="sidebarItemLinkActive_I1ZP",N="yearGroupHeading_rMGB",w=e=>{let{items:t}=e;return(0,u.jsx)(o.OU,{items:t,ulClassName:(0,s.A)(f,"clean-list"),liClassName:j,linkClassName:v,linkActiveClassName:b})};function A(e){let{sidebar:t}=e;const a=(0,o.Gx)(t.items);return(0,u.jsx)("aside",{className:"col col--3",children:(0,u.jsxs)("nav",{className:(0,s.A)(x,"thin-scrollbar"),"aria-label":(0,i.T)({id:"theme.blog.sidebar.navAriaLabel",message:"Blog recent posts navigation",description:"The ARIA label for recent posts in the blog sidebar"}),children:[(0,u.jsx)("div",{className:(0,s.A)(p,"margin-bottom--md"),children:t.title}),(0,u.jsx)(g,{items:a,ListComponent:w,yearGroupHeadingClassName:N})]})})}const _=(0,n.memo)(A);var k=a(5600);const y={yearGroupHeading:"yearGroupHeading_QT03"},C=e=>{let{items:t}=e;return(0,u.jsx)(o.OU,{items:t,ulClassName:"menu__list",liClassName:"menu__list-item",linkClassName:"menu__link",linkActiveClassName:"menu__link--active"})};function M(e){let{sidebar:t}=e;const a=(0,o.Gx)(t.items);return(0,u.jsx)(g,{items:a,ListComponent:C,yearGroupHeadingClassName:y.yearGroupHeading})}function P(e){return(0,u.jsx)(k.GX,{component:M,props:e})}const B=(0,n.memo)(P);function L(e){let{sidebar:t}=e;const a=(0,l.l)();return t?.items.length?"mobile"===a?(0,u.jsx)(B,{sidebar:t}):(0,u.jsx)(_,{sidebar:t}):null}function T(e){const{sidebar:t,toc:a,children:n,...l}=e,i=t&&t.items.length>0;return(0,u.jsx)(r.A,{...l,children:(0,u.jsx)("div",{className:"container margin-vert--lg",children:(0,u.jsxs)("div",{className:"row",children:[(0,u.jsx)(L,{sidebar:t}),(0,u.jsx)("main",{className:(0,s.A)("col",{"col--7":i,"col--9 col--offset-1":!i}),children:n}),a&&(0,u.jsx)("div",{className:"col col--2",children:a})]})})})}},1240:(e,t,a)=>{a.d(t,{A:()=>z});a(6540);var n=a(4164),s=a(4096),r=a(4848);function l(e){let{children:t,className:a}=e;return(0,r.jsx)("article",{className:a,children:t})}var i=a(8774);const o={title:"title_f1Hy"};function c(e){let{className:t}=e;const{metadata:a,isBlogPostPage:l}=(0,s.e7)(),{permalink:c,title:m}=a,u=l?"h1":"h2";return(0,r.jsx)(u,{className:(0,n.A)(o.title,t),children:l?m:(0,r.jsx)(i.A,{to:c,children:m})})}var m=a(1312),u=a(5846),d=a(6266);const h={container:"container_mt6G"};function g(e){let{readingTime:t}=e;const a=function(){const{selectMessage:e}=(0,u.W)();return t=>{const a=Math.ceil(t);return e(a,(0,m.T)({id:"theme.blog.post.readingTime.plurals",description:'Pluralized label for "{readingTime} min read". Use as much plural forms (separated by "|") as your language support (see https://www.unicode.org/cldr/cldr-aux/charts/34/supplemental/language_plural_rules.html)',message:"One min read|{readingTime} min read"},{readingTime:a}))}}();return(0,r.jsx)(r.Fragment,{children:a(t)})}function x(e){let{date:t,formattedDate:a}=e;return(0,r.jsx)("time",{dateTime:t,children:a})}function p(){return(0,r.jsx)(r.Fragment,{children:" \xb7 "})}function f(e){let{className:t}=e;const{metadata:a}=(0,s.e7)(),{date:l,readingTime:i}=a,o=(0,d.i)({day:"numeric",month:"long",year:"numeric",timeZone:"UTC"});return(0,r.jsxs)("div",{className:(0,n.A)(h.container,"margin-vert--md",t),children:[(0,r.jsx)(x,{date:l,formattedDate:(c=l,o.format(new Date(c)))}),void 0!==i&&(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(p,{}),(0,r.jsx)(g,{readingTime:i})]})]});var c}const j="githubSvg_Uu4N";const v="xSvg_y3PF";const b=function(e){return(0,r.jsxs)("svg",{xmlns:"http://www.w3.org/2000/svg",width:"1em",height:"1em",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round",...e,children:[(0,r.jsx)("path",{stroke:"none",d:"M0 0h24v24H0z",fill:"none"}),(0,r.jsx)("path",{d:"M3 12a9 9 0 1 0 18 0a9 9 0 0 0 -18 0"}),(0,r.jsx)("path",{d:"M3.6 9h16.8"}),(0,r.jsx)("path",{d:"M3.6 15h16.8"}),(0,r.jsx)("path",{d:"M11.5 3a17 17 0 0 0 0 18"}),(0,r.jsx)("path",{d:"M12.5 3a17 17 0 0 1 0 18"})]})},N={authorSocials:"authorSocials_rSDt",authorSocialLink:"authorSocialLink_owbf",authorSocialIcon:"authorSocialIcon_XYv3"},w={twitter:{Icon:function(e){return(0,r.jsx)("svg",{viewBox:"0 0 256 209",width:"1em",height:"1em",xmlns:"http://www.w3.org/2000/svg",preserveAspectRatio:"xMidYMid",...e,children:(0,r.jsx)("path",{d:"M256 25.45c-9.42 4.177-19.542 7-30.166 8.27 10.845-6.5 19.172-16.793 23.093-29.057a105.183 105.183 0 0 1-33.351 12.745C205.995 7.201 192.346.822 177.239.822c-29.006 0-52.523 23.516-52.523 52.52 0 4.117.465 8.125 1.36 11.97-43.65-2.191-82.35-23.1-108.255-54.876-4.52 7.757-7.11 16.78-7.11 26.404 0 18.222 9.273 34.297 23.365 43.716a52.312 52.312 0 0 1-23.79-6.57c-.003.22-.003.44-.003.661 0 25.447 18.104 46.675 42.13 51.5a52.592 52.592 0 0 1-23.718.9c6.683 20.866 26.08 36.05 49.062 36.475-17.975 14.086-40.622 22.483-65.228 22.483-4.24 0-8.42-.249-12.529-.734 23.243 14.902 50.85 23.597 80.51 23.597 96.607 0 149.434-80.031 149.434-149.435 0-2.278-.05-4.543-.152-6.795A106.748 106.748 0 0 0 256 25.45",fill:"#55acee"})})},label:"Twitter"},github:{Icon:function(e){return(0,r.jsx)("svg",{viewBox:"0 0 256 250",width:"1em",height:"1em",...e,className:(0,n.A)(e.className,j),xmlns:"http://www.w3.org/2000/svg",style:{"--dark":"#000","--light":"#fff"},preserveAspectRatio:"xMidYMid",children:(0,r.jsx)("path",{d:"M128.001 0C57.317 0 0 57.307 0 128.001c0 56.554 36.676 104.535 87.535 121.46 6.397 1.185 8.746-2.777 8.746-6.158 0-3.052-.12-13.135-.174-23.83-35.61 7.742-43.124-15.103-43.124-15.103-5.823-14.795-14.213-18.73-14.213-18.73-11.613-7.944.876-7.78.876-7.78 12.853.902 19.621 13.19 19.621 13.19 11.417 19.568 29.945 13.911 37.249 10.64 1.149-8.272 4.466-13.92 8.127-17.116-28.431-3.236-58.318-14.212-58.318-63.258 0-13.975 5-25.394 13.188-34.358-1.329-3.224-5.71-16.242 1.24-33.874 0 0 10.749-3.44 35.21 13.121 10.21-2.836 21.16-4.258 32.038-4.307 10.878.049 21.837 1.47 32.066 4.307 24.431-16.56 35.165-13.12 35.165-13.12 6.967 17.63 2.584 30.65 1.255 33.873 8.207 8.964 13.173 20.383 13.173 34.358 0 49.163-29.944 59.988-58.447 63.157 4.591 3.972 8.682 11.762 8.682 23.704 0 17.126-.148 30.91-.148 35.126 0 3.407 2.304 7.398 8.792 6.14C219.37 232.5 256 184.537 256 128.002 256 57.307 198.691 0 128.001 0Zm-80.06 182.34c-.282.636-1.283.827-2.194.39-.929-.417-1.45-1.284-1.15-1.922.276-.655 1.279-.838 2.205-.399.93.418 1.46 1.293 1.139 1.931Zm6.296 5.618c-.61.566-1.804.303-2.614-.591-.837-.892-.994-2.086-.375-2.66.63-.566 1.787-.301 2.626.591.838.903 1 2.088.363 2.66Zm4.32 7.188c-.785.545-2.067.034-2.86-1.104-.784-1.138-.784-2.503.017-3.05.795-.547 2.058-.055 2.861 1.075.782 1.157.782 2.522-.019 3.08Zm7.304 8.325c-.701.774-2.196.566-3.29-.49-1.119-1.032-1.43-2.496-.726-3.27.71-.776 2.213-.558 3.315.49 1.11 1.03 1.45 2.505.701 3.27Zm9.442 2.81c-.31 1.003-1.75 1.459-3.199 1.033-1.448-.439-2.395-1.613-2.103-2.626.301-1.01 1.747-1.484 3.207-1.028 1.446.436 2.396 1.602 2.095 2.622Zm10.744 1.193c.036 1.055-1.193 1.93-2.715 1.95-1.53.034-2.769-.82-2.786-1.86 0-1.065 1.202-1.932 2.733-1.958 1.522-.03 2.768.818 2.768 1.868Zm10.555-.405c.182 1.03-.875 2.088-2.387 2.37-1.485.271-2.861-.365-3.05-1.386-.184-1.056.893-2.114 2.376-2.387 1.514-.263 2.868.356 3.061 1.403Z"})})},label:"GitHub"},stackoverflow:{Icon:function(e){return(0,r.jsxs)("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 169.61 200",width:"1em",height:"1em",...e,children:[(0,r.jsx)("path",{d:"M140.44 178.38v-48.65h21.61V200H0v-70.27h21.61v48.65z",fill:"#bcbbbb"}),(0,r.jsx)("path",{d:"M124.24 140.54l4.32-16.22-86.97-17.83-3.78 17.83zM49.7 82.16L130.72 120l7.56-16.22-81.02-37.83zm22.68-40l68.06 57.3 11.35-13.51-68.6-57.3-11.35 13.51zM116.14 0l-14.59 10.81 53.48 71.89 14.58-10.81zM37.81 162.16h86.43v-16.21H37.81z",fill:"#f48024"})]})},label:"Stack Overflow"},linkedin:{Icon:function(e){return(0,r.jsx)("svg",{width:"1em",height:"1em",xmlns:"http://www.w3.org/2000/svg",preserveAspectRatio:"xMidYMid",viewBox:"0 0 256 256",...e,children:(0,r.jsx)("path",{d:"M218.123 218.127h-37.931v-59.403c0-14.165-.253-32.4-19.728-32.4-19.756 0-22.779 15.434-22.779 31.369v60.43h-37.93V95.967h36.413v16.694h.51a39.907 39.907 0 0 1 35.928-19.733c38.445 0 45.533 25.288 45.533 58.186l-.016 67.013ZM56.955 79.27c-12.157.002-22.014-9.852-22.016-22.009-.002-12.157 9.851-22.014 22.008-22.016 12.157-.003 22.014 9.851 22.016 22.008A22.013 22.013 0 0 1 56.955 79.27m18.966 138.858H37.95V95.967h37.97v122.16ZM237.033.018H18.89C8.58-.098.125 8.161-.001 18.471v219.053c.122 10.315 8.576 18.582 18.89 18.474h218.144c10.336.128 18.823-8.139 18.966-18.474V18.454c-.147-10.33-8.635-18.588-18.966-18.453",fill:"#0A66C2"})})},label:"LinkedIn"},x:{Icon:function(e){return(0,r.jsx)("svg",{xmlns:"http://www.w3.org/2000/svg",width:"1em",height:"1em",fill:"none",viewBox:"0 0 1200 1227",...e,className:(0,n.A)(e.className,v),style:{"--dark":"#000","--light":"#fff"},children:(0,r.jsx)("path",{d:"M714.163 519.284 1160.89 0h-105.86L667.137 450.887 357.328 0H0l468.492 681.821L0 1226.37h105.866l409.625-476.152 327.181 476.152H1200L714.137 519.284h.026ZM569.165 687.828l-47.468-67.894-377.686-540.24h162.604l304.797 435.991 47.468 67.894 396.2 566.721H892.476L569.165 687.854v-.026Z"})})},label:"X"}};function A(e){let{platform:t,link:a}=e;const{Icon:s,label:l}=w[o=t]??{Icon:b,label:o};var o;return(0,r.jsx)(i.A,{className:N.authorSocialLink,href:a,title:l,children:(0,r.jsx)(s,{className:(0,n.A)(N.authorSocialLink)})})}function _(e){let{author:t}=e;const a=Object.entries(t.socials??{});return(0,r.jsx)("div",{className:N.authorSocials,children:a.map((e=>{let[t,a]=e;return(0,r.jsx)(A,{platform:t,link:a},t)}))})}var k=a(1107);const y={authorImage:"authorImage_XqGP","author-as-h1":"author-as-h1_n9oJ","author-as-h2":"author-as-h2_gXvM",authorDetails:"authorDetails_lV9A",authorName:"authorName_yefp",authorTitle:"authorTitle_nd0D",authorBlogPostCount:"authorBlogPostCount_iiJ5"};function C(e){return e.href?(0,r.jsx)(i.A,{...e}):(0,r.jsx)(r.Fragment,{children:e.children})}function M(e){let{title:t}=e;return(0,r.jsx)("small",{className:y.authorTitle,title:t,children:t})}function P(e){let{name:t,as:a}=e;return a?(0,r.jsx)(k.A,{as:a,className:y.authorName,children:t}):(0,r.jsx)("span",{className:y.authorName,children:t})}function B(e){let{count:t}=e;return(0,r.jsx)("span",{className:(0,n.A)(y.authorBlogPostCount),children:t})}function L(e){let{as:t,author:a,className:s,count:l}=e;const{name:i,title:o,url:c,imageURL:m,email:u,page:d}=a,h=d?.permalink||c||u&&`mailto:${u}`||void 0;return(0,r.jsxs)("div",{className:(0,n.A)("avatar margin-bottom--sm",s,y[`author-as-${t}`]),children:[m&&(0,r.jsx)(C,{href:h,className:"avatar__photo-link",children:(0,r.jsx)("img",{className:(0,n.A)("avatar__photo",y.authorImage),src:m,alt:i})}),(i||o)&&(0,r.jsxs)("div",{className:(0,n.A)("avatar__intro",y.authorDetails),children:[(0,r.jsxs)("div",{className:"avatar__name",children:[i&&(0,r.jsx)(C,{href:h,children:(0,r.jsx)(P,{name:i,as:t})}),l&&(0,r.jsx)(B,{count:l})]}),!!o&&(0,r.jsx)(M,{title:o}),(0,r.jsx)(_,{author:a})]})]})}const T={authorCol:"authorCol_Hf19",imageOnlyAuthorRow:"imageOnlyAuthorRow_pa_O",imageOnlyAuthorCol:"imageOnlyAuthorCol_G86a"};function I(e){let{className:t}=e;const{metadata:{authors:a},assets:l}=(0,s.e7)();if(0===a.length)return null;const i=a.every((e=>{let{name:t}=e;return!t})),o=1===a.length;return(0,r.jsx)("div",{className:(0,n.A)("margin-top--md margin-bottom--sm",i?T.imageOnlyAuthorRow:"row",t),children:a.map(((e,t)=>(0,r.jsx)("div",{className:(0,n.A)(!i&&(o?"col col--12":"col col--6"),i?T.imageOnlyAuthorCol:T.authorCol),children:(0,r.jsx)(L,{author:{...e,imageURL:l.authorsImageUrls[t]??e.imageURL}})},t)))})}function U(){return(0,r.jsxs)("header",{children:[(0,r.jsx)(c,{}),(0,r.jsx)(f,{}),(0,r.jsx)(I,{})]})}var H=a(440),O=a(8509);function R(e){let{children:t,className:a}=e;const{isBlogPostPage:l}=(0,s.e7)();return(0,r.jsx)("div",{id:l?H.LU:void 0,className:(0,n.A)("markdown",a),children:(0,r.jsx)(O.A,{children:t})})}var G=a(7559),$=a(4336),F=a(2053);function S(){return(0,r.jsx)("b",{children:(0,r.jsx)(m.A,{id:"theme.blog.post.readMore",description:"The label used in blog post item excerpts to link to full blog posts",children:"Read more"})})}function Z(e){const{blogPostTitle:t,...a}=e;return(0,r.jsx)(i.A,{"aria-label":(0,m.T)({message:"Read more about {title}",id:"theme.blog.post.readMoreLabel",description:"The ARIA label for the link to full blog posts from excerpts"},{title:t}),...a,children:(0,r.jsx)(S,{})})}function D(){const{metadata:e,isBlogPostPage:t}=(0,s.e7)(),{tags:a,title:l,editUrl:i,hasTruncateMarker:o,lastUpdatedBy:c,lastUpdatedAt:m}=e,u=!t&&o,d=a.length>0;if(!(d||u||i))return null;if(t){const e=!!(i||m||c);return(0,r.jsxs)("footer",{className:"docusaurus-mt-lg",children:[d&&(0,r.jsx)("div",{className:(0,n.A)("row","margin-top--sm",G.G.blog.blogFooterEditMetaRow),children:(0,r.jsx)("div",{className:"col",children:(0,r.jsx)(F.A,{tags:a})})}),e&&(0,r.jsx)($.A,{className:(0,n.A)("margin-top--sm",G.G.blog.blogFooterEditMetaRow),editUrl:i,lastUpdatedAt:m,lastUpdatedBy:c})]})}return(0,r.jsxs)("footer",{className:"row docusaurus-mt-lg",children:[d&&(0,r.jsx)("div",{className:(0,n.A)("col",{"col--9":u}),children:(0,r.jsx)(F.A,{tags:a})}),u&&(0,r.jsx)("div",{className:(0,n.A)("col text--right",{"col--3":d}),children:(0,r.jsx)(Z,{blogPostTitle:l,to:e.permalink})})]})}function z(e){let{children:t,className:a}=e;const i=function(){const{isBlogPostPage:e}=(0,s.e7)();return e?void 0:"margin-bottom--xl"}();return(0,r.jsxs)(l,{className:(0,n.A)(i,a),children:[(0,r.jsx)(U,{}),(0,r.jsx)(R,{children:t}),(0,r.jsx)(D,{})]})}},9022:(e,t,a)=>{a.d(t,{A:()=>l});a(6540);var n=a(4164),s=a(8774),r=a(4848);function l(e){const{permalink:t,title:a,subLabel:l,isNext:i}=e;return(0,r.jsxs)(s.A,{className:(0,n.A)("pagination-nav__link",i?"pagination-nav__link--next":"pagination-nav__link--prev"),to:t,children:[l&&(0,r.jsx)("div",{className:"pagination-nav__sublabel",children:l}),(0,r.jsx)("div",{className:"pagination-nav__label",children:a})]})}},6133:(e,t,a)=>{a.d(t,{A:()=>i});a(6540);var n=a(4164),s=a(8774);const r={tag:"tag_zVej",tagRegular:"tagRegular_sFm0",tagWithCount:"tagWithCount_h2kH"};var l=a(4848);function i(e){let{permalink:t,label:a,count:i,description:o}=e;return(0,l.jsxs)(s.A,{href:t,title:o,className:(0,n.A)(r.tag,i?r.tagWithCount:r.tagRegular),children:[a,i&&(0,l.jsx)("span",{children:i})]})}},2053:(e,t,a)=>{a.d(t,{A:()=>o});a(6540);var n=a(4164),s=a(1312),r=a(6133);const l={tags:"tags_jXut",tag:"tag_QGVx"};var i=a(4848);function o(e){let{tags:t}=e;return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)("b",{children:(0,i.jsx)(s.A,{id:"theme.tags.tagsListLabel",description:"The label alongside a tag list",children:"Tags:"})}),(0,i.jsx)("ul",{className:(0,n.A)(l.tags,"padding--none","margin-left--sm"),children:t.map((e=>(0,i.jsx)("li",{className:l.tag,children:(0,i.jsx)(r.A,{...e})},e.permalink)))})]})}},5846:(e,t,a)=>{a.d(t,{W:()=>c});var n=a(6540),s=a(4586);const r=["zero","one","two","few","many","other"];function l(e){return r.filter((t=>e.includes(t)))}const i={locale:"en",pluralForms:l(["one","other"]),select:e=>1===e?"one":"other"};function o(){const{i18n:{currentLocale:e}}=(0,s.A)();return(0,n.useMemo)((()=>{try{return function(e){const t=new Intl.PluralRules(e);return{locale:e,pluralForms:l(t.resolvedOptions().pluralCategories),select:e=>t.select(e)}}(e)}catch(t){return console.error(`Failed to use Intl.PluralRules for locale "${e}".\nDocusaurus will fallback to the default (English) implementation.\nError: ${t.message}\n`),i}}),[e])}function c(){const e=o();return{selectMessage:(t,a)=>function(e,t,a){const n=e.split("|");if(1===n.length)return n[0];n.length>a.pluralForms.length&&console.error(`For locale=${a.locale}, a maximum of ${a.pluralForms.length} plural forms are expected (${a.pluralForms.join(",")}), but the message contains ${n.length}: ${e}`);const s=a.select(t),r=a.pluralForms.indexOf(s);return n[Math.min(r,n.length-1)]}(a,t,e)}}}}]); \ No newline at end of file diff --git a/assets/js/998d107e.572954ef.js b/assets/js/998d107e.572954ef.js deleted file mode 100644 index 7d5c24a3..00000000 --- a/assets/js/998d107e.572954ef.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[274],{7672:(e,i,n)=>{n.r(i),n.d(i,{assets:()=>d,contentTitle:()=>t,default:()=>h,frontMatter:()=>s,metadata:()=>c,toc:()=>a});var o=n(4848),r=n(8453);const s={title:"FFV1",sidebar_position:12},t="FFV1",c={id:"video/FFV1",title:"FFV1",description:"This section is in need of contributions. If you believe you can help, please see our Contribution Guide to get started as a contributor!",source:"@site/docs/video/FFV1.mdx",sourceDirName:"video",slug:"/video/FFV1",permalink:"/docs/video/FFV1",draft:!1,unlisted:!1,editUrl:"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/video/FFV1.mdx",tags:[],version:"current",sidebarPosition:12,frontMatter:{title:"FFV1",sidebar_position:12},sidebar:"tutorialSidebar",previous:{title:"Theora",permalink:"/docs/video/Theora"},next:{title:"UT Video",permalink:"/docs/video/utvideo"}},d={},a=[{value:"History",id:"history",level:2},{value:"Usage",id:"usage",level:2},{value:"Options",id:"options",level:3},{value:"intra-frame only catch",id:"intra-frame-only-catch",level:2}];function l(e){const i={a:"a",admonition:"admonition",code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",p:"p",pre:"pre",ul:"ul",...(0,r.R)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(i.header,{children:(0,o.jsx)(i.h1,{id:"ffv1",children:"FFV1"})}),"\n",(0,o.jsx)(i.admonition,{title:"Help Wanted",type:"danger",children:(0,o.jsxs)(i.p,{children:["This section is in need of contributions. If you believe you can help, please see our ",(0,o.jsx)(i.a,{href:"/docs/contribution-guide",children:"Contribution Guide"})," to get started as a contributor!"]})}),"\n",(0,o.jsxs)(i.p,{children:["FFV1 (",(0,o.jsx)(i.a,{href:"https://datatracker.ietf.org/doc/html/rfc9043",children:"rfc9043"}),") is a lossless intra-frame video codec designed for archival use & preservation. Created by Michael Niedermayer it is part of the ",(0,o.jsx)(i.a,{href:"/docs/utilities/ffmpeg",children:"FFmpeg"})," project. The codec supports wide range of color spaces. It can work with YUV and RGB content also including alpha channel with color depths ranging from 8 to 16 bits (only up to 14 in case of RGB). It has good parallelization support and achieves very high compression ratios compared to other lossless video encoders such as ",(0,o.jsx)(i.a,{href:"/docs/video/utvideo",children:"UT Video"})," albeit at the cost of being more resource hungry."]}),"\n",(0,o.jsx)(i.h2,{id:"history",children:"History"}),"\n",(0,o.jsx)(i.p,{children:"In 2003 the codec was merged into FFmpeg however the bistream specification was frozen in 2006 (officially FFV1 version 0). Later in 2009 came version 1 covering more bideo bit depths."}),"\n",(0,o.jsx)(i.p,{children:"Version 2 never got its release, it existed only in experimental form."}),"\n",(0,o.jsx)(i.p,{children:"The 3rd bistream version was frozen in 2013 and it's still the latest as of 2024. It added multithreading support and frame integrity checking."}),"\n",(0,o.jsxs)(i.p,{children:["There is a 4th version ",(0,o.jsx)(i.a,{href:"https://datatracker.ietf.org/doc/draft-ietf-cellar-ffv1-v4/",children:"coming"})," which might bring better support for color spaces, compression improvements and ",(0,o.jsx)(i.a,{href:"https://mailarchive.ietf.org/arch/msg/cellar/gFydpu8BKAgzspvy6Mvbpsrg5yY/",children:"maybe"})," proper inter-frame prediction."]}),"\n",(0,o.jsx)(i.h2,{id:"usage",children:"Usage"}),"\n",(0,o.jsx)(i.pre,{children:(0,o.jsx)(i.code,{className:"language-bash",metastring:'title="Fast, heavily multithreaded"',children:"ffmpeg -i input.mkv -c:v ffv1 -slices 16 out.mkv\n"})}),"\n",(0,o.jsx)(i.pre,{children:(0,o.jsx)(i.code,{className:"language-bash",metastring:'title="Slow, highest compression"',children:"ffmpeg -i input.mkv -c:v ffv1 -g 60 -slices 4 -context 1 -coder 2 out.mkv\n"})}),"\n",(0,o.jsx)(i.pre,{children:(0,o.jsx)(i.code,{className:"language-bash",metastring:'title="Recommended for archival purposes, high compression, multithreaded"',children:"ffmpeg -i input.mkv -c:v ffv1 -g 1 -slices 16 -slicecrc 1 -context 1 -coder 2 out.mkv\n"})}),"\n",(0,o.jsx)(i.h3,{id:"options",children:"Options"}),"\n",(0,o.jsxs)(i.ul,{children:["\n",(0,o.jsxs)(i.li,{children:[(0,o.jsx)(i.code,{children:"slices"})," - Slices divide frame into multiple parts that can be encoded and decoded in parallel. Can only be one of: [",(0,o.jsx)(i.code,{children:"4"}),", ",(0,o.jsx)(i.code,{children:"6"}),", ",(0,o.jsx)(i.code,{children:"9"}),", ",(0,o.jsx)(i.code,{children:"12"}),", ",(0,o.jsx)(i.code,{children:"16"}),", ",(0,o.jsx)(i.code,{children:"24"}),", ",(0,o.jsx)(i.code,{children:"30"}),"] where ",(0,o.jsx)(i.code,{children:"4"})," is the default."]}),"\n",(0,o.jsxs)(i.li,{children:[(0,o.jsx)(i.code,{children:"slicecrc"})," - Setting it to ",(0,o.jsx)(i.code,{children:"1"})," will enable decoder to detect errors in the bitstream. Must be enabled for archival use. Can be eitner ",(0,o.jsx)(i.code,{children:"0"})," or ",(0,o.jsx)(i.code,{children:"1"}),"."]}),"\n",(0,o.jsxs)(i.li,{children:[(0,o.jsx)(i.code,{children:"context"})," - Setting it to ",(0,o.jsx)(i.code,{children:"1"})," will make encoder use larger context size which usually leads to better compression. Can be eitner ",(0,o.jsx)(i.code,{children:"0"})," or ",(0,o.jsx)(i.code,{children:"1"}),"."]}),"\n",(0,o.jsxs)(i.li,{children:[(0,o.jsx)(i.code,{children:"coder"})," - Sets entropy coding method:","\n",(0,o.jsxs)(i.ul,{children:["\n",(0,o.jsxs)(i.li,{children:[(0,o.jsx)(i.code,{children:"0"})," - Golomb-Rice (faster, default)"]}),"\n",(0,o.jsxs)(i.li,{children:[(0,o.jsx)(i.code,{children:"1"})," - Range Coder (used for higher bit depths and better compression)"]}),"\n",(0,o.jsxs)(i.li,{children:[(0,o.jsx)(i.code,{children:"2"})," - Range Coder with custom state transition table (almost the same as ",(0,o.jsx)(i.code,{children:"1"}),")"]}),"\n"]}),"\n"]}),"\n",(0,o.jsxs)(i.li,{children:[(0,o.jsx)(i.code,{children:"g"})," - Sets ",(0,o.jsx)(i.code,{children:"GOP size"}),". Must be ",(0,o.jsx)(i.code,{children:"1"})," for archival use. ",(0,o.jsx)(i.a,{href:"#intra-frame-only-catch",children:"see below"})]}),"\n"]}),"\n",(0,o.jsx)(i.h2,{id:"intra-frame-only-catch",children:"intra-frame only catch"}),"\n",(0,o.jsxs)(i.p,{children:["Intra-frame only codecs do not use common ",(0,o.jsx)(i.em,{children:"inter"}),"-frame video coding techniques such as ",(0,o.jsx)(i.a,{href:"#TODO",children:"motion compensation"}),", reusing parts of surrounding frames or adapting encoding context based on them. Every frame is independent from one another. Common Intra-frame only codecs may include Motion JPEG (Lossy), Motion JPEG 2000 (Both) or ",(0,o.jsx)(i.a,{href:"/docs/video/utvideo",children:"UT Video"})," (Lossless)."]}),"\n",(0,o.jsxs)(i.p,{children:["If you're careful reader you might have noticed that setting ",(0,o.jsx)(i.code,{children:"GOP size"})," isn't a common characteristic amongst intra-frame only codecs."]}),"\n",(0,o.jsxs)(i.p,{children:["In fact FFV1 can be considered an intra-frame codec only if ",(0,o.jsx)(i.code,{children:"GOP size"})," is set to ",(0,o.jsx)(i.code,{children:"1"}),". When it's larger than that, its context model depends on other frames found within the ",(0,o.jsx)(i.code,{children:"GOP"})," which contradicts the definition of intra-frame only codec. The main reason why it's strongly recommended to set ",(0,o.jsx)(i.code,{children:"GOP size"})," to ",(0,o.jsx)(i.code,{children:"1"})," for archival purposes is that if one frame gets somehow corrupted, we only lost one frame. If ",(0,o.jsx)(i.code,{children:"GOP size"})," was big we could loose much larger part of the video."]}),"\n",(0,o.jsx)(i.p,{children:"References:"}),"\n",(0,o.jsxs)(i.ul,{children:["\n",(0,o.jsx)(i.li,{children:(0,o.jsx)(i.a,{href:"https://en.wikipedia.org/wiki/FFV1",children:"Wikipedia"})}),"\n",(0,o.jsx)(i.li,{children:(0,o.jsx)(i.a,{href:"https://datatracker.ietf.org/doc/html/rfc9043",children:"RFC9043"})}),"\n",(0,o.jsx)(i.li,{children:(0,o.jsx)(i.a,{href:"https://trac.ffmpeg.org/wiki/Encode/FFV1",children:"FFmpeg Docs"})}),"\n",(0,o.jsx)(i.li,{children:(0,o.jsx)(i.a,{href:"https://forum.shotcut.org/t/exporting-as-ffv1-change-form-to-support-lossless-parameters/41230/19?page=2",children:"This Thread"})}),"\n",(0,o.jsx)(i.li,{children:(0,o.jsx)(i.a,{href:"https://video.stackexchange.com/questions/24874/what-does-the-context-parameter-mean-when-using-ffv1-in-ffmpeg",children:"This Question"})}),"\n"]})]})}function h(e={}){const{wrapper:i}={...(0,r.R)(),...e.components};return i?(0,o.jsx)(i,{...e,children:(0,o.jsx)(l,{...e})}):l(e)}},8453:(e,i,n)=>{n.d(i,{R:()=>t,x:()=>c});var o=n(6540);const r={},s=o.createContext(r);function t(e){const i=o.useContext(s);return o.useMemo((function(){return"function"==typeof e?e(i):{...i,...e}}),[i,e])}function c(e){let i;return i=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:t(e.components),o.createElement(s.Provider,{value:i},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/998d107e.6cbdd3c4.js b/assets/js/998d107e.6cbdd3c4.js new file mode 100644 index 00000000..5f9040e7 --- /dev/null +++ b/assets/js/998d107e.6cbdd3c4.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[274],{7672:(e,i,n)=>{n.r(i),n.d(i,{assets:()=>d,contentTitle:()=>r,default:()=>h,frontMatter:()=>s,metadata:()=>c,toc:()=>a});var t=n(4848),o=n(8453);const s={title:"FFV1",sidebar_position:12},r="FFV1",c={id:"video/FFV1",title:"FFV1",description:"This section is in need of contributions. If you believe you can help, please see our Contribution Guide to get started as a contributor!",source:"@site/docs/video/FFV1.mdx",sourceDirName:"video",slug:"/video/FFV1",permalink:"/docs/video/FFV1",draft:!1,unlisted:!1,editUrl:"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/video/FFV1.mdx",tags:[],version:"current",sidebarPosition:12,frontMatter:{title:"FFV1",sidebar_position:12},sidebar:"tutorialSidebar",previous:{title:"Theora",permalink:"/docs/video/Theora"},next:{title:"UT Video",permalink:"/docs/video/utvideo"}},d={},a=[{value:"History",id:"history",level:2},{value:"Usage",id:"usage",level:2},{value:"Options",id:"options",level:3},{value:"Intra-frame only catch",id:"intra-frame-only-catch",level:2}];function l(e){const i={a:"a",admonition:"admonition",code:"code",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",p:"p",pre:"pre",ul:"ul",...(0,o.R)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(i.header,{children:(0,t.jsx)(i.h1,{id:"ffv1",children:"FFV1"})}),"\n",(0,t.jsx)(i.admonition,{title:"Help Wanted",type:"danger",children:(0,t.jsxs)(i.p,{children:["This section is in need of contributions. If you believe you can help, please see our ",(0,t.jsx)(i.a,{href:"/docs/contribution-guide",children:"Contribution Guide"})," to get started as a contributor!"]})}),"\n",(0,t.jsxs)(i.p,{children:["FFV1 (",(0,t.jsx)(i.a,{href:"https://datatracker.ietf.org/doc/html/rfc9043",children:"rfc9043"}),") is a lossless intra-frame video codec designed for archival use and preservation. Created by Michael Niedermayer, it is part of the ",(0,t.jsx)(i.a,{href:"/docs/utilities/ffmpeg",children:"FFmpeg"})," project. The codec supports a wide range of color spaces, works with YUV and RGB content including alpha channel of color depths ranging from 8 to 16 bits (only up to 14 in case of RGB). It has good parallelization support and achieves very high compression ratios compared to other lossless video encoders such as ",(0,t.jsx)(i.a,{href:"/docs/video/utvideo",children:"UT Video"}),", albeit at the cost of being more resource-hungry."]}),"\n",(0,t.jsx)(i.h2,{id:"history",children:"History"}),"\n",(0,t.jsx)(i.p,{children:"In 2003, the codec was merged into FFmpeg; however, the bitstream specification was frozen in 2006 (officially FFV1 version 0). Later, in 2009, version 1 came out, covering more video bit depths. Version 2 never got its release, existing only in experimental form."}),"\n",(0,t.jsx)(i.p,{children:"The third bitstream version was frozen in 2013 and is still the latest as of 2024. It added multithreading support and frame integrity checking."}),"\n",(0,t.jsxs)(i.p,{children:["There is a fourth version ",(0,t.jsx)(i.a,{href:"https://datatracker.ietf.org/doc/draft-ietf-cellar-ffv1-v4/",children:"coming"})," which might bring better support for color spaces, compression improvements, and maybe proper inter-frame prediction."]}),"\n",(0,t.jsx)(i.h2,{id:"usage",children:"Usage"}),"\n",(0,t.jsx)(i.pre,{children:(0,t.jsx)(i.code,{className:"language-bash",metastring:'title="Fast, heavily multithreaded"',children:"ffmpeg -i input.mkv -c:v ffv1 -slices 16 out.mkv\n"})}),"\n",(0,t.jsx)(i.pre,{children:(0,t.jsx)(i.code,{className:"language-bash",metastring:'title="Slow, highest compression"',children:"ffmpeg -i input.mkv -c:v ffv1 -g 60 -slices 4 -context 1 -coder 2 out.mkv\n"})}),"\n",(0,t.jsx)(i.pre,{children:(0,t.jsx)(i.code,{className:"language-bash",metastring:'title="Recommended for archival purposes, high compression, multithreaded"',children:"ffmpeg -i input.mkv -c:v ffv1 -g 1 -slices 16 -slicecrc 1 -context 1 -coder 2 out.mkv\n"})}),"\n",(0,t.jsx)(i.h3,{id:"options",children:"Options"}),"\n",(0,t.jsxs)(i.ul,{children:["\n",(0,t.jsxs)(i.li,{children:[(0,t.jsx)(i.code,{children:"slices"})," - Slices divide the frame into multiple parts that can be encoded and decoded in parallel. Can only be one of: [",(0,t.jsx)(i.code,{children:"4"}),", ",(0,t.jsx)(i.code,{children:"6"}),", ",(0,t.jsx)(i.code,{children:"9"}),", ",(0,t.jsx)(i.code,{children:"12"}),", ",(0,t.jsx)(i.code,{children:"16"}),", ",(0,t.jsx)(i.code,{children:"24"}),", ",(0,t.jsx)(i.code,{children:"30"}),"], where ",(0,t.jsx)(i.code,{children:"4"})," is the default."]}),"\n",(0,t.jsxs)(i.li,{children:[(0,t.jsx)(i.code,{children:"slicecrc"})," - Setting it to ",(0,t.jsx)(i.code,{children:"1"})," will enable the decoder to detect errors in the bitstream. Must be enabled for archival use. Can be either ",(0,t.jsx)(i.code,{children:"0"})," or ",(0,t.jsx)(i.code,{children:"1"}),"."]}),"\n",(0,t.jsxs)(i.li,{children:[(0,t.jsx)(i.code,{children:"context"})," - Setting it to ",(0,t.jsx)(i.code,{children:"1"})," will make the encoder use a larger context size, which usually leads to better compression. Can be either ",(0,t.jsx)(i.code,{children:"0"})," or ",(0,t.jsx)(i.code,{children:"1"}),"."]}),"\n",(0,t.jsxs)(i.li,{children:[(0,t.jsx)(i.code,{children:"coder"})," - Sets entropy coding method:","\n",(0,t.jsxs)(i.ul,{children:["\n",(0,t.jsxs)(i.li,{children:[(0,t.jsx)(i.code,{children:"0"})," - Golomb-Rice (faster, default)"]}),"\n",(0,t.jsxs)(i.li,{children:[(0,t.jsx)(i.code,{children:"1"})," - Range Coder (used for higher bit depths and better compression)"]}),"\n",(0,t.jsxs)(i.li,{children:[(0,t.jsx)(i.code,{children:"2"})," - Range Coder with custom state transition table (almost the same as ",(0,t.jsx)(i.code,{children:"1"}),")"]}),"\n"]}),"\n"]}),"\n",(0,t.jsxs)(i.li,{children:[(0,t.jsx)(i.code,{children:"g"})," - Sets GOP size. Must be ",(0,t.jsx)(i.code,{children:"1"})," for archival use. ",(0,t.jsx)(i.a,{href:"#intra-frame-only-catch",children:"See below"})]}),"\n"]}),"\n",(0,t.jsx)(i.h2,{id:"intra-frame-only-catch",children:"Intra-frame only catch"}),"\n",(0,t.jsxs)(i.p,{children:["Intra-frame codecs do not use well known inter-frame video coding techniques such as motion compensation, reusing parts of surrounding frames or adapting encoding context based on them. Every frame is independent from one another. Common intra-frame codecs include Motion JPEG (Lossy), Motion JPEG 2000 (Both), and ",(0,t.jsx)(i.a,{href:"/docs/video/utvideo",children:"UT Video"})," (Lossless)."]}),"\n",(0,t.jsxs)(i.p,{children:["If you're a careful reader, you might have noticed that setting ",(0,t.jsx)(i.code,{children:"GOP size"})," isn't a common characteristic among intra-frame codecs."]}),"\n",(0,t.jsxs)(i.p,{children:["In fact, FFV1 can be considered an intra-frame codec only if the ",(0,t.jsx)(i.code,{children:"GOP size"})," is set to ",(0,t.jsx)(i.code,{children:"1"}),". When it's larger than that, its context model depends on other frames found within the GOP, which contradicts the definition of intra-frame video codec. That is why it's highly advised to set ",(0,t.jsx)(i.code,{children:"GOP size"})," to ",(0,t.jsx)(i.code,{children:"1"})," for archiving. This way, if a single frame gets damaged, you'll\nonly lose that frame. If ",(0,t.jsx)(i.code,{children:"GOP size"})," was large, you might lose much bigger part of the video."]}),"\n",(0,t.jsx)(i.p,{children:"References:"}),"\n",(0,t.jsxs)(i.ul,{children:["\n",(0,t.jsx)(i.li,{children:(0,t.jsx)(i.a,{href:"https://en.wikipedia.org/wiki/FFV1",children:"Wikipedia"})}),"\n",(0,t.jsx)(i.li,{children:(0,t.jsx)(i.a,{href:"https://datatracker.ietf.org/doc/html/rfc9043",children:"RFC9043"})}),"\n",(0,t.jsx)(i.li,{children:(0,t.jsx)(i.a,{href:"https://trac.ffmpeg.org/wiki/Encode/FFV1",children:"FFmpeg Docs"})}),"\n",(0,t.jsx)(i.li,{children:(0,t.jsx)(i.a,{href:"https://forum.shotcut.org/t/exporting-as-ffv1-change-form-to-support-lossless-parameters/41230/19?page=2",children:"This Thread"})}),"\n",(0,t.jsx)(i.li,{children:(0,t.jsx)(i.a,{href:"https://video.stackexchange.com/questions/24874/what-does-the-context-parameter-mean-when-using-ffv1-in-ffmpeg",children:"This Question"})}),"\n"]})]})}function h(e={}){const{wrapper:i}={...(0,o.R)(),...e.components};return i?(0,t.jsx)(i,{...e,children:(0,t.jsx)(l,{...e})}):l(e)}},8453:(e,i,n)=>{n.d(i,{R:()=>r,x:()=>c});var t=n(6540);const o={},s=t.createContext(o);function r(e){const i=t.useContext(s);return t.useMemo((function(){return"function"==typeof e?e(i):{...i,...e}}),[i,e])}function c(e){let i;return i=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:r(e.components),t.createElement(s.Provider,{value:i},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/9cae5962.dbfe0728.js b/assets/js/9cae5962.1ac861f4.js similarity index 93% rename from assets/js/9cae5962.dbfe0728.js rename to assets/js/9cae5962.1ac861f4.js index 22e747e3..833293dd 100644 --- a/assets/js/9cae5962.dbfe0728.js +++ b/assets/js/9cae5962.1ac861f4.js @@ -1 +1 @@ -"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[71],{5650:(e,i,s)=>{s.r(i),s.d(i,{assets:()=>c,contentTitle:()=>l,default:()=>p,frontMatter:()=>a,metadata:()=>d,toc:()=>h});var n=s(4848),t=s(8453),r=s(1470),o=s(9365);const a={title:"JPEG-XL",sidebar_position:7},l="JPEG-XL",d={id:"images/JXL",title:"JPEG-XL",description:"JPEG-XL (JXL) is a compression format for images that was developed by the Joint Photographic Experts Group (JPEG) in 2020. It is designed to provide improved compression efficiency compared to the traditional JPEG format, while still maintaining image quality. JPEG-XL uses a combination of techniques such as perceptual color encoding, advanced entropy coding, and a new image prediction method to achieve its improved compression performance. It also has a lossless JPEG recompression mode, where an existing JPEG file can be turned into a JXL that can be decoded for a bit-for-bit exact replica of the original JPEG.",source:"@site/docs/images/JXL.mdx",sourceDirName:"images",slug:"/images/JXL",permalink:"/docs/images/JXL",draft:!1,unlisted:!1,editUrl:"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/images/JXL.mdx",tags:[],version:"current",sidebarPosition:7,frontMatter:{title:"JPEG-XL",sidebar_position:7},sidebar:"tutorialSidebar",previous:{title:"AVIF",permalink:"/docs/images/AVIF"},next:{title:"QOI",permalink:"/docs/images/QOI"}},c={},h=[{value:"Performance Checklist",id:"performance-checklist",level:2},{value:"Format Breakdown",id:"format-breakdown",level:2},{value:"Lossless Compression",id:"lossless-compression",level:3},{value:"Lossy Compression",id:"lossy-compression",level:3},{value:"Supported Bit Depth(s)",id:"supported-bit-depths",level:3},{value:"Progressive Decode",id:"progressive-decode",level:3},{value:"Lossless JPEG Re-compression",id:"lossless-jpeg-re-compression",level:3},{value:"Industry Support",id:"industry-support",level:3},{value:"Other Features",id:"other-features",level:3},{value:"Encoders",id:"encoders",level:2},{value:"libjxl",id:"libjxl",level:3},{value:"libjxl-tiny",id:"libjxl-tiny",level:3},{value:"Hydrium",id:"hydrium",level:3},{value:"zune-jpegxl",id:"zune-jpegxl",level:3},{value:"Decoders",id:"decoders",level:2},{value:"jxl-oxide",id:"jxl-oxide",level:3}];function u(e){const i={a:"a",blockquote:"blockquote",code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,t.R)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(i.header,{children:(0,n.jsx)(i.h1,{id:"jpeg-xl",children:"JPEG-XL"})}),"\n",(0,n.jsxs)(i.p,{children:["JPEG-XL (JXL) is a compression format for images that was developed by the Joint Photographic Experts Group (JPEG) in 2020. It is designed to provide improved compression efficiency compared to the traditional ",(0,n.jsx)(i.a,{href:"/docs/images/JPEG",children:"JPEG"})," format, while still maintaining image quality. JPEG-XL uses a combination of techniques such as perceptual color encoding, advanced entropy coding, and a new image prediction method to achieve its improved compression performance. It also has a lossless JPEG recompression mode, where an existing JPEG file can be turned into a JXL that can be decoded for a bit-for-bit exact replica of the original JPEG."]}),"\n",(0,n.jsx)(i.h2,{id:"performance-checklist",children:"Performance Checklist"}),"\n",(0,n.jsxs)(i.p,{children:["Lossless? ",(0,n.jsx)(i.em,{children:"Yes"})]}),"\n",(0,n.jsxs)(i.p,{children:["Lossy? ",(0,n.jsx)(i.em,{children:"Yes"})]}),"\n",(0,n.jsxs)(i.p,{children:["Supported Bit Depths:\n",(0,n.jsx)(i.em,{children:"Up to 32 BPC"})]}),"\n",(0,n.jsxs)(i.p,{children:["HDR/Wide Gamut? ",(0,n.jsx)(i.em,{children:"Yes"})]}),"\n",(0,n.jsxs)(i.p,{children:["Animation? ",(0,n.jsx)(i.em,{children:"Yes"})]}),"\n",(0,n.jsxs)(i.p,{children:["Transparency? ",(0,n.jsx)(i.em,{children:"Yes"})]}),"\n",(0,n.jsxs)(i.p,{children:["Progressive Decode? ",(0,n.jsx)(i.em,{children:"Yes"})]}),"\n",(0,n.jsxs)(i.p,{children:["Royalty Free? ",(0,n.jsx)(i.em,{children:"Yes"})]}),"\n",(0,n.jsx)(i.h2,{id:"format-breakdown",children:"Format Breakdown"}),"\n",(0,n.jsxs)(i.p,{children:["JPEG-XL has a number of standout features that make it an appealing image codec to work with for many use cases. From the ",(0,n.jsx)(i.a,{href:"https://jpegxl.info",children:"JPEG-XL Info page"}),", JXL has the following features:"]}),"\n",(0,n.jsxs)(i.ul,{children:["\n",(0,n.jsxs)(i.li,{children:[(0,n.jsx)(i.strong,{children:"Best lossless image compression"}),": It offers about 35% smaller file sizes than PNG (50% smaller for HDR)."]}),"\n",(0,n.jsxs)(i.li,{children:[(0,n.jsx)(i.strong,{children:"High-fidelity lossy image compression"}),": JPEG XL provides about 60% smaller file sizes than JPEG for the same visual quality."]}),"\n",(0,n.jsxs)(i.li,{children:[(0,n.jsx)(i.strong,{children:"Progressive decoding"}),": This allows an image to be displayed in lower quality before the entire file has been downloaded, improving user experience on slow connections."]}),"\n",(0,n.jsxs)(i.li,{children:[(0,n.jsx)(i.strong,{children:"Lossless JPEG transcoding"}),": JPEG images can be converted to JPEG XL without any mathematical loss, and the resulting file is about 20% smaller."]}),"\n",(0,n.jsxs)(i.li,{children:[(0,n.jsx)(i.strong,{children:"Designed for both photographic and synthetic images"}),": JPEG XL works well with a wide range of image types, including photos, graphics, and illustrations."]}),"\n",(0,n.jsxs)(i.li,{children:[(0,n.jsx)(i.strong,{children:"Fast software encoding and decoding"}),": The codec is designed to be efficient and fast, enabling quick image loading and saving."]}),"\n",(0,n.jsxs)(i.li,{children:[(0,n.jsx)(i.strong,{children:"Full support for wide gamut and HDR"}),": JPEG XL supports a wide range of colors and high dynamic range, making it suitable for modern displays."]}),"\n",(0,n.jsxs)(i.li,{children:[(0,n.jsx)(i.strong,{children:"Perceptually optimizing reference encoder"}),": The encoder is designed to optimize image quality based on how humans perceive images."]}),"\n"]}),"\n",(0,n.jsx)(i.h3,{id:"lossless-compression",children:"Lossless Compression"}),"\n",(0,n.jsx)(i.p,{children:"JPEG-XL offers excellent lossless compression capabilities. While lossless WebP was an improvement over PNG for 8-bit lossless image encoding, JPEG-XL manages not only to outdo lossless WebP in encoding efficiency but also be more versatile for bit depths greater than 8-bit (a category PNG previously dominated). 16-bit lossless imagery, especially HDR images that are becoming more popular & rarely utilize 8-bit color depth, are where JPEG-XL shines, and it is the only codec to compete with PNG in that regard while providing better coding efficiency."}),"\n",(0,n.jsxs)(i.p,{children:["Example: JPEG-XL compresses ",(0,n.jsx)(i.a,{href:"https://imgsaver.com/images/2023/10/03/16bit.png",children:"this 16-bit AdobeRGB PNG"})," better than PNG. Using: ",(0,n.jsx)(i.code,{children:"cjxl 16bit.png 16bit.jxl -d 0.0 -e 9 -I 100 -g 3 -E 11"})]}),"\n",(0,n.jsxs)(i.p,{children:["16-bit PNG: ",(0,n.jsx)(i.code,{children:"1533373"})," bytes.\n16-bit JXL: ",(0,n.jsx)(i.code,{children:"1211029"})," bytes."]}),"\n",(0,n.jsx)(i.h3,{id:"lossy-compression",children:"Lossy Compression"}),"\n",(0,n.jsx)(i.p,{children:"JPEG-XL is also adept at lossy compression, especially at quality levels that we as humans care about. It promises to be around 60% better than JPEG. While video-based codecs like AVIF can be competitive when given lots of CPU time, JPEG-XL is both fast and efficient for medium to high fidelity photographic imaging."}),"\n",(0,n.jsx)(i.h3,{id:"supported-bit-depths",children:"Supported Bit Depth(s)"}),"\n",(0,n.jsx)(i.p,{children:"JPEG-XL supports up to 32 bits per channel of bit depth, making it future proof for the increasingly popular HDR photos coming out of smartphones. There is essentially zero downside to encoding high bit depth with JXL relative to the resulting encode's size. Considering many smartphones take HDR photos now, JXL offers a compelling pipeline for these photos to make their way to the Web in the future especially as companies like Adobe & Apple have already embraced the new codec."}),"\n",(0,n.jsx)(i.h3,{id:"progressive-decode",children:"Progressive Decode"}),"\n",(0,n.jsx)(i.p,{children:"JPEG-XL provides actual progressive decode support that you can experiment with here on a supported browser like Safari, Waterfox, Thorium, Mercury, or any browser on iOS."}),"\n",(0,n.jsx)(i.p,{children:"Progressive decode is a feature only JPEG is able to offer a real implementation of, rendering low frequency transform coefficients before the rest of the image arrives to allow an image to display before the entire thing has been sent over the network. Blurhashes do not replace this technology, but rather compliment it, allowing another layer of progressive decode that can be used even before the image begins to load progressively. This is an important feature to improve the user experience on websites featuring large images, or on any website if your Internet connection isn't strong."}),"\n",(0,n.jsx)(i.h3,{id:"lossless-jpeg-re-compression",children:"Lossless JPEG Re-compression"}),"\n",(0,n.jsx)(i.p,{children:"An incredibly unique JPEG-XL feature is lossless JPEG re-compression, or the ability to take a JPEG input and provide an output with a smaller filesize (on average, 20% smaller) that is pixel-for-pixel identical. This is why companies like Meta have endorsed JPEG-XL, as it offers a path forward for the existing JPEGs on the Internet."}),"\n",(0,n.jsx)(i.h3,{id:"industry-support",children:"Industry Support"}),"\n",(0,n.jsx)(i.p,{children:"From the JPEG-XL Wikipedia page:"}),"\n",(0,n.jsxs)(i.blockquote,{children:["\n",(0,n.jsx)(i.p,{children:"Besides Cloudinary and Google originally, throughout JPEG XL's preliminary implementation in web browsers, various representatives of well-known industry brand names have publicly voiced support for JPEG XL as their preferred choice, including Facebook, Adobe, Intel and the Video Electronics Standards Association, The Guardian, Flickr and SmugMug, Shopify, the Krita Foundation, and Serif Ltd."}),"\n"]}),"\n",(0,n.jsx)(i.p,{children:"Apple also features ecosystem-wide JPEG-XL support as of iOS 17 & macOS Sonoma."}),"\n",(0,n.jsx)(i.h3,{id:"other-features",children:"Other Features"}),"\n",(0,n.jsx)(i.p,{children:"JPEG-XL has the potential to replace popular formats like TIFF for authoring workflows due to its broad feature set. From the JXL Wikipedia, some additional features include:"}),"\n",(0,n.jsxs)(i.ul,{children:["\n",(0,n.jsx)(i.li,{children:"Image dimensions of over a billion (2^30-1) pixels on each side."}),"\n",(0,n.jsx)(i.li,{children:"Up to 4099 channels, including support for alpha transparency"}),"\n",(0,n.jsx)(i.li,{children:"There can be multiple frames with zero duration, allowing support for layers in graphics software"}),"\n",(0,n.jsx)(i.li,{children:"Animation support, allowing JXL to rival GIF"}),"\n",(0,n.jsx)(i.li,{children:"Images can be stored in tiles to reduce the time needed to decode them."}),"\n",(0,n.jsx)(i.li,{children:"Graceful quality degradation across a large range of bitrates means quality loss isn't as abrupt as with older formats."}),"\n",(0,n.jsx)(i.li,{children:"Perceptually optimized reference encoder which uses a perceptual color space, adaptive quantization, and conservative default settings."}),"\n",(0,n.jsx)(i.li,{children:"Support for wide color gamut and HDR"}),"\n",(0,n.jsx)(i.li,{children:"Efficient encoding and decoding without requiring specialized hardware: JPEG XL is about as fast to encode and decode as old JPEG using libjpeg-turbo and an order of magnitude faster to encode and decode compared to HEIC with x265. It is also parallelizable."}),"\n",(0,n.jsx)(i.li,{children:"Royalty-free format with an open-source reference implementation available on GitHub."}),"\n"]}),"\n",(0,n.jsx)(i.h2,{id:"encoders",children:"Encoders"}),"\n",(0,n.jsx)(i.p,{children:"JPEG-XL has a couple of noteworthy encoders currently available to work with. Because JPEG-XL is so new, most encoders aren't yet intelligent enough to take advantage of the whole format yet. Here's a quote from Jon Sneyers in the JPEG-XL discord that sums it up nicely:"}),"\n",(0,n.jsxs)(i.blockquote,{children:["\n",(0,n.jsx)(i.p,{children:"Encode side: 80% or so of the coding tools are used in one way or another by the encoder (the 20% is splines and super large VarDCT blocks, and also the things that are not used by default without using special experimental options, such as delta palette and noise). But the coding tools that are used, are typically used in a specific, limited way that doesn't come anywhere close to exhausting the bitstream expressivity."}),"\n"]}),"\n",(0,n.jsxs)(i.p,{children:["Sneyers is talking about libjxl's ",(0,n.jsx)(i.code,{children:"cjxl"})," encoder, which will be discussed further below."]}),"\n",(0,n.jsx)(i.h3,{id:"libjxl",children:"libjxl"}),"\n",(0,n.jsxs)(i.p,{children:["The reference ",(0,n.jsx)(i.a,{href:"https://github.com/libjxl/libjxl",children:"libjxl"})," implementation has the capability to both decode and encode JPEG-XL image files. Both are discussed below."]}),"\n",(0,n.jsxs)(r.A,{children:[(0,n.jsxs)(o.A,{value:"enc",label:"Encoding",default:!0,children:[(0,n.jsxs)(i.p,{children:["libjxl's encoder ",(0,n.jsx)(i.code,{children:"cjxl"})," has more options to play around with. It takes a few primary arguments, distance (",(0,n.jsx)(i.code,{children:"-d"}),"), quality (",(0,n.jsx)(i.code,{children:"-q"}),"), and effort (",(0,n.jsx)(i.code,{children:"-e"}),")."]}),(0,n.jsx)(i.p,{children:(0,n.jsx)(i.strong,{children:"Distance and quality"})}),(0,n.jsxs)(i.p,{children:["Distance and quality are two ways of specifying ",(0,n.jsx)(i.em,{children:"how much loss"})," you are willing to tolerate, and as such, they are mutually exclusive, as they pull the same levers under the hood."]}),(0,n.jsxs)(i.ul,{children:["\n",(0,n.jsxs)(i.li,{children:["Distance is designed to map to how 'close' one must be to the source to notice any loss. It is represented as a scale between 0.0 & 25.0. 0.0 is ",(0,n.jsx)(i.strong,{children:"mathematically lossless"}),", every pixel will have the exact same value as the source. 1.0 is designed to be ",(0,n.jsx)(i.strong,{children:"visually lossless"}),", look the same at a normal viewing distance, and higher values have more loss."]}),"\n",(0,n.jsxs)(i.li,{children:["Quality is designed to roughly map to ",(0,n.jsx)(i.a,{href:"/docs/images/JPEG",children:"JPEG"}),"'s quality argument. A range 0-100, where 100 is ",(0,n.jsx)(i.strong,{children:"mathematically lossless"}),", 90 is intended to be ",(0,n.jsx)(i.strong,{children:"visually lossless"}),", and 0 is almost unrecognizable as the original image."]}),"\n"]}),(0,n.jsx)(i.p,{children:(0,n.jsx)(i.strong,{children:"Effort"})}),(0,n.jsxs)(i.p,{children:["Effort is similar to ",(0,n.jsx)(i.code,{children:"cpu-used"})," in video encoding. It specifies the amount of effort the encoder will make in order to get the smallest file size it can. It takes the form of a range 1-9, where higher numbers will spend more resources to get diminishing returns in terms of smaller size, while lower values do the opposite, leaving file size on the table for faster encoding."]}),(0,n.jsx)(i.pre,{children:(0,n.jsx)(i.code,{className:"language-bash",metastring:'title="Encoding with effort 9 and distance 1.0"',children:"cjxl -e 9 -d 1.0 example.png example.jxl\n"})}),(0,n.jsx)(i.pre,{children:(0,n.jsx)(i.code,{className:"language-bash",metastring:'title="This, by default uses lossless JPEG compression."',children:"cjxl example.jpg example.jxl\n"})})]}),(0,n.jsxs)(o.A,{value:"dec",label:"Decoding",children:[(0,n.jsxs)(i.p,{children:["Decoding a ",(0,n.jsx)(i.code,{children:".jxl"})," image is straightforward with libjxl's decoder, ",(0,n.jsx)(i.code,{children:"djxl"}),":"]}),(0,n.jsx)(i.pre,{children:(0,n.jsx)(i.code,{className:"language-bash",children:"djxl example.jxl example.png\n"})}),(0,n.jsxs)(i.p,{children:[(0,n.jsx)(i.code,{children:"djxl"})," can decode to pixels via pipes, png, apng for animated jxl, jpg, ppm, and pfm."]}),(0,n.jsxs)(i.p,{children:["By default, if the ",(0,n.jsx)(i.code,{children:".jxl"})," file was encoded with lossless jpeg recompression, ",(0,n.jsx)(i.code,{children:"djxl"})," will rebuild the exact jpeg file that was originally compressed. To avoid this, and create a new jpeg file:"]}),(0,n.jsx)(i.pre,{children:(0,n.jsx)(i.code,{className:"language-bash",children:"djxl -j example.jxl example.jpg\n"})}),(0,n.jsx)(i.p,{children:(0,n.jsxs)(i.strong,{children:["Keep in mind this is now a lossy process as ",(0,n.jsx)(i.code,{children:"djxl"})," will decode to pixels, then encode a new ",(0,n.jsx)(i.code,{children:".jpg"})," with those pixels."]})})]}),(0,n.jsxs)(o.A,{value:"build",label:"Building",children:[(0,n.jsxs)(i.p,{children:["A full build guide is provided in the ",(0,n.jsx)(i.a,{href:"https://github.com/libjxl/libjxl/blob/main/BUILDING.md",children:"libjxl build instructions"})," in the GitHub repo. This guide is simplified, and is only focused on building a working efficient encoder & decoder."]}),(0,n.jsx)(i.p,{children:"These instructions should work for macOS and Linux, although macOS support isn't guaranteed."}),(0,n.jsx)(i.pre,{children:(0,n.jsx)(i.code,{className:"language-bash",metastring:'title="1. Clone the repo"',children:"git clone https://github.com/libjxl/libjxl.git --recursive --shallow-submodules\n"})}),(0,n.jsx)(i.pre,{children:(0,n.jsx)(i.code,{className:"language-bash",metastring:'title="2. Install dependencies. May have to run these commands with root"',children:"apt install cmake pkg-config libbrotli-dev clang # Debian Linux\npacman -Syu cmake pkgconf brotli clang # Arch Linux\nbrew install cmake pkg-config brotli # macOS\n"})}),(0,n.jsx)(i.pre,{children:(0,n.jsx)(i.code,{className:"language-bash",metastring:'title="3. Set CC & CXX variables before building (Recommended)"',children:"export CC=clang CXX=clang++\n"})}),(0,n.jsx)(i.pre,{children:(0,n.jsx)(i.code,{className:"language-bash",metastring:'title="4. cjxl & djxl will be available in the build/tools directory."',children:'cd libjxl && mkdir build && cd build\ncmake -DCMAKE_BUILD_TYPE=Release -DCMAKE_CXX_FLAGS="-O3 -march=native" -DCMAKE_C_FLAGS="-O3 -march=native" -DBUILD_TESTING=OFF -DJPEGXL_WARNINGS_AS_ERRORS=OFF -DJPEGXL_ENABLE_SJPEG=OFF ..\ncmake --build . -- -j$(nproc)\n'})}),(0,n.jsxs)(i.p,{children:["This will build ",(0,n.jsx)(i.code,{children:"cjxl"})," and ",(0,n.jsx)(i.code,{children:"djxl"})," with O3 optimization for your CPU architecture on Linux or macOS. Again, be aware that macOS support is not a priority. Via the libjxl OS X build guide:"]}),(0,n.jsxs)(i.blockquote,{children:["\n",(0,n.jsx)(i.p,{children:'OSX builds have "best effort" support, i.e. build might not work at all, some tests may fail and some sub-projects are excluded from build.'}),"\n"]})]})]}),"\n",(0,n.jsx)(i.h3,{id:"libjxl-tiny",children:"libjxl-tiny"}),"\n",(0,n.jsxs)(i.p,{children:[(0,n.jsx)(i.a,{href:"https://github.com/libjxl/libjxl-tiny",children:"libjxl-tiny"})," contains a simpler encoder implementation of JPEG XL, aimed at photographic images without an alpha channel. The goal is to guide hardware implementations of the encoder where support for the full set of encoding tools is not feasible. The color management is outside the scope of this library, the encoder input is given as a portable float map (PFM) in the linear sRGB colorspace, where individual sample values can be outside the [0.0, 1.0] range for out-of-gammut colors. For more details, see the ",(0,n.jsx)(i.a,{href:"https://github.com/libjxl/libjxl-tiny/blob/main/doc/coding_tools.md",children:"overview of the coding tools"}),"."]}),"\n",(0,n.jsx)(i.p,{children:"The last commit was ten months ago, so it is uncertain whether libjxl-tiny could be considered active."}),"\n",(0,n.jsx)(i.h3,{id:"hydrium",children:"Hydrium"}),"\n",(0,n.jsxs)(i.p,{children:[(0,n.jsx)(i.a,{href:"https://github.com/Traneptora/hydrium",children:"Hydrium"})," is a fast, ultra-low-memory, streaming JPEG XL encoder written in portable C. It is maintained by Traneptora."]}),"\n",(0,n.jsx)(i.h3,{id:"zune-jpegxl",children:"zune-jpegxl"}),"\n",(0,n.jsxs)(i.p,{children:[(0,n.jsx)(i.a,{href:"https://github.com/etemesi254/zune-image/tree/dev/crates/zune-jpegxl",children:"zune-jpegxl"})," is a simple, fast and fully safe modular JXL encoder written in Rust. It is maintained by etemesi254."]}),"\n",(0,n.jsx)(i.p,{children:"zune-jpegxl has the following features:"}),"\n",(0,n.jsxs)(i.ul,{children:["\n",(0,n.jsx)(i.li,{children:"Lossless encoding"}),"\n",(0,n.jsx)(i.li,{children:"8 bit and 16 bit support"}),"\n",(0,n.jsx)(i.li,{children:"Grayscale and RGBA encoding"}),"\n",(0,n.jsx)(i.li,{children:"Threading capabilities"}),"\n"]}),"\n",(0,n.jsx)(i.h2,{id:"decoders",children:"Decoders"}),"\n",(0,n.jsx)(i.h3,{id:"jxl-oxide",children:"jxl-oxide"}),"\n",(0,n.jsxs)(i.p,{children:[(0,n.jsx)(i.a,{href:"https://github.com/tirr-c/jxl-oxide",children:"jxl-oxide"})," is a spec-conforming JPEG XL decoder written in pure Rust. It is maintained by Wonwoo Choi."]}),"\n","\n",(0,n.jsx)(i.p,{children:"Sources:"}),"\n",(0,n.jsxs)(i.ul,{children:["\n",(0,n.jsx)(i.li,{children:(0,n.jsx)(i.a,{href:"https://en.wikipedia.org/wiki/JPEG_XL",children:"JXL Wikipedia"})}),"\n",(0,n.jsx)(i.li,{children:(0,n.jsx)(i.a,{href:"https://jpegxl.info/why-jxl.html",children:"JPEGXL.info: Why JXL"})}),"\n",(0,n.jsx)(i.li,{children:(0,n.jsx)(i.a,{href:"https://webkit.org/blog/14205/news-from-wwdc23-webkit-features-in-safari-17-beta/#images",children:"Apple JXL Announcement"})}),"\n",(0,n.jsx)(i.li,{children:(0,n.jsx)(i.a,{href:"https://cloudinary.com/blog/jpeg-xl-how-it-started-how-its-going",children:"JPEG XL: How It Started, How It's Going"})}),"\n",(0,n.jsx)(i.li,{children:(0,n.jsx)(i.a,{href:"https://cloudinary.com/blog/the-case-for-jpeg-xl",children:"The Case for JPEG XL"})}),"\n",(0,n.jsx)(i.li,{children:(0,n.jsx)(i.a,{href:"https://cloudinary.com/blog/time_for_next_gen_codecs_to_dethrone_jpeg",children:"Time for Next-Gen Codecs to Dethrone JPEG"})}),"\n",(0,n.jsx)(i.li,{children:(0,n.jsx)(i.a,{href:"https://giannirosato.com/blog/post/image-comparison/",children:"Image Codec Comparison"})}),"\n"]})]})}function p(e={}){const{wrapper:i}={...(0,t.R)(),...e.components};return i?(0,n.jsx)(i,{...e,children:(0,n.jsx)(u,{...e})}):u(e)}},9365:(e,i,s)=>{s.d(i,{A:()=>o});s(6540);var n=s(4164);const t={tabItem:"tabItem_Ymn6"};var r=s(4848);function o(e){let{children:i,hidden:s,className:o}=e;return(0,r.jsx)("div",{role:"tabpanel",className:(0,n.A)(t.tabItem,o),hidden:s,children:i})}},1470:(e,i,s)=>{s.d(i,{A:()=>w});var n=s(6540),t=s(4164),r=s(3104),o=s(6347),a=s(205),l=s(7485),d=s(1682),c=s(679);function h(e){return n.Children.toArray(e).filter((e=>"\n"!==e)).map((e=>{if(!e||(0,n.isValidElement)(e)&&function(e){const{props:i}=e;return!!i&&"object"==typeof i&&"value"in i}(e))return e;throw new Error(`Docusaurus error: Bad child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the component should be , and every should have a unique "value" prop.`)}))?.filter(Boolean)??[]}function u(e){const{values:i,children:s}=e;return(0,n.useMemo)((()=>{const e=i??function(e){return h(e).map((e=>{let{props:{value:i,label:s,attributes:n,default:t}}=e;return{value:i,label:s,attributes:n,default:t}}))}(s);return function(e){const i=(0,d.XI)(e,((e,i)=>e.value===i.value));if(i.length>0)throw new Error(`Docusaurus error: Duplicate values "${i.map((e=>e.value)).join(", ")}" found in . Every value needs to be unique.`)}(e),e}),[i,s])}function p(e){let{value:i,tabValues:s}=e;return s.some((e=>e.value===i))}function m(e){let{queryString:i=!1,groupId:s}=e;const t=(0,o.W6)(),r=function(e){let{queryString:i=!1,groupId:s}=e;if("string"==typeof i)return i;if(!1===i)return null;if(!0===i&&!s)throw new Error('Docusaurus error: The component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return s??null}({queryString:i,groupId:s});return[(0,l.aZ)(r),(0,n.useCallback)((e=>{if(!r)return;const i=new URLSearchParams(t.location.search);i.set(r,e),t.replace({...t.location,search:i.toString()})}),[r,t])]}function g(e){const{defaultValue:i,queryString:s=!1,groupId:t}=e,r=u(e),[o,l]=(0,n.useState)((()=>function(e){let{defaultValue:i,tabValues:s}=e;if(0===s.length)throw new Error("Docusaurus error: the component requires at least one children component");if(i){if(!p({value:i,tabValues:s}))throw new Error(`Docusaurus error: The has a defaultValue "${i}" but none of its children has the corresponding value. Available values are: ${s.map((e=>e.value)).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return i}const n=s.find((e=>e.default))??s[0];if(!n)throw new Error("Unexpected error: 0 tabValues");return n.value}({defaultValue:i,tabValues:r}))),[d,h]=m({queryString:s,groupId:t}),[g,x]=function(e){let{groupId:i}=e;const s=function(e){return e?`docusaurus.tab.${e}`:null}(i),[t,r]=(0,c.Dv)(s);return[t,(0,n.useCallback)((e=>{s&&r.set(e)}),[s,r])]}({groupId:t}),f=(()=>{const e=d??g;return p({value:e,tabValues:r})?e:null})();(0,a.A)((()=>{f&&l(f)}),[f]);return{selectedValue:o,selectValue:(0,n.useCallback)((e=>{if(!p({value:e,tabValues:r}))throw new Error(`Can't select invalid tab value=${e}`);l(e),h(e),x(e)}),[h,x,r]),tabValues:r}}var x=s(2303);const f={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};var b=s(4848);function j(e){let{className:i,block:s,selectedValue:n,selectValue:o,tabValues:a}=e;const l=[],{blockElementScrollPositionUntilNextRender:d}=(0,r.a_)(),c=e=>{const i=e.currentTarget,s=l.indexOf(i),t=a[s].value;t!==n&&(d(i),o(t))},h=e=>{let i=null;switch(e.key){case"Enter":c(e);break;case"ArrowRight":{const s=l.indexOf(e.currentTarget)+1;i=l[s]??l[0];break}case"ArrowLeft":{const s=l.indexOf(e.currentTarget)-1;i=l[s]??l[l.length-1];break}}i?.focus()};return(0,b.jsx)("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,t.A)("tabs",{"tabs--block":s},i),children:a.map((e=>{let{value:i,label:s,attributes:r}=e;return(0,b.jsx)("li",{role:"tab",tabIndex:n===i?0:-1,"aria-selected":n===i,ref:e=>l.push(e),onKeyDown:h,onClick:c,...r,className:(0,t.A)("tabs__item",f.tabItem,r?.className,{"tabs__item--active":n===i}),children:s??i},i)}))})}function y(e){let{lazy:i,children:s,selectedValue:r}=e;const o=(Array.isArray(s)?s:[s]).filter(Boolean);if(i){const e=o.find((e=>e.props.value===r));return e?(0,n.cloneElement)(e,{className:(0,t.A)("margin-top--md",e.props.className)}):null}return(0,b.jsx)("div",{className:"margin-top--md",children:o.map(((e,i)=>(0,n.cloneElement)(e,{key:i,hidden:e.props.value!==r})))})}function v(e){const i=g(e);return(0,b.jsxs)("div",{className:(0,t.A)("tabs-container",f.tabList),children:[(0,b.jsx)(j,{...i,...e}),(0,b.jsx)(y,{...i,...e})]})}function w(e){const i=(0,x.A)();return(0,b.jsx)(v,{...e,children:h(e.children)},String(i))}},8453:(e,i,s)=>{s.d(i,{R:()=>o,x:()=>a});var n=s(6540);const t={},r=n.createContext(t);function o(e){const i=n.useContext(r);return n.useMemo((function(){return"function"==typeof e?e(i):{...i,...e}}),[i,e])}function a(e){let i;return i=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:o(e.components),n.createElement(r.Provider,{value:i},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[71],{5650:(e,i,s)=>{s.r(i),s.d(i,{assets:()=>c,contentTitle:()=>l,default:()=>p,frontMatter:()=>a,metadata:()=>d,toc:()=>h});var n=s(4848),t=s(8453),r=s(1470),o=s(9365);const a={title:"JPEG XL",sidebar_position:7},l="JPEG XL",d={id:"images/JXL",title:"JPEG XL",description:"JPEG XL (JXL) is a compression format for images that was developed by the Joint Photographic Experts Group (JPEG) in 2020. It is designed to provide improved compression efficiency compared to the traditional JPEG format, while still maintaining image quality. JPEG XL uses a combination of techniques such as perceptual color encoding, advanced entropy coding, and a new image prediction method to achieve its improved compression performance. It also has a lossless JPEG recompression mode, where an existing JPEG file can be turned into a JXL that can be decoded for a bit-for-bit exact replica of the original JPEG.",source:"@site/docs/images/JXL.mdx",sourceDirName:"images",slug:"/images/JXL",permalink:"/docs/images/JXL",draft:!1,unlisted:!1,editUrl:"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/images/JXL.mdx",tags:[],version:"current",sidebarPosition:7,frontMatter:{title:"JPEG XL",sidebar_position:7},sidebar:"tutorialSidebar",previous:{title:"AVIF",permalink:"/docs/images/AVIF"},next:{title:"QOI",permalink:"/docs/images/QOI"}},c={},h=[{value:"Performance Checklist",id:"performance-checklist",level:2},{value:"Format Breakdown",id:"format-breakdown",level:2},{value:"Lossless Compression",id:"lossless-compression",level:3},{value:"Lossy Compression",id:"lossy-compression",level:3},{value:"Supported Bit Depth(s)",id:"supported-bit-depths",level:3},{value:"Progressive Decode",id:"progressive-decode",level:3},{value:"Lossless JPEG Re-compression",id:"lossless-jpeg-re-compression",level:3},{value:"Industry Support",id:"industry-support",level:3},{value:"Other Features",id:"other-features",level:3},{value:"Encoders",id:"encoders",level:2},{value:"libjxl",id:"libjxl",level:3},{value:"libjxl-tiny",id:"libjxl-tiny",level:3},{value:"Hydrium",id:"hydrium",level:3},{value:"zune-jpegxl",id:"zune-jpegxl",level:3},{value:"Decoders",id:"decoders",level:2},{value:"jxl-oxide",id:"jxl-oxide",level:3}];function u(e){const i={a:"a",blockquote:"blockquote",code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,t.R)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(i.header,{children:(0,n.jsx)(i.h1,{id:"jpeg-xl",children:"JPEG XL"})}),"\n",(0,n.jsxs)(i.p,{children:["JPEG XL (JXL) is a compression format for images that was developed by the Joint Photographic Experts Group (JPEG) in 2020. It is designed to provide improved compression efficiency compared to the traditional ",(0,n.jsx)(i.a,{href:"/docs/images/JPEG",children:"JPEG"})," format, while still maintaining image quality. JPEG XL uses a combination of techniques such as perceptual color encoding, advanced entropy coding, and a new image prediction method to achieve its improved compression performance. It also has a lossless JPEG recompression mode, where an existing JPEG file can be turned into a JXL that can be decoded for a bit-for-bit exact replica of the original JPEG."]}),"\n",(0,n.jsx)(i.h2,{id:"performance-checklist",children:"Performance Checklist"}),"\n",(0,n.jsxs)(i.p,{children:["Lossless? ",(0,n.jsx)(i.em,{children:"Yes"})]}),"\n",(0,n.jsxs)(i.p,{children:["Lossy? ",(0,n.jsx)(i.em,{children:"Yes"})]}),"\n",(0,n.jsxs)(i.p,{children:["Supported Bit Depths:\n",(0,n.jsx)(i.em,{children:"Up to 32 BPC"})]}),"\n",(0,n.jsxs)(i.p,{children:["HDR/Wide Gamut? ",(0,n.jsx)(i.em,{children:"Yes"})]}),"\n",(0,n.jsxs)(i.p,{children:["Animation? ",(0,n.jsx)(i.em,{children:"Yes"})]}),"\n",(0,n.jsxs)(i.p,{children:["Transparency? ",(0,n.jsx)(i.em,{children:"Yes"})]}),"\n",(0,n.jsxs)(i.p,{children:["Progressive Decode? ",(0,n.jsx)(i.em,{children:"Yes"})]}),"\n",(0,n.jsxs)(i.p,{children:["Royalty Free? ",(0,n.jsx)(i.em,{children:"Yes"})]}),"\n",(0,n.jsx)(i.h2,{id:"format-breakdown",children:"Format Breakdown"}),"\n",(0,n.jsxs)(i.p,{children:["JPEG XL has a number of standout features that make it an appealing image codec to work with for many use cases. From the ",(0,n.jsx)(i.a,{href:"https://jpegxl.info",children:"JPEG XL Info page"}),", JXL has the following features:"]}),"\n",(0,n.jsxs)(i.ul,{children:["\n",(0,n.jsxs)(i.li,{children:[(0,n.jsx)(i.strong,{children:"Best lossless image compression"}),": It offers about 35% smaller file sizes than PNG (50% smaller for HDR)."]}),"\n",(0,n.jsxs)(i.li,{children:[(0,n.jsx)(i.strong,{children:"High-fidelity lossy image compression"}),": JPEG XL provides about 60% smaller file sizes than JPEG for the same visual quality."]}),"\n",(0,n.jsxs)(i.li,{children:[(0,n.jsx)(i.strong,{children:"Progressive decoding"}),": This allows an image to be displayed in lower quality before the entire file has been downloaded, improving user experience on slow connections."]}),"\n",(0,n.jsxs)(i.li,{children:[(0,n.jsx)(i.strong,{children:"Lossless JPEG transcoding"}),": JPEG images can be converted to JPEG XL without any mathematical loss, and the resulting file is about 20% smaller."]}),"\n",(0,n.jsxs)(i.li,{children:[(0,n.jsx)(i.strong,{children:"Designed for both photographic and synthetic images"}),": JPEG XL works well with a wide range of image types, including photos, graphics, and illustrations."]}),"\n",(0,n.jsxs)(i.li,{children:[(0,n.jsx)(i.strong,{children:"Fast software encoding and decoding"}),": The codec is designed to be efficient and fast, enabling quick image loading and saving."]}),"\n",(0,n.jsxs)(i.li,{children:[(0,n.jsx)(i.strong,{children:"Full support for wide gamut and HDR"}),": JPEG XL supports a wide range of colors and high dynamic range, making it suitable for modern displays."]}),"\n",(0,n.jsxs)(i.li,{children:[(0,n.jsx)(i.strong,{children:"Perceptually optimizing reference encoder"}),": The encoder is designed to optimize image quality based on how humans perceive images."]}),"\n"]}),"\n",(0,n.jsx)(i.h3,{id:"lossless-compression",children:"Lossless Compression"}),"\n",(0,n.jsx)(i.p,{children:"JPEG XL offers excellent lossless compression capabilities. While lossless WebP was an improvement over PNG for 8-bit lossless image encoding, JPEG XL manages not only to outdo lossless WebP in encoding efficiency but also be more versatile for bit depths greater than 8-bit (a category PNG previously dominated). 16-bit lossless imagery, especially HDR images that are becoming more popular & rarely utilize 8-bit color depth, are where JPEG XL shines, and it is the only codec to compete with PNG in that regard while providing better coding efficiency."}),"\n",(0,n.jsxs)(i.p,{children:["Example: JPEG XL compresses ",(0,n.jsx)(i.a,{href:"https://imgsaver.com/images/2023/10/03/16bit.png",children:"this 16-bit AdobeRGB PNG"})," better than PNG. Using: ",(0,n.jsx)(i.code,{children:"cjxl 16bit.png 16bit.jxl -d 0.0 -e 9 -I 100 -g 3 -E 11"})]}),"\n",(0,n.jsxs)(i.p,{children:["16-bit PNG: ",(0,n.jsx)(i.code,{children:"1533373"})," bytes.\n16-bit JXL: ",(0,n.jsx)(i.code,{children:"1211029"})," bytes."]}),"\n",(0,n.jsx)(i.h3,{id:"lossy-compression",children:"Lossy Compression"}),"\n",(0,n.jsx)(i.p,{children:"JPEG XL is also adept at lossy compression, especially at quality levels that we as humans care about. It promises to be around 60% better than JPEG. While video-based codecs like AVIF can be competitive when given lots of CPU time, JPEG XL is both fast and efficient for medium to high fidelity photographic imaging."}),"\n",(0,n.jsx)(i.h3,{id:"supported-bit-depths",children:"Supported Bit Depth(s)"}),"\n",(0,n.jsx)(i.p,{children:"JPEG XL supports up to 32 bits per channel of bit depth, making it future proof for the increasingly popular HDR photos coming out of smartphones. There is essentially zero downside to encoding high bit depth with JXL relative to the resulting encode's size. Considering many smartphones take HDR photos now, JXL offers a compelling pipeline for these photos to make their way to the Web in the future especially as companies like Adobe & Apple have already embraced the new codec."}),"\n",(0,n.jsx)(i.h3,{id:"progressive-decode",children:"Progressive Decode"}),"\n",(0,n.jsx)(i.p,{children:"JPEG XL provides actual progressive decode support that you can experiment with here on a supported browser like Safari, Waterfox, Thorium, Mercury, or any browser on iOS."}),"\n",(0,n.jsx)(i.p,{children:"Progressive decode is a feature only JPEG is able to offer a real implementation of, rendering low frequency transform coefficients before the rest of the image arrives to allow an image to display before the entire thing has been sent over the network. Blurhashes do not replace this technology, but rather compliment it, allowing another layer of progressive decode that can be used even before the image begins to load progressively. This is an important feature to improve the user experience on websites featuring large images, or on any website if your Internet connection isn't strong."}),"\n",(0,n.jsx)(i.h3,{id:"lossless-jpeg-re-compression",children:"Lossless JPEG Re-compression"}),"\n",(0,n.jsx)(i.p,{children:"An incredibly unique JPEG XL feature is lossless JPEG re-compression, or the ability to take a JPEG input and provide an output with a smaller filesize (on average, 20% smaller) that is pixel-for-pixel identical. This is why companies like Meta have endorsed JPEG XL, as it offers a path forward for the existing JPEGs on the Internet."}),"\n",(0,n.jsx)(i.h3,{id:"industry-support",children:"Industry Support"}),"\n",(0,n.jsx)(i.p,{children:"From the JPEG XL Wikipedia page:"}),"\n",(0,n.jsxs)(i.blockquote,{children:["\n",(0,n.jsx)(i.p,{children:"Besides Cloudinary and Google originally, throughout JPEG XL's preliminary implementation in web browsers, various representatives of well-known industry brand names have publicly voiced support for JPEG XL as their preferred choice, including Facebook, Adobe, Intel and the Video Electronics Standards Association, The Guardian, Flickr and SmugMug, Shopify, the Krita Foundation, and Serif Ltd."}),"\n"]}),"\n",(0,n.jsx)(i.p,{children:"Apple also features ecosystem-wide JPEG XL support as of iOS 17 & macOS Sonoma."}),"\n",(0,n.jsx)(i.h3,{id:"other-features",children:"Other Features"}),"\n",(0,n.jsx)(i.p,{children:"JPEG XL has the potential to replace popular formats like TIFF for authoring workflows due to its broad feature set. From the JXL Wikipedia, some additional features include:"}),"\n",(0,n.jsxs)(i.ul,{children:["\n",(0,n.jsx)(i.li,{children:"Image dimensions of over a billion (2^30-1) pixels on each side."}),"\n",(0,n.jsx)(i.li,{children:"Up to 4099 channels, including support for alpha transparency"}),"\n",(0,n.jsx)(i.li,{children:"There can be multiple frames with zero duration, allowing support for layers in graphics software"}),"\n",(0,n.jsx)(i.li,{children:"Animation support, allowing JXL to rival GIF"}),"\n",(0,n.jsx)(i.li,{children:"Images can be stored in tiles to reduce the time needed to decode them."}),"\n",(0,n.jsx)(i.li,{children:"Graceful quality degradation across a large range of bitrates means quality loss isn't as abrupt as with older formats."}),"\n",(0,n.jsx)(i.li,{children:"Perceptually optimized reference encoder which uses a perceptual color space, adaptive quantization, and conservative default settings."}),"\n",(0,n.jsx)(i.li,{children:"Support for wide color gamut and HDR"}),"\n",(0,n.jsx)(i.li,{children:"Efficient encoding and decoding without requiring specialized hardware: JPEG XL is about as fast to encode and decode as old JPEG using libjpeg-turbo and an order of magnitude faster to encode and decode compared to HEIC with x265. It is also parallelizable."}),"\n",(0,n.jsx)(i.li,{children:"Royalty-free format with an open-source reference implementation available on GitHub."}),"\n"]}),"\n",(0,n.jsx)(i.h2,{id:"encoders",children:"Encoders"}),"\n",(0,n.jsx)(i.p,{children:"JPEG XL has a couple of noteworthy encoders currently available to work with. Because JPEG XL is so new, most encoders aren't yet intelligent enough to take advantage of the whole format yet. Here's a quote from Jon Sneyers in the JPEG XL discord that sums it up nicely:"}),"\n",(0,n.jsxs)(i.blockquote,{children:["\n",(0,n.jsx)(i.p,{children:"Encode side: 80% or so of the coding tools are used in one way or another by the encoder (the 20% is splines and super large VarDCT blocks, and also the things that are not used by default without using special experimental options, such as delta palette and noise). But the coding tools that are used, are typically used in a specific, limited way that doesn't come anywhere close to exhausting the bitstream expressivity."}),"\n"]}),"\n",(0,n.jsxs)(i.p,{children:["Sneyers is talking about libjxl's ",(0,n.jsx)(i.code,{children:"cjxl"})," encoder, which will be discussed further below."]}),"\n",(0,n.jsx)(i.h3,{id:"libjxl",children:"libjxl"}),"\n",(0,n.jsxs)(i.p,{children:["The reference ",(0,n.jsx)(i.a,{href:"https://github.com/libjxl/libjxl",children:"libjxl"})," implementation has the capability to both decode and encode JPEG XL image files. Both are discussed below."]}),"\n",(0,n.jsxs)(r.A,{children:[(0,n.jsxs)(o.A,{value:"enc",label:"Encoding",default:!0,children:[(0,n.jsxs)(i.p,{children:["libjxl's encoder ",(0,n.jsx)(i.code,{children:"cjxl"})," has more options to play around with. It takes a few primary arguments, distance (",(0,n.jsx)(i.code,{children:"-d"}),"), quality (",(0,n.jsx)(i.code,{children:"-q"}),"), and effort (",(0,n.jsx)(i.code,{children:"-e"}),")."]}),(0,n.jsx)(i.p,{children:(0,n.jsx)(i.strong,{children:"Distance and quality"})}),(0,n.jsxs)(i.p,{children:["Distance and quality are two ways of specifying ",(0,n.jsx)(i.em,{children:"how much loss"})," you are willing to tolerate, and as such, they are mutually exclusive, as they pull the same levers under the hood."]}),(0,n.jsxs)(i.ul,{children:["\n",(0,n.jsxs)(i.li,{children:["Distance is designed to map to how 'close' one must be to the source to notice any loss. It is represented as a scale between 0.0 & 25.0. 0.0 is ",(0,n.jsx)(i.strong,{children:"mathematically lossless"}),", every pixel will have the exact same value as the source. 1.0 is designed to be ",(0,n.jsx)(i.strong,{children:"visually lossless"}),", look the same at a normal viewing distance, and higher values have more loss."]}),"\n",(0,n.jsxs)(i.li,{children:["Quality is designed to roughly map to ",(0,n.jsx)(i.a,{href:"/docs/images/JPEG",children:"JPEG"}),"'s quality argument. A range 0-100, where 100 is ",(0,n.jsx)(i.strong,{children:"mathematically lossless"}),", 90 is intended to be ",(0,n.jsx)(i.strong,{children:"visually lossless"}),", and 0 is almost unrecognizable as the original image."]}),"\n"]}),(0,n.jsx)(i.p,{children:(0,n.jsx)(i.strong,{children:"Effort"})}),(0,n.jsxs)(i.p,{children:["Effort is similar to ",(0,n.jsx)(i.code,{children:"cpu-used"})," in video encoding. It specifies the amount of effort the encoder will make in order to get the smallest file size it can. It takes the form of a range 1-9, where higher numbers will spend more resources to get diminishing returns in terms of smaller size, while lower values do the opposite, leaving file size on the table for faster encoding."]}),(0,n.jsx)(i.pre,{children:(0,n.jsx)(i.code,{className:"language-bash",metastring:'title="Encoding with effort 9 and distance 1.0"',children:"cjxl -e 9 -d 1.0 example.png example.jxl\n"})}),(0,n.jsx)(i.pre,{children:(0,n.jsx)(i.code,{className:"language-bash",metastring:'title="This, by default uses lossless JPEG compression."',children:"cjxl example.jpg example.jxl\n"})})]}),(0,n.jsxs)(o.A,{value:"dec",label:"Decoding",children:[(0,n.jsxs)(i.p,{children:["Decoding a ",(0,n.jsx)(i.code,{children:".jxl"})," image is straightforward with libjxl's decoder, ",(0,n.jsx)(i.code,{children:"djxl"}),":"]}),(0,n.jsx)(i.pre,{children:(0,n.jsx)(i.code,{className:"language-bash",children:"djxl example.jxl example.png\n"})}),(0,n.jsxs)(i.p,{children:[(0,n.jsx)(i.code,{children:"djxl"})," can decode to pixels via pipes, png, apng for animated jxl, jpg, ppm, and pfm."]}),(0,n.jsxs)(i.p,{children:["By default, if the ",(0,n.jsx)(i.code,{children:".jxl"})," file was encoded with lossless jpeg recompression, ",(0,n.jsx)(i.code,{children:"djxl"})," will rebuild the exact jpeg file that was originally compressed. To avoid this, and create a new jpeg file:"]}),(0,n.jsx)(i.pre,{children:(0,n.jsx)(i.code,{className:"language-bash",children:"djxl -j example.jxl example.jpg\n"})}),(0,n.jsx)(i.p,{children:(0,n.jsxs)(i.strong,{children:["Keep in mind this is now a lossy process as ",(0,n.jsx)(i.code,{children:"djxl"})," will decode to pixels, then encode a new ",(0,n.jsx)(i.code,{children:".jpg"})," with those pixels."]})})]}),(0,n.jsxs)(o.A,{value:"build",label:"Building",children:[(0,n.jsxs)(i.p,{children:["A full build guide is provided in the ",(0,n.jsx)(i.a,{href:"https://github.com/libjxl/libjxl/blob/main/BUILDING.md",children:"libjxl build instructions"})," in the GitHub repo. This guide is simplified, and is only focused on building a working efficient encoder & decoder."]}),(0,n.jsx)(i.p,{children:"These instructions should work for macOS and Linux, although macOS support isn't guaranteed."}),(0,n.jsx)(i.pre,{children:(0,n.jsx)(i.code,{className:"language-bash",metastring:'title="1. Clone the repo"',children:"git clone https://github.com/libjxl/libjxl.git --recursive --shallow-submodules\n"})}),(0,n.jsx)(i.pre,{children:(0,n.jsx)(i.code,{className:"language-bash",metastring:'title="2. Install dependencies. May have to run these commands with root"',children:"apt install cmake pkg-config libbrotli-dev clang # Debian Linux\npacman -Syu cmake pkgconf brotli clang # Arch Linux\nbrew install cmake pkg-config brotli # macOS\n"})}),(0,n.jsx)(i.pre,{children:(0,n.jsx)(i.code,{className:"language-bash",metastring:'title="3. Set CC & CXX variables before building (Recommended)"',children:"export CC=clang CXX=clang++\n"})}),(0,n.jsx)(i.pre,{children:(0,n.jsx)(i.code,{className:"language-bash",metastring:'title="4. cjxl & djxl will be available in the build/tools directory."',children:'cd libjxl && mkdir build && cd build\ncmake -DCMAKE_BUILD_TYPE=Release -DCMAKE_CXX_FLAGS="-O3 -march=native" -DCMAKE_C_FLAGS="-O3 -march=native" -DBUILD_TESTING=OFF -DJPEGXL_WARNINGS_AS_ERRORS=OFF -DJPEGXL_ENABLE_SJPEG=OFF ..\ncmake --build . -- -j$(nproc)\n'})}),(0,n.jsxs)(i.p,{children:["This will build ",(0,n.jsx)(i.code,{children:"cjxl"})," and ",(0,n.jsx)(i.code,{children:"djxl"})," with O3 optimization for your CPU architecture on Linux or macOS. Again, be aware that macOS support is not a priority. Via the libjxl OS X build guide:"]}),(0,n.jsxs)(i.blockquote,{children:["\n",(0,n.jsx)(i.p,{children:'OSX builds have "best effort" support, i.e. build might not work at all, some tests may fail and some sub-projects are excluded from build.'}),"\n"]})]})]}),"\n",(0,n.jsx)(i.h3,{id:"libjxl-tiny",children:"libjxl-tiny"}),"\n",(0,n.jsxs)(i.p,{children:[(0,n.jsx)(i.a,{href:"https://github.com/libjxl/libjxl-tiny",children:"libjxl-tiny"})," contains a simpler encoder implementation of JPEG XL, aimed at photographic images without an alpha channel. The goal is to guide hardware implementations of the encoder where support for the full set of encoding tools is not feasible. The color management is outside the scope of this library, the encoder input is given as a portable float map (PFM) in the linear sRGB colorspace, where individual sample values can be outside the [0.0, 1.0] range for out-of-gammut colors. For more details, see the ",(0,n.jsx)(i.a,{href:"https://github.com/libjxl/libjxl-tiny/blob/main/doc/coding_tools.md",children:"overview of the coding tools"}),"."]}),"\n",(0,n.jsx)(i.p,{children:"The last commit was ten months ago, so it is uncertain whether libjxl-tiny could be considered active."}),"\n",(0,n.jsx)(i.h3,{id:"hydrium",children:"Hydrium"}),"\n",(0,n.jsxs)(i.p,{children:[(0,n.jsx)(i.a,{href:"https://github.com/Traneptora/hydrium",children:"Hydrium"})," is a fast, ultra-low-memory, streaming JPEG XL encoder written in portable C. It is maintained by Traneptora."]}),"\n",(0,n.jsx)(i.h3,{id:"zune-jpegxl",children:"zune-jpegxl"}),"\n",(0,n.jsxs)(i.p,{children:[(0,n.jsx)(i.a,{href:"https://github.com/etemesi254/zune-image/tree/dev/crates/zune-jpegxl",children:"zune-jpegxl"})," is a simple, fast and fully safe modular JXL encoder written in Rust. It is maintained by etemesi254."]}),"\n",(0,n.jsx)(i.p,{children:"zune-jpegxl has the following features:"}),"\n",(0,n.jsxs)(i.ul,{children:["\n",(0,n.jsx)(i.li,{children:"Lossless encoding"}),"\n",(0,n.jsx)(i.li,{children:"8 bit and 16 bit support"}),"\n",(0,n.jsx)(i.li,{children:"Grayscale and RGBA encoding"}),"\n",(0,n.jsx)(i.li,{children:"Threading capabilities"}),"\n"]}),"\n",(0,n.jsx)(i.h2,{id:"decoders",children:"Decoders"}),"\n",(0,n.jsx)(i.h3,{id:"jxl-oxide",children:"jxl-oxide"}),"\n",(0,n.jsxs)(i.p,{children:[(0,n.jsx)(i.a,{href:"https://github.com/tirr-c/jxl-oxide",children:"jxl-oxide"})," is a spec-conforming JPEG XL decoder written in pure Rust. It is maintained by Wonwoo Choi."]}),"\n","\n",(0,n.jsx)(i.p,{children:"Sources:"}),"\n",(0,n.jsxs)(i.ul,{children:["\n",(0,n.jsx)(i.li,{children:(0,n.jsx)(i.a,{href:"https://en.wikipedia.org/wiki/JPEG_XL",children:"JXL Wikipedia"})}),"\n",(0,n.jsx)(i.li,{children:(0,n.jsx)(i.a,{href:"https://jpegxl.info/why-jxl.html",children:"JPEGXL.info: Why JXL"})}),"\n",(0,n.jsx)(i.li,{children:(0,n.jsx)(i.a,{href:"https://webkit.org/blog/14205/news-from-wwdc23-webkit-features-in-safari-17-beta/#images",children:"Apple JXL Announcement"})}),"\n",(0,n.jsx)(i.li,{children:(0,n.jsx)(i.a,{href:"https://cloudinary.com/blog/jpeg-xl-how-it-started-how-its-going",children:"JPEG XL: How It Started, How It's Going"})}),"\n",(0,n.jsx)(i.li,{children:(0,n.jsx)(i.a,{href:"https://cloudinary.com/blog/the-case-for-jpeg-xl",children:"The Case for JPEG XL"})}),"\n",(0,n.jsx)(i.li,{children:(0,n.jsx)(i.a,{href:"https://cloudinary.com/blog/time_for_next_gen_codecs_to_dethrone_jpeg",children:"Time for Next-Gen Codecs to Dethrone JPEG"})}),"\n",(0,n.jsx)(i.li,{children:(0,n.jsx)(i.a,{href:"https://giannirosato.com/blog/post/image-comparison/",children:"Image Codec Comparison"})}),"\n"]})]})}function p(e={}){const{wrapper:i}={...(0,t.R)(),...e.components};return i?(0,n.jsx)(i,{...e,children:(0,n.jsx)(u,{...e})}):u(e)}},9365:(e,i,s)=>{s.d(i,{A:()=>o});s(6540);var n=s(4164);const t={tabItem:"tabItem_Ymn6"};var r=s(4848);function o(e){let{children:i,hidden:s,className:o}=e;return(0,r.jsx)("div",{role:"tabpanel",className:(0,n.A)(t.tabItem,o),hidden:s,children:i})}},1470:(e,i,s)=>{s.d(i,{A:()=>w});var n=s(6540),t=s(4164),r=s(3104),o=s(6347),a=s(205),l=s(7485),d=s(1682),c=s(679);function h(e){return n.Children.toArray(e).filter((e=>"\n"!==e)).map((e=>{if(!e||(0,n.isValidElement)(e)&&function(e){const{props:i}=e;return!!i&&"object"==typeof i&&"value"in i}(e))return e;throw new Error(`Docusaurus error: Bad child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the component should be , and every should have a unique "value" prop.`)}))?.filter(Boolean)??[]}function u(e){const{values:i,children:s}=e;return(0,n.useMemo)((()=>{const e=i??function(e){return h(e).map((e=>{let{props:{value:i,label:s,attributes:n,default:t}}=e;return{value:i,label:s,attributes:n,default:t}}))}(s);return function(e){const i=(0,d.XI)(e,((e,i)=>e.value===i.value));if(i.length>0)throw new Error(`Docusaurus error: Duplicate values "${i.map((e=>e.value)).join(", ")}" found in . Every value needs to be unique.`)}(e),e}),[i,s])}function p(e){let{value:i,tabValues:s}=e;return s.some((e=>e.value===i))}function m(e){let{queryString:i=!1,groupId:s}=e;const t=(0,o.W6)(),r=function(e){let{queryString:i=!1,groupId:s}=e;if("string"==typeof i)return i;if(!1===i)return null;if(!0===i&&!s)throw new Error('Docusaurus error: The component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return s??null}({queryString:i,groupId:s});return[(0,l.aZ)(r),(0,n.useCallback)((e=>{if(!r)return;const i=new URLSearchParams(t.location.search);i.set(r,e),t.replace({...t.location,search:i.toString()})}),[r,t])]}function g(e){const{defaultValue:i,queryString:s=!1,groupId:t}=e,r=u(e),[o,l]=(0,n.useState)((()=>function(e){let{defaultValue:i,tabValues:s}=e;if(0===s.length)throw new Error("Docusaurus error: the component requires at least one children component");if(i){if(!p({value:i,tabValues:s}))throw new Error(`Docusaurus error: The has a defaultValue "${i}" but none of its children has the corresponding value. Available values are: ${s.map((e=>e.value)).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return i}const n=s.find((e=>e.default))??s[0];if(!n)throw new Error("Unexpected error: 0 tabValues");return n.value}({defaultValue:i,tabValues:r}))),[d,h]=m({queryString:s,groupId:t}),[g,x]=function(e){let{groupId:i}=e;const s=function(e){return e?`docusaurus.tab.${e}`:null}(i),[t,r]=(0,c.Dv)(s);return[t,(0,n.useCallback)((e=>{s&&r.set(e)}),[s,r])]}({groupId:t}),f=(()=>{const e=d??g;return p({value:e,tabValues:r})?e:null})();(0,a.A)((()=>{f&&l(f)}),[f]);return{selectedValue:o,selectValue:(0,n.useCallback)((e=>{if(!p({value:e,tabValues:r}))throw new Error(`Can't select invalid tab value=${e}`);l(e),h(e),x(e)}),[h,x,r]),tabValues:r}}var x=s(2303);const f={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};var b=s(4848);function j(e){let{className:i,block:s,selectedValue:n,selectValue:o,tabValues:a}=e;const l=[],{blockElementScrollPositionUntilNextRender:d}=(0,r.a_)(),c=e=>{const i=e.currentTarget,s=l.indexOf(i),t=a[s].value;t!==n&&(d(i),o(t))},h=e=>{let i=null;switch(e.key){case"Enter":c(e);break;case"ArrowRight":{const s=l.indexOf(e.currentTarget)+1;i=l[s]??l[0];break}case"ArrowLeft":{const s=l.indexOf(e.currentTarget)-1;i=l[s]??l[l.length-1];break}}i?.focus()};return(0,b.jsx)("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,t.A)("tabs",{"tabs--block":s},i),children:a.map((e=>{let{value:i,label:s,attributes:r}=e;return(0,b.jsx)("li",{role:"tab",tabIndex:n===i?0:-1,"aria-selected":n===i,ref:e=>l.push(e),onKeyDown:h,onClick:c,...r,className:(0,t.A)("tabs__item",f.tabItem,r?.className,{"tabs__item--active":n===i}),children:s??i},i)}))})}function y(e){let{lazy:i,children:s,selectedValue:r}=e;const o=(Array.isArray(s)?s:[s]).filter(Boolean);if(i){const e=o.find((e=>e.props.value===r));return e?(0,n.cloneElement)(e,{className:(0,t.A)("margin-top--md",e.props.className)}):null}return(0,b.jsx)("div",{className:"margin-top--md",children:o.map(((e,i)=>(0,n.cloneElement)(e,{key:i,hidden:e.props.value!==r})))})}function v(e){const i=g(e);return(0,b.jsxs)("div",{className:(0,t.A)("tabs-container",f.tabList),children:[(0,b.jsx)(j,{...i,...e}),(0,b.jsx)(y,{...i,...e})]})}function w(e){const i=(0,x.A)();return(0,b.jsx)(v,{...e,children:h(e.children)},String(i))}},8453:(e,i,s)=>{s.d(i,{R:()=>o,x:()=>a});var n=s(6540);const t={},r=n.createContext(t);function o(e){const i=n.useContext(r);return n.useMemo((function(){return"function"==typeof e?e(i):{...i,...e}}),[i,e])}function a(e){let i;return i=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:o(e.components),n.createElement(r.Provider,{value:i},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/a6aa9e1f.5b83d6be.js b/assets/js/a6aa9e1f.31881d66.js similarity index 93% rename from assets/js/a6aa9e1f.5b83d6be.js rename to assets/js/a6aa9e1f.31881d66.js index 87a610a4..4e17e7b8 100644 --- a/assets/js/a6aa9e1f.5b83d6be.js +++ b/assets/js/a6aa9e1f.31881d66.js @@ -1 +1 @@ -"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[7643],{5124:(e,t,i)=>{i.r(t),i.d(t,{default:()=>u});i(6540);var n=i(4164),a=i(4586),s=i(1213),r=i(7559),l=i(8027),o=i(7713),c=i(1463),d=i(3892),g=i(5260),p=i(4096),x=i(4848);function h(e){const t=(0,p.kJ)(e);return(0,x.jsx)(g.A,{children:(0,x.jsx)("script",{type:"application/ld+json",children:JSON.stringify(t)})})}function j(e){const{metadata:t}=e,{siteConfig:{title:i}}=(0,a.A)(),{blogDescription:n,blogTitle:r,permalink:l}=t,o="/"===l?i:r;return(0,x.jsxs)(x.Fragment,{children:[(0,x.jsx)(s.be,{title:o,description:n}),(0,x.jsx)(c.A,{tag:"blog_posts_list"})]})}function m(e){const{metadata:t,items:i,sidebar:n}=e;return(0,x.jsxs)(l.A,{sidebar:n,children:[(0,x.jsx)(d.A,{items:i}),(0,x.jsx)(o.A,{metadata:t})]})}function u(e){return(0,x.jsxs)(s.e3,{className:(0,n.A)(r.G.wrapper.blogPages,r.G.page.blogListPage),children:[(0,x.jsx)(j,{...e}),(0,x.jsx)(h,{...e}),(0,x.jsx)(m,{...e})]})}},7713:(e,t,i)=>{i.d(t,{A:()=>r});i(6540);var n=i(1312),a=i(9022),s=i(4848);function r(e){const{metadata:t}=e,{previousPage:i,nextPage:r}=t;return(0,s.jsxs)("nav",{className:"pagination-nav","aria-label":(0,n.T)({id:"theme.blog.paginator.navAriaLabel",message:"Blog list page navigation",description:"The ARIA label for the blog pagination"}),children:[i&&(0,s.jsx)(a.A,{permalink:i,title:(0,s.jsx)(n.A,{id:"theme.blog.paginator.newerEntries",description:"The label used to navigate to the newer blog posts page (previous page)",children:"Newer Entries"})}),r&&(0,s.jsx)(a.A,{permalink:r,title:(0,s.jsx)(n.A,{id:"theme.blog.paginator.olderEntries",description:"The label used to navigate to the older blog posts page (next page)",children:"Older Entries"}),isNext:!0})]})}},3892:(e,t,i)=>{i.d(t,{A:()=>r});i(6540);var n=i(4096),a=i(1240),s=i(4848);function r(e){let{items:t,component:i=a.A}=e;return(0,s.jsx)(s.Fragment,{children:t.map((e=>{let{content:t}=e;return(0,s.jsx)(n.in,{content:t,children:(0,s.jsx)(i,{children:(0,s.jsx)(t,{})})},t.metadata.permalink)}))})}}}]); \ No newline at end of file +"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[7643],{5124:(e,t,i)=>{i.r(t),i.d(t,{default:()=>u});i(6540);var n=i(4164),a=i(4586),s=i(1213),r=i(7559),l=i(8027),o=i(7713),c=i(1463),d=i(3892),g=i(5260),p=i(4096),x=i(4848);function h(e){const t=(0,p.kJ)(e);return(0,x.jsx)(g.A,{children:(0,x.jsx)("script",{type:"application/ld+json",children:JSON.stringify(t)})})}function j(e){const{metadata:t}=e,{siteConfig:{title:i}}=(0,a.A)(),{blogDescription:n,blogTitle:r,permalink:l}=t,o="/"===l?i:r;return(0,x.jsxs)(x.Fragment,{children:[(0,x.jsx)(s.be,{title:o,description:n}),(0,x.jsx)(c.A,{tag:"blog_posts_list"})]})}function m(e){const{metadata:t,items:i,sidebar:n}=e;return(0,x.jsxs)(l.A,{sidebar:n,children:[(0,x.jsx)(d.A,{items:i}),(0,x.jsx)(o.A,{metadata:t})]})}function u(e){return(0,x.jsxs)(s.e3,{className:(0,n.A)(r.G.wrapper.blogPages,r.G.page.blogListPage),children:[(0,x.jsx)(j,{...e}),(0,x.jsx)(h,{...e}),(0,x.jsx)(m,{...e})]})}},7713:(e,t,i)=>{i.d(t,{A:()=>r});i(6540);var n=i(1312),a=i(9022),s=i(4848);function r(e){const{metadata:t}=e,{previousPage:i,nextPage:r}=t;return(0,s.jsxs)("nav",{className:"pagination-nav","aria-label":(0,n.T)({id:"theme.blog.paginator.navAriaLabel",message:"Blog list page navigation",description:"The ARIA label for the blog pagination"}),children:[i&&(0,s.jsx)(a.A,{permalink:i,title:(0,s.jsx)(n.A,{id:"theme.blog.paginator.newerEntries",description:"The label used to navigate to the newer blog posts page (previous page)",children:"Newer entries"})}),r&&(0,s.jsx)(a.A,{permalink:r,title:(0,s.jsx)(n.A,{id:"theme.blog.paginator.olderEntries",description:"The label used to navigate to the older blog posts page (next page)",children:"Older entries"}),isNext:!0})]})}},3892:(e,t,i)=>{i.d(t,{A:()=>r});i(6540);var n=i(4096),a=i(1240),s=i(4848);function r(e){let{items:t,component:i=a.A}=e;return(0,s.jsx)(s.Fragment,{children:t.map((e=>{let{content:t}=e;return(0,s.jsx)(n.in,{content:t,children:(0,s.jsx)(i,{children:(0,s.jsx)(t,{})})},t.metadata.permalink)}))})}}}]); \ No newline at end of file diff --git a/assets/js/a7bd4aaa.5afbb011.js b/assets/js/a7bd4aaa.5afbb011.js new file mode 100644 index 00000000..6f95f648 --- /dev/null +++ b/assets/js/a7bd4aaa.5afbb011.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[7098],{4532:(n,e,s)=>{s.r(e),s.d(e,{default:()=>d});s(6540);var r=s(1213),o=s(2565),i=s(3025),c=s(2831),t=s(1463),u=s(4848);function a(n){const{version:e}=n;return(0,u.jsxs)(u.Fragment,{children:[(0,u.jsx)(t.A,{version:e.version,tag:(0,o.k)(e.pluginId,e.version)}),(0,u.jsx)(r.be,{children:e.noIndex&&(0,u.jsx)("meta",{name:"robots",content:"noindex, nofollow"})})]})}function l(n){const{version:e,route:s}=n;return(0,u.jsx)(r.e3,{className:e.className,children:(0,u.jsx)(i.n,{version:e,children:(0,c.v)(s.routes)})})}function d(n){return(0,u.jsxs)(u.Fragment,{children:[(0,u.jsx)(a,{...n}),(0,u.jsx)(l,{...n})]})}}}]); \ No newline at end of file diff --git a/assets/js/a7bd4aaa.931cd6b1.js b/assets/js/a7bd4aaa.931cd6b1.js deleted file mode 100644 index 2da245b3..00000000 --- a/assets/js/a7bd4aaa.931cd6b1.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[7098],{1723:(n,e,s)=>{s.r(e),s.d(e,{default:()=>l});s(6540);var r=s(1213);function o(n,e){return`docs-${n}-${e}`}var c=s(3025),i=s(2831),t=s(1463),u=s(4848);function a(n){const{version:e}=n;return(0,u.jsxs)(u.Fragment,{children:[(0,u.jsx)(t.A,{version:e.version,tag:o(e.pluginId,e.version)}),(0,u.jsx)(r.be,{children:e.noIndex&&(0,u.jsx)("meta",{name:"robots",content:"noindex, nofollow"})})]})}function d(n){const{version:e,route:s}=n;return(0,u.jsx)(r.e3,{className:e.className,children:(0,u.jsx)(c.n,{version:e,children:(0,i.v)(s.routes)})})}function l(n){return(0,u.jsxs)(u.Fragment,{children:[(0,u.jsx)(a,{...n}),(0,u.jsx)(d,{...n})]})}}}]); \ No newline at end of file diff --git a/assets/js/bc32b9c5.ea617b31.js b/assets/js/bc32b9c5.ea617b31.js new file mode 100644 index 00000000..86d24190 --- /dev/null +++ b/assets/js/bc32b9c5.ea617b31.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[786],{8450:(e,n,i)=>{i.r(n),i.d(n,{assets:()=>l,contentTitle:()=>o,default:()=>h,frontMatter:()=>r,metadata:()=>a,toc:()=>c});var t=i(4848),s=i(8453);const r={title:"XPSNR",sidebar_position:1},o="XPSNR",a={id:"metrics/XPSNR",title:"XPSNR",description:"The content in this entry is incomplete & is in the process of being completed.",source:"@site/docs/metrics/XPSNR.mdx",sourceDirName:"metrics",slug:"/metrics/XPSNR",permalink:"/docs/metrics/XPSNR",draft:!1,unlisted:!1,editUrl:"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/metrics/XPSNR.mdx",tags:[],version:"current",sidebarPosition:1,frontMatter:{title:"XPSNR",sidebar_position:1},sidebar:"tutorialSidebar",previous:{title:"VMAF",permalink:"/docs/metrics/VMAF"},next:{title:"Butteraugli",permalink:"/docs/metrics/butteraugli"}},l={},c=[{value:"Installation",id:"installation",level:2},{value:"Usage",id:"usage",level:2},{value:"Notes",id:"notes",level:2},{value:"Comparing to SSIMULACRA 2",id:"comparing-to-ssimulacra-2",level:2}];function d(e){const n={a:"a",admonition:"admonition",code:"code",h1:"h1",h2:"h2",header:"header",li:"li",ol:"ol",p:"p",pre:"pre",ul:"ul",...(0,s.R)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(n.header,{children:(0,t.jsx)(n.h1,{id:"xpsnr",children:"XPSNR"})}),"\n",(0,t.jsx)(n.admonition,{title:"Under Maintenance",type:"info",children:(0,t.jsx)(n.p,{children:"The content in this entry is incomplete & is in the process of being completed."})}),"\n",(0,t.jsx)(n.p,{children:"XPSNR is a distortion measurement algorithm for video quality assessment, based on the concept of the peak signal to noise ratio (PSNR), tuned to better reflect the human visual system."}),"\n",(0,t.jsxs)(n.p,{children:["XPSNR is considered to be a highly reputable visual quality metric according to its correlation with subjective results relative to its impressive speed.\nUnlike image-first metrics like ",(0,t.jsx)(n.a,{href:"/docs/metrics/SSIMULACRA2",children:"SSIMULACRA2"}),", XPSNR is a video-focused metric, and uses temporal information to compute its score."]}),"\n",(0,t.jsxs)(n.p,{children:["The reference implementation by Fraunhofer HHI is a ",(0,t.jsx)(n.a,{href:"https://github.com/fraunhoferhhi/xpsnr",children:"FFmpeg 7.0 plug-in"}),", and there is a ",(0,t.jsx)(n.a,{href:"https://github.com/gianni-rosato/sxpsnr",children:"community-built standalone implementation"})," available as well.\nFor more details about the algorithm and its design, ",(0,t.jsx)(n.a,{href:"https://www.itu.int/pub/S-JOURNAL-ICTS.V3I1-2020-8",children:"a scientific paper is available"}),"."]}),"\n",(0,t.jsx)(n.h2,{id:"installation",children:"Installation"}),"\n",(0,t.jsx)(n.p,{children:"XPSNR comes as an FFmpeg 7.0 plug-in. The process of installing it is somewhat straightforward:"}),"\n",(0,t.jsxs)(n.ol,{children:["\n",(0,t.jsx)(n.li,{children:"Download the source code for FFmpeg 7.0:"}),"\n"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"git clone -b release/7.0 https://git.ffmpeg.org/ffmpeg.git ffmpeg\n"})}),"\n",(0,t.jsxs)(n.ol,{start:"2",children:["\n",(0,t.jsx)(n.li,{children:"Download the code for the XPSNR plug-in:"}),"\n"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"git clone https://github.com/fraunhoferhhi/xpsnr\n"})}),"\n",(0,t.jsxs)(n.ol,{start:"3",children:["\n",(0,t.jsx)(n.li,{children:"Copy the plug-in files from XPSNR's code to FFmpeg's:"}),"\n"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"cp xpsnr/libavfilter/* ffmpeg/libavfilter/\n"})}),"\n",(0,t.jsxs)(n.ol,{start:"4",children:["\n",(0,t.jsx)(n.li,{children:"Configure and compile FFmpeg:"}),"\n"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"cd ffmpeg\n./configure ...\nmake -j $(nproc)\n"})}),"\n",(0,t.jsx)(n.h2,{id:"usage",children:"Usage"}),"\n",(0,t.jsx)(n.p,{children:"XPSNR is used as an FFmpeg filter, similarly to the built-in PSNR plugin:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:'./ffmpeg -i ref.mkv -i test.mkv -lavfi xpsnr="stats_file=xpsnr.log" -f null -\n'})}),"\n",(0,t.jsx)(n.h2,{id:"notes",children:"Notes"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:["Being the reference implementation an FFmpeg plug-in and not a standalone binary is inconvenient for some workflows.\nCurrently, there are some attempts at making a ",(0,t.jsx)(n.a,{href:"https://github.com/gianni-rosato/sxpsnr",children:"standalone XPSNR binary"}),", although they are not very widespread yet."]}),"\n",(0,t.jsxs)(n.li,{children:["XPSNR uses a PSNR-like scoring system: a logarithmic scale in range 0..inf.\nThis is considerably harder to interpret than other metrics (e.g. ",(0,t.jsx)(n.a,{href:"/docs/metrics/SSIMULACRA2",children:"SSIMULACRA 2"})," or ",(0,t.jsx)(n.a,{href:"/docs/metrics/VMAF",children:"VMAF"}),");\nand the threshold to what constitutes good quality is content-dependent.\n(Preliminary testing seems to indicate that anything above a XPSNR score of 42.00 is visually lossless.)"]}),"\n",(0,t.jsxs)(n.li,{children:['XPSNR scores are computed independently for the luma (Y) and two chroma (U, V) components of videos,\nthus actually providing 3 scores.\nAlthough the developers argue that using the minimum of these 3 scores as "definitive score"\n(i.e. better correlates to human impressions),\nsome people in the community prefer using a weighted sum: ',(0,t.jsx)(n.code,{children:"(4 * XPSNR_Y + XPSNR_U + XPSNR_V) / 6"}),"."]}),"\n"]}),"\n",(0,t.jsx)(n.h2,{id:"comparing-to-ssimulacra-2",children:"Comparing to SSIMULACRA 2"}),"\n",(0,t.jsx)(n.p,{children:"The main advantage of XPSNR over SSIMULACRA 2 is that it is considerably faster to compute.\nXPSNR can achieve real-time speeds for 1080p 24 fps video, making it more convenient to quickly compare test encodes."}),"\n",(0,t.jsx)(n.p,{children:"Regarding their visual assessment capabilities, XPSNR and SSIMULACRA 2 seem to complement each other quite well,\nhaving both their own strong points and weak points with specific video content.\nIf possible, using both at the same time provides great benefits for video quality assessment and comparison."})]})}function h(e={}){const{wrapper:n}={...(0,s.R)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(d,{...e})}):d(e)}},8453:(e,n,i)=>{i.d(n,{R:()=>o,x:()=>a});var t=i(6540);const s={},r=t.createContext(s);function o(e){const n=t.useContext(r);return t.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function a(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:o(e.components),t.createElement(r.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/bc32b9c5.eb784be6.js b/assets/js/bc32b9c5.eb784be6.js deleted file mode 100644 index fe66d374..00000000 --- a/assets/js/bc32b9c5.eb784be6.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[786],{8450:(e,t,i)=>{i.r(t),i.d(t,{assets:()=>a,contentTitle:()=>s,default:()=>l,frontMatter:()=>r,metadata:()=>c,toc:()=>d});var n=i(4848),o=i(8453);const r={title:"XPSNR",sidebar_position:1},s="XPSNR",c={id:"metrics/XPSNR",title:"XPSNR",description:"This section is in need of contributions. If you believe you can help, please see our Contribution Guide to get started as a contributor!",source:"@site/docs/metrics/XPSNR.mdx",sourceDirName:"metrics",slug:"/metrics/XPSNR",permalink:"/docs/metrics/XPSNR",draft:!1,unlisted:!1,editUrl:"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/metrics/XPSNR.mdx",tags:[],version:"current",sidebarPosition:1,frontMatter:{title:"XPSNR",sidebar_position:1},sidebar:"tutorialSidebar",previous:{title:"VMAF",permalink:"/docs/metrics/VMAF"},next:{title:"Butteraugli",permalink:"/docs/metrics/butteraugli"}},a={},d=[];function u(e){const t={a:"a",admonition:"admonition",h1:"h1",header:"header",p:"p",...(0,o.R)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(t.header,{children:(0,n.jsx)(t.h1,{id:"xpsnr",children:"XPSNR"})}),"\n",(0,n.jsx)(t.admonition,{title:"Help Wanted",type:"danger",children:(0,n.jsxs)(t.p,{children:["This section is in need of contributions. If you believe you can help, please see our ",(0,n.jsx)(t.a,{href:"/docs/contribution-guide",children:"Contribution Guide"})," to get started as a contributor!"]})})]})}function l(e={}){const{wrapper:t}={...(0,o.R)(),...e.components};return t?(0,n.jsx)(t,{...e,children:(0,n.jsx)(u,{...e})}):u(e)}},8453:(e,t,i)=>{i.d(t,{R:()=>s,x:()=>c});var n=i(6540);const o={},r=n.createContext(o);function s(e){const t=n.useContext(r);return n.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function c(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:s(e.components),n.createElement(r.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/c7deb2e0.06f8d154.js b/assets/js/c7deb2e0.06f8d154.js deleted file mode 100644 index cc3c5984..00000000 --- a/assets/js/c7deb2e0.06f8d154.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[9551],{9009:(e,o,t)=>{t.r(o),t.d(o,{assets:()=>c,contentTitle:()=>a,default:()=>l,frontMatter:()=>s,metadata:()=>r,toc:()=>d});var i=t(4848),n=t(8453);const s={title:"WavPack",sidebar_position:8},a="WavPack",r={id:"audio/WavPack",title:"WavPack",description:"This section is in need of contributions. If you believe you can help, please see our Contribution Guide to get started as a contributor!",source:"@site/docs/audio/WavPack.mdx",sourceDirName:"audio",slug:"/audio/WavPack",permalink:"/docs/audio/WavPack",draft:!1,unlisted:!1,editUrl:"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/audio/WavPack.mdx",tags:[],version:"current",sidebarPosition:8,frontMatter:{title:"WavPack",sidebar_position:8},sidebar:"tutorialSidebar",previous:{title:"FLAC",permalink:"/docs/audio/FLAC"},next:{title:"AVC / H.264",permalink:"/docs/video/AVC"}},c={},d=[];function u(e){const o={a:"a",admonition:"admonition",h1:"h1",header:"header",p:"p",...(0,n.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(o.header,{children:(0,i.jsx)(o.h1,{id:"wavpack",children:"WavPack"})}),"\n",(0,i.jsx)(o.admonition,{title:"Help Wanted",type:"danger",children:(0,i.jsxs)(o.p,{children:["This section is in need of contributions. If you believe you can help, please see our ",(0,i.jsx)(o.a,{href:"/docs/contribution-guide",children:"Contribution Guide"})," to get started as a contributor!"]})}),"\n",(0,i.jsx)(o.p,{children:"WavPack is an open-source lossless audio codec with support for lossless & lossy compression with a unique hybrid compression mode for compressing a lossy audio stream alongside a lossless reference."})]})}function l(e={}){const{wrapper:o}={...(0,n.R)(),...e.components};return o?(0,i.jsx)(o,{...e,children:(0,i.jsx)(u,{...e})}):u(e)}},8453:(e,o,t)=>{t.d(o,{R:()=>a,x:()=>r});var i=t(6540);const n={},s=i.createContext(n);function a(e){const o=i.useContext(s);return i.useMemo((function(){return"function"==typeof e?e(o):{...o,...e}}),[o,e])}function r(e){let o;return o=e.disableParentContext?"function"==typeof e.components?e.components(n):e.components||n:a(e.components),i.createElement(s.Provider,{value:o},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/c7deb2e0.2f90776e.js b/assets/js/c7deb2e0.2f90776e.js new file mode 100644 index 00000000..2df98380 --- /dev/null +++ b/assets/js/c7deb2e0.2f90776e.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[9551],{9009:(e,s,i)=>{i.r(s),i.d(s,{assets:()=>t,contentTitle:()=>d,default:()=>h,frontMatter:()=>r,metadata:()=>a,toc:()=>c});var n=i(4848),o=i(8453);const r={title:"WavPack",sidebar_position:8},d="WavPack",a={id:"audio/WavPack",title:"WavPack",description:"This section is in need of contributions. If you believe you can help, please see our Contribution Guide to get started as a contributor!",source:"@site/docs/audio/WavPack.mdx",sourceDirName:"audio",slug:"/audio/WavPack",permalink:"/docs/audio/WavPack",draft:!1,unlisted:!1,editUrl:"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/audio/WavPack.mdx",tags:[],version:"current",sidebarPosition:8,frontMatter:{title:"WavPack",sidebar_position:8},sidebar:"tutorialSidebar",previous:{title:"FLAC",permalink:"/docs/audio/FLAC"},next:{title:"AVC / H.264",permalink:"/docs/video/AVC"}},t={},c=[{value:"Features",id:"features",level:2},{value:"Hybrid Mode",id:"hybrid-mode",level:2},{value:"Format Breakdown",id:"format-breakdown",level:2},{value:"Encoders",id:"encoders",level:2},{value:"wavpack",id:"wavpack-1",level:3},{value:"FFmpeg",id:"ffmpeg",level:3},{value:"Adoption issues",id:"adoption-issues",level:2},{value:"Notes",id:"notes",level:2}];function l(e){const s={a:"a",admonition:"admonition",code:"code",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,o.R)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(s.header,{children:(0,n.jsx)(s.h1,{id:"wavpack",children:"WavPack"})}),"\n",(0,n.jsx)(s.admonition,{title:"Help Wanted",type:"danger",children:(0,n.jsxs)(s.p,{children:["This section is in need of contributions. If you believe you can help, please see our ",(0,n.jsx)(s.a,{href:"/docs/contribution-guide",children:"Contribution Guide"})," to get started as a contributor!"]})}),"\n",(0,n.jsxs)(s.p,{children:["WavPack is an open-source lossless audio codec with support for lossless & lossy compression with a unique hybrid compression mode for compressing a lossy audio stream alongside a lossless reference. Created by David Bryant in 1998, it gained a lot of software support, although not as much as ",(0,n.jsx)(s.a,{href:"/docs/audio/FLAC",children:"FLAC"}),"."]}),"\n",(0,n.jsxs)(s.p,{children:["Compressed file size is somewhat between ",(0,n.jsx)(s.a,{href:"/docs/audio/FLAC",children:"FLAC"})," and heavier state-of-art lossless audio compressors like TAK, OptimFrog or SAC. Compared to ",(0,n.jsx)(s.a,{href:"/docs/audio/FLAC",children:"FLAC"}),", WavPack usually gives a lower bitrate at the expense of slightly more resource usage."]}),"\n",(0,n.jsx)(s.h2,{id:"features",children:"Features"}),"\n",(0,n.jsx)(s.p,{children:"WavPack is one of the most robust and feature-rich lossless audio codecs. Some notable features include:"}),"\n",(0,n.jsxs)(s.ul,{children:["\n",(0,n.jsx)(s.li,{children:(0,n.jsx)(s.a,{href:"#hybrid-mode",children:"Hybrid mode"})}),"\n",(0,n.jsx)(s.li,{children:"Support for 1-32 bit integer/floating point audio streams"}),"\n",(0,n.jsxs)(s.li,{children:["Muxable into Matroska ",(0,n.jsx)(s.code,{children:".mkv"})," container"]}),"\n",(0,n.jsx)(s.li,{children:"Multichannel with up to 4096 channels"}),"\n",(0,n.jsx)(s.li,{children:"APEv2/ID3v1 tagging format"}),"\n",(0,n.jsx)(s.li,{children:"RIFF chunks support"}),"\n",(0,n.jsx)(s.li,{children:"Multithreaded encoding/decoding"}),"\n",(0,n.jsx)(s.li,{children:"Error detection using CRC32 checksums and optionally also MD5 hash of original audio data"}),"\n"]}),"\n",(0,n.jsx)(s.h2,{id:"hybrid-mode",children:"Hybrid Mode"}),"\n",(0,n.jsxs)(s.p,{children:["Hybrid Mode is not to be confused with hybrid codecs like ",(0,n.jsx)(s.a,{href:"/docs/audio/Opus",children:"Opus"}),". WavPack uses the same algorithm for both lossy and lossless mode. When using lossy mode, the encoder transmits only the unary magnitude and the sign bit of Recursive Golomb encoded residuals. During decoding, those data points can be further enhanced if the correction file is provided."]}),"\n",(0,n.jsxs)(s.p,{children:["WavPack can produce 2 output files when using Hybrid Mode. The main ",(0,n.jsx)(s.code,{children:".wv"})," file with truncated (lossy) residuals and a ",(0,n.jsx)(s.code,{children:".wvc"})," correction file containing the enhancement layer. When both files are provided to the decoder, it should be able to recreate original audio data. Otherwise, if only the ",(0,n.jsx)(s.code,{children:".wv"})," file is available, the decoder will decode lossy audio stream."]}),"\n",(0,n.jsx)(s.h2,{id:"format-breakdown",children:"Format Breakdown"}),"\n",(0,n.jsxs)(s.p,{children:["Like in many lossless audio codecs, WavPack only encodes the prediction error value. In the default ",(0,n.jsx)(s.code,{children:"fast"})," mode, prediction is just extrapolation of the previous two samples. More sophisticated predictors are used with higher encoding modes.\nDue to poor performance, unpredictability, and other problems with floating-point arithmetic in CPUs of its time, WavPack only uses integer arithmetic even when operating on IEEE float data. Nowadays, many of those issues were addressed, however it could still make porting WavPack to chips with no FPU support much easier."]}),"\n",(0,n.jsx)(s.p,{children:"The encoding process consists of 3 main steps:"}),"\n",(0,n.jsxs)(s.ul,{children:["\n",(0,n.jsxs)(s.li,{children:["\n",(0,n.jsx)(s.p,{children:"Joint stereo processing - Converts the stereo channels to the standard difference and average, removing inter-channel correlations."}),"\n"]}),"\n",(0,n.jsxs)(s.li,{children:["\n",(0,n.jsx)(s.p,{children:"Multipass decorrelation - Includes multiple prediction passes where the number of passes and predictor type depend on the selected encoding mode, removing intra-channel correlations between neighboring audio samples."}),"\n"]}),"\n",(0,n.jsxs)(s.li,{children:["\n",(0,n.jsx)(s.p,{children:"Entropy coding the residuals with Recursive Golomb Coding - Instead of Rice Coding, the author proposed a new technique that combines Golomb and Elias gamma code to better address the nature of audio data."}),"\n"]}),"\n"]}),"\n",(0,n.jsx)(s.h2,{id:"encoders",children:"Encoders"}),"\n",(0,n.jsx)(s.h3,{id:"wavpack-1",children:"wavpack"}),"\n",(0,n.jsx)(s.pre,{children:(0,n.jsx)(s.code,{className:"language-bash",metastring:'title="Default options"',children:"wavpack input.wav -o out.wv\n"})}),"\n",(0,n.jsx)(s.pre,{children:(0,n.jsx)(s.code,{className:"language-bash",metastring:'title="Fast, lowest compression, md5 hash"',children:"wavpack input.wav -f -m -o out.wv\n"})}),"\n",(0,n.jsx)(s.pre,{children:(0,n.jsx)(s.code,{className:"language-bash",metastring:'title="Very slow, highest compression, 8 threads"',children:"wavpack input.wav -hh -x6 --threads=8 -o out.wv\n"})}),"\n",(0,n.jsx)(s.pre,{children:(0,n.jsx)(s.code,{className:"language-bash",metastring:'title="Lossy, slow, 240kbps"',children:"wavpack input.wav -b240 -h -x3 -o out.lsy.wv\n"})}),"\n",(0,n.jsx)(s.pre,{children:(0,n.jsx)(s.code,{className:"language-bash",metastring:'title="Highest hybrid compression, very slow, 4bps"',children:"wavpack input.wav -b4 -cc -hh -x6 -o out.hyb.wv\n"})}),"\n",(0,n.jsxs)(s.p,{children:[(0,n.jsx)(s.code,{children:"wvunpack"})," can be used to decode resulting ",(0,n.jsx)(s.code,{children:".wv"})," files, however most major ",(0,n.jsx)(s.a,{href:"/docs/video-players",children:"media players"})," like MPV or VLC already have (limited) WavPack support."]}),"\n",(0,n.jsx)(s.p,{children:"Options:"}),"\n",(0,n.jsxs)(s.ul,{children:["\n",(0,n.jsxs)(s.li,{children:["\n",(0,n.jsxs)(s.p,{children:[(0,n.jsx)(s.code,{children:"-f"})," Faster encode/decode at the expense of larger file size"]}),"\n"]}),"\n",(0,n.jsxs)(s.li,{children:["\n",(0,n.jsxs)(s.p,{children:[(0,n.jsx)(s.code,{children:"-h"})," Slower encode/decode with higher compression"]}),"\n"]}),"\n",(0,n.jsxs)(s.li,{children:["\n",(0,n.jsxs)(s.p,{children:[(0,n.jsx)(s.code,{children:"-hh"})," Slowest encode/decode with highest compression"]}),"\n"]}),"\n",(0,n.jsxs)(s.li,{children:["\n",(0,n.jsxs)(s.p,{children:[(0,n.jsx)(s.code,{children:"-x0"})," Disable extra filters"]}),"\n"]}),"\n",(0,n.jsxs)(s.li,{children:["\n",(0,n.jsxs)(s.p,{children:[(0,n.jsx)(s.code,{children:"-x3"})," Try all predefined filters, slow, higher compression"]}),"\n"]}),"\n",(0,n.jsxs)(s.li,{children:["\n",(0,n.jsxs)(s.p,{children:[(0,n.jsx)(s.code,{children:"-x6"})," Generate custom filters, very slow, best compression"]}),"\n"]}),"\n",(0,n.jsxs)(s.li,{children:["\n",(0,n.jsxs)(s.p,{children:[(0,n.jsx)(s.code,{children:"-b240"})," Enable lossy mode, set bitrate to ",(0,n.jsx)(s.code,{children:"240kbps"})," (acceptable range is ",(0,n.jsx)(s.code,{children:"24"}),"-",(0,n.jsx)(s.code,{children:"9600"})," but it won't get lower than ",(0,n.jsx)(s.code,{children:"2 bits per sample"}),")"]}),"\n"]}),"\n",(0,n.jsxs)(s.li,{children:["\n",(0,n.jsxs)(s.p,{children:[(0,n.jsx)(s.code,{children:"-b4"})," Enable lossy mode, set ",(0,n.jsx)(s.code,{children:"bits per sample"})," to ",(0,n.jsx)(s.code,{children:"4"})," (acceptable range is ",(0,n.jsx)(s.code,{children:"2"}),"-",(0,n.jsx)(s.code,{children:"23.9"}),")"]}),"\n"]}),"\n",(0,n.jsxs)(s.li,{children:["\n",(0,n.jsxs)(s.p,{children:[(0,n.jsx)(s.code,{children:"-c"})," Enable hybrid mode (will produce ",(0,n.jsx)(s.code,{children:".wv"})," and ",(0,n.jsx)(s.code,{children:".wvc"})," file)"]}),"\n"]}),"\n",(0,n.jsxs)(s.li,{children:["\n",(0,n.jsxs)(s.p,{children:[(0,n.jsx)(s.code,{children:"-cc"})," Enable and optimize for hybrid mode, might lower decoding speed and hurt quality"]}),"\n"]}),"\n",(0,n.jsxs)(s.li,{children:["\n",(0,n.jsxs)(s.p,{children:[(0,n.jsx)(s.code,{children:"-m"})," Include MD5 hash of original audio data in the output file"]}),"\n"]}),"\n",(0,n.jsxs)(s.li,{children:["\n",(0,n.jsxs)(s.p,{children:[(0,n.jsx)(s.code,{children:"--threads=8"})," Use ",(0,n.jsx)(s.code,{children:"8"})," threads (acceptable range is ",(0,n.jsx)(s.code,{children:"1"}),"-",(0,n.jsx)(s.code,{children:"12"}),")"]}),"\n"]}),"\n"]}),"\n",(0,n.jsxs)(s.p,{children:["For more detailed description of all available options, see the ",(0,n.jsx)(s.a,{href:"https://www.wavpack.com/wavpack_doc.html",children:"manual"}),"."]}),"\n",(0,n.jsx)(s.h3,{id:"ffmpeg",children:"FFmpeg"}),"\n",(0,n.jsxs)(s.p,{children:[(0,n.jsx)(s.a,{href:"/docs/utilities/ffmpeg",children:"FFmpeg"})," has its own native WavPack encoder and decoder. It used to also support ",(0,n.jsx)(s.code,{children:"libwavpack"})," with ",(0,n.jsx)(s.code,{children:"--enable-libwavpack"}),", however it was ",(0,n.jsx)(s.a,{href:"https://hydrogenaud.io/index.php/topic,120038.0.html",children:"removed"})," due to interface incompleteness."]}),"\n",(0,n.jsxs)(s.p,{children:["The native encoder is single-threaded and doesn't support neither Lossy or ",(0,n.jsx)(s.a,{href:"#hybrid-mode",children:"Hybrid"})," Mode. It uses the ",(0,n.jsx)(s.code,{children:"-compression_level"})," parameter to control speed to compression ratio."]}),"\n",(0,n.jsx)(s.pre,{children:(0,n.jsx)(s.code,{className:"language-bash",metastring:'title="Fastest, lowest compression"',children:"ffmpeg -i input.wav -compression_level 0 out.wv\n"})}),"\n",(0,n.jsx)(s.pre,{children:(0,n.jsx)(s.code,{className:"language-bash",metastring:'title="Slowest, highest compression"',children:"ffmpeg -i input.wav -compression_level 8 out.wv\n"})}),"\n",(0,n.jsxs)(s.p,{children:["For all possible parameters, consult the ",(0,n.jsx)(s.a,{href:"https://www.ffmpeg.org/ffmpeg-codecs.html#wavpack",children:"FFmpeg documentation"}),"."]}),"\n",(0,n.jsx)(s.h2,{id:"adoption-issues",children:"Adoption issues"}),"\n",(0,n.jsxs)(s.p,{children:["As of 2024, WavPack has been largely superseded by ",(0,n.jsx)(s.a,{href:"/docs/audio/FLAC",children:"FLAC"}),", which became the de facto standard for lossless audio on the Web and in Hardware."]}),"\n",(0,n.jsxs)(s.p,{children:["The implementation of WavPack in media software is often incomplete. FFmpeg doesn't support ",(0,n.jsx)(s.a,{href:"#hybrid-mode",children:"Hybrid Mode"}),", and other media players usually don't support it either. There are also ",(0,n.jsx)(s.a,{href:"https://www.reddit.com/r/ffmpeg/comments/tpptoi/using_hybrid_wavpack_in_video/",children:"issues"})," with its support in the ",(0,n.jsx)(s.code,{children:".mkv"})," container."]}),"\n",(0,n.jsxs)(s.p,{children:["Without this feature, WavPack doesn't provide much benefit over already widespread ",(0,n.jsx)(s.a,{href:"/docs/audio/FLAC",children:"FLAC"}),". The compressed file might be slightly smaller, however music streaming companies tend to choose well-standardized FLAC which also has the benefit of ",(0,n.jsx)(s.code,{children:"DRM"})," support in the ",(0,n.jsx)(s.code,{children:".mp4"})," container (apparently very important thing on the modern web)."]}),"\n",(0,n.jsxs)(s.p,{children:["Even if ",(0,n.jsx)(s.a,{href:"#hybrid-mode",children:"Hybrid Mode"})," had better software support, the minimum lossy setting is ",(0,n.jsx)(s.code,{children:"2 bits per sample"}),". That translates to around ",(0,n.jsx)(s.code,{children:"200kbps"})," with stereo audio track which is quite high. The quality of WavPack lossy mode is also somewhat lacking compared to modern lossy codecs such as ",(0,n.jsx)(s.a,{href:"/docs/audio/Opus",children:"Opus"})," or ",(0,n.jsx)(s.a,{href:"/docs/audio/AAC",children:"AAC"})," because it doesn't utilize any psychoacoustic model."]}),"\n",(0,n.jsx)(s.h2,{id:"notes",children:"Notes"}),"\n",(0,n.jsxs)(s.ul,{children:["\n",(0,n.jsxs)(s.li,{children:["WavPack was one of the first compressed lossless audio codecs preceding Monkey's Audio (2000), ",(0,n.jsx)(s.a,{href:"/docs/audio/FLAC",children:"FLAC"})," (2001), OptimFROG (2002) and ",(0,n.jsx)(s.a,{href:"/docs/audio/ALAC",children:"ALAC"})," (2004)."]}),"\n",(0,n.jsx)(s.li,{children:"OptimFROG Dualstream is a feature of OptimFROG codec serving a similar purpose to WavPack Hybrid, however it was introduced much later."}),"\n",(0,n.jsxs)(s.li,{children:["Apparently there are some devices with WavPack ",(0,n.jsx)(s.a,{href:"https://hydrogenaud.io/index.php/topic,119143.0.html",children:"Hardware Support"}),"."]}),"\n"]}),"\n",(0,n.jsx)(s.p,{children:(0,n.jsx)(s.strong,{children:"References:"})}),"\n",(0,n.jsxs)(s.ul,{children:["\n",(0,n.jsx)(s.li,{children:(0,n.jsx)(s.a,{href:"https://www.wavpack.com/WavPack.pdf",children:"WavPack Compression Techniques"})}),"\n",(0,n.jsx)(s.li,{children:(0,n.jsx)(s.a,{href:"https://www.wavpack.com/technical.htm",children:"WavPack Technical Document"})}),"\n",(0,n.jsx)(s.li,{children:(0,n.jsx)(s.a,{href:"https://web.archive.org/web/20160705230053/http://www.wavpack.com/file_format.txt",children:"Old WavPack File Format Specification"})}),"\n",(0,n.jsx)(s.li,{children:(0,n.jsx)(s.a,{href:"https://wiki.hydrogenaud.io/index.php?title=WavPack",children:"Hydrogenaudio Wiki"})}),"\n",(0,n.jsx)(s.li,{children:(0,n.jsx)(s.a,{href:"https://wiki.multimedia.cx/index.php/WavPack",children:"Multimedia.cx Wiki"})}),"\n",(0,n.jsx)(s.li,{children:(0,n.jsx)(s.a,{href:"https://en.wikipedia.org/wiki/WavPack",children:"Wikipedia"})}),"\n",(0,n.jsx)(s.li,{children:(0,n.jsx)(s.a,{href:"https://ffmpeg.org/doxygen/3.3/wavpackenc_8c_source.html",children:"FFmpeg WavPack Source"})}),"\n"]})]})}function h(e={}){const{wrapper:s}={...(0,o.R)(),...e.components};return s?(0,n.jsx)(s,{...e,children:(0,n.jsx)(l,{...e})}):l(e)}},8453:(e,s,i)=>{i.d(s,{R:()=>d,x:()=>a});var n=i(6540);const o={},r=n.createContext(o);function d(e){const s=n.useContext(r);return n.useMemo((function(){return"function"==typeof e?e(s):{...s,...e}}),[s,e])}function a(e){let s;return s=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:d(e.components),n.createElement(r.Provider,{value:s},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/ccc49370.c67ac341.js b/assets/js/ccc49370.847a3819.js similarity index 98% rename from assets/js/ccc49370.c67ac341.js rename to assets/js/ccc49370.847a3819.js index e208153f..d1d2e3f3 100644 --- a/assets/js/ccc49370.c67ac341.js +++ b/assets/js/ccc49370.847a3819.js @@ -1 +1 @@ -"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[3249],{3858:(e,n,t)=>{t.r(n),t.d(n,{default:()=>b});t(6540);var i=t(4164),a=t(1213),s=t(7559),r=t(4096),o=t(8027),l=t(1240),c=t(1312),d=t(9022),u=t(4848);function m(e){const{nextItem:n,prevItem:t}=e;return(0,u.jsxs)("nav",{className:"pagination-nav docusaurus-mt-lg","aria-label":(0,c.T)({id:"theme.blog.post.paginator.navAriaLabel",message:"Blog post page navigation",description:"The ARIA label for the blog posts pagination"}),children:[t&&(0,u.jsx)(d.A,{...t,subLabel:(0,u.jsx)(c.A,{id:"theme.blog.post.paginator.newerPost",description:"The blog post button label to navigate to the newer/previous post",children:"Newer Post"})}),n&&(0,u.jsx)(d.A,{...n,subLabel:(0,u.jsx)(c.A,{id:"theme.blog.post.paginator.olderPost",description:"The blog post button label to navigate to the older/next post",children:"Older Post"}),isNext:!0})]})}function h(){const{assets:e,metadata:n}=(0,r.e7)(),{title:t,description:i,date:s,tags:o,authors:l,frontMatter:c}=n,{keywords:d}=c,m=e.image??c.image;return(0,u.jsxs)(a.be,{title:t,description:i,keywords:d,image:m,children:[(0,u.jsx)("meta",{property:"og:type",content:"article"}),(0,u.jsx)("meta",{property:"article:published_time",content:s}),l.some((e=>e.url))&&(0,u.jsx)("meta",{property:"article:author",content:l.map((e=>e.url)).filter(Boolean).join(",")}),o.length>0&&(0,u.jsx)("meta",{property:"article:tag",content:o.map((e=>e.label)).join(",")})]})}var f=t(5260);function g(){const e=(0,r.J_)();return(0,u.jsx)(f.A,{children:(0,u.jsx)("script",{type:"application/ld+json",children:JSON.stringify(e)})})}var p=t(7763),v=t(1689);function x(e){let{sidebar:n,children:t}=e;const{metadata:i,toc:a}=(0,r.e7)(),{nextItem:s,prevItem:c,frontMatter:d}=i,{hide_table_of_contents:h,toc_min_heading_level:f,toc_max_heading_level:g}=d;return(0,u.jsxs)(o.A,{sidebar:n,toc:!h&&a.length>0?(0,u.jsx)(p.A,{toc:a,minHeadingLevel:f,maxHeadingLevel:g}):void 0,children:[(0,u.jsx)(v.A,{metadata:i}),(0,u.jsx)(l.A,{children:t}),(s||c)&&(0,u.jsx)(m,{nextItem:s,prevItem:c})]})}function b(e){const n=e.content;return(0,u.jsx)(r.in,{content:e.content,isBlogPostPage:!0,children:(0,u.jsxs)(a.e3,{className:(0,i.A)(s.G.wrapper.blogPages,s.G.page.blogPostPage),children:[(0,u.jsx)(h,{}),(0,u.jsx)(g,{}),(0,u.jsx)(x,{sidebar:e.sidebar,children:(0,u.jsx)(n,{})})]})})}},2234:(e,n,t)=>{t.d(n,{A:()=>c});t(6540);var i=t(4164),a=t(4084),s=t(7559),r=t(7293),o=t(4848);function l(e){let{className:n}=e;return(0,o.jsx)(r.A,{type:"caution",title:(0,o.jsx)(a.Rc,{}),className:(0,i.A)(n,s.G.common.unlistedBanner),children:(0,o.jsx)(a.Uh,{})})}function c(e){return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(a.AE,{}),(0,o.jsx)(l,{...e})]})}},1689:(e,n,t)=>{t.d(n,{A:()=>d});t(6540);var i=t(4164),a=t(4084),s=t(7559),r=t(7293),o=t(4848);function l(e){let{className:n}=e;return(0,o.jsx)(r.A,{type:"caution",title:(0,o.jsx)(a.Yh,{}),className:(0,i.A)(n,s.G.common.draftBanner),children:(0,o.jsx)(a.TT,{})})}var c=t(2234);function d(e){let{metadata:n}=e;const{unlisted:t,frontMatter:i}=n;return(0,o.jsxs)(o.Fragment,{children:[(t||i.unlisted)&&(0,o.jsx)(c.A,{}),i.draft&&(0,o.jsx)(l,{})]})}},7763:(e,n,t)=>{t.d(n,{A:()=>c});t(6540);var i=t(4164),a=t(5195);const s={tableOfContents:"tableOfContents_bqdL",docItemContainer:"docItemContainer_F8PC"};var r=t(4848);const o="table-of-contents__link toc-highlight",l="table-of-contents__link--active";function c(e){let{className:n,...t}=e;return(0,r.jsx)("div",{className:(0,i.A)(s.tableOfContents,"thin-scrollbar",n),children:(0,r.jsx)(a.A,{...t,linkClassName:o,linkActiveClassName:l})})}},5195:(e,n,t)=>{t.d(n,{A:()=>g});var i=t(6540),a=t(6342);function s(e){const n=e.map((e=>({...e,parentIndex:-1,children:[]}))),t=Array(7).fill(-1);n.forEach(((e,n)=>{const i=t.slice(2,e.level);e.parentIndex=Math.max(...i),t[e.level]=n}));const i=[];return n.forEach((e=>{const{parentIndex:t,...a}=e;t>=0?n[t].children.push(a):i.push(a)})),i}function r(e){let{toc:n,minHeadingLevel:t,maxHeadingLevel:i}=e;return n.flatMap((e=>{const n=r({toc:e.children,minHeadingLevel:t,maxHeadingLevel:i});return function(e){return e.level>=t&&e.level<=i}(e)?[{...e,children:n}]:n}))}function o(e){const n=e.getBoundingClientRect();return n.top===n.bottom?o(e.parentNode):n}function l(e,n){let{anchorTopOffset:t}=n;const i=e.find((e=>o(e).top>=t));if(i){return function(e){return e.top>0&&e.bottom{e.current=n?0:document.querySelector(".navbar").clientHeight}),[n]),e}function d(e){const n=(0,i.useRef)(void 0),t=c();(0,i.useEffect)((()=>{if(!e)return()=>{};const{linkClassName:i,linkActiveClassName:a,minHeadingLevel:s,maxHeadingLevel:r}=e;function o(){const e=function(e){return Array.from(document.getElementsByClassName(e))}(i),o=function(e){let{minHeadingLevel:n,maxHeadingLevel:t}=e;const i=[];for(let a=n;a<=t;a+=1)i.push(`h${a}.anchor`);return Array.from(document.querySelectorAll(i.join()))}({minHeadingLevel:s,maxHeadingLevel:r}),c=l(o,{anchorTopOffset:t.current}),d=e.find((e=>c&&c.id===function(e){return decodeURIComponent(e.href.substring(e.href.indexOf("#")+1))}(e)));e.forEach((e=>{!function(e,t){t?(n.current&&n.current!==e&&n.current.classList.remove(a),e.classList.add(a),n.current=e):e.classList.remove(a)}(e,e===d)}))}return document.addEventListener("scroll",o),document.addEventListener("resize",o),o(),()=>{document.removeEventListener("scroll",o),document.removeEventListener("resize",o)}}),[e,t])}var u=t(8774),m=t(4848);function h(e){let{toc:n,className:t,linkClassName:i,isChild:a}=e;return n.length?(0,m.jsx)("ul",{className:a?void 0:t,children:n.map((e=>(0,m.jsxs)("li",{children:[(0,m.jsx)(u.A,{to:`#${e.id}`,className:i??void 0,dangerouslySetInnerHTML:{__html:e.value}}),(0,m.jsx)(h,{isChild:!0,toc:e.children,className:t,linkClassName:i})]},e.id)))}):null}const f=i.memo(h);function g(e){let{toc:n,className:t="table-of-contents table-of-contents__left-border",linkClassName:o="table-of-contents__link",linkActiveClassName:l,minHeadingLevel:c,maxHeadingLevel:u,...h}=e;const g=(0,a.p)(),p=c??g.tableOfContents.minHeadingLevel,v=u??g.tableOfContents.maxHeadingLevel,x=function(e){let{toc:n,minHeadingLevel:t,maxHeadingLevel:a}=e;return(0,i.useMemo)((()=>r({toc:s(n),minHeadingLevel:t,maxHeadingLevel:a})),[n,t,a])}({toc:n,minHeadingLevel:p,maxHeadingLevel:v});return d((0,i.useMemo)((()=>{if(o&&l)return{linkClassName:o,linkActiveClassName:l,minHeadingLevel:p,maxHeadingLevel:v}}),[o,l,p,v])),(0,m.jsx)(f,{toc:x,className:t,linkClassName:o,...h})}},4084:(e,n,t)=>{t.d(n,{AE:()=>l,Rc:()=>r,TT:()=>d,Uh:()=>o,Yh:()=>c});t(6540);var i=t(1312),a=t(5260),s=t(4848);function r(){return(0,s.jsx)(i.A,{id:"theme.contentVisibility.unlistedBanner.title",description:"The unlisted content banner title",children:"Unlisted page"})}function o(){return(0,s.jsx)(i.A,{id:"theme.contentVisibility.unlistedBanner.message",description:"The unlisted content banner message",children:"This page is unlisted. Search engines will not index it, and only users having a direct link can access it."})}function l(){return(0,s.jsx)(a.A,{children:(0,s.jsx)("meta",{name:"robots",content:"noindex, nofollow"})})}function c(){return(0,s.jsx)(i.A,{id:"theme.contentVisibility.draftBanner.title",description:"The draft content banner title",children:"Draft page"})}function d(){return(0,s.jsx)(i.A,{id:"theme.contentVisibility.draftBanner.message",description:"The draft content banner message",children:"This page is a draft. It will only be visible in dev and be excluded from the production build."})}}}]); \ No newline at end of file +"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[3249],{3858:(e,n,t)=>{t.r(n),t.d(n,{default:()=>b});t(6540);var i=t(4164),a=t(1213),s=t(7559),r=t(4096),o=t(8027),l=t(1240),c=t(1312),d=t(9022),u=t(4848);function m(e){const{nextItem:n,prevItem:t}=e;return(0,u.jsxs)("nav",{className:"pagination-nav docusaurus-mt-lg","aria-label":(0,c.T)({id:"theme.blog.post.paginator.navAriaLabel",message:"Blog post page navigation",description:"The ARIA label for the blog posts pagination"}),children:[t&&(0,u.jsx)(d.A,{...t,subLabel:(0,u.jsx)(c.A,{id:"theme.blog.post.paginator.newerPost",description:"The blog post button label to navigate to the newer/previous post",children:"Newer post"})}),n&&(0,u.jsx)(d.A,{...n,subLabel:(0,u.jsx)(c.A,{id:"theme.blog.post.paginator.olderPost",description:"The blog post button label to navigate to the older/next post",children:"Older post"}),isNext:!0})]})}function h(){const{assets:e,metadata:n}=(0,r.e7)(),{title:t,description:i,date:s,tags:o,authors:l,frontMatter:c}=n,{keywords:d}=c,m=e.image??c.image;return(0,u.jsxs)(a.be,{title:t,description:i,keywords:d,image:m,children:[(0,u.jsx)("meta",{property:"og:type",content:"article"}),(0,u.jsx)("meta",{property:"article:published_time",content:s}),l.some((e=>e.url))&&(0,u.jsx)("meta",{property:"article:author",content:l.map((e=>e.url)).filter(Boolean).join(",")}),o.length>0&&(0,u.jsx)("meta",{property:"article:tag",content:o.map((e=>e.label)).join(",")})]})}var f=t(5260);function g(){const e=(0,r.J_)();return(0,u.jsx)(f.A,{children:(0,u.jsx)("script",{type:"application/ld+json",children:JSON.stringify(e)})})}var p=t(7763),v=t(1689);function x(e){let{sidebar:n,children:t}=e;const{metadata:i,toc:a}=(0,r.e7)(),{nextItem:s,prevItem:c,frontMatter:d}=i,{hide_table_of_contents:h,toc_min_heading_level:f,toc_max_heading_level:g}=d;return(0,u.jsxs)(o.A,{sidebar:n,toc:!h&&a.length>0?(0,u.jsx)(p.A,{toc:a,minHeadingLevel:f,maxHeadingLevel:g}):void 0,children:[(0,u.jsx)(v.A,{metadata:i}),(0,u.jsx)(l.A,{children:t}),(s||c)&&(0,u.jsx)(m,{nextItem:s,prevItem:c})]})}function b(e){const n=e.content;return(0,u.jsx)(r.in,{content:e.content,isBlogPostPage:!0,children:(0,u.jsxs)(a.e3,{className:(0,i.A)(s.G.wrapper.blogPages,s.G.page.blogPostPage),children:[(0,u.jsx)(h,{}),(0,u.jsx)(g,{}),(0,u.jsx)(x,{sidebar:e.sidebar,children:(0,u.jsx)(n,{})})]})})}},2234:(e,n,t)=>{t.d(n,{A:()=>c});t(6540);var i=t(4164),a=t(4084),s=t(7559),r=t(7293),o=t(4848);function l(e){let{className:n}=e;return(0,o.jsx)(r.A,{type:"caution",title:(0,o.jsx)(a.Rc,{}),className:(0,i.A)(n,s.G.common.unlistedBanner),children:(0,o.jsx)(a.Uh,{})})}function c(e){return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(a.AE,{}),(0,o.jsx)(l,{...e})]})}},1689:(e,n,t)=>{t.d(n,{A:()=>d});t(6540);var i=t(4164),a=t(4084),s=t(7559),r=t(7293),o=t(4848);function l(e){let{className:n}=e;return(0,o.jsx)(r.A,{type:"caution",title:(0,o.jsx)(a.Yh,{}),className:(0,i.A)(n,s.G.common.draftBanner),children:(0,o.jsx)(a.TT,{})})}var c=t(2234);function d(e){let{metadata:n}=e;const{unlisted:t,frontMatter:i}=n;return(0,o.jsxs)(o.Fragment,{children:[(t||i.unlisted)&&(0,o.jsx)(c.A,{}),i.draft&&(0,o.jsx)(l,{})]})}},7763:(e,n,t)=>{t.d(n,{A:()=>c});t(6540);var i=t(4164),a=t(5195);const s={tableOfContents:"tableOfContents_bqdL",docItemContainer:"docItemContainer_F8PC"};var r=t(4848);const o="table-of-contents__link toc-highlight",l="table-of-contents__link--active";function c(e){let{className:n,...t}=e;return(0,r.jsx)("div",{className:(0,i.A)(s.tableOfContents,"thin-scrollbar",n),children:(0,r.jsx)(a.A,{...t,linkClassName:o,linkActiveClassName:l})})}},5195:(e,n,t)=>{t.d(n,{A:()=>g});var i=t(6540),a=t(6342);function s(e){const n=e.map((e=>({...e,parentIndex:-1,children:[]}))),t=Array(7).fill(-1);n.forEach(((e,n)=>{const i=t.slice(2,e.level);e.parentIndex=Math.max(...i),t[e.level]=n}));const i=[];return n.forEach((e=>{const{parentIndex:t,...a}=e;t>=0?n[t].children.push(a):i.push(a)})),i}function r(e){let{toc:n,minHeadingLevel:t,maxHeadingLevel:i}=e;return n.flatMap((e=>{const n=r({toc:e.children,minHeadingLevel:t,maxHeadingLevel:i});return function(e){return e.level>=t&&e.level<=i}(e)?[{...e,children:n}]:n}))}function o(e){const n=e.getBoundingClientRect();return n.top===n.bottom?o(e.parentNode):n}function l(e,n){let{anchorTopOffset:t}=n;const i=e.find((e=>o(e).top>=t));if(i){return function(e){return e.top>0&&e.bottom{e.current=n?0:document.querySelector(".navbar").clientHeight}),[n]),e}function d(e){const n=(0,i.useRef)(void 0),t=c();(0,i.useEffect)((()=>{if(!e)return()=>{};const{linkClassName:i,linkActiveClassName:a,minHeadingLevel:s,maxHeadingLevel:r}=e;function o(){const e=function(e){return Array.from(document.getElementsByClassName(e))}(i),o=function(e){let{minHeadingLevel:n,maxHeadingLevel:t}=e;const i=[];for(let a=n;a<=t;a+=1)i.push(`h${a}.anchor`);return Array.from(document.querySelectorAll(i.join()))}({minHeadingLevel:s,maxHeadingLevel:r}),c=l(o,{anchorTopOffset:t.current}),d=e.find((e=>c&&c.id===function(e){return decodeURIComponent(e.href.substring(e.href.indexOf("#")+1))}(e)));e.forEach((e=>{!function(e,t){t?(n.current&&n.current!==e&&n.current.classList.remove(a),e.classList.add(a),n.current=e):e.classList.remove(a)}(e,e===d)}))}return document.addEventListener("scroll",o),document.addEventListener("resize",o),o(),()=>{document.removeEventListener("scroll",o),document.removeEventListener("resize",o)}}),[e,t])}var u=t(8774),m=t(4848);function h(e){let{toc:n,className:t,linkClassName:i,isChild:a}=e;return n.length?(0,m.jsx)("ul",{className:a?void 0:t,children:n.map((e=>(0,m.jsxs)("li",{children:[(0,m.jsx)(u.A,{to:`#${e.id}`,className:i??void 0,dangerouslySetInnerHTML:{__html:e.value}}),(0,m.jsx)(h,{isChild:!0,toc:e.children,className:t,linkClassName:i})]},e.id)))}):null}const f=i.memo(h);function g(e){let{toc:n,className:t="table-of-contents table-of-contents__left-border",linkClassName:o="table-of-contents__link",linkActiveClassName:l,minHeadingLevel:c,maxHeadingLevel:u,...h}=e;const g=(0,a.p)(),p=c??g.tableOfContents.minHeadingLevel,v=u??g.tableOfContents.maxHeadingLevel,x=function(e){let{toc:n,minHeadingLevel:t,maxHeadingLevel:a}=e;return(0,i.useMemo)((()=>r({toc:s(n),minHeadingLevel:t,maxHeadingLevel:a})),[n,t,a])}({toc:n,minHeadingLevel:p,maxHeadingLevel:v});return d((0,i.useMemo)((()=>{if(o&&l)return{linkClassName:o,linkActiveClassName:l,minHeadingLevel:p,maxHeadingLevel:v}}),[o,l,p,v])),(0,m.jsx)(f,{toc:x,className:t,linkClassName:o,...h})}},4084:(e,n,t)=>{t.d(n,{AE:()=>l,Rc:()=>r,TT:()=>d,Uh:()=>o,Yh:()=>c});t(6540);var i=t(1312),a=t(5260),s=t(4848);function r(){return(0,s.jsx)(i.A,{id:"theme.contentVisibility.unlistedBanner.title",description:"The unlisted content banner title",children:"Unlisted page"})}function o(){return(0,s.jsx)(i.A,{id:"theme.contentVisibility.unlistedBanner.message",description:"The unlisted content banner message",children:"This page is unlisted. Search engines will not index it, and only users having a direct link can access it."})}function l(){return(0,s.jsx)(a.A,{children:(0,s.jsx)("meta",{name:"robots",content:"noindex, nofollow"})})}function c(){return(0,s.jsx)(i.A,{id:"theme.contentVisibility.draftBanner.title",description:"The draft content banner title",children:"Draft page"})}function d(){return(0,s.jsx)(i.A,{id:"theme.contentVisibility.draftBanner.message",description:"The draft content banner message",children:"This page is a draft. It will only be visible in dev and be excluded from the production build."})}}}]); \ No newline at end of file diff --git a/assets/js/ce98a713.462c84fe.js b/assets/js/ce98a713.462c84fe.js new file mode 100644 index 00000000..911dc139 --- /dev/null +++ b/assets/js/ce98a713.462c84fe.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[6168],{4705:(e,n,i)=>{i.r(n),i.d(n,{assets:()=>d,contentTitle:()=>o,default:()=>h,frontMatter:()=>t,metadata:()=>l,toc:()=>a});var s=i(4848),r=i(8453);const t={title:"Denoise",sidebar_position:8},o="Denoise",l={id:"filtering/denoise",title:"Denoise",description:"This section is in need of contributions. If you believe you can help, please see our Contribution Guide to get started as a contributor!",source:"@site/docs/filtering/denoise.mdx",sourceDirName:"filtering",slug:"/filtering/denoise",permalink:"/docs/filtering/denoise",draft:!1,unlisted:!1,editUrl:"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/filtering/denoise.mdx",tags:[],version:"current",sidebarPosition:8,frontMatter:{title:"Denoise",sidebar_position:8},sidebar:"tutorialSidebar",previous:{title:"Stabilizing",permalink:"/docs/filtering/stabilizing"},next:{title:"Dehalo",permalink:"/docs/filtering/dehalo"}},d={},a=[{value:"Overview",id:"overview",level:2},{value:"hqdn3d",id:"hqdn3d",level:2},{value:"Usage",id:"usage",level:3},{value:"nlmeans",id:"nlmeans",level:2},{value:"Usage",id:"usage-1",level:3},{value:"Parameters",id:"parameters",level:3}];function c(e){const n={a:"a",admonition:"admonition",code:"code",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",p:"p",pre:"pre",ul:"ul",...(0,r.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(n.header,{children:(0,s.jsx)(n.h1,{id:"denoise",children:"Denoise"})}),"\n",(0,s.jsx)(n.admonition,{title:"Help Wanted",type:"danger",children:(0,s.jsxs)(n.p,{children:["This section is in need of contributions. If you believe you can help, please see our ",(0,s.jsx)(n.a,{href:"/docs/contribution-guide",children:"Contribution Guide"})," to get started as a contributor!"]})}),"\n",(0,s.jsx)(n.h2,{id:"overview",children:"Overview"}),"\n",(0,s.jsx)(n.p,{children:"Denoising involves removing random noise from the video. Such noise can result from film grain, signal interference or simply low light conditions. In any case, noise can greatly reduce compression efficiency especially if the video codec doesn't support film grain synthesis."}),"\n",(0,s.jsxs)(n.p,{children:["In ",(0,s.jsx)(n.a,{href:"/docs/utilities/ffmpeg",children:"FFmpeg"})," there are two filters available for denoising:"]}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:(0,s.jsx)(n.a,{href:"#hqdn3d",children:"hqdn3d"})}),"\n",(0,s.jsx)(n.li,{children:(0,s.jsx)(n.a,{href:"#nlmeans",children:"nlmeans"})}),"\n"]}),"\n",(0,s.jsx)(n.h2,{id:"hqdn3d",children:"hqdn3d"}),"\n",(0,s.jsx)(n.p,{children:"hqdn3d is a fast, high quality 3d denoising filter which improves compressibility. Can be applied to images and videos."}),"\n",(0,s.jsx)(n.h3,{id:"usage",children:"Usage"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-shell",children:"ffmpeg -i input.mp4 -vf hqdn3d output.mp4\n"})}),"\n",(0,s.jsx)(n.p,{children:"The default configuration should be fine for most use cases."}),"\n",(0,s.jsxs)(n.p,{children:["If you still see too much noise you can adjust the ",(0,s.jsx)(n.code,{children:"luma_spatial"})," parameter (other parameters are derived from it by default). Higher ",(0,s.jsx)(n.code,{children:"luma_spatial"})," value will result in stronger denoising. By default it is set to ",(0,s.jsx)(n.code,{children:"4"}),"."]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-shell",children:"ffmpeg -i input.mp4 -vf hqdn3d=8 output.mp4\n# which is the same as\nffmpeg -i input.mp4 -vf hqdn3d=8:6:12:9 output.mp4\n"})}),"\n",(0,s.jsx)(n.admonition,{type:"caution",children:(0,s.jsxs)(n.p,{children:["Setting ",(0,s.jsx)(n.code,{children:"luma_spatial"})," to larger values could result in ghosting and ",(0,s.jsx)(n.a,{href:"/docs/introduction/video-artifacts#bandingcontouring",children:"banding"})," artifacts."]})}),"\n",(0,s.jsxs)(n.p,{children:["For description of all four parameters take a look ",(0,s.jsx)(n.a,{href:"https://ffmpeg.org/ffmpeg-filters.html#hqdn3d-1",children:"here"}),"."]}),"\n",(0,s.jsx)(n.h2,{id:"nlmeans",children:"nlmeans"}),"\n",(0,s.jsxs)(n.p,{children:["nlmeans uses Non-Local Means algorithm to do denoising. Each pixel is compared to similar pixels based on their surroundings (context). The size of such context is expressed as ",(0,s.jsx)(n.code,{children:"r"}),"x",(0,s.jsx)(n.code,{children:"r"}),"."]}),"\n",(0,s.jsxs)(n.p,{children:["The filter is rather slow and doesn't parallelize well. Only use it in cases the video contains a lot of noise or you need very high quality denoising. In all other cases ",(0,s.jsx)(n.a,{href:"#hqdn3d",children:"hqdn3d"})," will be more efficient."]}),"\n",(0,s.jsx)(n.h3,{id:"usage-1",children:"Usage"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"ffmpeg -i input.mp4 -vf nlmeans output.mp4\n"})}),"\n",(0,s.jsx)(n.p,{children:"The default configuration should be fine for most use cases."}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"ffmpeg -i input.mp4 -vf nlmeans=s=3.0:r=31:p=15 output.mp4\n"})}),"\n",(0,s.jsx)(n.p,{children:"Stronger denoising with larger research and patch size. Might be useful for ultra high quality denoising in 4K+ resolutions but you might struggle to achieve even 0.1 fps."}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"ffmpeg -i input.mp4 -vf nlmeans=s=1.0:r=5:p=3 output.mp4\n"})}),"\n",(0,s.jsx)(n.p,{children:"Prioritize speed over quality."}),"\n",(0,s.jsx)(n.h3,{id:"parameters",children:"Parameters"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"s"})," - Denoising Strength where ",(0,s.jsx)(n.code,{children:"1.0"})," is the lightest and also the default and the strongest is ",(0,s.jsx)(n.code,{children:"30.0"})," although I wouldn't recommend going above ",(0,s.jsx)(n.code,{children:"10.0"}),"."]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"r"})," - Research Size where ",(0,s.jsx)(n.code,{children:"15"})," is the default, it must be an odd number ranging from ",(0,s.jsx)(n.code,{children:"0"})," to ",(0,s.jsx)(n.code,{children:"99"}),". The higher the value, the slower denoising will be."]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"p"})," - Research Size where ",(0,s.jsx)(n.code,{children:"7"})," is the default and, it must be an odd number ranging from ",(0,s.jsx)(n.code,{children:"0"})," to ",(0,s.jsx)(n.code,{children:"99"}),"."]}),"\n"]}),"\n",(0,s.jsxs)(n.p,{children:["For description of all possible parameters take a look ",(0,s.jsx)(n.a,{href:"https://ffmpeg.org/ffmpeg-filters.html#nlmeans-1",children:"here"}),"."]}),"\n",(0,s.jsx)(n.h1,{id:"notes",children:"Notes"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.a,{href:"#hqdn3d",children:"hqdn3d"})," may create visual artifacts like ghosting, ",(0,s.jsx)(n.a,{href:"/docs/introduction/video-artifacts#bandingcontouring",children:"banding"})," and ",(0,s.jsx)(n.a,{href:"/docs/introduction/video-artifacts#blocking",children:"blocking"})]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.a,{href:"#nlmeans",children:"nlmeans"})," creates much less noticeable artifacts like cartoonish look but only for very noisy inputs"]}),"\n"]})]})}function h(e={}){const{wrapper:n}={...(0,r.R)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(c,{...e})}):c(e)}},8453:(e,n,i)=>{i.d(n,{R:()=>o,x:()=>l});var s=i(6540);const r={},t=s.createContext(r);function o(e){const n=s.useContext(t);return s.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function l(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:o(e.components),s.createElement(t.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/ce98a713.84ef499f.js b/assets/js/ce98a713.84ef499f.js deleted file mode 100644 index 1de28d7b..00000000 --- a/assets/js/ce98a713.84ef499f.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[6168],{4705:(e,n,i)=>{i.r(n),i.d(n,{assets:()=>d,contentTitle:()=>l,default:()=>h,frontMatter:()=>t,metadata:()=>o,toc:()=>a});var s=i(4848),r=i(8453);const t={title:"Denoise",sidebar_position:8},l="Denoise",o={id:"filtering/denoise",title:"Denoise",description:"This section is in need of contributions. If you believe you can help, please see our Contribution Guide to get started as a contributor!",source:"@site/docs/filtering/denoise.mdx",sourceDirName:"filtering",slug:"/filtering/denoise",permalink:"/docs/filtering/denoise",draft:!1,unlisted:!1,editUrl:"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/filtering/denoise.mdx",tags:[],version:"current",sidebarPosition:8,frontMatter:{title:"Denoise",sidebar_position:8},sidebar:"tutorialSidebar",previous:{title:"Stabilizing",permalink:"/docs/filtering/stabilizing"},next:{title:"Dehalo",permalink:"/docs/filtering/dehalo"}},d={},a=[{value:"Overview",id:"overview",level:2},{value:"hqdn3d",id:"hqdn3d",level:2},{value:"Usage",id:"usage",level:3},{value:"nlmeans",id:"nlmeans",level:2},{value:"Usage",id:"usage-1",level:3},{value:"Parameters",id:"parameters",level:3}];function c(e){const n={a:"a",admonition:"admonition",code:"code",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",p:"p",pre:"pre",ul:"ul",...(0,r.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(n.header,{children:(0,s.jsx)(n.h1,{id:"denoise",children:"Denoise"})}),"\n",(0,s.jsx)(n.admonition,{title:"Help Wanted",type:"danger",children:(0,s.jsxs)(n.p,{children:["This section is in need of contributions. If you believe you can help, please see our ",(0,s.jsx)(n.a,{href:"/docs/contribution-guide",children:"Contribution Guide"})," to get started as a contributor!"]})}),"\n",(0,s.jsx)(n.h2,{id:"overview",children:"Overview"}),"\n",(0,s.jsx)(n.p,{children:"Denoising involves removing random noise from the video. Such noise can result from film grain, signal interference or simply low light conditions. In any case, noise can greatly reduce compression efficiency especially with older video codecs that don't support film grain synthesis."}),"\n",(0,s.jsxs)(n.p,{children:["In ",(0,s.jsx)(n.a,{href:"/docs/utilities/ffmpeg",children:"FFmpeg"})," there are two filters made for denoising:"]}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:(0,s.jsx)(n.a,{href:"#hqdn3d",children:"hqdn3d"})}),"\n",(0,s.jsx)(n.li,{children:(0,s.jsx)(n.a,{href:"#nlmeans",children:"nlmeans"})}),"\n"]}),"\n",(0,s.jsx)(n.h2,{id:"hqdn3d",children:"hqdn3d"}),"\n",(0,s.jsx)(n.p,{children:"hqdn3d is a fast, high quality 3d denoising filter which improves compressibility. Can be applied to images and videos."}),"\n",(0,s.jsx)(n.h3,{id:"usage",children:"Usage"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-shell",children:"ffmpeg -i input.mp4 -vf hqdn3d output.mp4\n"})}),"\n",(0,s.jsx)(n.p,{children:"The default configuration should be fine for most use cases."}),"\n",(0,s.jsxs)(n.p,{children:["If you still see too much noise you can adjust the ",(0,s.jsx)(n.code,{children:"luma_spatial"})," parameter (other parameters are derived from it by default). Higher ",(0,s.jsx)(n.code,{children:"luma_spatial"})," value will result in stronger denoising. By default it is set to ",(0,s.jsx)(n.code,{children:"4"}),"."]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-shell",children:"ffmpeg -i input.mp4 -vf hqdn3d=8 output.mp4\n# which is the same as\nffmpeg -i input.mp4 -vf hqdn3d=8:6:12:9 output.mp4\n"})}),"\n",(0,s.jsx)(n.admonition,{type:"caution",children:(0,s.jsxs)(n.p,{children:["Setting ",(0,s.jsx)(n.code,{children:"luma_spatial"})," to larger values could result in ghosting and ",(0,s.jsx)(n.a,{href:"/docs/filtering/deband",children:"banding"})," artifacts."]})}),"\n",(0,s.jsxs)(n.p,{children:["For description of all four parameters take a look ",(0,s.jsx)(n.a,{href:"https://ffmpeg.org/ffmpeg-filters.html#hqdn3d-1",children:"here"}),"."]}),"\n",(0,s.jsx)(n.h2,{id:"nlmeans",children:"nlmeans"}),"\n",(0,s.jsxs)(n.p,{children:["nlmeans uses Non-Local Means algorithm to do denoising. Each pixel is compared to similar pixels based on their surroundings - context. The size of such context is expressed as ",(0,s.jsx)(n.code,{children:"r"}),"x",(0,s.jsx)(n.code,{children:"r"}),"."]}),"\n",(0,s.jsxs)(n.p,{children:["The filter itself is rather slow slow and doesn't parallelize well. It's recommended to only use it in cases the video contains a lot of noise or denoising needs to be very high quality. In all other cases ",(0,s.jsx)(n.a,{href:"#hqdn3d",children:"hqdn3d"})," will be more efficient."]}),"\n",(0,s.jsx)(n.h3,{id:"usage-1",children:"Usage"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-shell",children:"ffmpeg -i input.mp4 -vf nlmeans output.mp4\n"})}),"\n",(0,s.jsx)(n.p,{children:"The default configuration should be fine for most use cases."}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-shell",children:"ffmpeg -i input.mp4 -vf nlmeans=s=3.0:r=31:p=15 output.mp4\n"})}),"\n",(0,s.jsx)(n.p,{children:"Stronger denoising with larger research and patch size. Might be useful for ultra high quality denoising in 4K+ resolutions but you might struggle to get more than 0.1 fps."}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-shell",children:"ffmpeg -i input.mp4 -vf nlmeans=s=1.0:r=5:p=3 output.mp4\n"})}),"\n",(0,s.jsx)(n.p,{children:"Prioritize speed over quality."}),"\n",(0,s.jsx)(n.h3,{id:"parameters",children:"Parameters"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"s"})," - Denoising Strength where ",(0,s.jsx)(n.code,{children:"1.0"})," is the lightest and also the default and the strongest is ",(0,s.jsx)(n.code,{children:"30.0"})," although I wouldn't recommend going above ",(0,s.jsx)(n.code,{children:"10.0"}),"."]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"r"})," - Research Size where ",(0,s.jsx)(n.code,{children:"15"})," is the default, it must be an odd number ranging from ",(0,s.jsx)(n.code,{children:"0"})," to ",(0,s.jsx)(n.code,{children:"99"}),". The higher the value, the slower denoising will be."]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"p"})," - Research Size where ",(0,s.jsx)(n.code,{children:"7"})," is the default and, it must be an odd number ranging from ",(0,s.jsx)(n.code,{children:"0"})," to ",(0,s.jsx)(n.code,{children:"99"}),"."]}),"\n"]}),"\n",(0,s.jsxs)(n.p,{children:["For description of all possible parameters take a look ",(0,s.jsx)(n.a,{href:"https://ffmpeg.org/ffmpeg-filters.html#nlmeans-1",children:"here"}),"."]}),"\n",(0,s.jsx)(n.h1,{id:"notes",children:"Notes"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.a,{href:"#hqdn3d",children:"hqdn3d"})," may create visual artifacts like ghosting, banding and blockiness"]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.a,{href:"#nlmeans",children:"nlmeans"})," creates much less noticable artifacts like cartoonish look but only for very noisy inputs"]}),"\n"]})]})}function h(e={}){const{wrapper:n}={...(0,r.R)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(c,{...e})}):c(e)}},8453:(e,n,i)=>{i.d(n,{R:()=>l,x:()=>o});var s=i(6540);const r={},t=s.createContext(r);function l(e){const n=s.useContext(t);return s.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function o(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:l(e.components),s.createElement(t.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/fb02bab9.88092581.js b/assets/js/fb02bab9.88092581.js new file mode 100644 index 00000000..c9a99eec --- /dev/null +++ b/assets/js/fb02bab9.88092581.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[5885],{5190:(e,i,t)=>{t.r(i),t.d(i,{assets:()=>d,contentTitle:()=>o,default:()=>h,frontMatter:()=>r,metadata:()=>a,toc:()=>l});var s=t(4848),n=t(8453);const r={title:"Stabilizing",sidebar_position:7},o="Stabilizing",a={id:"filtering/stabilizing",title:"Stabilizing",description:"This section is in need of contributions. If you believe you can help, please see our Contribution Guide to get started as a contributor!",source:"@site/docs/filtering/stabilizing.mdx",sourceDirName:"filtering",slug:"/filtering/stabilizing",permalink:"/docs/filtering/stabilizing",draft:!1,unlisted:!1,editUrl:"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/filtering/stabilizing.mdx",tags:[],version:"current",sidebarPosition:7,frontMatter:{title:"Stabilizing",sidebar_position:7},sidebar:"tutorialSidebar",previous:{title:"Decombing",permalink:"/docs/filtering/decombing"},next:{title:"Denoise",permalink:"/docs/filtering/denoise"}},d={},l=[{value:"Overview",id:"overview",level:2},{value:"Usage",id:"usage",level:2},{value:"vidstabdetect Parameters",id:"vidstabdetect-parameters",level:3},{value:"vidstabtransform Parameters",id:"vidstabtransform-parameters",level:3},{value:"Notes",id:"notes",level:2}];function c(e){const i={a:"a",admonition:"admonition",code:"code",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",p:"p",pre:"pre",ul:"ul",...(0,n.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(i.header,{children:(0,s.jsx)(i.h1,{id:"stabilizing",children:"Stabilizing"})}),"\n",(0,s.jsx)(i.admonition,{title:"Help Wanted",type:"danger",children:(0,s.jsxs)(i.p,{children:["This section is in need of contributions. If you believe you can help, please see our ",(0,s.jsx)(i.a,{href:"/docs/contribution-guide",children:"Contribution Guide"})," to get started as a contributor!"]})}),"\n",(0,s.jsx)(i.h2,{id:"overview",children:"Overview"}),"\n",(0,s.jsxs)(i.p,{children:["Stabilizing is the process of reducing unwanted camera movement and shakes in video clips using ",(0,s.jsx)(i.a,{href:"/docs/utilities/ffmpeg",children:"FFmpeg"}),". This improves overall encoding efficiency by minimizing unpredictable global movement, such as that from handheld cameras. The recommended method for stabilizing videos with FFmpeg is to use the VidStab library, which requires a build of FFmpeg compiled with ",(0,s.jsx)(i.code,{children:"--enable-libvidstab"}),"."]}),"\n",(0,s.jsx)(i.p,{children:"VidStab offers two filters within FFmpeg:"}),"\n",(0,s.jsx)(i.pre,{children:(0,s.jsx)(i.code,{className:"language-shell",children:"ffmpeg -hide_banner -filters | grep vidstab\n ... vidstabdetect V->V Extract relative transformations, pass 1 of 2 for stabilization (see vidstabtransform for pass 2).\n ... vidstabtransform V->V Transform the frames, pass 2 of 2 for stabilization (see vidstabdetect for pass 1).\n"})}),"\n",(0,s.jsxs)(i.p,{children:["The ",(0,s.jsx)(i.code,{children:"vidstabdetect"})," filter is used in the first pass to generate a video transformations file (",(0,s.jsx)(i.code,{children:".trf"}),"), while ",(0,s.jsx)(i.code,{children:"vidstabtransform"})," is employed in the second pass to apply those transformations."]}),"\n",(0,s.jsx)(i.h2,{id:"usage",children:"Usage"}),"\n",(0,s.jsx)(i.p,{children:"To stabilize a video using default parameters, follow these two steps:"}),"\n",(0,s.jsx)(i.pre,{children:(0,s.jsx)(i.code,{className:"language-shell",children:"ffmpeg -i input.mp4 -vf vidstabdetect -f null -\nffmpeg -i input.mp4 -vf vidstabtransform output.mp4\n"})}),"\n",(0,s.jsxs)(i.p,{children:["After running the first command, a ",(0,s.jsx)(i.code,{children:"transforms.trf"})," file will be created in the directory where you executed FFmpeg. Once the stabilization process is complete, you can safely delete this file. The resulting ",(0,s.jsx)(i.code,{children:"output.mp4"})," video will have reduced shakiness."]}),"\n",(0,s.jsx)(i.p,{children:"For stabilizing high-framerate videos with strong camera movement:"}),"\n",(0,s.jsx)(i.pre,{children:(0,s.jsx)(i.code,{className:"language-shell",children:"ffmpeg -i input.mp4 -vf vidstabdetect=shakiness=8:result=a.trf -f null -\nffmpeg -i input.mp4 -vf vidstabtransform=smoothing=30:zoom=-5:input=a.trf output.mp4\n"})}),"\n",(0,s.jsx)(i.admonition,{type:"tip",children:(0,s.jsxs)(i.p,{children:["Remember to set appropriate video/audio codec parameters in the command before ",(0,s.jsx)(i.code,{children:"output.mp4"}),". You must not use ",(0,s.jsx)(i.code,{children:"-c:v copy"}),", as the video will undergo transformations."]})}),"\n",(0,s.jsx)(i.h3,{id:"vidstabdetect-parameters",children:"vidstabdetect Parameters"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"result"})," - Sets the output ",(0,s.jsx)(i.code,{children:".trf"})," file location"]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"shakiness"})," - Adjusts movement reduction, with ",(0,s.jsx)(i.code,{children:"1"})," being the least and ",(0,s.jsx)(i.code,{children:"10"})," the most reduction (highest stabilization). Default is ",(0,s.jsx)(i.code,{children:"5"}),"."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"accuracy"})," - Controls movement reduction accuracy. Lower values use less CPU but may be less accurate. FFmpeg's minimum allowed value is ",(0,s.jsx)(i.code,{children:"3"}),". Processing speed was approximately ",(0,s.jsx)(i.code,{children:"21 fps"})," at ",(0,s.jsx)(i.code,{children:"3"})," and ",(0,s.jsx)(i.code,{children:"14 fps"})," at ",(0,s.jsx)(i.code,{children:"15"}),"."]}),"\n"]}),"\n",(0,s.jsxs)(i.p,{children:["For a complete list of parameters, refer to the ",(0,s.jsx)(i.a,{href:"https://ffmpeg.org/ffmpeg-filters.html#vidstabdetect-1",children:"vidstabdetect documentation"}),"."]}),"\n",(0,s.jsx)(i.h3,{id:"vidstabtransform-parameters",children:"vidstabtransform Parameters"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"input"})," - Specifies the input ",(0,s.jsx)(i.code,{children:".trf"})," file created by ",(0,s.jsx)(i.code,{children:"vidstabdetect"})]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"smoothing"})," - Determines the number of frames considered for future and past movement estimation. Default is ",(0,s.jsx)(i.code,{children:"10"}),"."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"zoom"})," - Adjusts the zoom percentage, with ",(0,s.jsx)(i.code,{children:"0%"})," being the default. Negative values create a zoom-out effect."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"interpol"})," - Sets the type of interpolation used:","\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"no"})," - No interpolation"]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"linear"})," - Only horizontal"]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"bilinear"})," - Faster but may result in blurry output (default)"]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"bicubic"})," - Slower"]}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,s.jsxs)(i.p,{children:["See the ",(0,s.jsx)(i.a,{href:"https://ffmpeg.org/ffmpeg-filters.html#vidstabtransform-1",children:"vidstabtransform documentation"})," for more details."]}),"\n",(0,s.jsx)(i.h2,{id:"notes",children:"Notes"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsx)(i.li,{children:"Stabilization is a lossy process that can reduce video quality due to zoom and interpolation effects."}),"\n",(0,s.jsx)(i.li,{children:"Some users may notice overall wobbliness in stabilized videos, especially at higher stabilization levels. This is an inherent characteristic of this filter."}),"\n",(0,s.jsx)(i.li,{children:"Depending on your use case, consider employing two-pass encoding along with these stabilization steps."}),"\n"]})]})}function h(e={}){const{wrapper:i}={...(0,n.R)(),...e.components};return i?(0,s.jsx)(i,{...e,children:(0,s.jsx)(c,{...e})}):c(e)}},8453:(e,i,t)=>{t.d(i,{R:()=>o,x:()=>a});var s=t(6540);const n={},r=s.createContext(n);function o(e){const i=s.useContext(r);return s.useMemo((function(){return"function"==typeof e?e(i):{...i,...e}}),[i,e])}function a(e){let i;return i=e.disableParentContext?"function"==typeof e.components?e.components(n):e.components||n:o(e.components),s.createElement(r.Provider,{value:i},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/fb02bab9.acb075f9.js b/assets/js/fb02bab9.acb075f9.js deleted file mode 100644 index 5be85cf2..00000000 --- a/assets/js/fb02bab9.acb075f9.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[5885],{5190:(e,i,t)=>{t.r(i),t.d(i,{assets:()=>d,contentTitle:()=>o,default:()=>h,frontMatter:()=>r,metadata:()=>a,toc:()=>l});var s=t(4848),n=t(8453);const r={title:"Stabilizing",sidebar_position:7},o="Stabilizing",a={id:"filtering/stabilizing",title:"Stabilizing",description:"This section is in need of contributions. If you believe you can help, please see our Contribution Guide to get started as a contributor!",source:"@site/docs/filtering/stabilizing.mdx",sourceDirName:"filtering",slug:"/filtering/stabilizing",permalink:"/docs/filtering/stabilizing",draft:!1,unlisted:!1,editUrl:"https://github.com/av1-community-contributors/codec-wiki/tree/main/docs/filtering/stabilizing.mdx",tags:[],version:"current",sidebarPosition:7,frontMatter:{title:"Stabilizing",sidebar_position:7},sidebar:"tutorialSidebar",previous:{title:"Decombing",permalink:"/docs/filtering/decombing"},next:{title:"Denoise",permalink:"/docs/filtering/denoise"}},d={},l=[{value:"Overview",id:"overview",level:2},{value:"Usage",id:"usage",level:2},{value:"vidstabdetect Parameters",id:"vidstabdetect-parameters",level:3},{value:"vidstabtransform Parameters",id:"vidstabtransform-parameters",level:3},{value:"Notes",id:"notes",level:2}];function c(e){const i={a:"a",admonition:"admonition",code:"code",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",p:"p",pre:"pre",ul:"ul",...(0,n.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(i.header,{children:(0,s.jsx)(i.h1,{id:"stabilizing",children:"Stabilizing"})}),"\n",(0,s.jsx)(i.admonition,{title:"Help Wanted",type:"danger",children:(0,s.jsxs)(i.p,{children:["This section is in need of contributions. If you believe you can help, please see our ",(0,s.jsx)(i.a,{href:"/docs/contribution-guide",children:"Contribution Guide"})," to get started as a contributor!"]})}),"\n",(0,s.jsx)(i.h2,{id:"overview",children:"Overview"}),"\n",(0,s.jsxs)(i.p,{children:["Stabilizing is a process that reduces unwanted camera movement and shakes in a video clip. This is particularly important, as unpredictable global movement (such as that from a handheld camera) can decrease overall encoding efficiency. The most popular way to stabilize video with ",(0,s.jsx)(i.a,{href:"/docs/utilities/ffmpeg",children:"FFmpeg"})," is to use the ",(0,s.jsx)(i.a,{href:"https://github.com/georgmartius/vid.stab",children:"VidStab"})," library. To do this, you need a build of FFmpeg compiled with ",(0,s.jsx)(i.code,{children:"--enable-libvidstab"}),"."]}),"\n",(0,s.jsx)(i.p,{children:"VidStab actually has two filters within FFmpeg."}),"\n",(0,s.jsx)(i.pre,{children:(0,s.jsx)(i.code,{className:"language-shell",children:"ffmpeg -hide_banner -filters | grep vidstab\n ... vidstabdetect V->V Extract relative transformations, pass 1 of 2 for stabilization (see vidstabtransform for pass 2).\n ... vidstabtransform V->V Transform the frames, pass 2 of 2 for stabilization (see vidstabdetect for pass 1).\n"})}),"\n",(0,s.jsxs)(i.p,{children:["The ",(0,s.jsx)(i.code,{children:"vidstabdetect"})," filter is used for the first pass, where the video transformations file (",(0,s.jsx)(i.code,{children:".trf"}),") is generated, and ",(0,s.jsx)(i.code,{children:"vidstabtransform"})," is used for the second pass, where transformations are actually applied. This implies that stabilization cannot be achieved in real-time."]}),"\n",(0,s.jsx)(i.h2,{id:"usage",children:"Usage"}),"\n",(0,s.jsx)(i.p,{children:"To stabilize a video using default parameters, you need to run two FFmpeg commands:"}),"\n",(0,s.jsx)(i.pre,{children:(0,s.jsx)(i.code,{className:"language-shell",children:"ffmpeg -i input.mp4 -vf vidstabdetect -f null -\nffmpeg -i input.mp4 -vf vidstabtransform output.mp4\n"})}),"\n",(0,s.jsxs)(i.p,{children:["A file called ",(0,s.jsx)(i.code,{children:"transforms.trf"})," will be created in the directory where you run FFmpeg. After the second step is finished, you can safely remove it. The resulting ",(0,s.jsx)(i.code,{children:"output.mp4"})," video will now have reduced shakiness."]}),"\n",(0,s.jsxs)(i.p,{children:["To stabilize a high-framerate video with strong camera movement, set its transformations filename to ",(0,s.jsx)(i.code,{children:"a.trf"}),", and increase the output field of view. You can use the following commands:"]}),"\n",(0,s.jsx)(i.pre,{children:(0,s.jsx)(i.code,{className:"language-shell",children:"ffmpeg -i input.mp4 -vf vidstabdetect=shakiness=8:result=a.trf -f null -\nffmpeg -i input.mp4 -vf vidstabtransform=smoothing=30:zoom=-5:input=a.trf output.mp4\n"})}),"\n",(0,s.jsx)(i.admonition,{type:"tip",children:(0,s.jsxs)(i.p,{children:["Remember to set appropriate video/audio codec parameters in the command before ",(0,s.jsx)(i.code,{children:"output.mp4"}),". You must not use ",(0,s.jsx)(i.code,{children:"-c:v copy"}),", as the video will be transformed."]})}),"\n",(0,s.jsx)(i.h3,{id:"vidstabdetect-parameters",children:"vidstabdetect Parameters"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"result"}),": Sets the output ",(0,s.jsx)(i.code,{children:".trf"})," file location"]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"shakiness"}),": The amount of movement reduction, where ",(0,s.jsx)(i.code,{children:"1"})," is the least reduction, ",(0,s.jsx)(i.code,{children:"10"})," is the most reduction (highest stabilization), and ",(0,s.jsx)(i.code,{children:"5"})," is the default"]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"accuracy"}),": The accuracy of movement reduction, where ",(0,s.jsx)(i.code,{children:"1"})," is the least accurate, ",(0,s.jsx)(i.code,{children:"15"})," is the most accurate, and ",(0,s.jsx)(i.code,{children:"15"})," is also the default. This setting influences CPU usage during detection. FFmpeg does not allow setting a value lower than ",(0,s.jsx)(i.code,{children:"3"}),". ",(0,s.jsx)(i.code,{children:"3"})," gave a processing speed of ",(0,s.jsx)(i.code,{children:"21 fps"}),", and ",(0,s.jsx)(i.code,{children:"15"})," gave ",(0,s.jsx)(i.code,{children:"14 fps"}),". The process itself is rather CPU-intensive."]}),"\n"]}),"\n",(0,s.jsxs)(i.p,{children:["For a description of all possible parameters, take a look ",(0,s.jsx)(i.a,{href:"https://ffmpeg.org/ffmpeg-filters.html#vidstabdetect-1",children:"here"}),"."]}),"\n",(0,s.jsx)(i.h3,{id:"vidstabtransform-parameters",children:"vidstabtransform Parameters"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"input"}),": Sets the input ",(0,s.jsx)(i.code,{children:".trf"})," file location created by ",(0,s.jsx)(i.code,{children:"vidstabdetect"})]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"smoothing"}),": The number of frames in the future and past used for movement estimation, where the default is ",(0,s.jsx)(i.code,{children:"10"})," (so 10 past and 10 future frames)"]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"zoom"}),": The amount of zoom expressed in percentage, where the default is ",(0,s.jsx)(i.code,{children:"0%"}),". It can be negative, which will create a zoom-out effect."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"interpol"}),": The type of interpolation used, where ",(0,s.jsx)(i.code,{children:"bilinear"})," is the default.","\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"no"}),": No interpolation"]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"linear"}),": Only horizontal"]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"bilinear"}),": Faster but can result in blurry output"]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"bicubic"}),": Slower"]}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,s.jsxs)(i.p,{children:["For a description of all possible parameters, take a look ",(0,s.jsx)(i.a,{href:"https://ffmpeg.org/ffmpeg-filters.html#vidstabtransform-1",children:"here"}),"."]}),"\n",(0,s.jsx)(i.h2,{id:"notes",children:"Notes"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsx)(i.li,{children:"The process of stabilization is lossy and can reduce the quality of the video, mainly due to the zoom and interpolation used."}),"\n",(0,s.jsx)(i.li,{children:"You might notice overall wobbliness in the resulting video file, especially with higher stabilization levels. This is just how this filter works."}),"\n",(0,s.jsx)(i.li,{children:"As you will need to run two passes anyway, you might also consider using two-pass encoding, depending on your use case."}),"\n"]})]})}function h(e={}){const{wrapper:i}={...(0,n.R)(),...e.components};return i?(0,s.jsx)(i,{...e,children:(0,s.jsx)(c,{...e})}):c(e)}},8453:(e,i,t)=>{t.d(i,{R:()=>o,x:()=>a});var s=t(6540);const n={},r=s.createContext(n);function o(e){const i=s.useContext(r);return s.useMemo((function(){return"function"==typeof e?e(i):{...i,...e}}),[i,e])}function a(e){let i;return i=e.disableParentContext?"function"==typeof e.components?e.components(n):e.components||n:o(e.components),s.createElement(r.Provider,{value:i},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/main.0d7a5f66.js b/assets/js/main.0d7a5f66.js new file mode 100644 index 00000000..dccd1f01 --- /dev/null +++ b/assets/js/main.0d7a5f66.js @@ -0,0 +1,2 @@ +/*! For license information please see main.0d7a5f66.js.LICENSE.txt */ +(self.webpackChunkcodec_wiki=self.webpackChunkcodec_wiki||[]).push([[8792],{5391:(e,t,n)=>{"use strict";function r(e){var t,n,o="";if("string"==typeof e||"number"==typeof e)o+=e;else if("object"==typeof e)if(Array.isArray(e))for(t=0;to});const o=function(){for(var e,t,n=0,o="";n{"use strict";n.d(t,{A:()=>p});n(6540);var r=n(3259),o=n.n(r),a=n(4054);const i={"0058b4c6":[()=>n.e(849).then(n.t.bind(n,6164,19)),"@generated/docusaurus-plugin-content-docs/default/p/docs-175.json",6164],"0092d9fd":[()=>n.e(9057).then(n.bind(n,3372)),"@site/docs/audio/FLAC.mdx",3372],"015d9d66":[()=>n.e(4598).then(n.bind(n,1854)),"@site/docs/metrics/PSNR.mdx",1854],"01a85c17":[()=>Promise.all([n.e(1869),n.e(8209)]).then(n.bind(n,9158)),"@theme/BlogTagsListPage",9158],"03af419f":[()=>Promise.all([n.e(1869),n.e(9305)]).then(n.bind(n,1865)),"@site/docs/encoders/VVenC.mdx",1865],"03e95fdf":[()=>n.e(3485).then(n.bind(n,1789)),"@site/docs/video/VP8.mdx",1789],"04dda763":[()=>n.e(6778).then(n.bind(n,3763)),"@site/blog/2024-06-24-av1-for-dummies-2.mdx",3763],"059e36ab":[()=>n.e(6838).then(n.bind(n,6587)),"@site/docs/video/utvideo.mdx",6587],"06ed4e86":[()=>n.e(8161).then(n.bind(n,3514)),"@site/docs/audio/Dolby.mdx",3514],"09a8bfdb":[()=>n.e(5579).then(n.bind(n,4070)),"@site/blog/2023-10-29-embedding-the-un-embeddable copy.mdx",4070],"09bc817a":[()=>n.e(1554).then(n.bind(n,5811)),"@site/docs/audio/Opus.mdx",5811],"0b185270":[()=>n.e(3482).then(n.bind(n,455)),"@site/docs/FAQ.mdx",455],"0c06159a":[()=>n.e(8258).then(n.bind(n,1339)),"@site/docs/data/tar.mdx",1339],"0e7f53a8":[()=>n.e(9954).then(n.bind(n,929)),"@site/docs/images/PNG.mdx",929],"112763a5":[()=>n.e(1779).then(n.bind(n,5836)),"@site/docs/terms-of-use.mdx",5836],"12b076f3":[()=>n.e(7222).then(n.bind(n,9905)),"@site/docs/data/zstd.mdx",9905],"12df3b9e":[()=>n.e(9993).then(n.bind(n,1793)),"@site/docs/images/QOI.mdx",1793],"138e0e15":[()=>n.e(4921).then(n.t.bind(n,1597,19)),"@generated/@easyops-cn/docusaurus-search-local/default/__plugin.json",1597],17896441:[()=>Promise.all([n.e(1869),n.e(8498),n.e(8401)]).then(n.bind(n,575)),"@theme/DocItem",575],"1817a557":[()=>n.e(6738).then(n.bind(n,6118)),"@site/docs/introduction/lossless.mdx",6118],"1a4e3797":[()=>Promise.all([n.e(1869),n.e(2138)]).then(n.bind(n,1283)),"@theme/SearchPage",1283],"1b67d0f3":[()=>n.e(842).then(n.bind(n,4476)),"@site/docs/data/gzip.mdx",4476],"1ca2b1db":[()=>n.e(7855).then(n.bind(n,9073)),"@site/docs/encoders_hw/mediacodec.mdx",9073],"1e5c3f00":[()=>n.e(9486).then(n.bind(n,3585)),"@site/blog/2024-07-20-codec-wiki-one-year-later.mdx",3585],"1ec3ce74":[()=>Promise.all([n.e(1869),n.e(2142)]).then(n.bind(n,5780)),"@site/docs/encoders/rav1e.mdx",5780],"1f391b9e":[()=>Promise.all([n.e(1869),n.e(8498),n.e(6061)]).then(n.bind(n,7973)),"@theme/MDXPage",7973],"1fabe0bd":[()=>n.e(5562).then(n.bind(n,3315)),"@site/docs/colorimetry/intro.mdx",3315],"20d769d8":[()=>n.e(3121).then(n.bind(n,7114)),"@site/blog/2023-10-29-embedding-the-un-embeddable copy.mdx?truncated=true",7114],"229f7513":[()=>n.e(7146).then(n.bind(n,4153)),"@site/docs/subtitles/webvtt.mdx",4153],"28bd9d7a":[()=>n.e(888).then(n.bind(n,1849)),"@site/docs/utilities/FFMetrics.mdx",1849],"299beccc":[()=>n.e(5479).then(n.bind(n,1531)),"@site/docs/data/7z.mdx",1531],"2d25ac87":[()=>n.e(5949).then(n.bind(n,822)),"@site/docs/utilities/autocompressor.mdx",822],"2e23a845":[()=>Promise.all([n.e(1869),n.e(5147)]).then(n.bind(n,2914)),"@site/docs/encoders/SVT-AV1-PSY.mdx",2914],"2fcb10cd":[()=>n.e(8158).then(n.bind(n,1162)),"@site/docs/audio/intro.mdx",1162],"318608aa":[()=>Promise.all([n.e(1869),n.e(6003)]).then(n.bind(n,3187)),"@site/docs/encoders/vpxenc.mdx",3187],32987299:[()=>n.e(7754).then(n.bind(n,5029)),"@site/docs/filtering/vapoursynth.mdx",5029],"345ef4f9":[()=>n.e(6509).then(n.bind(n,5389)),"@site/docs/utilities/MKVToolNix.mdx",5389],"36994c47":[()=>n.e(9858).then(n.t.bind(n,5516,19)),"@generated/docusaurus-plugin-content-blog/default/__plugin.json",5516],"37c719d6":[()=>Promise.all([n.e(6256),n.e(1227)]).then(n.bind(n,1800)),"@site/blog/2024-05-19-svt-av1-deep-dive2-v2-1-0.mdx",1800],"3a2db09e":[()=>n.e(8121).then(n.t.bind(n,8070,19)),"@generated/docusaurus-plugin-content-blog/default/p/blog-tags-df9.json",8070],"3d6cf458":[()=>n.e(2614).then(n.bind(n,6396)),"@site/docs/video/VC-1.mdx",6396],"43624f55":[()=>n.e(7844).then(n.bind(n,3676)),"@site/docs/filtering/ivtc.mdx",3676],"44e37655":[()=>Promise.all([n.e(1869),n.e(5958)]).then(n.bind(n,6147)),"@site/docs/metrics/SSIMULACRA2.mdx",6147],"45f4020c":[()=>n.e(4897).then(n.bind(n,9493)),"@site/docs/encoders_hw/videotoolbox.mdx",9493],"467a109f":[()=>n.e(7431).then(n.t.bind(n,891,19)),"@generated/docusaurus-plugin-content-blog/default/p/blog-tags-benchmarks-180.json",891],"48b7ca01":[()=>Promise.all([n.e(6256),n.e(1347)]).then(n.bind(n,9350)),"@site/blog/2023-12-30-svt-av1-deep-dive.mdx?truncated=true",9350],"49b64d14":[()=>Promise.all([n.e(1869),n.e(5993)]).then(n.bind(n,4493)),"@site/docs/encoders/SVT-AV1.mdx",4493],"4c678320":[()=>n.e(9664).then(n.bind(n,2051)),"@site/src/pages/markdown-page.mdx",2051],"4d877b09":[()=>n.e(2150).then(n.bind(n,8493)),"@site/docs/encoders_hw/qsv.mdx",8493],"522a92e3":[()=>n.e(5220).then(n.bind(n,2191)),"@site/docs/encoders_hw/nvenc.mdx",2191],"54a9c2bb":[()=>n.e(561).then(n.bind(n,3633)),"@site/docs/utilities/YUView.mdx",3633],56786013:[()=>n.e(8741).then(n.bind(n,3588)),"@site/docs/images/JPEG.mdx",3588],"59e6fde5":[()=>n.e(9724).then(n.bind(n,357)),"@site/blog/2024-06-24-av1-for-dummies-2.mdx?truncated=true",357],"5b209502":[()=>n.e(4176).then(n.bind(n,4296)),"@site/docs/filtering/deinterlace.mdx",4296],"5d1a7e8b":[()=>n.e(5936).then(n.bind(n,63)),"@site/docs/video-players.mdx",63],"5db6705b":[()=>n.e(1624).then(n.bind(n,9828)),"@site/docs/utilities/nmkoder.mdx",9828],"5e069031":[()=>n.e(5968).then(n.bind(n,9483)),"@site/docs/introduction/prologue.mdx",9483],"5e1194df":[()=>n.e(4822).then(n.bind(n,5160)),"@site/docs/data/zpaq.mdx",5160],"5e95c892":[()=>n.e(9647).then(n.bind(n,7121)),"@theme/DocsRoot",7121],"5e9f5e1a":[()=>Promise.resolve().then(n.bind(n,4784)),"@generated/docusaurus.config",4784],"5ec46d54":[()=>n.e(1481).then(n.bind(n,2886)),"@site/docs/video/ECM.mdx",2886],"5f74c797":[()=>Promise.all([n.e(1869),n.e(5745)]).then(n.bind(n,6185)),"@site/docs/utilities/av1an.mdx",6185],"632d0ef1":[()=>n.e(106).then(n.bind(n,1598)),"@site/docs/encoders/VTM.mdx",1598],"6549b2b5":[()=>n.e(4846).then(n.bind(n,2417)),"@site/blog/2023-07-21-site-optimization.mdx",2417],"65524f4d":[()=>n.e(6891).then(n.bind(n,2030)),"@site/docs/filtering/antialiasing.mdx",2030],66935117:[()=>n.e(2017).then(n.t.bind(n,5585,19)),"@generated/docusaurus-plugin-content-blog/default/p/blog-tags-anniversary-322.json",5585],"6875c492":[()=>Promise.all([n.e(1869),n.e(8498),n.e(8793),n.e(4813)]).then(n.bind(n,1086)),"@theme/BlogTagsPostsPage",1086],"68dcf780":[()=>n.e(1315).then(n.bind(n,1538)),"@site/docs/filtering/decombing.mdx",1538],"6bf0f114":[()=>n.e(881).then(n.bind(n,779)),"@site/docs/data/zip.mdx",779],"6c179ac5":[()=>n.e(4072).then(n.bind(n,9964)),"@site/docs/video/Theora.mdx",9964],"6d85920a":[()=>n.e(7800).then(n.bind(n,3911)),"@site/docs/introduction/terminology.mdx",3911],70006292:[()=>n.e(9987).then(n.bind(n,1359)),"@site/docs/encoders/x266.mdx",1359],"70de1c07":[()=>Promise.all([n.e(6256),n.e(544)]).then(n.bind(n,850)),"@site/blog/2023-12-30-svt-av1-deep-dive.mdx",850],"7385c97b":[()=>n.e(8415).then(n.bind(n,5322)),"@site/docs/images/AVIF.mdx",5322],"75936cdf":[()=>n.e(7564).then(n.bind(n,9613)),"@site/docs/filtering/graining.mdx",9613],"76096a15":[()=>n.e(8924).then(n.bind(n,8560)),"@site/docs/subtitles/SRT.mdx",8560],"7d09a242":[()=>Promise.all([n.e(1869),n.e(6692)]).then(n.bind(n,1586)),"@site/docs/encoders/aomenc.mdx",1586],"7eff0f1a":[()=>n.e(2515).then(n.bind(n,7199)),"@site/docs/video/AVC.mdx",7199],"7f76a12e":[()=>n.e(1502).then(n.bind(n,2225)),"@site/blog/2023-09-03-av1-for-dummies.mdx",2225],"7fa695a7":[()=>n.e(1363).then(n.bind(n,6046)),"@site/docs/images/GIF.mdx",6046],80447496:[()=>n.e(7715).then(n.bind(n,6520)),"@site/docs/video/VVC.mdx",6520],"80bfa96b":[()=>n.e(2901).then(n.bind(n,9340)),"@site/docs/resources.mdx",9340],"814f3328":[()=>n.e(7472).then(n.t.bind(n,5513,19)),"~blog/default/blog-post-list-prop-default.json",5513],81739261:[()=>n.e(4794).then(n.bind(n,2358)),"@site/docs/video/prores.mdx",2358],"83732ada":[()=>n.e(6840).then(n.bind(n,3387)),"@site/docs/video/HEVC.mdx",3387],"841b1305":[()=>Promise.all([n.e(1869),n.e(9939)]).then(n.bind(n,7026)),"@site/docs/encoders/uavs3e.mdx",7026],"842a7beb":[()=>n.e(6866).then(n.bind(n,7216)),"@site/docs/utilities/rAV1ator.mdx",7216],"84e198a2":[()=>n.e(6711).then(n.bind(n,2955)),"@site/docs/utilities/eac3to.mdx",2955],"86ba2311":[()=>n.e(8141).then(n.bind(n,4632)),"@site/docs/video/VP9.mdx",4632],"8a894f7b":[()=>n.e(538).then(n.bind(n,8245)),"@site/docs/introduction/video-artifacts.mdx",8245],"8aacd032":[()=>n.e(2897).then(n.bind(n,6669)),"@site/docs/video/AV1.mdx",6669],"8bdabb45":[()=>n.e(7957).then(n.bind(n,5575)),"@site/docs/encoders/AVM.mdx",5575],"8eb2df80":[()=>Promise.all([n.e(1869),n.e(7796)]).then(n.bind(n,5101)),"@site/docs/utilities/rav1ator-cli.mdx",5101],"8ee2fdd1":[()=>Promise.all([n.e(1869),n.e(8420)]).then(n.bind(n,4335)),"@site/docs/encoders/aom-av1-lavish.mdx",4335],"8f6f5e4c":[()=>n.e(8760).then(n.bind(n,4216)),"@site/docs/colorimetry/format.mdx",4216],"904009dc":[()=>n.e(822).then(n.t.bind(n,8235,19)),"@generated/docusaurus-plugin-content-blog/default/p/blog-tags-web-377.json",8235],"9060e84a":[()=>n.e(8320).then(n.bind(n,4e3)),"@site/docs/encoders/HM.mdx",4e3],"90aedb84":[()=>n.e(1691).then(n.bind(n,8872)),"@site/docs/introduction/psychovisual.mdx",8872],"915a111c":[()=>n.e(5889).then(n.bind(n,1389)),"@site/docs/filtering/dehalo.mdx",1389],"92fa5ef1":[()=>n.e(4044).then(n.t.bind(n,9232,19)),"@generated/docusaurus-plugin-content-blog/default/p/blog-tags-history-b17.json",9232],"939f23de":[()=>n.e(2590).then(n.bind(n,631)),"@site/docs/filtering/basics.mdx",631],"94782d2d":[()=>n.e(4597).then(n.bind(n,2774)),"@site/docs/colorimetry/range.mdx",2774],"95e9a4c5":[()=>n.e(3672).then(n.bind(n,7426)),"@site/docs/utilities/Discord.mdx",7426],"998d107e":[()=>n.e(274).then(n.bind(n,7672)),"@site/docs/video/FFV1.mdx",7672],"99c26446":[()=>n.e(8026).then(n.bind(n,1455)),"@site/docs/metrics/butteraugli.mdx",1455],"9ba56b79":[()=>n.e(1288).then(n.bind(n,5495)),"@site/docs/encoders_hw/amf.mdx",5495],"9c171e5c":[()=>n.e(8773).then(n.bind(n,3061)),"@site/docs/metrics/SSIM.mdx",3061],"9cae5962":[()=>Promise.all([n.e(1869),n.e(71)]).then(n.bind(n,5650)),"@site/docs/images/JXL.mdx",5650],"9e4087bc":[()=>n.e(2711).then(n.bind(n,9331)),"@theme/BlogArchivePage",9331],"9efd8a4a":[()=>n.e(5415).then(n.bind(n,1076)),"@site/docs/images/WebP.mdx",1076],"9f640ee8":[()=>n.e(6810).then(n.bind(n,5864)),"@site/docs/encoders/Aurora1.mdx",5864],"9f709603":[()=>n.e(5341).then(n.bind(n,3414)),"@site/docs/filtering/deband.mdx",3414],a6aa9e1f:[()=>Promise.all([n.e(1869),n.e(8498),n.e(8793),n.e(7643)]).then(n.bind(n,5124)),"@theme/BlogListPage",5124],a7456010:[()=>n.e(1235).then(n.t.bind(n,8552,19)),"@generated/docusaurus-plugin-content-pages/default/__plugin.json",8552],a7bd4aaa:[()=>n.e(7098).then(n.bind(n,4532)),"@theme/DocVersionRoot",4532],a8f610c9:[()=>n.e(8599).then(n.bind(n,5860)),"@site/docs/data/brotli.mdx",5860],a94703ab:[()=>Promise.all([n.e(1869),n.e(9048)]).then(n.bind(n,1377)),"@theme/DocRoot",1377],aaf3ff15:[()=>n.e(3170).then(n.t.bind(n,5890,19)),"@generated/docusaurus-plugin-content-blog/default/p/blog-tags-compression-44b.json",5890],aba21aa0:[()=>n.e(5742).then(n.t.bind(n,7093,19)),"@generated/docusaurus-plugin-content-docs/default/__plugin.json",7093],acecf23e:[()=>n.e(1903).then(n.t.bind(n,1912,19)),"~blog/default/blogMetadata-default.json",1912],acf4709b:[()=>n.e(7225).then(n.bind(n,1918)),"@site/docs/subtitles/SSA.mdx",1918],afe5e22f:[()=>n.e(8117).then(n.bind(n,1624)),"@site/docs/encoders/x265.mdx",1624],b0535000:[()=>n.e(7238).then(n.bind(n,851)),"@site/blog/2023-07-21-site-optimization.mdx?truncated=true",851],b261517a:[()=>Promise.all([n.e(6256),n.e(1454)]).then(n.bind(n,3012)),"@site/blog/2024-05-19-svt-av1-deep-dive2-v2-1-0.mdx?truncated=true",3012],b4030b4d:[()=>Promise.all([n.e(1869),n.e(3408)]).then(n.bind(n,6856)),"@site/docs/utilities/Aviator.mdx",6856],b4bbde8e:[()=>n.e(7989).then(n.bind(n,965)),"@site/docs/audio/AAC.mdx",965],b59b8cf7:[()=>n.e(1271).then(n.bind(n,5423)),"@site/docs/audio/Vorbis.mdx",5423],b8af02bf:[()=>n.e(3222).then(n.bind(n,1158)),"@site/docs/images/JPEG2000.mdx",1158],bb17976f:[()=>Promise.all([n.e(1869),n.e(8943)]).then(n.bind(n,2591)),"@site/docs/encoders/aom-psy101.mdx",2591],bc32b9c5:[()=>n.e(786).then(n.bind(n,8450)),"@site/docs/metrics/XPSNR.mdx",8450],bd173b27:[()=>n.e(1651).then(n.bind(n,4646)),"@site/docs/data/xz.mdx",4646],be236901:[()=>n.e(6795).then(n.bind(n,7090)),"@site/docs/contribution-guide.mdx",7090],bf9d09b6:[()=>Promise.all([n.e(1869),n.e(8270)]).then(n.bind(n,6491)),"@site/docs/encoders/SVT-HEVC.mdx",6491],c15d9823:[()=>n.e(8146).then(n.t.bind(n,9328,19)),"@generated/docusaurus-plugin-content-blog/default/p/blog-bd9.json",9328],c19fbcae:[()=>n.e(4501).then(n.bind(n,5341)),"@site/docs/audio/ALAC.mdx",5341],c224274c:[()=>n.e(3356).then(n.bind(n,4736)),"@site/docs/video/AVS3.mdx",4736],c4f5d8e4:[()=>Promise.all([n.e(1869),n.e(2634)]).then(n.bind(n,1459)),"@site/src/pages/index.js",1459],c7deb2e0:[()=>n.e(9551).then(n.bind(n,9009)),"@site/docs/audio/WavPack.mdx",9009],c92fe796:[()=>n.e(3034).then(n.bind(n,3083)),"@site/docs/utilities/ffmpeg.mdx",3083],c943a24a:[()=>n.e(5512).then(n.bind(n,556)),"@site/docs/introduction/high-dynamic-range.mdx",556],ccc49370:[()=>Promise.all([n.e(1869),n.e(8498),n.e(8793),n.e(3249)]).then(n.bind(n,3858)),"@theme/BlogPostPage",3858],cce09ffa:[()=>n.e(5556).then(n.bind(n,1939)),"@site/blog/2023-09-03-av1-for-dummies.mdx?truncated=true",1939],cd6cf5b7:[()=>n.e(5365).then(n.bind(n,9576)),"@site/docs/encoders/SVT-VP9.mdx",9576],ce98a713:[()=>n.e(6168).then(n.bind(n,4705)),"@site/docs/filtering/denoise.mdx",4705],cf7588c6:[()=>n.e(5971).then(n.bind(n,2493)),"@site/docs/encoders/x264.mdx",2493],d1becb09:[()=>n.e(8843).then(n.bind(n,5224)),"@site/docs/privacy-policy.mdx",5224],d337df6f:[()=>n.e(6496).then(n.bind(n,8051)),"@site/blog/2024-07-20-codec-wiki-one-year-later.mdx?truncated=true",8051],d5ab79da:[()=>n.e(8382).then(n.bind(n,2082)),"@site/docs/audio/MP3.mdx",2082],d5f89569:[()=>Promise.all([n.e(1869),n.e(1401)]).then(n.bind(n,7235)),"@site/docs/encoders/Kvazaar.mdx",7235],d6535278:[()=>Promise.all([n.e(1869),n.e(6977)]).then(n.bind(n,9963)),"@site/docs/metrics/VMAF.mdx",9963],d96727fd:[()=>n.e(1500).then(n.bind(n,8566)),"@site/docs/colorimetry/matrix.mdx",8566],ddce1156:[()=>n.e(1408).then(n.bind(n,5856)),"@site/docs/utilities/mp4box.mdx",5856],e157395a:[()=>n.e(7967).then(n.bind(n,8935)),"@site/docs/images/HEIC.mdx",8935],e1a437f7:[()=>n.e(9381).then(n.bind(n,801)),"@site/docs/data/bzip2.mdx",801],e1c48702:[()=>n.e(6377).then(n.bind(n,1356)),"@site/docs/introduction/lossy.mdx",1356],e23fa6d4:[()=>n.e(4704).then(n.t.bind(n,1696,19)),"@generated/docusaurus-plugin-content-blog/default/p/blog-tags-image-83d.json",1696],e33da66d:[()=>n.e(2361).then(n.t.bind(n,9109,19)),"@generated/docusaurus-plugin-content-blog/default/p/blog-tags-video-28b.json",9109],e3409e91:[()=>n.e(6231).then(n.t.bind(n,210,19)),"@generated/docusaurus-plugin-content-blog/default/p/blog-tags-discord-cfa.json",210],e3b00369:[()=>n.e(921).then(n.bind(n,1364)),"@site/docs/utilities/av1an-command-gen.mdx",1364],e641ee58:[()=>n.e(5738).then(n.bind(n,3493)),"@site/docs/audio/Speex.mdx",3493],edaea366:[()=>n.e(7978).then(n.bind(n,4992)),"@site/docs/colorimetry/transfer.mdx",4992],ee513c31:[()=>Promise.all([n.e(1869),n.e(1137)]).then(n.bind(n,7155)),"@site/docs/utilities/dovi_tool.mdx",7155],ee8c27e3:[()=>n.e(9819).then(n.bind(n,3835)),"@site/docs/encoders/uvg266.mdx",3835],f4fea690:[()=>n.e(4924).then(n.bind(n,278)),"@site/docs/encoders/JM.mdx",278],f81c1134:[()=>n.e(8130).then(n.t.bind(n,7735,19)),"@generated/docusaurus-plugin-content-blog/default/p/blog-archive-f05.json",7735],f9208490:[()=>Promise.all([n.e(1869),n.e(3229)]).then(n.bind(n,6450)),"@site/docs/utilities/hdr10plus_tool.mdx",6450],fb02bab9:[()=>n.e(5885).then(n.bind(n,5190)),"@site/docs/filtering/stabilizing.mdx",5190],fda0af90:[()=>n.e(5376).then(n.bind(n,7615)),"@site/docs/colorimetry/primaries.mdx",7615]};var s=n(4848);function l(e){let{error:t,retry:n,pastDelay:r}=e;return t?(0,s.jsxs)("div",{style:{textAlign:"center",color:"#fff",backgroundColor:"#fa383e",borderColor:"#fa383e",borderStyle:"solid",borderRadius:"0.25rem",borderWidth:"1px",boxSizing:"border-box",display:"block",padding:"1rem",flex:"0 0 50%",marginLeft:"25%",marginRight:"25%",marginTop:"5rem",maxWidth:"50%",width:"100%"},children:[(0,s.jsx)("p",{children:String(t)}),(0,s.jsx)("div",{children:(0,s.jsx)("button",{type:"button",onClick:n,children:"Retry"})})]}):r?(0,s.jsx)("div",{style:{display:"flex",justifyContent:"center",alignItems:"center",height:"100vh"},children:(0,s.jsx)("svg",{id:"loader",style:{width:128,height:110,position:"absolute",top:"calc(100vh - 64%)"},viewBox:"0 0 45 45",xmlns:"http://www.w3.org/2000/svg",stroke:"#61dafb",children:(0,s.jsxs)("g",{fill:"none",fillRule:"evenodd",transform:"translate(1 1)",strokeWidth:"2",children:[(0,s.jsxs)("circle",{cx:"22",cy:"22",r:"6",strokeOpacity:"0",children:[(0,s.jsx)("animate",{attributeName:"r",begin:"1.5s",dur:"3s",values:"6;22",calcMode:"linear",repeatCount:"indefinite"}),(0,s.jsx)("animate",{attributeName:"stroke-opacity",begin:"1.5s",dur:"3s",values:"1;0",calcMode:"linear",repeatCount:"indefinite"}),(0,s.jsx)("animate",{attributeName:"stroke-width",begin:"1.5s",dur:"3s",values:"2;0",calcMode:"linear",repeatCount:"indefinite"})]}),(0,s.jsxs)("circle",{cx:"22",cy:"22",r:"6",strokeOpacity:"0",children:[(0,s.jsx)("animate",{attributeName:"r",begin:"3s",dur:"3s",values:"6;22",calcMode:"linear",repeatCount:"indefinite"}),(0,s.jsx)("animate",{attributeName:"stroke-opacity",begin:"3s",dur:"3s",values:"1;0",calcMode:"linear",repeatCount:"indefinite"}),(0,s.jsx)("animate",{attributeName:"stroke-width",begin:"3s",dur:"3s",values:"2;0",calcMode:"linear",repeatCount:"indefinite"})]}),(0,s.jsx)("circle",{cx:"22",cy:"22",r:"8",children:(0,s.jsx)("animate",{attributeName:"r",begin:"0s",dur:"1.5s",values:"6;1;2;3;4;5;6",calcMode:"linear",repeatCount:"indefinite"})})]})})}):null}var c=n(6921),u=n(3102);function d(e,t){if("*"===e)return o()({loading:l,loader:()=>n.e(2237).then(n.bind(n,2237)),modules:["@theme/NotFound"],webpack:()=>[2237],render(e,t){const n=e.default;return(0,s.jsx)(u.W,{value:{plugin:{name:"native",id:"default"}},children:(0,s.jsx)(n,{...t})})}});const r=a[`${e}-${t}`],d={},p=[],f=[],h=(0,c.A)(r);return Object.entries(h).forEach((e=>{let[t,n]=e;const r=i[n];r&&(d[t]=r[0],p.push(r[1]),f.push(r[2]))})),o().Map({loading:l,loader:d,modules:p,webpack:()=>f,render(t,n){const o=JSON.parse(JSON.stringify(r));Object.entries(t).forEach((t=>{let[n,r]=t;const a=r.default;if(!a)throw new Error(`The page component at ${e} doesn't have a default export. This makes it impossible to render anything. Consider default-exporting a React component.`);"object"!=typeof a&&"function"!=typeof a||Object.keys(r).filter((e=>"default"!==e)).forEach((e=>{a[e]=r[e]}));let i=o;const s=n.split(".");s.slice(0,-1).forEach((e=>{i=i[e]})),i[s[s.length-1]]=a}));const a=o.__comp;delete o.__comp;const i=o.__context;delete o.__context;const l=o.__props;return delete o.__props,(0,s.jsx)(u.W,{value:i,children:(0,s.jsx)(a,{...o,...l,...n})})}})}const p=[{path:"/blog",component:d("/blog","116"),exact:!0},{path:"/blog/archive",component:d("/blog/archive","182"),exact:!0},{path:"/blog/av1-encoding-for-dummies",component:d("/blog/av1-encoding-for-dummies","7e6"),exact:!0},{path:"/blog/av1-for-dummies",component:d("/blog/av1-for-dummies","36a"),exact:!0},{path:"/blog/codec-wiki-one-year-later",component:d("/blog/codec-wiki-one-year-later","053"),exact:!0},{path:"/blog/embedding-the-un-embeddable",component:d("/blog/embedding-the-un-embeddable","ddb"),exact:!0},{path:"/blog/site-optimization",component:d("/blog/site-optimization","79f"),exact:!0},{path:"/blog/svt-av1-deep-dive",component:d("/blog/svt-av1-deep-dive","32d"),exact:!0},{path:"/blog/svt-av1-second-deep-dive",component:d("/blog/svt-av1-second-deep-dive","ca6"),exact:!0},{path:"/blog/tags",component:d("/blog/tags","287"),exact:!0},{path:"/blog/tags/anniversary",component:d("/blog/tags/anniversary","00b"),exact:!0},{path:"/blog/tags/benchmarks",component:d("/blog/tags/benchmarks","ae5"),exact:!0},{path:"/blog/tags/compression",component:d("/blog/tags/compression","5f1"),exact:!0},{path:"/blog/tags/discord",component:d("/blog/tags/discord","2ab"),exact:!0},{path:"/blog/tags/history",component:d("/blog/tags/history","f7a"),exact:!0},{path:"/blog/tags/image",component:d("/blog/tags/image","2b9"),exact:!0},{path:"/blog/tags/video",component:d("/blog/tags/video","d7a"),exact:!0},{path:"/blog/tags/web",component:d("/blog/tags/web","e61"),exact:!0},{path:"/markdown-page",component:d("/markdown-page","53a"),exact:!0},{path:"/search",component:d("/search","822"),exact:!0},{path:"/docs",component:d("/docs","171"),routes:[{path:"/docs",component:d("/docs","fda"),routes:[{path:"/docs",component:d("/docs","2b2"),routes:[{path:"/docs/audio/AAC",component:d("/docs/audio/AAC","cc0"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/audio/ALAC",component:d("/docs/audio/ALAC","88f"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/audio/Dolby",component:d("/docs/audio/Dolby","be7"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/audio/FLAC",component:d("/docs/audio/FLAC","68a"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/audio/intro",component:d("/docs/audio/intro","c71"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/audio/MP3",component:d("/docs/audio/MP3","8b0"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/audio/Opus",component:d("/docs/audio/Opus","ede"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/audio/Speex",component:d("/docs/audio/Speex","efd"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/audio/Vorbis",component:d("/docs/audio/Vorbis","e65"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/audio/WavPack",component:d("/docs/audio/WavPack","faf"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/colorimetry/format",component:d("/docs/colorimetry/format","f03"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/colorimetry/intro",component:d("/docs/colorimetry/intro","dc6"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/colorimetry/matrix",component:d("/docs/colorimetry/matrix","56d"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/colorimetry/primaries",component:d("/docs/colorimetry/primaries","0ce"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/colorimetry/range",component:d("/docs/colorimetry/range","be1"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/colorimetry/transfer",component:d("/docs/colorimetry/transfer","0ec"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/contribution-guide",component:d("/docs/contribution-guide","a83"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/data/7z",component:d("/docs/data/7z","663"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/data/brotli",component:d("/docs/data/brotli","f1e"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/data/bzip2",component:d("/docs/data/bzip2","aea"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/data/gzip",component:d("/docs/data/gzip","644"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/data/tar",component:d("/docs/data/tar","548"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/data/xz",component:d("/docs/data/xz","a88"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/data/zip",component:d("/docs/data/zip","2e5"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/data/zpaq",component:d("/docs/data/zpaq","407"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/data/zstd",component:d("/docs/data/zstd","78a"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/encoders_hw/amf",component:d("/docs/encoders_hw/amf","504"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/encoders_hw/mediacodec",component:d("/docs/encoders_hw/mediacodec","e64"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/encoders_hw/nvenc",component:d("/docs/encoders_hw/nvenc","851"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/encoders_hw/qsv",component:d("/docs/encoders_hw/qsv","ce1"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/encoders_hw/videotoolbox",component:d("/docs/encoders_hw/videotoolbox","426"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/encoders/aom-av1-lavish",component:d("/docs/encoders/aom-av1-lavish","14a"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/encoders/aom-psy101",component:d("/docs/encoders/aom-psy101","274"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/encoders/aomenc",component:d("/docs/encoders/aomenc","3c9"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/encoders/Aurora1",component:d("/docs/encoders/Aurora1","96b"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/encoders/AVM",component:d("/docs/encoders/AVM","1b8"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/encoders/HM",component:d("/docs/encoders/HM","09e"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/encoders/JM",component:d("/docs/encoders/JM","26a"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/encoders/Kvazaar",component:d("/docs/encoders/Kvazaar","723"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/encoders/rav1e",component:d("/docs/encoders/rav1e","8de"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/encoders/SVT-AV1",component:d("/docs/encoders/SVT-AV1","c47"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/encoders/SVT-AV1-PSY",component:d("/docs/encoders/SVT-AV1-PSY","673"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/encoders/SVT-HEVC",component:d("/docs/encoders/SVT-HEVC","d5b"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/encoders/SVT-VP9",component:d("/docs/encoders/SVT-VP9","952"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/encoders/uavs3e",component:d("/docs/encoders/uavs3e","8de"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/encoders/uvg266",component:d("/docs/encoders/uvg266","d2d"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/encoders/vpxenc",component:d("/docs/encoders/vpxenc","9fa"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/encoders/VTM",component:d("/docs/encoders/VTM","e57"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/encoders/VVenC",component:d("/docs/encoders/VVenC","469"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/encoders/x264",component:d("/docs/encoders/x264","26c"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/encoders/x265",component:d("/docs/encoders/x265","fb3"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/encoders/x266",component:d("/docs/encoders/x266","74f"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/FAQ",component:d("/docs/FAQ","5ed"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/filtering/antialiasing",component:d("/docs/filtering/antialiasing","118"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/filtering/basics",component:d("/docs/filtering/basics","c1f"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/filtering/deband",component:d("/docs/filtering/deband","2ca"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/filtering/decombing",component:d("/docs/filtering/decombing","08e"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/filtering/dehalo",component:d("/docs/filtering/dehalo","c4e"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/filtering/deinterlace",component:d("/docs/filtering/deinterlace","62f"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/filtering/denoise",component:d("/docs/filtering/denoise","129"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/filtering/graining",component:d("/docs/filtering/graining","e7d"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/filtering/ivtc",component:d("/docs/filtering/ivtc","d1b"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/filtering/stabilizing",component:d("/docs/filtering/stabilizing","d74"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/filtering/vapoursynth",component:d("/docs/filtering/vapoursynth","42f"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/images/AVIF",component:d("/docs/images/AVIF","371"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/images/GIF",component:d("/docs/images/GIF","677"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/images/HEIC",component:d("/docs/images/HEIC","70b"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/images/JPEG",component:d("/docs/images/JPEG","7f9"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/images/JPEG2000",component:d("/docs/images/JPEG2000","3f4"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/images/JXL",component:d("/docs/images/JXL","abb"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/images/PNG",component:d("/docs/images/PNG","9b0"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/images/QOI",component:d("/docs/images/QOI","c2e"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/images/WebP",component:d("/docs/images/WebP","b27"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/introduction/high-dynamic-range",component:d("/docs/introduction/high-dynamic-range","7e1"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/introduction/lossless",component:d("/docs/introduction/lossless","417"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/introduction/lossy",component:d("/docs/introduction/lossy","aeb"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/introduction/prologue",component:d("/docs/introduction/prologue","b4e"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/introduction/psychovisual",component:d("/docs/introduction/psychovisual","539"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/introduction/terminology",component:d("/docs/introduction/terminology","041"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/introduction/video-artifacts",component:d("/docs/introduction/video-artifacts","0af"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/metrics/butteraugli",component:d("/docs/metrics/butteraugli","a60"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/metrics/PSNR",component:d("/docs/metrics/PSNR","1e4"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/metrics/SSIM",component:d("/docs/metrics/SSIM","1ea"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/metrics/SSIMULACRA2",component:d("/docs/metrics/SSIMULACRA2","a14"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/metrics/VMAF",component:d("/docs/metrics/VMAF","62e"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/metrics/XPSNR",component:d("/docs/metrics/XPSNR","646"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/privacy-policy",component:d("/docs/privacy-policy","923"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/resources",component:d("/docs/resources","0e5"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/subtitles/SRT",component:d("/docs/subtitles/SRT","af2"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/subtitles/SSA",component:d("/docs/subtitles/SSA","c6a"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/subtitles/webvtt",component:d("/docs/subtitles/webvtt","d8f"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/terms-of-use",component:d("/docs/terms-of-use","70c"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/utilities/autocompressor",component:d("/docs/utilities/autocompressor","43c"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/utilities/av1an",component:d("/docs/utilities/av1an","53c"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/utilities/av1an-command-gen",component:d("/docs/utilities/av1an-command-gen","f4e"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/utilities/Aviator",component:d("/docs/utilities/Aviator","b18"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/utilities/Discord",component:d("/docs/utilities/Discord","849"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/utilities/dovi_tool",component:d("/docs/utilities/dovi_tool","6fd"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/utilities/eac3to",component:d("/docs/utilities/eac3to","fde"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/utilities/FFMetrics",component:d("/docs/utilities/FFMetrics","bb5"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/utilities/ffmpeg",component:d("/docs/utilities/ffmpeg","07b"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/utilities/hdr10plus_tool",component:d("/docs/utilities/hdr10plus_tool","d8d"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/utilities/MKVToolNix",component:d("/docs/utilities/MKVToolNix","2d7"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/utilities/mp4box",component:d("/docs/utilities/mp4box","d04"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/utilities/nmkoder",component:d("/docs/utilities/nmkoder","a80"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/utilities/rAV1ator",component:d("/docs/utilities/rAV1ator","88b"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/utilities/rav1ator-cli",component:d("/docs/utilities/rav1ator-cli","930"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/utilities/YUView",component:d("/docs/utilities/YUView","017"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/video-players",component:d("/docs/video-players","870"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/video/AV1",component:d("/docs/video/AV1","28f"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/video/AVC",component:d("/docs/video/AVC","e47"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/video/AVS3",component:d("/docs/video/AVS3","42e"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/video/ECM",component:d("/docs/video/ECM","568"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/video/FFV1",component:d("/docs/video/FFV1","ec1"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/video/HEVC",component:d("/docs/video/HEVC","df9"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/video/prores",component:d("/docs/video/prores","770"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/video/Theora",component:d("/docs/video/Theora","4cf"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/video/utvideo",component:d("/docs/video/utvideo","9f1"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/video/VC-1",component:d("/docs/video/VC-1","d82"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/video/VP8",component:d("/docs/video/VP8","88c"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/video/VP9",component:d("/docs/video/VP9","dc7"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/video/VVC",component:d("/docs/video/VVC","1f7"),exact:!0,sidebar:"tutorialSidebar"}]}]}]},{path:"/",component:d("/","2e1"),exact:!0},{path:"*",component:d("*")}]},6125:(e,t,n)=>{"use strict";n.d(t,{o:()=>a,x:()=>i});var r=n(6540),o=n(4848);const a=r.createContext(!1);function i(e){let{children:t}=e;const[n,i]=(0,r.useState)(!1);return(0,r.useEffect)((()=>{i(!0)}),[]),(0,o.jsx)(a.Provider,{value:n,children:t})}},7815:(e,t,n)=>{"use strict";var r=n(6540),o=n(5338),a=n(545),i=n(4625),s=n(4784),l=n(8193);const c=[n(119),n(6134),n(6294),n(1043),n(8015)];var u=n(8328),d=n(6347),p=n(2831),f=n(4848);function h(e){let{children:t}=e;return(0,f.jsx)(f.Fragment,{children:t})}var m=n(5260),g=n(4586),b=n(6025),y=n(6342),v=n(1213),x=n(2131),w=n(4090);const S="default";var k=n(440),_=n(1463);function E(){const{i18n:{currentLocale:e,defaultLocale:t,localeConfigs:n}}=(0,g.A)(),r=(0,x.o)(),o=n[e].htmlLang,a=e=>e.replace("-","_");return(0,f.jsxs)(m.A,{children:[Object.entries(n).map((e=>{let[t,{htmlLang:n}]=e;return(0,f.jsx)("link",{rel:"alternate",href:r.createUrl({locale:t,fullyQualified:!0}),hrefLang:n},t)})),(0,f.jsx)("link",{rel:"alternate",href:r.createUrl({locale:t,fullyQualified:!0}),hrefLang:"x-default"}),(0,f.jsx)("meta",{property:"og:locale",content:a(o)}),Object.values(n).filter((e=>o!==e.htmlLang)).map((e=>(0,f.jsx)("meta",{property:"og:locale:alternate",content:a(e.htmlLang)},`meta-og-${e.htmlLang}`)))]})}function C(e){let{permalink:t}=e;const{siteConfig:{url:n}}=(0,g.A)(),r=function(){const{siteConfig:{url:e,baseUrl:t,trailingSlash:n}}=(0,g.A)(),{pathname:r}=(0,d.zy)();return e+(0,k.Ks)((0,b.Ay)(r),{trailingSlash:n,baseUrl:t})}(),o=t?`${n}${t}`:r;return(0,f.jsxs)(m.A,{children:[(0,f.jsx)("meta",{property:"og:url",content:o}),(0,f.jsx)("link",{rel:"canonical",href:o})]})}function A(){const{i18n:{currentLocale:e}}=(0,g.A)(),{metadata:t,image:n}=(0,y.p)();return(0,f.jsxs)(f.Fragment,{children:[(0,f.jsxs)(m.A,{children:[(0,f.jsx)("meta",{name:"twitter:card",content:"summary_large_image"}),(0,f.jsx)("body",{className:w.w})]}),n&&(0,f.jsx)(v.be,{image:n}),(0,f.jsx)(C,{}),(0,f.jsx)(E,{}),(0,f.jsx)(_.A,{tag:S,locale:e}),(0,f.jsx)(m.A,{children:t.map(((e,t)=>(0,f.jsx)("meta",{...e},t)))})]})}const T=new Map;var P=n(6125),L=n(6988),O=n(205);function N(e){for(var t=arguments.length,n=new Array(t>1?t-1:0),r=1;r{const r=t.default?.[e]??t[e];return r?.(...n)}));return()=>o.forEach((e=>e?.()))}const j=function(e){let{children:t,location:n,previousLocation:r}=e;return(0,O.A)((()=>{r!==n&&(!function(e){let{location:t,previousLocation:n}=e;if(!n)return;const r=t.pathname===n.pathname,o=t.hash===n.hash,a=t.search===n.search;if(r&&o&&!a)return;const{hash:i}=t;if(i){const e=decodeURIComponent(i.substring(1)),t=document.getElementById(e);t?.scrollIntoView()}else window.scrollTo(0,0)}({location:n,previousLocation:r}),N("onRouteDidUpdate",{previousLocation:r,location:n}))}),[r,n]),t};function R(e){const t=Array.from(new Set([e,decodeURI(e)])).map((e=>(0,p.u)(u.A,e))).flat();return Promise.all(t.map((e=>e.route.component.preload?.())))}class I extends r.Component{previousLocation;routeUpdateCleanupCb;constructor(e){super(e),this.previousLocation=null,this.routeUpdateCleanupCb=l.A.canUseDOM?N("onRouteUpdate",{previousLocation:null,location:this.props.location}):()=>{},this.state={nextRouteHasLoaded:!0}}shouldComponentUpdate(e,t){if(e.location===this.props.location)return t.nextRouteHasLoaded;const n=e.location;return this.previousLocation=this.props.location,this.setState({nextRouteHasLoaded:!1}),this.routeUpdateCleanupCb=N("onRouteUpdate",{previousLocation:this.previousLocation,location:n}),R(n.pathname).then((()=>{this.routeUpdateCleanupCb(),this.setState({nextRouteHasLoaded:!0})})).catch((e=>{console.warn(e),window.location.reload()})),!1}render(){const{children:e,location:t}=this.props;return(0,f.jsx)(j,{previousLocation:this.previousLocation,location:t,children:(0,f.jsx)(d.qh,{location:t,render:()=>e})})}}const F=I,M="__docusaurus-base-url-issue-banner-container",z="__docusaurus-base-url-issue-banner",D="__docusaurus-base-url-issue-banner-suggestion-container";function B(e){return`\ndocument.addEventListener('DOMContentLoaded', function maybeInsertBanner() {\n var shouldInsert = typeof window['docusaurus'] === 'undefined';\n shouldInsert && insertBanner();\n});\n\nfunction insertBanner() {\n var bannerContainer = document.createElement('div');\n bannerContainer.id = '${M}';\n var bannerHtml = ${JSON.stringify(function(e){return`\n
\n

Your Docusaurus site did not load properly.

\n

A very common reason is a wrong site baseUrl configuration.

\n

Current configured baseUrl = ${e} ${"/"===e?" (default value)":""}

\n

We suggest trying baseUrl =

\n
\n`}(e)).replace(/{let{route:t}=e;return!0===t.exact})))return T.set(e.pathname,e.pathname),e;const t=e.pathname.trim().replace(/(?:\/index)?\.html$/,"")||"/";return T.set(e.pathname,t),{...e,pathname:t}}((0,d.zy)());return(0,f.jsx)(F,{location:e,children:G})}function Y(){return(0,f.jsx)(H.A,{children:(0,f.jsx)(L.l,{children:(0,f.jsxs)(P.x,{children:[(0,f.jsxs)(h,{children:[(0,f.jsx)(U,{}),(0,f.jsx)(A,{}),(0,f.jsx)(V,{}),(0,f.jsx)(q,{})]}),(0,f.jsx)(W,{})]})})})}var K=n(4054);const Z=function(e){try{return document.createElement("link").relList.supports(e)}catch{return!1}}("prefetch")?function(e){return new Promise(((t,n)=>{if("undefined"==typeof document)return void n();const r=document.createElement("link");r.setAttribute("rel","prefetch"),r.setAttribute("href",e),r.onload=()=>t(),r.onerror=()=>n();const o=document.getElementsByTagName("head")[0]??document.getElementsByName("script")[0]?.parentNode;o?.appendChild(r)}))}:function(e){return new Promise(((t,n)=>{const r=new XMLHttpRequest;r.open("GET",e,!0),r.withCredentials=!0,r.onload=()=>{200===r.status?t():n()},r.send(null)}))};var X=n(6921);const J=new Set,ee=new Set,te=()=>navigator.connection?.effectiveType.includes("2g")||navigator.connection?.saveData,ne={prefetch:e=>{if(!(e=>!te()&&!ee.has(e)&&!J.has(e))(e))return!1;J.add(e);const t=(0,p.u)(u.A,e).flatMap((e=>{return t=e.route.path,Object.entries(K).filter((e=>{let[n]=e;return n.replace(/-[^-]+$/,"")===t})).flatMap((e=>{let[,t]=e;return Object.values((0,X.A)(t))}));var t}));return Promise.all(t.map((e=>{const t=n.gca(e);return t&&!t.includes("undefined")?Z(t).catch((()=>{})):Promise.resolve()})))},preload:e=>!!(e=>!te()&&!ee.has(e))(e)&&(ee.add(e),R(e))},re=Object.freeze(ne);function oe(e){let{children:t}=e;return"hash"===s.default.future.experimental_router?(0,f.jsx)(i.I9,{children:t}):(0,f.jsx)(i.Kd,{children:t})}const ae=Boolean(!0);if(l.A.canUseDOM){window.docusaurus=re;const e=document.getElementById("__docusaurus"),t=(0,f.jsx)(a.vd,{children:(0,f.jsx)(oe,{children:(0,f.jsx)(Y,{})})}),n=(e,t)=>{console.error("Docusaurus React Root onRecoverableError:",e,t)},i=()=>{if(window.docusaurusRoot)window.docusaurusRoot.render(t);else if(ae)window.docusaurusRoot=o.hydrateRoot(e,t,{onRecoverableError:n});else{const r=o.createRoot(e,{onRecoverableError:n});r.render(t),window.docusaurusRoot=r}};R(window.location.pathname).then((()=>{(0,r.startTransition)(i)}))}},6988:(e,t,n)=>{"use strict";n.d(t,{o:()=>d,l:()=>p});var r=n(6540),o=n(4784);const a=JSON.parse('{"docusaurus-plugin-content-docs":{"default":{"path":"/docs","versions":[{"name":"current","label":"Next","isLast":true,"path":"/docs","mainDocId":"introduction/prologue","docs":[{"id":"audio/AAC","path":"/docs/audio/AAC","sidebar":"tutorialSidebar"},{"id":"audio/ALAC","path":"/docs/audio/ALAC","sidebar":"tutorialSidebar"},{"id":"audio/Dolby","path":"/docs/audio/Dolby","sidebar":"tutorialSidebar"},{"id":"audio/FLAC","path":"/docs/audio/FLAC","sidebar":"tutorialSidebar"},{"id":"audio/intro","path":"/docs/audio/intro","sidebar":"tutorialSidebar"},{"id":"audio/MP3","path":"/docs/audio/MP3","sidebar":"tutorialSidebar"},{"id":"audio/Opus","path":"/docs/audio/Opus","sidebar":"tutorialSidebar"},{"id":"audio/Speex","path":"/docs/audio/Speex","sidebar":"tutorialSidebar"},{"id":"audio/Vorbis","path":"/docs/audio/Vorbis","sidebar":"tutorialSidebar"},{"id":"audio/WavPack","path":"/docs/audio/WavPack","sidebar":"tutorialSidebar"},{"id":"colorimetry/format","path":"/docs/colorimetry/format","sidebar":"tutorialSidebar"},{"id":"colorimetry/intro","path":"/docs/colorimetry/intro","sidebar":"tutorialSidebar"},{"id":"colorimetry/matrix","path":"/docs/colorimetry/matrix","sidebar":"tutorialSidebar"},{"id":"colorimetry/primaries","path":"/docs/colorimetry/primaries","sidebar":"tutorialSidebar"},{"id":"colorimetry/range","path":"/docs/colorimetry/range","sidebar":"tutorialSidebar"},{"id":"colorimetry/transfer","path":"/docs/colorimetry/transfer","sidebar":"tutorialSidebar"},{"id":"contribution-guide","path":"/docs/contribution-guide","sidebar":"tutorialSidebar"},{"id":"data/7z","path":"/docs/data/7z","sidebar":"tutorialSidebar"},{"id":"data/brotli","path":"/docs/data/brotli","sidebar":"tutorialSidebar"},{"id":"data/bzip2","path":"/docs/data/bzip2","sidebar":"tutorialSidebar"},{"id":"data/gzip","path":"/docs/data/gzip","sidebar":"tutorialSidebar"},{"id":"data/tar","path":"/docs/data/tar","sidebar":"tutorialSidebar"},{"id":"data/xz","path":"/docs/data/xz","sidebar":"tutorialSidebar"},{"id":"data/zip","path":"/docs/data/zip","sidebar":"tutorialSidebar"},{"id":"data/zpaq","path":"/docs/data/zpaq","sidebar":"tutorialSidebar"},{"id":"data/zstd","path":"/docs/data/zstd","sidebar":"tutorialSidebar"},{"id":"encoders_hw/amf","path":"/docs/encoders_hw/amf","sidebar":"tutorialSidebar"},{"id":"encoders_hw/mediacodec","path":"/docs/encoders_hw/mediacodec","sidebar":"tutorialSidebar"},{"id":"encoders_hw/nvenc","path":"/docs/encoders_hw/nvenc","sidebar":"tutorialSidebar"},{"id":"encoders_hw/qsv","path":"/docs/encoders_hw/qsv","sidebar":"tutorialSidebar"},{"id":"encoders_hw/videotoolbox","path":"/docs/encoders_hw/videotoolbox","sidebar":"tutorialSidebar"},{"id":"encoders/aom-av1-lavish","path":"/docs/encoders/aom-av1-lavish","sidebar":"tutorialSidebar"},{"id":"encoders/aom-psy101","path":"/docs/encoders/aom-psy101","sidebar":"tutorialSidebar"},{"id":"encoders/aomenc","path":"/docs/encoders/aomenc","sidebar":"tutorialSidebar"},{"id":"encoders/Aurora1","path":"/docs/encoders/Aurora1","sidebar":"tutorialSidebar"},{"id":"encoders/AVM","path":"/docs/encoders/AVM","sidebar":"tutorialSidebar"},{"id":"encoders/HM","path":"/docs/encoders/HM","sidebar":"tutorialSidebar"},{"id":"encoders/JM","path":"/docs/encoders/JM","sidebar":"tutorialSidebar"},{"id":"encoders/Kvazaar","path":"/docs/encoders/Kvazaar","sidebar":"tutorialSidebar"},{"id":"encoders/rav1e","path":"/docs/encoders/rav1e","sidebar":"tutorialSidebar"},{"id":"encoders/SVT-AV1","path":"/docs/encoders/SVT-AV1","sidebar":"tutorialSidebar"},{"id":"encoders/SVT-AV1-PSY","path":"/docs/encoders/SVT-AV1-PSY","sidebar":"tutorialSidebar"},{"id":"encoders/SVT-HEVC","path":"/docs/encoders/SVT-HEVC","sidebar":"tutorialSidebar"},{"id":"encoders/SVT-VP9","path":"/docs/encoders/SVT-VP9","sidebar":"tutorialSidebar"},{"id":"encoders/uavs3e","path":"/docs/encoders/uavs3e","sidebar":"tutorialSidebar"},{"id":"encoders/uvg266","path":"/docs/encoders/uvg266","sidebar":"tutorialSidebar"},{"id":"encoders/vpxenc","path":"/docs/encoders/vpxenc","sidebar":"tutorialSidebar"},{"id":"encoders/VTM","path":"/docs/encoders/VTM","sidebar":"tutorialSidebar"},{"id":"encoders/VVenC","path":"/docs/encoders/VVenC","sidebar":"tutorialSidebar"},{"id":"encoders/x264","path":"/docs/encoders/x264","sidebar":"tutorialSidebar"},{"id":"encoders/x265","path":"/docs/encoders/x265","sidebar":"tutorialSidebar"},{"id":"encoders/x266","path":"/docs/encoders/x266","sidebar":"tutorialSidebar"},{"id":"FAQ","path":"/docs/FAQ","sidebar":"tutorialSidebar"},{"id":"filtering/antialiasing","path":"/docs/filtering/antialiasing","sidebar":"tutorialSidebar"},{"id":"filtering/basics","path":"/docs/filtering/basics","sidebar":"tutorialSidebar"},{"id":"filtering/deband","path":"/docs/filtering/deband","sidebar":"tutorialSidebar"},{"id":"filtering/decombing","path":"/docs/filtering/decombing","sidebar":"tutorialSidebar"},{"id":"filtering/dehalo","path":"/docs/filtering/dehalo","sidebar":"tutorialSidebar"},{"id":"filtering/deinterlace","path":"/docs/filtering/deinterlace","sidebar":"tutorialSidebar"},{"id":"filtering/denoise","path":"/docs/filtering/denoise","sidebar":"tutorialSidebar"},{"id":"filtering/graining","path":"/docs/filtering/graining","sidebar":"tutorialSidebar"},{"id":"filtering/ivtc","path":"/docs/filtering/ivtc","sidebar":"tutorialSidebar"},{"id":"filtering/stabilizing","path":"/docs/filtering/stabilizing","sidebar":"tutorialSidebar"},{"id":"filtering/vapoursynth","path":"/docs/filtering/vapoursynth","sidebar":"tutorialSidebar"},{"id":"images/AVIF","path":"/docs/images/AVIF","sidebar":"tutorialSidebar"},{"id":"images/GIF","path":"/docs/images/GIF","sidebar":"tutorialSidebar"},{"id":"images/HEIC","path":"/docs/images/HEIC","sidebar":"tutorialSidebar"},{"id":"images/JPEG","path":"/docs/images/JPEG","sidebar":"tutorialSidebar"},{"id":"images/JPEG2000","path":"/docs/images/JPEG2000","sidebar":"tutorialSidebar"},{"id":"images/JXL","path":"/docs/images/JXL","sidebar":"tutorialSidebar"},{"id":"images/PNG","path":"/docs/images/PNG","sidebar":"tutorialSidebar"},{"id":"images/QOI","path":"/docs/images/QOI","sidebar":"tutorialSidebar"},{"id":"images/WebP","path":"/docs/images/WebP","sidebar":"tutorialSidebar"},{"id":"introduction/high-dynamic-range","path":"/docs/introduction/high-dynamic-range","sidebar":"tutorialSidebar"},{"id":"introduction/lossless","path":"/docs/introduction/lossless","sidebar":"tutorialSidebar"},{"id":"introduction/lossy","path":"/docs/introduction/lossy","sidebar":"tutorialSidebar"},{"id":"introduction/prologue","path":"/docs/introduction/prologue","sidebar":"tutorialSidebar"},{"id":"introduction/psychovisual","path":"/docs/introduction/psychovisual","sidebar":"tutorialSidebar"},{"id":"introduction/terminology","path":"/docs/introduction/terminology","sidebar":"tutorialSidebar"},{"id":"introduction/video-artifacts","path":"/docs/introduction/video-artifacts","sidebar":"tutorialSidebar"},{"id":"metrics/butteraugli","path":"/docs/metrics/butteraugli","sidebar":"tutorialSidebar"},{"id":"metrics/PSNR","path":"/docs/metrics/PSNR","sidebar":"tutorialSidebar"},{"id":"metrics/SSIM","path":"/docs/metrics/SSIM","sidebar":"tutorialSidebar"},{"id":"metrics/SSIMULACRA2","path":"/docs/metrics/SSIMULACRA2","sidebar":"tutorialSidebar"},{"id":"metrics/VMAF","path":"/docs/metrics/VMAF","sidebar":"tutorialSidebar"},{"id":"metrics/XPSNR","path":"/docs/metrics/XPSNR","sidebar":"tutorialSidebar"},{"id":"privacy-policy","path":"/docs/privacy-policy","sidebar":"tutorialSidebar"},{"id":"resources","path":"/docs/resources","sidebar":"tutorialSidebar"},{"id":"subtitles/SRT","path":"/docs/subtitles/SRT","sidebar":"tutorialSidebar"},{"id":"subtitles/SSA","path":"/docs/subtitles/SSA","sidebar":"tutorialSidebar"},{"id":"subtitles/webvtt","path":"/docs/subtitles/webvtt","sidebar":"tutorialSidebar"},{"id":"terms-of-use","path":"/docs/terms-of-use","sidebar":"tutorialSidebar"},{"id":"utilities/autocompressor","path":"/docs/utilities/autocompressor","sidebar":"tutorialSidebar"},{"id":"utilities/av1an","path":"/docs/utilities/av1an","sidebar":"tutorialSidebar"},{"id":"utilities/av1an-command-gen","path":"/docs/utilities/av1an-command-gen","sidebar":"tutorialSidebar"},{"id":"utilities/Aviator","path":"/docs/utilities/Aviator","sidebar":"tutorialSidebar"},{"id":"utilities/Discord","path":"/docs/utilities/Discord","sidebar":"tutorialSidebar"},{"id":"utilities/dovi_tool","path":"/docs/utilities/dovi_tool","sidebar":"tutorialSidebar"},{"id":"utilities/eac3to","path":"/docs/utilities/eac3to","sidebar":"tutorialSidebar"},{"id":"utilities/FFMetrics","path":"/docs/utilities/FFMetrics","sidebar":"tutorialSidebar"},{"id":"utilities/ffmpeg","path":"/docs/utilities/ffmpeg","sidebar":"tutorialSidebar"},{"id":"utilities/hdr10plus_tool","path":"/docs/utilities/hdr10plus_tool","sidebar":"tutorialSidebar"},{"id":"utilities/MKVToolNix","path":"/docs/utilities/MKVToolNix","sidebar":"tutorialSidebar"},{"id":"utilities/mp4box","path":"/docs/utilities/mp4box","sidebar":"tutorialSidebar"},{"id":"utilities/nmkoder","path":"/docs/utilities/nmkoder","sidebar":"tutorialSidebar"},{"id":"utilities/rAV1ator","path":"/docs/utilities/rAV1ator","sidebar":"tutorialSidebar"},{"id":"utilities/rav1ator-cli","path":"/docs/utilities/rav1ator-cli","sidebar":"tutorialSidebar"},{"id":"utilities/YUView","path":"/docs/utilities/YUView","sidebar":"tutorialSidebar"},{"id":"video-players","path":"/docs/video-players","sidebar":"tutorialSidebar"},{"id":"video/AV1","path":"/docs/video/AV1","sidebar":"tutorialSidebar"},{"id":"video/AVC","path":"/docs/video/AVC","sidebar":"tutorialSidebar"},{"id":"video/AVS3","path":"/docs/video/AVS3","sidebar":"tutorialSidebar"},{"id":"video/ECM","path":"/docs/video/ECM","sidebar":"tutorialSidebar"},{"id":"video/FFV1","path":"/docs/video/FFV1","sidebar":"tutorialSidebar"},{"id":"video/HEVC","path":"/docs/video/HEVC","sidebar":"tutorialSidebar"},{"id":"video/prores","path":"/docs/video/prores","sidebar":"tutorialSidebar"},{"id":"video/Theora","path":"/docs/video/Theora","sidebar":"tutorialSidebar"},{"id":"video/utvideo","path":"/docs/video/utvideo","sidebar":"tutorialSidebar"},{"id":"video/VC-1","path":"/docs/video/VC-1","sidebar":"tutorialSidebar"},{"id":"video/VP8","path":"/docs/video/VP8","sidebar":"tutorialSidebar"},{"id":"video/VP9","path":"/docs/video/VP9","sidebar":"tutorialSidebar"},{"id":"video/VVC","path":"/docs/video/VVC","sidebar":"tutorialSidebar"}],"draftIds":[],"sidebars":{"tutorialSidebar":{"link":{"path":"/docs/introduction/prologue","label":"introduction/prologue"}}}}],"breadcrumbs":true}}}'),i=JSON.parse('{"defaultLocale":"en","locales":["en"],"path":"i18n","currentLocale":"en","localeConfigs":{"en":{"label":"English","direction":"ltr","htmlLang":"en","calendar":"gregory","path":"en"}}}');var s=n(2654);const l=JSON.parse('{"docusaurusVersion":"3.5.2","siteVersion":"0.1.0","pluginVersions":{"docusaurus-plugin-content-docs":{"type":"package","name":"@docusaurus/plugin-content-docs","version":"3.5.2"},"docusaurus-plugin-content-blog":{"type":"package","name":"@docusaurus/plugin-content-blog","version":"3.5.2"},"docusaurus-plugin-content-pages":{"type":"package","name":"@docusaurus/plugin-content-pages","version":"3.5.2"},"docusaurus-plugin-sitemap":{"type":"package","name":"@docusaurus/plugin-sitemap","version":"3.5.2"},"docusaurus-theme-classic":{"type":"package","name":"@docusaurus/theme-classic","version":"3.5.2"},"docusaurus-plugin-image-zoom":{"type":"package","name":"plugin-image-zoom","version":"1.2.0"},"@easyops-cn/docusaurus-search-local":{"type":"package","name":"@easyops-cn/docusaurus-search-local","version":"0.40.1"}}}');var c=n(4848);const u={siteConfig:o.default,siteMetadata:l,globalData:a,i18n:i,codeTranslations:s},d=r.createContext(u);function p(e){let{children:t}=e;return(0,c.jsx)(d.Provider,{value:u,children:t})}},7489:(e,t,n)=>{"use strict";n.d(t,{A:()=>m});var r=n(6540),o=n(8193),a=n(5260),i=n(440),s=n(263),l=n(3102),c=n(4848);function u(e){let{error:t,tryAgain:n}=e;return(0,c.jsxs)("div",{style:{display:"flex",flexDirection:"column",justifyContent:"center",alignItems:"flex-start",minHeight:"100vh",width:"100%",maxWidth:"80ch",fontSize:"20px",margin:"0 auto",padding:"1rem"},children:[(0,c.jsx)("h1",{style:{fontSize:"3rem"},children:"This page crashed"}),(0,c.jsx)("button",{type:"button",onClick:n,style:{margin:"1rem 0",fontSize:"2rem",cursor:"pointer",borderRadius:20,padding:"1rem"},children:"Try again"}),(0,c.jsx)(d,{error:t})]})}function d(e){let{error:t}=e;const n=(0,i.rA)(t).map((e=>e.message)).join("\n\nCause:\n");return(0,c.jsx)("p",{style:{whiteSpace:"pre-wrap"},children:n})}function p(e){let{children:t}=e;return(0,c.jsx)(l.W,{value:{plugin:{name:"docusaurus-core-error-boundary",id:"default"}},children:t})}function f(e){let{error:t,tryAgain:n}=e;return(0,c.jsx)(p,{children:(0,c.jsxs)(m,{fallback:()=>(0,c.jsx)(u,{error:t,tryAgain:n}),children:[(0,c.jsx)(a.A,{children:(0,c.jsx)("title",{children:"Page Error"})}),(0,c.jsx)(s.A,{children:(0,c.jsx)(u,{error:t,tryAgain:n})})]})})}const h=e=>(0,c.jsx)(f,{...e});class m extends r.Component{constructor(e){super(e),this.state={error:null}}componentDidCatch(e){o.A.canUseDOM&&this.setState({error:e})}render(){const{children:e}=this.props,{error:t}=this.state;if(t){const e={error:t,tryAgain:()=>this.setState({error:null})};return(this.props.fallback??h)(e)}return e??null}}},8193:(e,t,n)=>{"use strict";n.d(t,{A:()=>o});const r="undefined"!=typeof window&&"document"in window&&"createElement"in window.document,o={canUseDOM:r,canUseEventListeners:r&&("addEventListener"in window||"attachEvent"in window),canUseIntersectionObserver:r&&"IntersectionObserver"in window,canUseViewport:r&&"screen"in window}},5260:(e,t,n)=>{"use strict";n.d(t,{A:()=>a});n(6540);var r=n(545),o=n(4848);function a(e){return(0,o.jsx)(r.mg,{...e})}},8774:(e,t,n)=>{"use strict";n.d(t,{A:()=>f});var r=n(6540),o=n(4625),a=n(440),i=n(4586),s=n(6654),l=n(8193),c=n(3427),u=n(6025),d=n(4848);function p(e,t){let{isNavLink:n,to:p,href:f,activeClassName:h,isActive:m,"data-noBrokenLinkCheck":g,autoAddBaseUrl:b=!0,...y}=e;const{siteConfig:v}=(0,i.A)(),{trailingSlash:x,baseUrl:w}=v,S=v.future.experimental_router,{withBaseUrl:k}=(0,u.hH)(),_=(0,c.A)(),E=(0,r.useRef)(null);(0,r.useImperativeHandle)(t,(()=>E.current));const C=p||f;const A=(0,s.A)(C),T=C?.replace("pathname://","");let P=void 0!==T?(L=T,b&&(e=>e.startsWith("/"))(L)?k(L):L):void 0;var L;"hash"===S&&P?.startsWith("./")&&(P=P?.slice(1)),P&&A&&(P=(0,a.Ks)(P,{trailingSlash:x,baseUrl:w}));const O=(0,r.useRef)(!1),N=n?o.k2:o.N_,j=l.A.canUseIntersectionObserver,R=(0,r.useRef)(),I=()=>{O.current||null==P||(window.docusaurus.preload(P),O.current=!0)};(0,r.useEffect)((()=>(!j&&A&&l.A.canUseDOM&&null!=P&&window.docusaurus.prefetch(P),()=>{j&&R.current&&R.current.disconnect()})),[R,P,j,A]);const F=P?.startsWith("#")??!1,M=!y.target||"_self"===y.target,z=!P||!A||!M||F&&"hash"!==S;g||!F&&z||_.collectLink(P),y.id&&_.collectAnchor(y.id);const D={};return z?(0,d.jsx)("a",{ref:E,href:P,...C&&!A&&{target:"_blank",rel:"noopener noreferrer"},...y,...D}):(0,d.jsx)(N,{...y,onMouseEnter:I,onTouchStart:I,innerRef:e=>{E.current=e,j&&e&&A&&(R.current=new window.IntersectionObserver((t=>{t.forEach((t=>{e===t.target&&(t.isIntersecting||t.intersectionRatio>0)&&(R.current.unobserve(e),R.current.disconnect(),null!=P&&window.docusaurus.prefetch(P))}))})),R.current.observe(e))},to:P,...n&&{isActive:m,activeClassName:h},...D})}const f=r.forwardRef(p)},1312:(e,t,n)=>{"use strict";n.d(t,{A:()=>c,T:()=>l});var r=n(6540),o=n(4848);function a(e,t){const n=e.split(/(\{\w+\})/).map(((e,n)=>{if(n%2==1){const n=t?.[e.slice(1,-1)];if(void 0!==n)return n}return e}));return n.some((e=>(0,r.isValidElement)(e)))?n.map(((e,t)=>(0,r.isValidElement)(e)?r.cloneElement(e,{key:t}):e)).filter((e=>""!==e)):n.join("")}var i=n(2654);function s(e){let{id:t,message:n}=e;if(void 0===t&&void 0===n)throw new Error("Docusaurus translation declarations must have at least a translation id or a default translation message");return i[t??n]??n??t}function l(e,t){let{message:n,id:r}=e;return a(s({message:n,id:r}),t)}function c(e){let{children:t,id:n,values:r}=e;if(t&&"string"!=typeof t)throw console.warn("Illegal children",t),new Error("The Docusaurus component only accept simple string values");const i=s({message:t,id:n});return(0,o.jsx)(o.Fragment,{children:a(i,r)})}},7065:(e,t,n)=>{"use strict";n.d(t,{W:()=>r});const r="default"},6654:(e,t,n)=>{"use strict";function r(e){return/^(?:\w*:|\/\/)/.test(e)}function o(e){return void 0!==e&&!r(e)}n.d(t,{A:()=>o,z:()=>r})},6025:(e,t,n)=>{"use strict";n.d(t,{Ay:()=>s,hH:()=>i});var r=n(6540),o=n(4586),a=n(6654);function i(){const{siteConfig:e}=(0,o.A)(),{baseUrl:t,url:n}=e,i=e.future.experimental_router,s=(0,r.useCallback)(((e,r)=>function(e){let{siteUrl:t,baseUrl:n,url:r,options:{forcePrependBaseUrl:o=!1,absolute:i=!1}={},router:s}=e;if(!r||r.startsWith("#")||(0,a.z)(r))return r;if("hash"===s)return r.startsWith("/")?`.${r}`:`./${r}`;if(o)return n+r.replace(/^\//,"");if(r===n.replace(/\/$/,""))return n;const l=r.startsWith(n)?r:n+r.replace(/^\//,"");return i?t+l:l}({siteUrl:n,baseUrl:t,url:e,options:r,router:i})),[n,t,i]);return{withBaseUrl:s}}function s(e,t){void 0===t&&(t={});const{withBaseUrl:n}=i();return n(e,t)}},3427:(e,t,n)=>{"use strict";n.d(t,{A:()=>i});var r=n(6540);n(4848);const o=r.createContext({collectAnchor:()=>{},collectLink:()=>{}}),a=()=>(0,r.useContext)(o);function i(){return a()}},4586:(e,t,n)=>{"use strict";n.d(t,{A:()=>a});var r=n(6540),o=n(6988);function a(){return(0,r.useContext)(o.o)}},6588:(e,t,n)=>{"use strict";n.d(t,{P_:()=>i,kh:()=>a});var r=n(4586),o=n(7065);function a(e,t){void 0===t&&(t={});const n=function(){const{globalData:e}=(0,r.A)();return e}()[e];if(!n&&t.failfast)throw new Error(`Docusaurus plugin global data not found for "${e}" plugin.`);return n}function i(e,t,n){void 0===t&&(t=o.W),void 0===n&&(n={});const r=a(e),i=r?.[t];if(!i&&n.failfast)throw new Error(`Docusaurus plugin global data not found for "${e}" plugin with id "${t}".`);return i}},2303:(e,t,n)=>{"use strict";n.d(t,{A:()=>a});var r=n(6540),o=n(6125);function a(){return(0,r.useContext)(o.o)}},205:(e,t,n)=>{"use strict";n.d(t,{A:()=>o});var r=n(6540);const o=n(8193).A.canUseDOM?r.useLayoutEffect:r.useEffect},6803:(e,t,n)=>{"use strict";n.d(t,{A:()=>a});var r=n(6540),o=n(3102);function a(){const e=r.useContext(o.o);if(!e)throw new Error("Unexpected: no Docusaurus route context found");return e}},6921:(e,t,n)=>{"use strict";n.d(t,{A:()=>o});const r=e=>"object"==typeof e&&!!e&&Object.keys(e).length>0;function o(e){const t={};return function e(n,o){Object.entries(n).forEach((n=>{let[a,i]=n;const s=o?`${o}.${a}`:a;r(i)?e(i,s):t[s]=i}))}(e),t}},3102:(e,t,n)=>{"use strict";n.d(t,{W:()=>i,o:()=>a});var r=n(6540),o=n(4848);const a=r.createContext(null);function i(e){let{children:t,value:n}=e;const i=r.useContext(a),s=(0,r.useMemo)((()=>function(e){let{parent:t,value:n}=e;if(!t){if(!n)throw new Error("Unexpected: no Docusaurus route context found");if(!("plugin"in n))throw new Error("Unexpected: Docusaurus topmost route context has no `plugin` attribute");return n}const r={...t.data,...n?.data};return{plugin:t.plugin,data:r}}({parent:i,value:n})),[i,n]);return(0,o.jsx)(a.Provider,{value:s,children:t})}},3886:(e,t,n)=>{"use strict";n.d(t,{VQ:()=>g,XK:()=>v,g1:()=>y});var r=n(6540),o=n(8295),a=n(7065),i=n(6342),s=n(679),l=n(9532),c=n(4848);const u=e=>`docs-preferred-version-${e}`,d={save:(e,t,n)=>{(0,s.Wf)(u(e),{persistence:t}).set(n)},read:(e,t)=>(0,s.Wf)(u(e),{persistence:t}).get(),clear:(e,t)=>{(0,s.Wf)(u(e),{persistence:t}).del()}},p=e=>Object.fromEntries(e.map((e=>[e,{preferredVersionName:null}])));const f=r.createContext(null);function h(){const e=(0,o.Gy)(),t=(0,i.p)().docs.versionPersistence,n=(0,r.useMemo)((()=>Object.keys(e)),[e]),[a,s]=(0,r.useState)((()=>p(n)));(0,r.useEffect)((()=>{s(function(e){let{pluginIds:t,versionPersistence:n,allDocsData:r}=e;function o(e){const t=d.read(e,n);return r[e].versions.some((e=>e.name===t))?{preferredVersionName:t}:(d.clear(e,n),{preferredVersionName:null})}return Object.fromEntries(t.map((e=>[e,o(e)])))}({allDocsData:e,versionPersistence:t,pluginIds:n}))}),[e,t,n]);return[a,(0,r.useMemo)((()=>({savePreferredVersion:function(e,n){d.save(e,t,n),s((t=>({...t,[e]:{preferredVersionName:n}})))}})),[t])]}function m(e){let{children:t}=e;const n=h();return(0,c.jsx)(f.Provider,{value:n,children:t})}function g(e){let{children:t}=e;return(0,c.jsx)(m,{children:t})}function b(){const e=(0,r.useContext)(f);if(!e)throw new l.dV("DocsPreferredVersionContextProvider");return e}function y(e){void 0===e&&(e=a.W);const t=(0,o.ht)(e),[n,i]=b(),{preferredVersionName:s}=n[e];return{preferredVersion:t.versions.find((e=>e.name===s))??null,savePreferredVersionName:(0,r.useCallback)((t=>{i.savePreferredVersion(e,t)}),[i,e])}}function v(){const e=(0,o.Gy)(),[t]=b();function n(n){const r=e[n],{preferredVersionName:o}=t[n];return r.versions.find((e=>e.name===o))??null}const r=Object.keys(e);return Object.fromEntries(r.map((e=>[e,n(e)])))}},2565:(e,t,n)=>{"use strict";n.d(t,{k:()=>a,v:()=>i});var r=n(8295),o=n(3886);function a(e,t){return`docs-${e}-${t}`}function i(){const e=(0,r.Gy)(),t=(0,r.gk)(),n=(0,o.XK)();return[...Object.keys(e).map((function(r){const o=t?.activePlugin.pluginId===r?t.activeVersion:void 0,i=n[r],s=e[r].versions.find((e=>e.isLast));return a(r,(o??i??s).name)}))]}},609:(e,t,n)=>{"use strict";n.d(t,{V:()=>l,t:()=>c});var r=n(6540),o=n(9532),a=n(4848);const i=Symbol("EmptyContext"),s=r.createContext(i);function l(e){let{children:t,name:n,items:o}=e;const i=(0,r.useMemo)((()=>n&&o?{name:n,items:o}:null),[n,o]);return(0,a.jsx)(s.Provider,{value:i,children:t})}function c(){const e=(0,r.useContext)(s);if(e===i)throw new o.dV("DocsSidebarProvider");return e}},6972:(e,t,n)=>{"use strict";n.d(t,{$S:()=>f,B5:()=>_,Nr:()=>p,OF:()=>x,QB:()=>k,Vd:()=>w,Y:()=>y,d1:()=>E,fW:()=>S,w8:()=>g});var r=n(6540),o=n(6347),a=n(2831),i=n(8295),s=n(9169),l=n(1682),c=n(3886),u=n(3025),d=n(609);function p(e){return"link"!==e.type||e.unlisted?"category"===e.type?function(e){if(e.href&&!e.linkUnlisted)return e.href;for(const t of e.items){const e=p(t);if(e)return e}}(e):void 0:e.href}function f(){const{pathname:e}=(0,o.zy)(),t=(0,d.t)();if(!t)throw new Error("Unexpected: cant find current sidebar in context");const n=v({sidebarItems:t.items,pathname:e,onlyCategories:!0}).slice(-1)[0];if(!n)throw new Error(`${e} is not associated with a category. useCurrentSidebarCategory() should only be used on category index pages.`);return n}const h=(e,t)=>void 0!==e&&(0,s.ys)(e,t),m=(e,t)=>e.some((e=>g(e,t)));function g(e,t){return"link"===e.type?h(e.href,t):"category"===e.type&&(h(e.href,t)||m(e.items,t))}function b(e,t){switch(e.type){case"category":return g(e,t)||e.items.some((e=>b(e,t)));case"link":return!e.unlisted||g(e,t);default:return!0}}function y(e,t){return(0,r.useMemo)((()=>e.filter((e=>b(e,t)))),[e,t])}function v(e){let{sidebarItems:t,pathname:n,onlyCategories:r=!1}=e;const o=[];return function e(t){for(const a of t)if("category"===a.type&&((0,s.ys)(a.href,n)||e(a.items))||"link"===a.type&&(0,s.ys)(a.href,n)){return r&&"category"!==a.type||o.unshift(a),!0}return!1}(t),o}function x(){const e=(0,d.t)(),{pathname:t}=(0,o.zy)(),n=(0,i.vT)()?.pluginData.breadcrumbs;return!1!==n&&e?v({sidebarItems:e.items,pathname:t}):null}function w(e){const{activeVersion:t}=(0,i.zK)(e),{preferredVersion:n}=(0,c.g1)(e),o=(0,i.r7)(e);return(0,r.useMemo)((()=>(0,l.sb)([t,n,o].filter(Boolean))),[t,n,o])}function S(e,t){const n=w(t);return(0,r.useMemo)((()=>{const t=n.flatMap((e=>e.sidebars?Object.entries(e.sidebars):[])),r=t.find((t=>t[0]===e));if(!r)throw new Error(`Can't find any sidebar with id "${e}" in version${n.length>1?"s":""} ${n.map((e=>e.name)).join(", ")}".\nAvailable sidebar ids are:\n- ${t.map((e=>e[0])).join("\n- ")}`);return r[1]}),[e,n])}function k(e,t){const n=w(t);return(0,r.useMemo)((()=>{const t=n.flatMap((e=>e.docs)),r=t.find((t=>t.id===e));if(!r){if(n.flatMap((e=>e.draftIds)).includes(e))return null;throw new Error(`Couldn't find any doc with id "${e}" in version${n.length>1?"s":""} "${n.map((e=>e.name)).join(", ")}".\nAvailable doc ids are:\n- ${(0,l.sb)(t.map((e=>e.id))).join("\n- ")}`)}return r}),[e,n])}function _(e){let{route:t}=e;const n=(0,o.zy)(),r=(0,u.r)(),i=t.routes,s=i.find((e=>(0,o.B6)(n.pathname,e)));if(!s)return null;const l=s.sidebar,c=l?r.docsSidebars[l]:void 0;return{docElement:(0,a.v)(i),sidebarName:l,sidebarItems:c}}function E(e){return e.filter((e=>!("category"===e.type||"link"===e.type)||!!p(e)))}},3025:(e,t,n)=>{"use strict";n.d(t,{n:()=>s,r:()=>l});var r=n(6540),o=n(9532),a=n(4848);const i=r.createContext(null);function s(e){let{children:t,version:n}=e;return(0,a.jsx)(i.Provider,{value:n,children:t})}function l(){const e=(0,r.useContext)(i);if(null===e)throw new o.dV("DocsVersionProvider");return e}},8295:(e,t,n)=>{"use strict";n.d(t,{d1:()=>l.d1,zK:()=>y,vT:()=>h,gk:()=>m,Gy:()=>p,$S:()=>l.$S,HW:()=>v,vF:()=>u.v,ht:()=>f,g1:()=>c.g1,r7:()=>b,jh:()=>g});var r=n(6347),o=n(6588);const a=e=>e.versions.find((e=>e.isLast));function i(e,t){return[...e.versions].sort(((e,t)=>e.path===t.path?0:e.path.includes(t.path)?-1:t.path.includes(e.path)?1:0)).find((e=>!!(0,r.B6)(t,{path:e.path,exact:!1,strict:!1})))}function s(e,t){const n=i(e,t),o=n?.docs.find((e=>!!(0,r.B6)(t,{path:e.path,exact:!0,strict:!1})));return{activeVersion:n,activeDoc:o,alternateDocVersions:o?function(t){const n={};return e.versions.forEach((e=>{e.docs.forEach((r=>{r.id===t&&(n[e.name]=r)}))})),n}(o.id):{}}}var l=n(6972),c=n(3886),u=n(2565);const d={},p=()=>(0,o.kh)("docusaurus-plugin-content-docs")??d,f=e=>{try{return(0,o.P_)("docusaurus-plugin-content-docs",e,{failfast:!0})}catch(t){throw new Error("You are using a feature of the Docusaurus docs plugin, but this plugin does not seem to be enabled"+("Default"===e?"":` (pluginId=${e}`),{cause:t})}};function h(e){void 0===e&&(e={});const t=p(),{pathname:n}=(0,r.zy)();return function(e,t,n){void 0===n&&(n={});const o=Object.entries(e).sort(((e,t)=>t[1].path.localeCompare(e[1].path))).find((e=>{let[,n]=e;return!!(0,r.B6)(t,{path:n.path,exact:!1,strict:!1})})),a=o?{pluginId:o[0],pluginData:o[1]}:void 0;if(!a&&n.failfast)throw new Error(`Can't find active docs plugin for "${t}" pathname, while it was expected to be found. Maybe you tried to use a docs feature that can only be used on a docs-related page? Existing docs plugin paths are: ${Object.values(e).map((e=>e.path)).join(", ")}`);return a}(t,n,e)}function m(e){void 0===e&&(e={});const t=h(e),{pathname:n}=(0,r.zy)();if(!t)return;return{activePlugin:t,activeVersion:i(t.pluginData,n)}}function g(e){return f(e).versions}function b(e){const t=f(e);return a(t)}function y(e){const t=f(e),{pathname:n}=(0,r.zy)();return s(t,n)}function v(e){const t=f(e),{pathname:n}=(0,r.zy)();return function(e,t){const n=a(e);return{latestDocSuggestion:s(e,t).alternateDocVersions[n.name],latestVersionSuggestion:n}}(t,n)}},6294:(e,t,n)=>{"use strict";n.r(t),n.d(t,{default:()=>a});var r=n(5947),o=n.n(r);o().configure({showSpinner:!1});const a={onRouteUpdate(e){let{location:t,previousLocation:n}=e;if(n&&t.pathname!==n.pathname){const e=window.setTimeout((()=>{o().start()}),200);return()=>window.clearTimeout(e)}},onRouteDidUpdate(){o().done()}}},6134:(e,t,n)=>{"use strict";n.r(t);var r=n(1765),o=n(4784);!function(e){const{themeConfig:{prism:t}}=o.default,{additionalLanguages:r}=t;globalThis.Prism=e,r.forEach((e=>{"php"===e&&n(9700),n(875)(`./prism-${e}`)})),delete globalThis.Prism}(r.My)},1107:(e,t,n)=>{"use strict";n.d(t,{A:()=>u});n(6540);var r=n(4164),o=n(1312),a=n(6342),i=n(8774),s=n(3427);const l={anchorWithStickyNavbar:"anchorWithStickyNavbar_LWe7",anchorWithHideOnScrollNavbar:"anchorWithHideOnScrollNavbar_WYt5"};var c=n(4848);function u(e){let{as:t,id:n,...u}=e;const d=(0,s.A)(),{navbar:{hideOnScroll:p}}=(0,a.p)();if("h1"===t||!n)return(0,c.jsx)(t,{...u,id:void 0});d.collectAnchor(n);const f=(0,o.T)({id:"theme.common.headingLinkTitle",message:"Direct link to {heading}",description:"Title for link to heading"},{heading:"string"==typeof u.children?u.children:n});return(0,c.jsxs)(t,{...u,className:(0,r.A)("anchor",p?l.anchorWithHideOnScrollNavbar:l.anchorWithStickyNavbar,u.className),id:n,children:[u.children,(0,c.jsx)(i.A,{className:"hash-link",to:`#${n}`,"aria-label":f,title:f,children:"\u200b"})]})}},3186:(e,t,n)=>{"use strict";n.d(t,{A:()=>a});n(6540);const r={iconExternalLink:"iconExternalLink_nPIU"};var o=n(4848);function a(e){let{width:t=13.5,height:n=13.5}=e;return(0,o.jsx)("svg",{width:t,height:n,"aria-hidden":"true",viewBox:"0 0 24 24",className:r.iconExternalLink,children:(0,o.jsx)("path",{fill:"currentColor",d:"M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"})})}},263:(e,t,n)=>{"use strict";n.d(t,{A:()=>Dt});var r=n(6540),o=n(4164),a=n(7489),i=n(1213),s=n(6347),l=n(1312),c=n(5062),u=n(4848);const d="__docusaurus_skipToContent_fallback";function p(e){e.setAttribute("tabindex","-1"),e.focus(),e.removeAttribute("tabindex")}function f(){const e=(0,r.useRef)(null),{action:t}=(0,s.W6)(),n=(0,r.useCallback)((e=>{e.preventDefault();const t=document.querySelector("main:first-of-type")??document.getElementById(d);t&&p(t)}),[]);return(0,c.$)((n=>{let{location:r}=n;e.current&&!r.hash&&"PUSH"===t&&p(e.current)})),{containerRef:e,onClick:n}}const h=(0,l.T)({id:"theme.common.skipToMainContent",description:"The skip to content label used for accessibility, allowing to rapidly navigate to main content with keyboard tab/enter navigation",message:"Skip to main content"});function m(e){const t=e.children??h,{containerRef:n,onClick:r}=f();return(0,u.jsx)("div",{ref:n,role:"region","aria-label":h,children:(0,u.jsx)("a",{...e,href:`#${d}`,onClick:r,children:t})})}var g=n(7559),b=n(4090);const y={skipToContent:"skipToContent_fXgn"};function v(){return(0,u.jsx)(m,{className:y.skipToContent})}var x=n(6342),w=n(5041);function S(e){let{width:t=21,height:n=21,color:r="currentColor",strokeWidth:o=1.2,className:a,...i}=e;return(0,u.jsx)("svg",{viewBox:"0 0 15 15",width:t,height:n,...i,children:(0,u.jsx)("g",{stroke:r,strokeWidth:o,children:(0,u.jsx)("path",{d:"M.75.75l13.5 13.5M14.25.75L.75 14.25"})})})}const k={closeButton:"closeButton_CVFx"};function _(e){return(0,u.jsx)("button",{type:"button","aria-label":(0,l.T)({id:"theme.AnnouncementBar.closeButtonAriaLabel",message:"Close",description:"The ARIA label for close button of announcement bar"}),...e,className:(0,o.A)("clean-btn close",k.closeButton,e.className),children:(0,u.jsx)(S,{width:14,height:14,strokeWidth:3.1})})}const E={content:"content_knG7"};function C(e){const{announcementBar:t}=(0,x.p)(),{content:n}=t;return(0,u.jsx)("div",{...e,className:(0,o.A)(E.content,e.className),dangerouslySetInnerHTML:{__html:n}})}const A={announcementBar:"announcementBar_mb4j",announcementBarPlaceholder:"announcementBarPlaceholder_vyr4",announcementBarClose:"announcementBarClose_gvF7",announcementBarContent:"announcementBarContent_xLdY"};function T(){const{announcementBar:e}=(0,x.p)(),{isActive:t,close:n}=(0,w.M)();if(!t)return null;const{backgroundColor:r,textColor:o,isCloseable:a}=e;return(0,u.jsxs)("div",{className:A.announcementBar,style:{backgroundColor:r,color:o},role:"banner",children:[a&&(0,u.jsx)("div",{className:A.announcementBarPlaceholder}),(0,u.jsx)(C,{className:A.announcementBarContent}),a&&(0,u.jsx)(_,{onClick:n,className:A.announcementBarClose})]})}var P=n(2069),L=n(3104);var O=n(9532),N=n(5600);const j=r.createContext(null);function R(e){let{children:t}=e;const n=function(){const e=(0,P.M)(),t=(0,N.YL)(),[n,o]=(0,r.useState)(!1),a=null!==t.component,i=(0,O.ZC)(a);return(0,r.useEffect)((()=>{a&&!i&&o(!0)}),[a,i]),(0,r.useEffect)((()=>{a?e.shown||o(!0):o(!1)}),[e.shown,a]),(0,r.useMemo)((()=>[n,o]),[n])}();return(0,u.jsx)(j.Provider,{value:n,children:t})}function I(e){if(e.component){const t=e.component;return(0,u.jsx)(t,{...e.props})}}function F(){const e=(0,r.useContext)(j);if(!e)throw new O.dV("NavbarSecondaryMenuDisplayProvider");const[t,n]=e,o=(0,r.useCallback)((()=>n(!1)),[n]),a=(0,N.YL)();return(0,r.useMemo)((()=>({shown:t,hide:o,content:I(a)})),[o,a,t])}function M(e){let{header:t,primaryMenu:n,secondaryMenu:r}=e;const{shown:a}=F();return(0,u.jsxs)("div",{className:"navbar-sidebar",children:[t,(0,u.jsxs)("div",{className:(0,o.A)("navbar-sidebar__items",{"navbar-sidebar__items--show-secondary":a}),children:[(0,u.jsx)("div",{className:"navbar-sidebar__item menu",children:n}),(0,u.jsx)("div",{className:"navbar-sidebar__item menu",children:r})]})]})}var z=n(5293),D=n(2303);function B(e){return(0,u.jsx)("svg",{viewBox:"0 0 24 24",width:24,height:24,...e,children:(0,u.jsx)("path",{fill:"currentColor",d:"M12,9c1.65,0,3,1.35,3,3s-1.35,3-3,3s-3-1.35-3-3S10.35,9,12,9 M12,7c-2.76,0-5,2.24-5,5s2.24,5,5,5s5-2.24,5-5 S14.76,7,12,7L12,7z M2,13l2,0c0.55,0,1-0.45,1-1s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S1.45,13,2,13z M20,13l2,0c0.55,0,1-0.45,1-1 s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S19.45,13,20,13z M11,2v2c0,0.55,0.45,1,1,1s1-0.45,1-1V2c0-0.55-0.45-1-1-1S11,1.45,11,2z M11,20v2c0,0.55,0.45,1,1,1s1-0.45,1-1v-2c0-0.55-0.45-1-1-1C11.45,19,11,19.45,11,20z M5.99,4.58c-0.39-0.39-1.03-0.39-1.41,0 c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0s0.39-1.03,0-1.41L5.99,4.58z M18.36,16.95 c-0.39-0.39-1.03-0.39-1.41,0c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0c0.39-0.39,0.39-1.03,0-1.41 L18.36,16.95z M19.42,5.99c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06c-0.39,0.39-0.39,1.03,0,1.41 s1.03,0.39,1.41,0L19.42,5.99z M7.05,18.36c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06 c-0.39,0.39-0.39,1.03,0,1.41s1.03,0.39,1.41,0L7.05,18.36z"})})}function $(e){return(0,u.jsx)("svg",{viewBox:"0 0 24 24",width:24,height:24,...e,children:(0,u.jsx)("path",{fill:"currentColor",d:"M9.37,5.51C9.19,6.15,9.1,6.82,9.1,7.5c0,4.08,3.32,7.4,7.4,7.4c0.68,0,1.35-0.09,1.99-0.27C17.45,17.19,14.93,19,12,19 c-3.86,0-7-3.14-7-7C5,9.07,6.81,6.55,9.37,5.51z M12,3c-4.97,0-9,4.03-9,9s4.03,9,9,9s9-4.03,9-9c0-0.46-0.04-0.92-0.1-1.36 c-0.98,1.37-2.58,2.26-4.4,2.26c-2.98,0-5.4-2.42-5.4-5.4c0-1.81,0.89-3.42,2.26-4.4C12.92,3.04,12.46,3,12,3L12,3z"})})}const V={toggle:"toggle_vylO",toggleButton:"toggleButton_gllP",darkToggleIcon:"darkToggleIcon_wfgR",lightToggleIcon:"lightToggleIcon_pyhR",toggleButtonDisabled:"toggleButtonDisabled_aARS"};function U(e){let{className:t,buttonClassName:n,value:r,onChange:a}=e;const i=(0,D.A)(),s=(0,l.T)({message:"Switch between dark and light mode (currently {mode})",id:"theme.colorToggle.ariaLabel",description:"The ARIA label for the navbar color mode toggle"},{mode:"dark"===r?(0,l.T)({message:"dark mode",id:"theme.colorToggle.ariaLabel.mode.dark",description:"The name for the dark color mode"}):(0,l.T)({message:"light mode",id:"theme.colorToggle.ariaLabel.mode.light",description:"The name for the light color mode"})});return(0,u.jsx)("div",{className:(0,o.A)(V.toggle,t),children:(0,u.jsxs)("button",{className:(0,o.A)("clean-btn",V.toggleButton,!i&&V.toggleButtonDisabled,n),type:"button",onClick:()=>a("dark"===r?"light":"dark"),disabled:!i,title:s,"aria-label":s,"aria-live":"polite",children:[(0,u.jsx)(B,{className:(0,o.A)(V.toggleIcon,V.lightToggleIcon)}),(0,u.jsx)($,{className:(0,o.A)(V.toggleIcon,V.darkToggleIcon)})]})})}const H=r.memo(U),Q={darkNavbarColorModeToggle:"darkNavbarColorModeToggle_X3D1"};function W(e){let{className:t}=e;const n=(0,x.p)().navbar.style,r=(0,x.p)().colorMode.disableSwitch,{colorMode:o,setColorMode:a}=(0,z.G)();return r?null:(0,u.jsx)(H,{className:t,buttonClassName:"dark"===n?Q.darkNavbarColorModeToggle:void 0,value:o,onChange:a})}var G=n(3465);function q(){return(0,u.jsx)(G.A,{className:"navbar__brand",imageClassName:"navbar__logo",titleClassName:"navbar__title text--truncate"})}function Y(){const e=(0,P.M)();return(0,u.jsx)("button",{type:"button","aria-label":(0,l.T)({id:"theme.docs.sidebar.closeSidebarButtonAriaLabel",message:"Close navigation bar",description:"The ARIA label for close button of mobile sidebar"}),className:"clean-btn navbar-sidebar__close",onClick:()=>e.toggle(),children:(0,u.jsx)(S,{color:"var(--ifm-color-emphasis-600)"})})}function K(){return(0,u.jsxs)("div",{className:"navbar-sidebar__brand",children:[(0,u.jsx)(q,{}),(0,u.jsx)(W,{className:"margin-right--md"}),(0,u.jsx)(Y,{})]})}var Z=n(8774),X=n(6025),J=n(6654);function ee(e,t){return void 0!==e&&void 0!==t&&new RegExp(e,"gi").test(t)}var te=n(3186);function ne(e){let{activeBasePath:t,activeBaseRegex:n,to:r,href:o,label:a,html:i,isDropdownLink:s,prependBaseUrlToHref:l,...c}=e;const d=(0,X.Ay)(r),p=(0,X.Ay)(t),f=(0,X.Ay)(o,{forcePrependBaseUrl:!0}),h=a&&o&&!(0,J.A)(o),m=i?{dangerouslySetInnerHTML:{__html:i}}:{children:(0,u.jsxs)(u.Fragment,{children:[a,h&&(0,u.jsx)(te.A,{...s&&{width:12,height:12}})]})};return o?(0,u.jsx)(Z.A,{href:l?f:o,...c,...m}):(0,u.jsx)(Z.A,{to:d,isNavLink:!0,...(t||n)&&{isActive:(e,t)=>n?ee(n,t.pathname):t.pathname.startsWith(p)},...c,...m})}function re(e){let{className:t,isDropdownItem:n=!1,...r}=e;const a=(0,u.jsx)(ne,{className:(0,o.A)(n?"dropdown__link":"navbar__item navbar__link",t),isDropdownLink:n,...r});return n?(0,u.jsx)("li",{children:a}):a}function oe(e){let{className:t,isDropdownItem:n,...r}=e;return(0,u.jsx)("li",{className:"menu__list-item",children:(0,u.jsx)(ne,{className:(0,o.A)("menu__link",t),...r})})}function ae(e){let{mobile:t=!1,position:n,...r}=e;const o=t?oe:re;return(0,u.jsx)(o,{...r,activeClassName:r.activeClassName??(t?"menu__link--active":"navbar__link--active")})}var ie=n(1422),se=n(9169),le=n(4586);const ce={dropdownNavbarItemMobile:"dropdownNavbarItemMobile_S0Fm"};function ue(e,t){return e.some((e=>function(e,t){return!!(0,se.ys)(e.to,t)||!!ee(e.activeBaseRegex,t)||!(!e.activeBasePath||!t.startsWith(e.activeBasePath))}(e,t)))}function de(e){let{items:t,position:n,className:a,onClick:i,...s}=e;const l=(0,r.useRef)(null),[c,d]=(0,r.useState)(!1);return(0,r.useEffect)((()=>{const e=e=>{l.current&&!l.current.contains(e.target)&&d(!1)};return document.addEventListener("mousedown",e),document.addEventListener("touchstart",e),document.addEventListener("focusin",e),()=>{document.removeEventListener("mousedown",e),document.removeEventListener("touchstart",e),document.removeEventListener("focusin",e)}}),[l]),(0,u.jsxs)("div",{ref:l,className:(0,o.A)("navbar__item","dropdown","dropdown--hoverable",{"dropdown--right":"right"===n,"dropdown--show":c}),children:[(0,u.jsx)(ne,{"aria-haspopup":"true","aria-expanded":c,role:"button",href:s.to?void 0:"#",className:(0,o.A)("navbar__link",a),...s,onClick:s.to?void 0:e=>e.preventDefault(),onKeyDown:e=>{"Enter"===e.key&&(e.preventDefault(),d(!c))},children:s.children??s.label}),(0,u.jsx)("ul",{className:"dropdown__menu",children:t.map(((e,t)=>(0,r.createElement)(Ze,{isDropdownItem:!0,activeClassName:"dropdown__link--active",...e,key:t})))})]})}function pe(e){let{items:t,className:n,position:a,onClick:i,...l}=e;const c=function(){const{siteConfig:{baseUrl:e}}=(0,le.A)(),{pathname:t}=(0,s.zy)();return t.replace(e,"/")}(),d=ue(t,c),{collapsed:p,toggleCollapsed:f,setCollapsed:h}=(0,ie.u)({initialState:()=>!d});return(0,r.useEffect)((()=>{d&&h(!d)}),[c,d,h]),(0,u.jsxs)("li",{className:(0,o.A)("menu__list-item",{"menu__list-item--collapsed":p}),children:[(0,u.jsx)(ne,{role:"button",className:(0,o.A)(ce.dropdownNavbarItemMobile,"menu__link menu__link--sublist menu__link--sublist-caret",n),...l,onClick:e=>{e.preventDefault(),f()},children:l.children??l.label}),(0,u.jsx)(ie.N,{lazy:!0,as:"ul",className:"menu__list",collapsed:p,children:t.map(((e,t)=>(0,r.createElement)(Ze,{mobile:!0,isDropdownItem:!0,onClick:i,activeClassName:"menu__link--active",...e,key:t})))})]})}function fe(e){let{mobile:t=!1,...n}=e;const r=t?pe:de;return(0,u.jsx)(r,{...n})}var he=n(2131);function me(e){let{width:t=20,height:n=20,...r}=e;return(0,u.jsx)("svg",{viewBox:"0 0 24 24",width:t,height:n,"aria-hidden":!0,...r,children:(0,u.jsx)("path",{fill:"currentColor",d:"M12.87 15.07l-2.54-2.51.03-.03c1.74-1.94 2.98-4.17 3.71-6.53H17V4h-7V2H8v2H1v1.99h11.17C11.5 7.92 10.44 9.75 9 11.35 8.07 10.32 7.3 9.19 6.69 8h-2c.73 1.63 1.73 3.17 2.98 4.56l-5.09 5.02L4 19l5-5 3.11 3.11.76-2.04zM18.5 10h-2L12 22h2l1.12-3h4.75L21 22h2l-4.5-12zm-2.62 7l1.62-4.33L19.12 17h-3.24z"})})}const ge="iconLanguage_nlXk";var be=n(1088),ye=n(5391);var ve=n(6588);const xe={},we=()=>(0,ve.kh)("docusaurus-plugin-content-docs")??xe;function Se(e){void 0===e&&(e={});const t=we(),{pathname:n}=(0,s.zy)();return function(e,t,n){void 0===n&&(n={});const r=Object.entries(e).sort(((e,t)=>t[1].path.localeCompare(e[1].path))).find((e=>{let[,n]=e;return!!(0,s.B6)(t,{path:n.path,exact:!1,strict:!1})})),o=r?{pluginId:r[0],pluginData:r[1]}:void 0;if(!o&&n.failfast)throw new Error(`Can't find active docs plugin for "${t}" pathname, while it was expected to be found. Maybe you tried to use a docs feature that can only be used on a docs-related page? Existing docs plugin paths are: ${Object.values(e).map((e=>e.path)).join(", ")}`);return o}(t,n,e)}var ke=n(5891),_e=n(2384),Ee=n(4471),Ce=n(7674),Ae=n(6841),Te=n(3810);const Pe='',Le='',Oe='',Ne='',je='',Re='',Ie='',Fe={searchBar:"searchBar_RVTs",dropdownMenu:"dropdownMenu_qbY6",searchBarLeft:"searchBarLeft_MXDe",suggestion:"suggestion_fB_2",cursor:"cursor_eG29",hitTree:"hitTree_kk6K",hitIcon:"hitIcon_a7Zy",hitPath:"hitPath_ieM4",noResultsIcon:"noResultsIcon_EBY5",hitFooter:"hitFooter_E9YW",hitWrapper:"hitWrapper_sAK8",hitTitle:"hitTitle_vyVt",hitAction:"hitAction_NqkB",hideAction:"hideAction_vcyE",noResults:"noResults_l6Q3",searchBarContainer:"searchBarContainer_NW3z",searchBarLoadingRing:"searchBarLoadingRing_YnHq",searchClearButton:"searchClearButton_qk4g",searchIndexLoading:"searchIndexLoading_EJ1f",searchHintContainer:"searchHintContainer_Pkmr",searchHint:"searchHint_iIMx",focused:"focused_OWtg",input:"input_FOTf",hint:"hint_URu1",suggestions:"suggestions_X8XU",dataset:"dataset_QiCy",empty:"empty_eITn"};function Me(e){let{document:t,type:n,page:r,metadata:o,tokens:a,isInterOfTree:i,isLastOfTree:s}=e;const l=0===n,c=1===n,u=[];i?u.push(Re):s&&u.push(Ie);const d=u.map((e=>`${e}`)),p=`${l?Pe:c?Le:Oe}`,f=[`${(0,Te.C)(t.t,(0,Ce.g)(o,"t"),a)}`];if(!i&&!s&&be.tb){const e=r?(r.b??[]).concat(r.t).concat(t.s&&t.s!==r.t?t.s:[]):t.b;f.push(`${(0,Ee.$)(e??[])}`)}else l||f.push(`${(0,Ae.Z)(r.t||(t.u.startsWith("/docs/api-reference/")?"API Reference":""),a)}`);const h=`${Ne}`;return[...d,p,``,...f,"",h].join("")}function ze(){return`${je}${(0,l.T)({id:"theme.SearchBar.noResultsText",message:"No results"})}`}var De=n(2849),Be=n(3385);async function $e(){const e=await Promise.all([n.e(489),n.e(5741)]).then(n.t.bind(n,489,23)),t=e.default;return t.noConflict?t.noConflict():e.noConflict&&e.noConflict(),t}const Ve="_highlight";const Ue=function(e){let{handleSearchBarToggle:t}=e;const o=(0,D.A)(),{siteConfig:{baseUrl:a},i18n:{currentLocale:i}}=(0,le.A)(),c=Se();let d=a;try{const{preferredVersion:e}=function(){return n(8295).g1(...arguments)}(c?.pluginId??be.UB);e&&!e.isLast&&(d=e.path+"/")}catch(z){if(be.I$&&!(z instanceof O.dV))throw z}const p=(0,s.W6)(),f=(0,s.zy)(),h=(0,r.useRef)(null),m=(0,r.useRef)(new Map),g=(0,r.useRef)(!1),[b,y]=(0,r.useState)(!1),[v,x]=(0,r.useState)(!1),[w,S]=(0,r.useState)(""),k=(0,r.useRef)(null),_=(0,r.useRef)(""),[E,C]=(0,r.useState)("");(0,r.useEffect)((()=>{if(!Array.isArray(be.Hg))return;let e="";if(f.pathname.startsWith(d)){const t=f.pathname.substring(d.length);let n;for(const e of be.Hg){const r="string"==typeof e?e:e.path;if(t===r||t.startsWith(`${r}/`)){n=r;break}}n&&(e=n)}_.current!==e&&(m.current.delete(e),_.current=e),C(e)}),[f.pathname,d]);const A=!!be.O6&&Array.isArray(be.Hg)&&""===E,T=(0,r.useCallback)((async()=>{if(A||m.current.get(E))return;m.current.set(E,"loading"),k.current?.autocomplete.destroy(),y(!0);const[{wrappedIndexes:e,zhDictionary:t},n]=await Promise.all([(0,ke.Z)(d,E),$e()]);if(k.current=n(h.current,{hint:!1,autoselect:!0,openOnFocus:!0,cssClasses:{root:(0,ye.A)(Fe.searchBar,{[Fe.searchBarLeft]:"left"===be.ZG}),noPrefix:!0,dropdownMenu:Fe.dropdownMenu,input:Fe.input,hint:Fe.hint,suggestions:Fe.suggestions,suggestion:Fe.suggestion,cursor:Fe.cursor,dataset:Fe.dataset,empty:Fe.empty}},[{source:(0,_e.m)(e,t,be.AT),templates:{suggestion:Me,empty:ze,footer:e=>{let{query:t,isEmpty:n}=e;if(n&&(!E||!be.dz))return;const r=(e=>{let{query:t,isEmpty:n}=e;const r=document.createElement("a"),o=new URLSearchParams;let s;if(o.set("q",t),E){const e=E&&Array.isArray(be.Hg)?be.Hg.find((e=>"string"==typeof e?e===E:e.path===E)):E,t=e?(0,Be.p)(e,i).label:E;s=be.dz&&n?(0,l.T)({id:"theme.SearchBar.seeAllOutsideContext",message:"See results outside {context}"},{context:t}):(0,l.T)({id:"theme.SearchBar.searchInContext",message:"See all results in {context}"},{context:t})}else s=(0,l.T)({id:"theme.SearchBar.seeAll",message:"See all results"});if(!E||!Array.isArray(be.Hg)||be.dz&&n||o.set("ctx",E),d!==a){if(!d.startsWith(a))throw new Error(`Version url '${d}' does not start with base url '${a}', this is a bug of \`@easyops-cn/docusaurus-search-local\`, please report it.`);o.set("version",d.substring(a.length))}const c=`${a}search?${o.toString()}`;return r.href=c,r.textContent=s,r.addEventListener("click",(e=>{e.ctrlKey||e.metaKey||(e.preventDefault(),k.current?.autocomplete.close(),p.push(c))})),r})({query:t,isEmpty:n}),o=document.createElement("div");return o.className=Fe.hitFooter,o.appendChild(r),o}}}]).on("autocomplete:selected",(function(e,t){let{document:{u:n,h:r},tokens:o}=t;h.current?.blur();let a=n;if(be.CU&&o.length>0){const e=new URLSearchParams;for(const t of o)e.append(Ve,t);a+=`?${e.toString()}`}r&&(a+=r),p.push(a)})).on("autocomplete:closed",(()=>{h.current?.blur()})),m.current.set(E,"done"),y(!1),g.current){const e=h.current;e.value&&k.current?.autocomplete.open(),e.focus()}}),[A,E,d,a,p]);(0,r.useEffect)((()=>{if(!be.CU)return;const e=o?new URLSearchParams(f.search).getAll(Ve):[];setTimeout((()=>{const t=document.querySelector("article");if(!t)return;const n=new be.CU(t);n.unmark(),0!==e.length&&n.mark(e),S(e.join(" ")),k.current?.autocomplete.setVal(e.join(" "))}))}),[o,f.search,f.pathname]);const[P,L]=(0,r.useState)(!1),N=(0,r.useCallback)((()=>{g.current=!0,T(),L(!0),t?.(!0)}),[t,T]),j=(0,r.useCallback)((()=>{L(!1),t?.(!1)}),[t]),R=(0,r.useCallback)((()=>{T()}),[T]),I=(0,r.useCallback)((e=>{S(e.target.value),e.target.value&&x(!0)}),[]),F=!!o&&/mac/i.test(navigator.userAgentData?.platform??navigator.platform);(0,r.useEffect)((()=>{if(!be.WW)return;const e=e=>{!(F?e.metaKey:e.ctrlKey)||"k"!==e.key&&"K"!==e.key||(e.preventDefault(),h.current?.focus(),N())};return document.addEventListener("keydown",e),()=>{document.removeEventListener("keydown",e)}}),[F,N]);const M=(0,r.useCallback)((()=>{const e=new URLSearchParams(f.search);e.delete(Ve);const t=e.toString(),n=f.pathname+(""!=t?`?${t}`:"")+f.hash;n!=f.pathname+f.search+f.hash&&p.push(n),S(""),k.current?.autocomplete.setVal("")}),[f.pathname,f.search,f.hash,p]);return(0,u.jsxs)("div",{className:(0,ye.A)("navbar__search",Fe.searchBarContainer,{[Fe.searchIndexLoading]:b&&v,[Fe.focused]:P}),hidden:A,children:[(0,u.jsx)("input",{placeholder:(0,l.T)({id:"theme.SearchBar.label",message:"Search",description:"The ARIA label and placeholder for search button"}),"aria-label":"Search",className:"navbar__search-input",onMouseEnter:R,onFocus:N,onBlur:j,onChange:I,ref:h,value:w}),(0,u.jsx)(De.A,{className:Fe.searchBarLoadingRing}),be.WW&&be.pk&&(""!==w?(0,u.jsx)("button",{className:Fe.searchClearButton,onClick:M,children:"\u2715"}):o&&(0,u.jsxs)("div",{className:Fe.searchHintContainer,children:[(0,u.jsx)("kbd",{className:Fe.searchHint,children:F?"\u2318":"ctrl"}),(0,u.jsx)("kbd",{className:Fe.searchHint,children:"K"})]}))]})},He={navbarSearchContainer:"navbarSearchContainer_Bca1"};function Qe(e){let{children:t,className:n}=e;return(0,u.jsx)("div",{className:(0,o.A)(n,He.navbarSearchContainer),children:t})}var We=n(8295),Ge=n(6972);var qe=n(3886);function Ye(e,t){return t.alternateDocVersions[e.name]??function(e){return e.docs.find((t=>t.id===e.mainDocId))}(e)}const Ke={default:ae,localeDropdown:function(e){let{mobile:t,dropdownItemsBefore:n,dropdownItemsAfter:r,queryString:o="",...a}=e;const{i18n:{currentLocale:i,locales:c,localeConfigs:d}}=(0,le.A)(),p=(0,he.o)(),{search:f,hash:h}=(0,s.zy)(),m=[...n,...c.map((e=>{const n=`${`pathname://${p.createUrl({locale:e,fullyQualified:!1})}`}${f}${h}${o}`;return{label:d[e].label,lang:d[e].htmlLang,to:n,target:"_self",autoAddBaseUrl:!1,className:e===i?t?"menu__link--active":"dropdown__link--active":""}})),...r],g=t?(0,l.T)({message:"Languages",id:"theme.navbar.mobileLanguageDropdown.label",description:"The label for the mobile language switcher dropdown"}):d[i].label;return(0,u.jsx)(fe,{...a,mobile:t,label:(0,u.jsxs)(u.Fragment,{children:[(0,u.jsx)(me,{className:ge}),g]}),items:m})},search:function(e){let{mobile:t,className:n}=e;return t?null:(0,u.jsx)(Qe,{className:n,children:(0,u.jsx)(Ue,{})})},dropdown:fe,html:function(e){let{value:t,className:n,mobile:r=!1,isDropdownItem:a=!1}=e;const i=a?"li":"div";return(0,u.jsx)(i,{className:(0,o.A)({navbar__item:!r&&!a,"menu__list-item":r},n),dangerouslySetInnerHTML:{__html:t}})},doc:function(e){let{docId:t,label:n,docsPluginId:r,...o}=e;const{activeDoc:a}=(0,We.zK)(r),i=(0,Ge.QB)(t,r),s=a?.path===i?.path;return null===i||i.unlisted&&!s?null:(0,u.jsx)(ae,{exact:!0,...o,isActive:()=>s||!!a?.sidebar&&a.sidebar===i.sidebar,label:n??i.id,to:i.path})},docSidebar:function(e){let{sidebarId:t,label:n,docsPluginId:r,...o}=e;const{activeDoc:a}=(0,We.zK)(r),i=(0,Ge.fW)(t,r).link;if(!i)throw new Error(`DocSidebarNavbarItem: Sidebar with ID "${t}" doesn't have anything to be linked to.`);return(0,u.jsx)(ae,{exact:!0,...o,isActive:()=>a?.sidebar===t,label:n??i.label,to:i.path})},docsVersion:function(e){let{label:t,to:n,docsPluginId:r,...o}=e;const a=(0,Ge.Vd)(r)[0],i=t??a.label,s=n??(e=>e.docs.find((t=>t.id===e.mainDocId)))(a).path;return(0,u.jsx)(ae,{...o,label:i,to:s})},docsVersionDropdown:function(e){let{mobile:t,docsPluginId:n,dropdownActiveClassDisabled:r,dropdownItemsBefore:o,dropdownItemsAfter:a,...i}=e;const{search:c,hash:d}=(0,s.zy)(),p=(0,We.zK)(n),f=(0,We.jh)(n),{savePreferredVersionName:h}=(0,qe.g1)(n),m=[...o,...f.map((function(e){const t=Ye(e,p);return{label:e.label,to:`${t.path}${c}${d}`,isActive:()=>e===p.activeVersion,onClick:()=>h(e.name)}})),...a],g=(0,Ge.Vd)(n)[0],b=t&&m.length>1?(0,l.T)({id:"theme.navbar.mobileVersionsDropdown.label",message:"Versions",description:"The label for the navbar versions dropdown on mobile view"}):g.label,y=t&&m.length>1?void 0:Ye(g,p).path;return m.length<=1?(0,u.jsx)(ae,{...i,mobile:t,label:b,to:y,isActive:r?()=>!1:void 0}):(0,u.jsx)(fe,{...i,mobile:t,label:b,to:y,items:m,isActive:r?()=>!1:void 0})}};function Ze(e){let{type:t,...n}=e;const r=function(e,t){return e&&"default"!==e?e:"items"in t?"dropdown":"default"}(t,n),o=Ke[r];if(!o)throw new Error(`No NavbarItem component found for type "${t}".`);return(0,u.jsx)(o,{...n})}function Xe(){const e=(0,P.M)(),t=(0,x.p)().navbar.items;return(0,u.jsx)("ul",{className:"menu__list",children:t.map(((t,n)=>(0,r.createElement)(Ze,{mobile:!0,...t,onClick:()=>e.toggle(),key:n})))})}function Je(e){return(0,u.jsx)("button",{...e,type:"button",className:"clean-btn navbar-sidebar__back",children:(0,u.jsx)(l.A,{id:"theme.navbar.mobileSidebarSecondaryMenu.backButtonLabel",description:"The label of the back button to return to main menu, inside the mobile navbar sidebar secondary menu (notably used to display the docs sidebar)",children:"\u2190 Back to main menu"})})}function et(){const e=0===(0,x.p)().navbar.items.length,t=F();return(0,u.jsxs)(u.Fragment,{children:[!e&&(0,u.jsx)(Je,{onClick:()=>t.hide()}),t.content]})}function tt(){const e=(0,P.M)();var t;return void 0===(t=e.shown)&&(t=!0),(0,r.useEffect)((()=>(document.body.style.overflow=t?"hidden":"visible",()=>{document.body.style.overflow="visible"})),[t]),e.shouldRender?(0,u.jsx)(M,{header:(0,u.jsx)(K,{}),primaryMenu:(0,u.jsx)(Xe,{}),secondaryMenu:(0,u.jsx)(et,{})}):null}const nt={navbarHideable:"navbarHideable_m1mJ",navbarHidden:"navbarHidden_jGov"};function rt(e){return(0,u.jsx)("div",{role:"presentation",...e,className:(0,o.A)("navbar-sidebar__backdrop",e.className)})}function ot(e){let{children:t}=e;const{navbar:{hideOnScroll:n,style:a}}=(0,x.p)(),i=(0,P.M)(),{navbarRef:s,isNavbarVisible:d}=function(e){const[t,n]=(0,r.useState)(e),o=(0,r.useRef)(!1),a=(0,r.useRef)(0),i=(0,r.useCallback)((e=>{null!==e&&(a.current=e.getBoundingClientRect().height)}),[]);return(0,L.Mq)(((t,r)=>{let{scrollY:i}=t;if(!e)return;if(i=s?n(!1):i+c{if(!e)return;const r=t.location.hash;if(r?document.getElementById(r.substring(1)):void 0)return o.current=!0,void n(!1);n(!0)})),{navbarRef:i,isNavbarVisible:t}}(n);return(0,u.jsxs)("nav",{ref:s,"aria-label":(0,l.T)({id:"theme.NavBar.navAriaLabel",message:"Main",description:"The ARIA label for the main navigation"}),className:(0,o.A)("navbar","navbar--fixed-top",n&&[nt.navbarHideable,!d&&nt.navbarHidden],{"navbar--dark":"dark"===a,"navbar--primary":"primary"===a,"navbar-sidebar--show":i.shown}),children:[t,(0,u.jsx)(rt,{onClick:i.toggle}),(0,u.jsx)(tt,{})]})}var at=n(440);const it={errorBoundaryError:"errorBoundaryError_a6uf",errorBoundaryFallback:"errorBoundaryFallback_VBag"};function st(e){return(0,u.jsx)("button",{type:"button",...e,children:(0,u.jsx)(l.A,{id:"theme.ErrorPageContent.tryAgain",description:"The label of the button to try again rendering when the React error boundary captures an error",children:"Try again"})})}function lt(e){let{error:t}=e;const n=(0,at.rA)(t).map((e=>e.message)).join("\n\nCause:\n");return(0,u.jsx)("p",{className:it.errorBoundaryError,children:n})}class ct extends r.Component{componentDidCatch(e,t){throw this.props.onError(e,t)}render(){return this.props.children}}const ut="right";function dt(e){let{width:t=30,height:n=30,className:r,...o}=e;return(0,u.jsx)("svg",{className:r,width:t,height:n,viewBox:"0 0 30 30","aria-hidden":"true",...o,children:(0,u.jsx)("path",{stroke:"currentColor",strokeLinecap:"round",strokeMiterlimit:"10",strokeWidth:"2",d:"M4 7h22M4 15h22M4 23h22"})})}function pt(){const{toggle:e,shown:t}=(0,P.M)();return(0,u.jsx)("button",{onClick:e,"aria-label":(0,l.T)({id:"theme.docs.sidebar.toggleSidebarButtonAriaLabel",message:"Toggle navigation bar",description:"The ARIA label for hamburger menu button of mobile navigation"}),"aria-expanded":t,className:"navbar__toggle clean-btn",type:"button",children:(0,u.jsx)(dt,{})})}const ft={colorModeToggle:"colorModeToggle_DEke"};function ht(e){let{items:t}=e;return(0,u.jsx)(u.Fragment,{children:t.map(((e,t)=>(0,u.jsx)(ct,{onError:t=>new Error(`A theme navbar item failed to render.\nPlease double-check the following navbar item (themeConfig.navbar.items) of your Docusaurus config:\n${JSON.stringify(e,null,2)}`,{cause:t}),children:(0,u.jsx)(Ze,{...e})},t)))})}function mt(e){let{left:t,right:n}=e;return(0,u.jsxs)("div",{className:"navbar__inner",children:[(0,u.jsx)("div",{className:"navbar__items",children:t}),(0,u.jsx)("div",{className:"navbar__items navbar__items--right",children:n})]})}function gt(){const e=(0,P.M)(),t=(0,x.p)().navbar.items,[n,r]=function(e){function t(e){return"left"===(e.position??ut)}return[e.filter(t),e.filter((e=>!t(e)))]}(t),o=t.find((e=>"search"===e.type));return(0,u.jsx)(mt,{left:(0,u.jsxs)(u.Fragment,{children:[!e.disabled&&(0,u.jsx)(pt,{}),(0,u.jsx)(q,{}),(0,u.jsx)(ht,{items:n})]}),right:(0,u.jsxs)(u.Fragment,{children:[(0,u.jsx)(ht,{items:r}),(0,u.jsx)(W,{className:ft.colorModeToggle}),!o&&(0,u.jsx)(Qe,{children:(0,u.jsx)(Ue,{})})]})})}function bt(){return(0,u.jsx)(ot,{children:(0,u.jsx)(gt,{})})}function yt(e){let{item:t}=e;const{to:n,href:r,label:o,prependBaseUrlToHref:a,...i}=t,s=(0,X.Ay)(n),l=(0,X.Ay)(r,{forcePrependBaseUrl:!0});return(0,u.jsxs)(Z.A,{className:"footer__link-item",...r?{href:a?l:r}:{to:s},...i,children:[o,r&&!(0,J.A)(r)&&(0,u.jsx)(te.A,{})]})}function vt(e){let{item:t}=e;return t.html?(0,u.jsx)("li",{className:"footer__item",dangerouslySetInnerHTML:{__html:t.html}}):(0,u.jsx)("li",{className:"footer__item",children:(0,u.jsx)(yt,{item:t})},t.href??t.to)}function xt(e){let{column:t}=e;return(0,u.jsxs)("div",{className:"col footer__col",children:[(0,u.jsx)("div",{className:"footer__title",children:t.title}),(0,u.jsx)("ul",{className:"footer__items clean-list",children:t.items.map(((e,t)=>(0,u.jsx)(vt,{item:e},t)))})]})}function wt(e){let{columns:t}=e;return(0,u.jsx)("div",{className:"row footer__links",children:t.map(((e,t)=>(0,u.jsx)(xt,{column:e},t)))})}function St(){return(0,u.jsx)("span",{className:"footer__link-separator",children:"\xb7"})}function kt(e){let{item:t}=e;return t.html?(0,u.jsx)("span",{className:"footer__link-item",dangerouslySetInnerHTML:{__html:t.html}}):(0,u.jsx)(yt,{item:t})}function _t(e){let{links:t}=e;return(0,u.jsx)("div",{className:"footer__links text--center",children:(0,u.jsx)("div",{className:"footer__links",children:t.map(((e,n)=>(0,u.jsxs)(r.Fragment,{children:[(0,u.jsx)(kt,{item:e}),t.length!==n+1&&(0,u.jsx)(St,{})]},n)))})})}function Et(e){let{links:t}=e;return function(e){return"title"in e[0]}(t)?(0,u.jsx)(wt,{columns:t}):(0,u.jsx)(_t,{links:t})}var Ct=n(1122);const At={footerLogoLink:"footerLogoLink_BH7S"};function Tt(e){let{logo:t}=e;const{withBaseUrl:n}=(0,X.hH)(),r={light:n(t.src),dark:n(t.srcDark??t.src)};return(0,u.jsx)(Ct.A,{className:(0,o.A)("footer__logo",t.className),alt:t.alt,sources:r,width:t.width,height:t.height,style:t.style})}function Pt(e){let{logo:t}=e;return t.href?(0,u.jsx)(Z.A,{href:t.href,className:At.footerLogoLink,target:t.target,children:(0,u.jsx)(Tt,{logo:t})}):(0,u.jsx)(Tt,{logo:t})}function Lt(e){let{copyright:t}=e;return(0,u.jsx)("div",{className:"footer__copyright",dangerouslySetInnerHTML:{__html:t}})}function Ot(e){let{style:t,links:n,logo:r,copyright:a}=e;return(0,u.jsx)("footer",{className:(0,o.A)("footer",{"footer--dark":"dark"===t}),children:(0,u.jsxs)("div",{className:"container container-fluid",children:[n,(r||a)&&(0,u.jsxs)("div",{className:"footer__bottom text--center",children:[r&&(0,u.jsx)("div",{className:"margin-bottom--sm",children:r}),a]})]})})}function Nt(){const{footer:e}=(0,x.p)();if(!e)return null;const{copyright:t,links:n,logo:r,style:o}=e;return(0,u.jsx)(Ot,{style:o,links:n&&n.length>0&&(0,u.jsx)(Et,{links:n}),logo:r&&(0,u.jsx)(Pt,{logo:r}),copyright:t&&(0,u.jsx)(Lt,{copyright:t})})}const jt=r.memo(Nt),Rt=(0,O.fM)([z.a,w.o,L.Tv,qe.VQ,i.Jx,function(e){let{children:t}=e;return(0,u.jsx)(N.y_,{children:(0,u.jsx)(P.e,{children:(0,u.jsx)(R,{children:t})})})}]);function It(e){let{children:t}=e;return(0,u.jsx)(Rt,{children:t})}var Ft=n(1107);function Mt(e){let{error:t,tryAgain:n}=e;return(0,u.jsx)("main",{className:"container margin-vert--xl",children:(0,u.jsx)("div",{className:"row",children:(0,u.jsxs)("div",{className:"col col--6 col--offset-3",children:[(0,u.jsx)(Ft.A,{as:"h1",className:"hero__title",children:(0,u.jsx)(l.A,{id:"theme.ErrorPageContent.title",description:"The title of the fallback page when the page crashed",children:"This page crashed."})}),(0,u.jsx)("div",{className:"margin-vert--lg",children:(0,u.jsx)(st,{onClick:n,className:"button button--primary shadow--lw"})}),(0,u.jsx)("hr",{}),(0,u.jsx)("div",{className:"margin-vert--md",children:(0,u.jsx)(lt,{error:t})})]})})})}const zt={mainWrapper:"mainWrapper_z2l0"};function Dt(e){const{children:t,noFooter:n,wrapperClassName:r,title:s,description:l}=e;return(0,b.J)(),(0,u.jsxs)(It,{children:[(0,u.jsx)(i.be,{title:s,description:l}),(0,u.jsx)(v,{}),(0,u.jsx)(T,{}),(0,u.jsx)(bt,{}),(0,u.jsx)("div",{id:d,className:(0,o.A)(g.G.wrapper.main,zt.mainWrapper,r),children:(0,u.jsx)(a.A,{fallback:e=>(0,u.jsx)(Mt,{...e}),children:t})}),!n&&(0,u.jsx)(jt,{})]})}},3465:(e,t,n)=>{"use strict";n.d(t,{A:()=>u});n(6540);var r=n(8774),o=n(6025),a=n(4586),i=n(6342),s=n(1122),l=n(4848);function c(e){let{logo:t,alt:n,imageClassName:r}=e;const a={light:(0,o.Ay)(t.src),dark:(0,o.Ay)(t.srcDark||t.src)},i=(0,l.jsx)(s.A,{className:t.className,sources:a,height:t.height,width:t.width,alt:n,style:t.style});return r?(0,l.jsx)("div",{className:r,children:i}):i}function u(e){const{siteConfig:{title:t}}=(0,a.A)(),{navbar:{title:n,logo:s}}=(0,i.p)(),{imageClassName:u,titleClassName:d,...p}=e,f=(0,o.Ay)(s?.href||"/"),h=n?"":t,m=s?.alt??h;return(0,l.jsxs)(r.A,{to:f,...p,...s?.target&&{target:s.target},children:[s&&(0,l.jsx)(c,{logo:s,alt:m,imageClassName:u}),null!=n&&(0,l.jsx)("b",{className:d,children:n})]})}},1463:(e,t,n)=>{"use strict";n.d(t,{A:()=>a});n(6540);var r=n(5260),o=n(4848);function a(e){let{locale:t,version:n,tag:a}=e;const i=t;return(0,o.jsxs)(r.A,{children:[t&&(0,o.jsx)("meta",{name:"docusaurus_locale",content:t}),n&&(0,o.jsx)("meta",{name:"docusaurus_version",content:n}),a&&(0,o.jsx)("meta",{name:"docusaurus_tag",content:a}),i&&(0,o.jsx)("meta",{name:"docsearch:language",content:i}),n&&(0,o.jsx)("meta",{name:"docsearch:version",content:n}),a&&(0,o.jsx)("meta",{name:"docsearch:docusaurus_tag",content:a})]})}},1122:(e,t,n)=>{"use strict";n.d(t,{A:()=>u});var r=n(6540),o=n(4164),a=n(2303),i=n(5293);const s={themedComponent:"themedComponent_mlkZ","themedComponent--light":"themedComponent--light_NVdE","themedComponent--dark":"themedComponent--dark_xIcU"};var l=n(4848);function c(e){let{className:t,children:n}=e;const c=(0,a.A)(),{colorMode:u}=(0,i.G)();return(0,l.jsx)(l.Fragment,{children:(c?"dark"===u?["dark"]:["light"]:["light","dark"]).map((e=>{const a=n({theme:e,className:(0,o.A)(t,s.themedComponent,s[`themedComponent--${e}`])});return(0,l.jsx)(r.Fragment,{children:a},e)}))})}function u(e){const{sources:t,className:n,alt:r,...o}=e;return(0,l.jsx)(c,{className:n,children:e=>{let{theme:n,className:a}=e;return(0,l.jsx)("img",{src:t[n],alt:r,className:a,...o})}})}},1422:(e,t,n)=>{"use strict";n.d(t,{N:()=>b,u:()=>c});var r=n(6540),o=n(8193),a=n(205),i=n(3109),s=n(4848);const l="ease-in-out";function c(e){let{initialState:t}=e;const[n,o]=(0,r.useState)(t??!1),a=(0,r.useCallback)((()=>{o((e=>!e))}),[]);return{collapsed:n,setCollapsed:o,toggleCollapsed:a}}const u={display:"none",overflow:"hidden",height:"0px"},d={display:"block",overflow:"visible",height:"auto"};function p(e,t){const n=t?u:d;e.style.display=n.display,e.style.overflow=n.overflow,e.style.height=n.height}function f(e){let{collapsibleRef:t,collapsed:n,animation:o}=e;const a=(0,r.useRef)(!1);(0,r.useEffect)((()=>{const e=t.current;function r(){const t=e.scrollHeight,n=o?.duration??function(e){if((0,i.O)())return 1;const t=e/36;return Math.round(10*(4+15*t**.25+t/5))}(t);return{transition:`height ${n}ms ${o?.easing??l}`,height:`${t}px`}}function s(){const t=r();e.style.transition=t.transition,e.style.height=t.height}if(!a.current)return p(e,n),void(a.current=!0);return e.style.willChange="height",function(){const t=requestAnimationFrame((()=>{n?(s(),requestAnimationFrame((()=>{e.style.height=u.height,e.style.overflow=u.overflow}))):(e.style.display="block",requestAnimationFrame((()=>{s()})))}));return()=>cancelAnimationFrame(t)}()}),[t,n,o])}function h(e){if(!o.A.canUseDOM)return e?u:d}function m(e){let{as:t="div",collapsed:n,children:o,animation:a,onCollapseTransitionEnd:i,className:l,disableSSRStyle:c}=e;const u=(0,r.useRef)(null);return f({collapsibleRef:u,collapsed:n,animation:a}),(0,s.jsx)(t,{ref:u,style:c?void 0:h(n),onTransitionEnd:e=>{"height"===e.propertyName&&(p(u.current,n),i?.(n))},className:l,children:o})}function g(e){let{collapsed:t,...n}=e;const[o,i]=(0,r.useState)(!t),[l,c]=(0,r.useState)(t);return(0,a.A)((()=>{t||i(!0)}),[t]),(0,a.A)((()=>{o&&c(t)}),[o,t]),o?(0,s.jsx)(m,{...n,collapsed:l}):null}function b(e){let{lazy:t,...n}=e;const r=t?g:m;return(0,s.jsx)(r,{...n})}},5041:(e,t,n)=>{"use strict";n.d(t,{M:()=>m,o:()=>h});var r=n(6540),o=n(2303),a=n(679),i=n(9532),s=n(6342),l=n(4848);const c=(0,a.Wf)("docusaurus.announcement.dismiss"),u=(0,a.Wf)("docusaurus.announcement.id"),d=()=>"true"===c.get(),p=e=>c.set(String(e)),f=r.createContext(null);function h(e){let{children:t}=e;const n=function(){const{announcementBar:e}=(0,s.p)(),t=(0,o.A)(),[n,a]=(0,r.useState)((()=>!!t&&d()));(0,r.useEffect)((()=>{a(d())}),[]);const i=(0,r.useCallback)((()=>{p(!0),a(!0)}),[]);return(0,r.useEffect)((()=>{if(!e)return;const{id:t}=e;let n=u.get();"annoucement-bar"===n&&(n="announcement-bar");const r=t!==n;u.set(t),r&&p(!1),!r&&d()||a(!1)}),[e]),(0,r.useMemo)((()=>({isActive:!!e&&!n,close:i})),[e,n,i])}();return(0,l.jsx)(f.Provider,{value:n,children:t})}function m(){const e=(0,r.useContext)(f);if(!e)throw new i.dV("AnnouncementBarProvider");return e}},5293:(e,t,n)=>{"use strict";n.d(t,{G:()=>b,a:()=>g});var r=n(6540),o=n(8193),a=n(9532),i=n(679),s=n(6342),l=n(4848);const c=r.createContext(void 0),u="theme",d=(0,i.Wf)(u),p={light:"light",dark:"dark"},f=e=>e===p.dark?p.dark:p.light,h=e=>o.A.canUseDOM?f(document.documentElement.getAttribute("data-theme")):f(e),m=e=>{d.set(f(e))};function g(e){let{children:t}=e;const n=function(){const{colorMode:{defaultMode:e,disableSwitch:t,respectPrefersColorScheme:n}}=(0,s.p)(),[o,a]=(0,r.useState)(h(e));(0,r.useEffect)((()=>{t&&d.del()}),[t]);const i=(0,r.useCallback)((function(t,r){void 0===r&&(r={});const{persist:o=!0}=r;t?(a(t),o&&m(t)):(a(n?window.matchMedia("(prefers-color-scheme: dark)").matches?p.dark:p.light:e),d.del())}),[n,e]);(0,r.useEffect)((()=>{document.documentElement.setAttribute("data-theme",f(o))}),[o]),(0,r.useEffect)((()=>{if(t)return;const e=e=>{if(e.key!==u)return;const t=d.get();null!==t&&i(f(t))};return window.addEventListener("storage",e),()=>window.removeEventListener("storage",e)}),[t,i]);const l=(0,r.useRef)(!1);return(0,r.useEffect)((()=>{if(t&&!n)return;const e=window.matchMedia("(prefers-color-scheme: dark)"),r=()=>{window.matchMedia("print").matches||l.current?l.current=window.matchMedia("print").matches:i(null)};return e.addListener(r),()=>e.removeListener(r)}),[i,t,n]),(0,r.useMemo)((()=>({colorMode:o,setColorMode:i,get isDarkTheme(){return o===p.dark},setLightTheme(){i(p.light)},setDarkTheme(){i(p.dark)}})),[o,i])}();return(0,l.jsx)(c.Provider,{value:n,children:t})}function b(){const e=(0,r.useContext)(c);if(null==e)throw new a.dV("ColorModeProvider","Please see https://docusaurus.io/docs/api/themes/configuration#use-color-mode.");return e}},2069:(e,t,n)=>{"use strict";n.d(t,{M:()=>f,e:()=>p});var r=n(6540),o=n(5600),a=n(4581),i=n(7485),s=n(6342),l=n(9532),c=n(4848);const u=r.createContext(void 0);function d(){const e=function(){const e=(0,o.YL)(),{items:t}=(0,s.p)().navbar;return 0===t.length&&!e.component}(),t=(0,a.l)(),n=!e&&"mobile"===t,[l,c]=(0,r.useState)(!1);(0,i.$Z)((()=>{if(l)return c(!1),!1}));const u=(0,r.useCallback)((()=>{c((e=>!e))}),[]);return(0,r.useEffect)((()=>{"desktop"===t&&c(!1)}),[t]),(0,r.useMemo)((()=>({disabled:e,shouldRender:n,toggle:u,shown:l})),[e,n,u,l])}function p(e){let{children:t}=e;const n=d();return(0,c.jsx)(u.Provider,{value:n,children:t})}function f(){const e=r.useContext(u);if(void 0===e)throw new l.dV("NavbarMobileSidebarProvider");return e}},5600:(e,t,n)=>{"use strict";n.d(t,{GX:()=>c,YL:()=>l,y_:()=>s});var r=n(6540),o=n(9532),a=n(4848);const i=r.createContext(null);function s(e){let{children:t}=e;const n=(0,r.useState)({component:null,props:null});return(0,a.jsx)(i.Provider,{value:n,children:t})}function l(){const e=(0,r.useContext)(i);if(!e)throw new o.dV("NavbarSecondaryMenuContentProvider");return e[0]}function c(e){let{component:t,props:n}=e;const a=(0,r.useContext)(i);if(!a)throw new o.dV("NavbarSecondaryMenuContentProvider");const[,s]=a,l=(0,o.Be)(n);return(0,r.useEffect)((()=>{s({component:t,props:l})}),[s,t,l]),(0,r.useEffect)((()=>()=>s({component:null,props:null})),[s]),null}},4090:(e,t,n)=>{"use strict";n.d(t,{w:()=>o,J:()=>a});var r=n(6540);const o="navigation-with-keyboard";function a(){(0,r.useEffect)((()=>{function e(e){"keydown"===e.type&&"Tab"===e.key&&document.body.classList.add(o),"mousedown"===e.type&&document.body.classList.remove(o)}return document.addEventListener("keydown",e),document.addEventListener("mousedown",e),()=>{document.body.classList.remove(o),document.removeEventListener("keydown",e),document.removeEventListener("mousedown",e)}}),[])}},4581:(e,t,n)=>{"use strict";n.d(t,{l:()=>s});var r=n(6540),o=n(8193);const a={desktop:"desktop",mobile:"mobile",ssr:"ssr"},i=996;function s(e){let{desktopBreakpoint:t=i}=void 0===e?{}:e;const[n,s]=(0,r.useState)((()=>"ssr"));return(0,r.useEffect)((()=>{function e(){s(function(e){if(!o.A.canUseDOM)throw new Error("getWindowSize() should only be called after React hydration");return window.innerWidth>e?a.desktop:a.mobile}(t))}return e(),window.addEventListener("resize",e),()=>{window.removeEventListener("resize",e)}}),[t]),n}},7559:(e,t,n)=>{"use strict";n.d(t,{G:()=>r});const r={page:{blogListPage:"blog-list-page",blogPostPage:"blog-post-page",blogTagsListPage:"blog-tags-list-page",blogTagPostListPage:"blog-tags-post-list-page",blogAuthorsListPage:"blog-authors-list-page",blogAuthorsPostsPage:"blog-authors-posts-page",docsDocPage:"docs-doc-page",docsTagsListPage:"docs-tags-list-page",docsTagDocListPage:"docs-tags-doc-list-page",mdxPage:"mdx-page"},wrapper:{main:"main-wrapper",blogPages:"blog-wrapper",docsPages:"docs-wrapper",mdxPages:"mdx-wrapper"},common:{editThisPage:"theme-edit-this-page",lastUpdated:"theme-last-updated",backToTopButton:"theme-back-to-top-button",codeBlock:"theme-code-block",admonition:"theme-admonition",unlistedBanner:"theme-unlisted-banner",draftBanner:"theme-draft-banner",admonitionType:e=>`theme-admonition-${e}`},layout:{},docs:{docVersionBanner:"theme-doc-version-banner",docVersionBadge:"theme-doc-version-badge",docBreadcrumbs:"theme-doc-breadcrumbs",docMarkdown:"theme-doc-markdown",docTocMobile:"theme-doc-toc-mobile",docTocDesktop:"theme-doc-toc-desktop",docFooter:"theme-doc-footer",docFooterTagsRow:"theme-doc-footer-tags-row",docFooterEditMetaRow:"theme-doc-footer-edit-meta-row",docSidebarContainer:"theme-doc-sidebar-container",docSidebarMenu:"theme-doc-sidebar-menu",docSidebarItemCategory:"theme-doc-sidebar-item-category",docSidebarItemLink:"theme-doc-sidebar-item-link",docSidebarItemCategoryLevel:e=>`theme-doc-sidebar-item-category-level-${e}`,docSidebarItemLinkLevel:e=>`theme-doc-sidebar-item-link-level-${e}`},blog:{blogFooterTagsRow:"theme-blog-footer-tags-row",blogFooterEditMetaRow:"theme-blog-footer-edit-meta-row"},pages:{pageFooterEditMetaRow:"theme-pages-footer-edit-meta-row"}}},3109:(e,t,n)=>{"use strict";function r(){return window.matchMedia("(prefers-reduced-motion: reduce)").matches}n.d(t,{O:()=>r})},7485:(e,t,n)=>{"use strict";n.d(t,{$Z:()=>i,aZ:()=>l});var r=n(6540),o=n(6347),a=n(9532);function i(e){!function(e){const t=(0,o.W6)(),n=(0,a._q)(e);(0,r.useEffect)((()=>t.block(((e,t)=>n(e,t)))),[t,n])}(((t,n)=>{if("POP"===n)return e(t,n)}))}function s(e){const t=(0,o.W6)();return(0,r.useSyncExternalStore)(t.listen,(()=>e(t)),(()=>e(t)))}function l(e){return s((t=>null===e?null:new URLSearchParams(t.location.search).get(e)))}},1682:(e,t,n)=>{"use strict";function r(e,t){return void 0===t&&(t=(e,t)=>e===t),e.filter(((n,r)=>e.findIndex((e=>t(e,n)))!==r))}function o(e){return Array.from(new Set(e))}function a(e,t){const n={};let r=0;for(const o of e){const e=t(o,r);n[e]??=[],n[e].push(o),r+=1}return n}n.d(t,{$z:()=>a,XI:()=>r,sb:()=>o})},1213:(e,t,n)=>{"use strict";n.d(t,{e3:()=>p,be:()=>u,Jx:()=>f});var r=n(6540),o=n(4164),a=n(5260),i=n(6803),s=n(6025),l=n(4586);var c=n(4848);function u(e){let{title:t,description:n,keywords:r,image:o,children:i}=e;const u=function(e){const{siteConfig:t}=(0,l.A)(),{title:n,titleDelimiter:r}=t;return e?.trim().length?`${e.trim()} ${r} ${n}`:n}(t),{withBaseUrl:d}=(0,s.hH)(),p=o?d(o,{absolute:!0}):void 0;return(0,c.jsxs)(a.A,{children:[t&&(0,c.jsx)("title",{children:u}),t&&(0,c.jsx)("meta",{property:"og:title",content:u}),n&&(0,c.jsx)("meta",{name:"description",content:n}),n&&(0,c.jsx)("meta",{property:"og:description",content:n}),r&&(0,c.jsx)("meta",{name:"keywords",content:Array.isArray(r)?r.join(","):r}),p&&(0,c.jsx)("meta",{property:"og:image",content:p}),p&&(0,c.jsx)("meta",{name:"twitter:image",content:p}),i]})}const d=r.createContext(void 0);function p(e){let{className:t,children:n}=e;const i=r.useContext(d),s=(0,o.A)(i,t);return(0,c.jsxs)(d.Provider,{value:s,children:[(0,c.jsx)(a.A,{children:(0,c.jsx)("html",{className:s})}),n]})}function f(e){let{children:t}=e;const n=(0,i.A)(),r=`plugin-${n.plugin.name.replace(/docusaurus-(?:plugin|theme)-(?:content-)?/gi,"")}`;const a=`plugin-id-${n.plugin.id}`;return(0,c.jsx)(p,{className:(0,o.A)(r,a),children:t})}},9532:(e,t,n)=>{"use strict";n.d(t,{Be:()=>c,ZC:()=>s,_q:()=>i,dV:()=>l,fM:()=>u});var r=n(6540),o=n(205),a=n(4848);function i(e){const t=(0,r.useRef)(e);return(0,o.A)((()=>{t.current=e}),[e]),(0,r.useCallback)((function(){return t.current(...arguments)}),[])}function s(e){const t=(0,r.useRef)();return(0,o.A)((()=>{t.current=e})),t.current}class l extends Error{constructor(e,t){super(),this.name="ReactContextError",this.message=`Hook ${this.stack?.split("\n")[1]?.match(/at (?:\w+\.)?(?\w+)/)?.groups.name??""} is called outside the <${e}>. ${t??""}`}}function c(e){const t=Object.entries(e);return t.sort(((e,t)=>e[0].localeCompare(t[0]))),(0,r.useMemo)((()=>e),t.flat())}function u(e){return t=>{let{children:n}=t;return(0,a.jsx)(a.Fragment,{children:e.reduceRight(((e,t)=>(0,a.jsx)(t,{children:e})),n)})}}},9169:(e,t,n)=>{"use strict";n.d(t,{Dt:()=>s,ys:()=>i});var r=n(6540),o=n(8328),a=n(4586);function i(e,t){const n=e=>(!e||e.endsWith("/")?e:`${e}/`)?.toLowerCase();return n(e)===n(t)}function s(){const{baseUrl:e}=(0,a.A)().siteConfig;return(0,r.useMemo)((()=>function(e){let{baseUrl:t,routes:n}=e;function r(e){return e.path===t&&!0===e.exact}function o(e){return e.path===t&&!e.exact}return function e(t){if(0===t.length)return;return t.find(r)||e(t.filter(o).flatMap((e=>e.routes??[])))}(n)}({routes:o.A,baseUrl:e})),[e])}},3104:(e,t,n)=>{"use strict";n.d(t,{Mq:()=>f,Tv:()=>u,a_:()=>h,gk:()=>m});var r=n(6540),o=n(8193),a=n(2303),i=n(205),s=n(9532),l=n(4848);const c=r.createContext(void 0);function u(e){let{children:t}=e;const n=function(){const e=(0,r.useRef)(!0);return(0,r.useMemo)((()=>({scrollEventsEnabledRef:e,enableScrollEvents:()=>{e.current=!0},disableScrollEvents:()=>{e.current=!1}})),[])}();return(0,l.jsx)(c.Provider,{value:n,children:t})}function d(){const e=(0,r.useContext)(c);if(null==e)throw new s.dV("ScrollControllerProvider");return e}const p=()=>o.A.canUseDOM?{scrollX:window.pageXOffset,scrollY:window.pageYOffset}:null;function f(e,t){void 0===t&&(t=[]);const{scrollEventsEnabledRef:n}=d(),o=(0,r.useRef)(p()),a=(0,s._q)(e);(0,r.useEffect)((()=>{const e=()=>{if(!n.current)return;const e=p();a(e,o.current),o.current=e},t={passive:!0};return e(),window.addEventListener("scroll",e,t),()=>window.removeEventListener("scroll",e,t)}),[a,n,...t])}function h(){const e=d(),t=function(){const e=(0,r.useRef)({elem:null,top:0}),t=(0,r.useCallback)((t=>{e.current={elem:t,top:t.getBoundingClientRect().top}}),[]),n=(0,r.useCallback)((()=>{const{current:{elem:t,top:n}}=e;if(!t)return{restored:!1};const r=t.getBoundingClientRect().top-n;return r&&window.scrollBy({left:0,top:r}),e.current={elem:null,top:0},{restored:0!==r}}),[]);return(0,r.useMemo)((()=>({save:t,restore:n})),[n,t])}(),n=(0,r.useRef)(void 0),o=(0,r.useCallback)((r=>{t.save(r),e.disableScrollEvents(),n.current=()=>{const{restored:r}=t.restore();if(n.current=void 0,r){const t=()=>{e.enableScrollEvents(),window.removeEventListener("scroll",t)};window.addEventListener("scroll",t)}else e.enableScrollEvents()}}),[e,t]);return(0,i.A)((()=>{queueMicrotask((()=>n.current?.()))})),{blockElementScrollPositionUntilNextRender:o}}function m(){const e=(0,r.useRef)(null),t=(0,a.A)()&&"smooth"===getComputedStyle(document.documentElement).scrollBehavior;return{startScroll:n=>{e.current=t?function(e){return window.scrollTo({top:e,behavior:"smooth"}),()=>{}}(n):function(e){let t=null;const n=document.documentElement.scrollTop>e;return function r(){const o=document.documentElement.scrollTop;(n&&o>e||!n&&ot&&cancelAnimationFrame(t)}(n)},cancelScroll:()=>e.current?.()}}},679:(e,t,n)=>{"use strict";n.d(t,{Wf:()=>u,Dv:()=>d});var r=n(6540);const o=JSON.parse('{"N":"localStorage","M":""}'),a=o.N;function i(e){let{key:t,oldValue:n,newValue:r,storage:o}=e;if(n===r)return;const a=document.createEvent("StorageEvent");a.initStorageEvent("storage",!1,!1,t,n,r,window.location.href,o),window.dispatchEvent(a)}function s(e){if(void 0===e&&(e=a),"undefined"==typeof window)throw new Error("Browser storage is not available on Node.js/Docusaurus SSR process.");if("none"===e)return null;try{return window[e]}catch(n){return t=n,l||(console.warn("Docusaurus browser storage is not available.\nPossible reasons: running Docusaurus in an iframe, in an incognito browser session, or using too strict browser privacy settings.",t),l=!0),null}var t}let l=!1;const c={get:()=>null,set:()=>{},del:()=>{},listen:()=>()=>{}};function u(e,t){const n=`${e}${o.M}`;if("undefined"==typeof window)return function(e){function t(){throw new Error(`Illegal storage API usage for storage key "${e}".\nDocusaurus storage APIs are not supposed to be called on the server-rendering process.\nPlease only call storage APIs in effects and event handlers.`)}return{get:t,set:t,del:t,listen:t}}(n);const r=s(t?.persistence);return null===r?c:{get:()=>{try{return r.getItem(n)}catch(e){return console.error(`Docusaurus storage error, can't get key=${n}`,e),null}},set:e=>{try{const t=r.getItem(n);r.setItem(n,e),i({key:n,oldValue:t,newValue:e,storage:r})}catch(t){console.error(`Docusaurus storage error, can't set ${n}=${e}`,t)}},del:()=>{try{const e=r.getItem(n);r.removeItem(n),i({key:n,oldValue:e,newValue:null,storage:r})}catch(e){console.error(`Docusaurus storage error, can't delete key=${n}`,e)}},listen:e=>{try{const t=t=>{t.storageArea===r&&t.key===n&&e(t)};return window.addEventListener("storage",t),()=>window.removeEventListener("storage",t)}catch(t){return console.error(`Docusaurus storage error, can't listen for changes of key=${n}`,t),()=>{}}}}}function d(e,t){const n=(0,r.useRef)((()=>null===e?c:u(e,t))).current(),o=(0,r.useCallback)((e=>"undefined"==typeof window?()=>{}:n.listen(e)),[n]);return[(0,r.useSyncExternalStore)(o,(()=>"undefined"==typeof window?null:n.get()),(()=>null)),n]}},2131:(e,t,n)=>{"use strict";n.d(t,{o:()=>i});var r=n(4586),o=n(6347),a=n(440);function i(){const{siteConfig:{baseUrl:e,url:t,trailingSlash:n},i18n:{defaultLocale:i,currentLocale:s}}=(0,r.A)(),{pathname:l}=(0,o.zy)(),c=(0,a.Ks)(l,{trailingSlash:n,baseUrl:e}),u=s===i?e:e.replace(`/${s}/`,"/"),d=c.replace(e,"");return{createUrl:function(e){let{locale:n,fullyQualified:r}=e;return`${r?t:""}${function(e){return e===i?`${u}`:`${u}${e}/`}(n)}${d}`}}}},5062:(e,t,n)=>{"use strict";n.d(t,{$:()=>i});var r=n(6540),o=n(6347),a=n(9532);function i(e){const t=(0,o.zy)(),n=(0,a.ZC)(t),i=(0,a._q)(e);(0,r.useEffect)((()=>{n&&t!==n&&i({location:t,previousLocation:n})}),[i,t,n])}},6342:(e,t,n)=>{"use strict";n.d(t,{p:()=>o});var r=n(4586);function o(){return(0,r.A)().siteConfig.themeConfig}},2983:(e,t,n)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.addTrailingSlash=o,t.default=function(e,t){const{trailingSlash:n,baseUrl:r}=t;if(e.startsWith("#"))return e;if(void 0===n)return e;const[i]=e.split(/[#?]/),s="/"===i||i===r?i:(l=i,c=n,c?o(l):a(l));var l,c;return e.replace(i,s)},t.addLeadingSlash=function(e){return(0,r.addPrefix)(e,"/")},t.removeTrailingSlash=a;const r=n(2566);function o(e){return e.endsWith("/")?e:`${e}/`}function a(e){return(0,r.removeSuffix)(e,"/")}},253:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.getErrorCausalChain=function e(t){if(t.cause)return[t,...e(t.cause)];return[t]}},440:(e,t,n)=>{"use strict";t.rA=t.Ks=t.LU=void 0;const r=n(1635);t.LU="__blog-post-container";var o=n(2983);Object.defineProperty(t,"Ks",{enumerable:!0,get:function(){return r.__importDefault(o).default}});var a=n(2566);var i=n(253);Object.defineProperty(t,"rA",{enumerable:!0,get:function(){return i.getErrorCausalChain}})},2566:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.addPrefix=function(e,t){return e.startsWith(t)?e:`${t}${e}`},t.removeSuffix=function(e,t){if(""===t)return e;return e.endsWith(t)?e.slice(0,-t.length):e},t.addSuffix=function(e,t){return e.endsWith(t)?e:`${e}${t}`},t.removePrefix=function(e,t){return e.startsWith(t)?e.slice(t.length):e}},2849:(e,t,n)=>{"use strict";n.d(t,{A:()=>i});n(6540);var r=n(5391);const o={loadingRing:"loadingRing_RJI3","loading-ring":"loading-ring_FB5o"};var a=n(4848);function i(e){let{className:t}=e;return(0,a.jsxs)("div",{className:(0,r.A)(o.loadingRing,t),children:[(0,a.jsx)("div",{}),(0,a.jsx)("div",{}),(0,a.jsx)("div",{}),(0,a.jsx)("div",{})]})}},5891:(e,t,n)=>{"use strict";n.d(t,{Z:()=>s});var r=n(8291),o=n.n(r),a=n(1088);const i=new Map;function s(e,t){const n=`${e}${t}`;let r=i.get(n);return r||(r=async function(e,t){{const n=`${e}${a.IH.replace("{dir}",t?`-${t.replace(/\//g,"-")}`:"")}`;if(new URL(n,location.origin).origin!==location.origin)throw new Error("Unexpected version url");const r=await(await fetch(n)).json(),i=r.map(((e,t)=>{let{documents:n,index:r}=e;return{type:t,documents:n,index:o().Index.load(r)}})),s=r.reduce(((e,t)=>{for(const n of t.index.invertedIndex)/\p{Unified_Ideograph}/u.test(n[0][0])&&e.add(n[0]);return e}),new Set);return{wrappedIndexes:i,zhDictionary:Array.from(s)}}return{wrappedIndexes:[],zhDictionary:[]}}(e,t),i.set(n,r)),r}},2384:(e,t,n)=>{"use strict";n.d(t,{m:()=>l});var r=n(8291),o=n.n(r);var a=n(1088);function i(e){return s(e).concat(s(e.filter((e=>{const t=e[e.length-1];return!t.trailing&&t.maybeTyping})),!0))}function s(e,t){return e.map((e=>({tokens:e.map((e=>e.value)),term:e.map((e=>({value:e.value,presence:o().Query.presence.REQUIRED,wildcard:(t?e.trailing||e.maybeTyping:e.trailing)?o().Query.wildcard.TRAILING:o().Query.wildcard.NONE})))})))}function l(e,t,n){return function(r,s){const l=function(e,t){if(1===t.length&&["ja","jp","th"].includes(t[0]))return o()[t[0]].tokenizer(e).map((e=>e.toString()));let n=/[^-\s]+/g;return t.includes("zh")&&(n=/\w+|\p{Unified_Ideograph}+/gu),e.toLowerCase().match(n)||[]}(r,a.BH);if(0===l.length)return void s([]);const c=function(e,t){const n=function(e,t){const n=[];return function e(r,o){if(0===r.length)return void n.push(o);const a=r[0];if(/\p{Unified_Ideograph}/u.test(a)){const n=function(e,t){const n=[];return function e(r,o){let a=0,i=!1;for(const s of t)if(r.substr(0,s.length)===s){const t={missed:o.missed,term:o.term.concat({value:s})};r.length>s.length?e(r.substr(s.length),t):n.push(t),i=!0}else for(let t=s.length-1;t>a;t-=1){const l=s.substr(0,t);if(r.substr(0,t)===l){a=t;const s={missed:o.missed,term:o.term.concat({value:l,trailing:!0})};r.length>t?e(r.substr(t),s):n.push(s),i=!0;break}}i||(r.length>0?e(r.substr(1),{missed:o.missed+1,term:o.term}):o.term.length>0&&n.push(o))}(e,{missed:0,term:[]}),n.sort(((e,t)=>{const n=e.missed>0?1:0,r=t.missed>0?1:0;return n!==r?n-r:e.term.length-t.term.length})).map((e=>e.term))}(a,t);for(const t of n){const n=o.concat(...t);e(r.slice(1),n)}}else{const t=o.concat({value:a});e(r.slice(1),t)}}(e,[]),n}(e,t);if(0===n.length)return[{tokens:e,term:e.map((e=>({value:e,presence:o().Query.presence.REQUIRED,wildcard:o().Query.wildcard.LEADING|o().Query.wildcard.TRAILING})))}];for(const o of n)o[o.length-1].maybeTyping=!0;const r=[];for(const i of a.BH)if("en"===i)a.sx||r.unshift(o().stopWordFilter);else{const e=o()[i];e.stopWordFilter&&r.unshift(e.stopWordFilter)}let s;if(r.length>0){const e=e=>r.reduce(((e,t)=>e.filter((e=>t(e.value)))),e);s=[];const t=[];for(const r of n){const n=e(r);s.push(n),n.length0&&t.push(n)}n.push(...t)}else s=n.slice();const l=[];for(const o of s)if(o.length>2)for(let e=o.length-1;e>=0;e-=1)l.push(o.slice(0,e).concat(o.slice(e+1)));return i(n).concat(i(l))}(l,t),u=[];e:for(const{term:t,tokens:o}of c)for(const{documents:r,index:a,type:i}of e)if(u.push(...a.query((e=>{for(const n of t)e.term(n.value,{wildcard:n.wildcard,presence:n.presence})})).slice(0,n).filter((e=>!u.some((t=>t.document.i.toString()===e.ref)))).slice(0,n-u.length).map((t=>{const n=r.find((e=>e.i.toString()===t.ref));return{document:n,type:i,page:0!==i&&e[0].documents.find((e=>e.i===n.p)),metadata:t.matchData.metadata,tokens:o,score:t.score}}))),u.length>=n)break e;!function(e){e.forEach(((e,t)=>{e.index=t})),e.sort(((t,n)=>{let r=t.type>0&&t.page?e.findIndex((e=>e.document===t.page)):t.index,o=n.type>0&&n.page?e.findIndex((e=>e.document===n.page)):n.index;return-1===r&&(r=t.index),-1===o&&(o=n.index),r===o?0===t.type?-1:0===n.type?1:t.index-n.index:r-o}))}(u),function(e){e.forEach(((t,n)=>{n>0&&t.page&&e.some((e=>e.document===t.page))&&(n{"use strict";function r(e){return e.join(" \u203a ")}n.d(t,{$:()=>r})},3103:(e,t,n)=>{"use strict";function r(e){return e.replace(/&/g,"&").replace(//g,">").replace(/"/g,""").replace(/'/g,"'")}n.d(t,{Z:()=>r})},7674:(e,t,n)=>{"use strict";function r(e,t){const n=[];for(const r of Object.values(e))r[t]&&n.push(...r[t].position);return n.sort(((e,t)=>e[0]-t[0]||t[1]-e[1]))}n.d(t,{g:()=>r})},6841:(e,t,n)=>{"use strict";n.d(t,{Z:()=>o});var r=n(3103);function o(e,t,n){const a=[];for(const i of t){const n=e.toLowerCase().indexOf(i);if(n>=0){n>0&&a.push(o(e.substr(0,n),t)),a.push(`${(0,r.Z)(e.substr(n,i.length))}`);const s=n+i.length;s${(0,r.Z)(e)}`:(0,r.Z)(e):a.join("")}},3810:(e,t,n)=>{"use strict";n.d(t,{C:()=>l});var r=n(3103),o=n(6841);const a=/\w+|\p{Unified_Ideograph}/u;function i(e){const t=[];let n=0,r=e;for(;r.length>0;){const o=r.match(a);if(!o){t.push(r);break}o.index>0&&t.push(r.substring(0,o.index)),t.push(o[0]),n+=o.index+o[0].length,r=e.substring(n)}return t}var s=n(1088);function l(e,t,n,a){void 0===a&&(a=s.rG);const{chunkIndex:l,chunks:c}=function(e,t,n){const a=[];let s=0,l=0,c=-1;for(;sl){const t=i(e.substring(l,u)).map((e=>({html:(0,r.Z)(e),textLength:e.length})));for(const e of t)a.push(e)}-1===c&&(c=a.length),l=u+d,a.push({html:(0,o.Z)(e.substring(u,l),n,!0),textLength:d})}}if(l({html:(0,r.Z)(e),textLength:e.length})));for(const e of t)a.push(e)}return{chunkIndex:c,chunks:a}}(e,t,n),u=c.slice(0,l),d=c[l],p=[d.html],f=c.slice(l+1);let h=d.textLength,m=0,g=0,b=!1,y=!1;for(;h0){const e=u.pop();h+e.textLength<=a?(p.unshift(e.html),m+=e.textLength,h+=e.textLength):(b=!0,u.length=0)}else{if(!(f.length>0))break;{const e=f.shift();h+e.textLength<=a?(p.push(e.html),g+=e.textLength,h+=e.textLength):(y=!0,f.length=0)}}return(b||u.length>0)&&p.unshift("\u2026"),(y||f.length>0)&&p.push("\u2026"),p.join("")}},3385:(e,t,n)=>{"use strict";function r(e,t){if("string"==typeof e)return{label:e,path:e};{const{label:n,path:r}=e;return"string"==typeof n?{label:n,path:r}:Object.prototype.hasOwnProperty.call(n,t)?{label:n[t],path:r}:{label:r,path:r}}}n.d(t,{p:()=>r})},1088:(e,t,n)=>{"use strict";n.d(t,{CU:()=>a,UB:()=>f,tb:()=>c,O6:()=>g,I$:()=>h,BH:()=>r,sx:()=>o,ZG:()=>p,WW:()=>u,pk:()=>d,Hg:()=>m,IH:()=>i,rG:()=>l,AT:()=>s,dz:()=>b});n(8291);const r=["en"],o=!1,a=null,i="search-index{dir}.json",s=8,l=50,c=!1,u=!0,d=!0,p="right",f=void 0,h=!0,m=null,g=!1,b=!1},1513:(e,t,n)=>{"use strict";n.d(t,{zR:()=>x,TM:()=>C,yJ:()=>f,sC:()=>T,AO:()=>p});var r=n(8168);function o(e){return"/"===e.charAt(0)}function a(e,t){for(var n=t,r=n+1,o=e.length;r=0;p--){var f=i[p];"."===f?a(i,p):".."===f?(a(i,p),d++):d&&(a(i,p),d--)}if(!c)for(;d--;d)i.unshift("..");!c||""===i[0]||i[0]&&o(i[0])||i.unshift("");var h=i.join("/");return n&&"/"!==h.substr(-1)&&(h+="/"),h};var s=n(1561);function l(e){return"/"===e.charAt(0)?e:"/"+e}function c(e){return"/"===e.charAt(0)?e.substr(1):e}function u(e,t){return function(e,t){return 0===e.toLowerCase().indexOf(t.toLowerCase())&&-1!=="/?#".indexOf(e.charAt(t.length))}(e,t)?e.substr(t.length):e}function d(e){return"/"===e.charAt(e.length-1)?e.slice(0,-1):e}function p(e){var t=e.pathname,n=e.search,r=e.hash,o=t||"/";return n&&"?"!==n&&(o+="?"===n.charAt(0)?n:"?"+n),r&&"#"!==r&&(o+="#"===r.charAt(0)?r:"#"+r),o}function f(e,t,n,o){var a;"string"==typeof e?(a=function(e){var t=e||"/",n="",r="",o=t.indexOf("#");-1!==o&&(r=t.substr(o),t=t.substr(0,o));var a=t.indexOf("?");return-1!==a&&(n=t.substr(a),t=t.substr(0,a)),{pathname:t,search:"?"===n?"":n,hash:"#"===r?"":r}}(e),a.state=t):(void 0===(a=(0,r.A)({},e)).pathname&&(a.pathname=""),a.search?"?"!==a.search.charAt(0)&&(a.search="?"+a.search):a.search="",a.hash?"#"!==a.hash.charAt(0)&&(a.hash="#"+a.hash):a.hash="",void 0!==t&&void 0===a.state&&(a.state=t));try{a.pathname=decodeURI(a.pathname)}catch(s){throw s instanceof URIError?new URIError('Pathname "'+a.pathname+'" could not be decoded. This is likely caused by an invalid percent-encoding.'):s}return n&&(a.key=n),o?a.pathname?"/"!==a.pathname.charAt(0)&&(a.pathname=i(a.pathname,o.pathname)):a.pathname=o.pathname:a.pathname||(a.pathname="/"),a}function h(){var e=null;var t=[];return{setPrompt:function(t){return e=t,function(){e===t&&(e=null)}},confirmTransitionTo:function(t,n,r,o){if(null!=e){var a="function"==typeof e?e(t,n):e;"string"==typeof a?"function"==typeof r?r(a,o):o(!0):o(!1!==a)}else o(!0)},appendListener:function(e){var n=!0;function r(){n&&e.apply(void 0,arguments)}return t.push(r),function(){n=!1,t=t.filter((function(e){return e!==r}))}},notifyListeners:function(){for(var e=arguments.length,n=new Array(e),r=0;rt?n.splice(t,n.length-t,o):n.push(o),d({action:r,location:o,index:t,entries:n})}}))},replace:function(e,t){var r="REPLACE",o=f(e,t,m(),x.location);u.confirmTransitionTo(o,r,n,(function(e){e&&(x.entries[x.index]=o,d({action:r,location:o}))}))},go:v,goBack:function(){v(-1)},goForward:function(){v(1)},canGo:function(e){var t=x.index+e;return t>=0&&t{"use strict";var r=n(4363),o={childContextTypes:!0,contextType:!0,contextTypes:!0,defaultProps:!0,displayName:!0,getDefaultProps:!0,getDerivedStateFromError:!0,getDerivedStateFromProps:!0,mixins:!0,propTypes:!0,type:!0},a={name:!0,length:!0,prototype:!0,caller:!0,callee:!0,arguments:!0,arity:!0},i={$$typeof:!0,compare:!0,defaultProps:!0,displayName:!0,propTypes:!0,type:!0},s={};function l(e){return r.isMemo(e)?i:s[e.$$typeof]||o}s[r.ForwardRef]={$$typeof:!0,render:!0,defaultProps:!0,displayName:!0,propTypes:!0},s[r.Memo]=i;var c=Object.defineProperty,u=Object.getOwnPropertyNames,d=Object.getOwnPropertySymbols,p=Object.getOwnPropertyDescriptor,f=Object.getPrototypeOf,h=Object.prototype;e.exports=function e(t,n,r){if("string"!=typeof n){if(h){var o=f(n);o&&o!==h&&e(t,o,r)}var i=u(n);d&&(i=i.concat(d(n)));for(var s=l(t),m=l(n),g=0;g{"use strict";e.exports=function(e,t,n,r,o,a,i,s){if(!e){var l;if(void 0===t)l=new Error("Minified exception occurred; use the non-minified dev environment for the full error message and additional helpful warnings.");else{var c=[n,r,o,a,i,s],u=0;(l=new Error(t.replace(/%s/g,(function(){return c[u++]})))).name="Invariant Violation"}throw l.framesToPop=1,l}}},4634:e=>{e.exports=Array.isArray||function(e){return"[object Array]"==Object.prototype.toString.call(e)}},8291:(e,t,n)=>{var r,o;!function(){var a,i,s,l,c,u,d,p,f,h,m,g,b,y,v,x,w,S,k,_,E,C,A,T,P,L,O,N,j,R,I=function(e){var t=new I.Builder;return t.pipeline.add(I.trimmer,I.stopWordFilter,I.stemmer),t.searchPipeline.add(I.stemmer),e.call(t,t),t.build()};I.version="2.3.9",I.utils={},I.utils.warn=(a=this,function(e){a.console&&console.warn&&console.warn(e)}),I.utils.asString=function(e){return null==e?"":e.toString()},I.utils.clone=function(e){if(null==e)return e;for(var t=Object.create(null),n=Object.keys(e),r=0;r0){var l=I.utils.clone(t)||{};l.position=[i,s],l.index=o.length,o.push(new I.Token(n.slice(i,a),l))}i=a+1}}return o},I.tokenizer.separator=/[\s\-]+/,I.Pipeline=function(){this._stack=[]},I.Pipeline.registeredFunctions=Object.create(null),I.Pipeline.registerFunction=function(e,t){t in this.registeredFunctions&&I.utils.warn("Overwriting existing registered function: "+t),e.label=t,I.Pipeline.registeredFunctions[e.label]=e},I.Pipeline.warnIfFunctionNotRegistered=function(e){e.label&&e.label in this.registeredFunctions||I.utils.warn("Function is not registered with pipeline. This may cause problems when serialising the index.\n",e)},I.Pipeline.load=function(e){var t=new I.Pipeline;return e.forEach((function(e){var n=I.Pipeline.registeredFunctions[e];if(!n)throw new Error("Cannot load unregistered function: "+e);t.add(n)})),t},I.Pipeline.prototype.add=function(){Array.prototype.slice.call(arguments).forEach((function(e){I.Pipeline.warnIfFunctionNotRegistered(e),this._stack.push(e)}),this)},I.Pipeline.prototype.after=function(e,t){I.Pipeline.warnIfFunctionNotRegistered(t);var n=this._stack.indexOf(e);if(-1==n)throw new Error("Cannot find existingFn");n+=1,this._stack.splice(n,0,t)},I.Pipeline.prototype.before=function(e,t){I.Pipeline.warnIfFunctionNotRegistered(t);var n=this._stack.indexOf(e);if(-1==n)throw new Error("Cannot find existingFn");this._stack.splice(n,0,t)},I.Pipeline.prototype.remove=function(e){var t=this._stack.indexOf(e);-1!=t&&this._stack.splice(t,1)},I.Pipeline.prototype.run=function(e){for(var t=this._stack.length,n=0;n1&&(ae&&(n=o),a!=e);)r=n-t,o=t+Math.floor(r/2),a=this.elements[2*o];return a==e||a>e?2*o:as?c+=2:i==s&&(t+=n[l+1]*r[c+1],l+=2,c+=2);return t},I.Vector.prototype.similarity=function(e){return this.dot(e)/this.magnitude()||0},I.Vector.prototype.toArray=function(){for(var e=new Array(this.elements.length/2),t=1,n=0;t0){var a,i=o.str.charAt(0);i in o.node.edges?a=o.node.edges[i]:(a=new I.TokenSet,o.node.edges[i]=a),1==o.str.length&&(a.final=!0),r.push({node:a,editsRemaining:o.editsRemaining,str:o.str.slice(1)})}if(0!=o.editsRemaining){if("*"in o.node.edges)var s=o.node.edges["*"];else{s=new I.TokenSet;o.node.edges["*"]=s}if(0==o.str.length&&(s.final=!0),r.push({node:s,editsRemaining:o.editsRemaining-1,str:o.str}),o.str.length>1&&r.push({node:o.node,editsRemaining:o.editsRemaining-1,str:o.str.slice(1)}),1==o.str.length&&(o.node.final=!0),o.str.length>=1){if("*"in o.node.edges)var l=o.node.edges["*"];else{l=new I.TokenSet;o.node.edges["*"]=l}1==o.str.length&&(l.final=!0),r.push({node:l,editsRemaining:o.editsRemaining-1,str:o.str.slice(1)})}if(o.str.length>1){var c,u=o.str.charAt(0),d=o.str.charAt(1);d in o.node.edges?c=o.node.edges[d]:(c=new I.TokenSet,o.node.edges[d]=c),1==o.str.length&&(c.final=!0),r.push({node:c,editsRemaining:o.editsRemaining-1,str:u+o.str.slice(2)})}}}return n},I.TokenSet.fromString=function(e){for(var t=new I.TokenSet,n=t,r=0,o=e.length;r=e;t--){var n=this.uncheckedNodes[t],r=n.child.toString();r in this.minimizedNodes?n.parent.edges[n.char]=this.minimizedNodes[r]:(n.child._str=r,this.minimizedNodes[r]=n.child),this.uncheckedNodes.pop()}},I.Index=function(e){this.invertedIndex=e.invertedIndex,this.fieldVectors=e.fieldVectors,this.tokenSet=e.tokenSet,this.fields=e.fields,this.pipeline=e.pipeline},I.Index.prototype.search=function(e){return this.query((function(t){new I.QueryParser(e,t).parse()}))},I.Index.prototype.query=function(e){for(var t=new I.Query(this.fields),n=Object.create(null),r=Object.create(null),o=Object.create(null),a=Object.create(null),i=Object.create(null),s=0;s1?1:e},I.Builder.prototype.k1=function(e){this._k1=e},I.Builder.prototype.add=function(e,t){var n=e[this._ref],r=Object.keys(this._fields);this._documents[n]=t||{},this.documentCount+=1;for(var o=0;o=this.length)return I.QueryLexer.EOS;var e=this.str.charAt(this.pos);return this.pos+=1,e},I.QueryLexer.prototype.width=function(){return this.pos-this.start},I.QueryLexer.prototype.ignore=function(){this.start==this.pos&&(this.pos+=1),this.start=this.pos},I.QueryLexer.prototype.backup=function(){this.pos-=1},I.QueryLexer.prototype.acceptDigitRun=function(){var e,t;do{t=(e=this.next()).charCodeAt(0)}while(t>47&&t<58);e!=I.QueryLexer.EOS&&this.backup()},I.QueryLexer.prototype.more=function(){return this.pos1&&(e.backup(),e.emit(I.QueryLexer.TERM)),e.ignore(),e.more())return I.QueryLexer.lexText},I.QueryLexer.lexEditDistance=function(e){return e.ignore(),e.acceptDigitRun(),e.emit(I.QueryLexer.EDIT_DISTANCE),I.QueryLexer.lexText},I.QueryLexer.lexBoost=function(e){return e.ignore(),e.acceptDigitRun(),e.emit(I.QueryLexer.BOOST),I.QueryLexer.lexText},I.QueryLexer.lexEOS=function(e){e.width()>0&&e.emit(I.QueryLexer.TERM)},I.QueryLexer.termSeparator=I.tokenizer.separator,I.QueryLexer.lexText=function(e){for(;;){var t=e.next();if(t==I.QueryLexer.EOS)return I.QueryLexer.lexEOS;if(92!=t.charCodeAt(0)){if(":"==t)return I.QueryLexer.lexField;if("~"==t)return e.backup(),e.width()>0&&e.emit(I.QueryLexer.TERM),I.QueryLexer.lexEditDistance;if("^"==t)return e.backup(),e.width()>0&&e.emit(I.QueryLexer.TERM),I.QueryLexer.lexBoost;if("+"==t&&1===e.width())return e.emit(I.QueryLexer.PRESENCE),I.QueryLexer.lexText;if("-"==t&&1===e.width())return e.emit(I.QueryLexer.PRESENCE),I.QueryLexer.lexText;if(t.match(I.QueryLexer.termSeparator))return I.QueryLexer.lexTerm}else e.escapeCharacter()}},I.QueryParser=function(e,t){this.lexer=new I.QueryLexer(e),this.query=t,this.currentClause={},this.lexemeIdx=0},I.QueryParser.prototype.parse=function(){this.lexer.run(),this.lexemes=this.lexer.lexemes;for(var e=I.QueryParser.parseClause;e;)e=e(this);return this.query},I.QueryParser.prototype.peekLexeme=function(){return this.lexemes[this.lexemeIdx]},I.QueryParser.prototype.consumeLexeme=function(){var e=this.peekLexeme();return this.lexemeIdx+=1,e},I.QueryParser.prototype.nextClause=function(){var e=this.currentClause;this.query.clause(e),this.currentClause={}},I.QueryParser.parseClause=function(e){var t=e.peekLexeme();if(null!=t)switch(t.type){case I.QueryLexer.PRESENCE:return I.QueryParser.parsePresence;case I.QueryLexer.FIELD:return I.QueryParser.parseField;case I.QueryLexer.TERM:return I.QueryParser.parseTerm;default:var n="expected either a field or a term, found "+t.type;throw t.str.length>=1&&(n+=" with value '"+t.str+"'"),new I.QueryParseError(n,t.start,t.end)}},I.QueryParser.parsePresence=function(e){var t=e.consumeLexeme();if(null!=t){switch(t.str){case"-":e.currentClause.presence=I.Query.presence.PROHIBITED;break;case"+":e.currentClause.presence=I.Query.presence.REQUIRED;break;default:var n="unrecognised presence operator'"+t.str+"'";throw new I.QueryParseError(n,t.start,t.end)}var r=e.peekLexeme();if(null==r){n="expecting term or field, found nothing";throw new I.QueryParseError(n,t.start,t.end)}switch(r.type){case I.QueryLexer.FIELD:return I.QueryParser.parseField;case I.QueryLexer.TERM:return I.QueryParser.parseTerm;default:n="expecting term or field, found '"+r.type+"'";throw new I.QueryParseError(n,r.start,r.end)}}},I.QueryParser.parseField=function(e){var t=e.consumeLexeme();if(null!=t){if(-1==e.query.allFields.indexOf(t.str)){var n=e.query.allFields.map((function(e){return"'"+e+"'"})).join(", "),r="unrecognised field '"+t.str+"', possible fields: "+n;throw new I.QueryParseError(r,t.start,t.end)}e.currentClause.fields=[t.str];var o=e.peekLexeme();if(null==o){r="expecting term, found nothing";throw new I.QueryParseError(r,t.start,t.end)}if(o.type===I.QueryLexer.TERM)return I.QueryParser.parseTerm;r="expecting term, found '"+o.type+"'";throw new I.QueryParseError(r,o.start,o.end)}},I.QueryParser.parseTerm=function(e){var t=e.consumeLexeme();if(null!=t){e.currentClause.term=t.str.toLowerCase(),-1!=t.str.indexOf("*")&&(e.currentClause.usePipeline=!1);var n=e.peekLexeme();if(null!=n)switch(n.type){case I.QueryLexer.TERM:return e.nextClause(),I.QueryParser.parseTerm;case I.QueryLexer.FIELD:return e.nextClause(),I.QueryParser.parseField;case I.QueryLexer.EDIT_DISTANCE:return I.QueryParser.parseEditDistance;case I.QueryLexer.BOOST:return I.QueryParser.parseBoost;case I.QueryLexer.PRESENCE:return e.nextClause(),I.QueryParser.parsePresence;default:var r="Unexpected lexeme type '"+n.type+"'";throw new I.QueryParseError(r,n.start,n.end)}else e.nextClause()}},I.QueryParser.parseEditDistance=function(e){var t=e.consumeLexeme();if(null!=t){var n=parseInt(t.str,10);if(isNaN(n)){var r="edit distance must be numeric";throw new I.QueryParseError(r,t.start,t.end)}e.currentClause.editDistance=n;var o=e.peekLexeme();if(null!=o)switch(o.type){case I.QueryLexer.TERM:return e.nextClause(),I.QueryParser.parseTerm;case I.QueryLexer.FIELD:return e.nextClause(),I.QueryParser.parseField;case I.QueryLexer.EDIT_DISTANCE:return I.QueryParser.parseEditDistance;case I.QueryLexer.BOOST:return I.QueryParser.parseBoost;case I.QueryLexer.PRESENCE:return e.nextClause(),I.QueryParser.parsePresence;default:r="Unexpected lexeme type '"+o.type+"'";throw new I.QueryParseError(r,o.start,o.end)}else e.nextClause()}},I.QueryParser.parseBoost=function(e){var t=e.consumeLexeme();if(null!=t){var n=parseInt(t.str,10);if(isNaN(n)){var r="boost must be numeric";throw new I.QueryParseError(r,t.start,t.end)}e.currentClause.boost=n;var o=e.peekLexeme();if(null!=o)switch(o.type){case I.QueryLexer.TERM:return e.nextClause(),I.QueryParser.parseTerm;case I.QueryLexer.FIELD:return e.nextClause(),I.QueryParser.parseField;case I.QueryLexer.EDIT_DISTANCE:return I.QueryParser.parseEditDistance;case I.QueryLexer.BOOST:return I.QueryParser.parseBoost;case I.QueryLexer.PRESENCE:return e.nextClause(),I.QueryParser.parsePresence;default:r="Unexpected lexeme type '"+o.type+"'";throw new I.QueryParseError(r,o.start,o.end)}else e.nextClause()}},void 0===(o="function"==typeof(r=function(){return I})?r.call(t,n,t,e):r)||(e.exports=o)}()},119:(e,t,n)=>{"use strict";n.r(t)},1043:(e,t,n)=>{"use strict";n.r(t)},5947:function(e,t,n){var r,o;r=function(){var e,t,n={version:"0.2.0"},r=n.settings={minimum:.08,easing:"ease",positionUsing:"",speed:200,trickle:!0,trickleRate:.02,trickleSpeed:800,showSpinner:!0,barSelector:'[role="bar"]',spinnerSelector:'[role="spinner"]',parent:"body",template:'
'};function o(e,t,n){return en?n:e}function a(e){return 100*(-1+e)}function i(e,t,n){var o;return(o="translate3d"===r.positionUsing?{transform:"translate3d("+a(e)+"%,0,0)"}:"translate"===r.positionUsing?{transform:"translate("+a(e)+"%,0)"}:{"margin-left":a(e)+"%"}).transition="all "+t+"ms "+n,o}n.configure=function(e){var t,n;for(t in e)void 0!==(n=e[t])&&e.hasOwnProperty(t)&&(r[t]=n);return this},n.status=null,n.set=function(e){var t=n.isStarted();e=o(e,r.minimum,1),n.status=1===e?null:e;var a=n.render(!t),c=a.querySelector(r.barSelector),u=r.speed,d=r.easing;return a.offsetWidth,s((function(t){""===r.positionUsing&&(r.positionUsing=n.getPositioningCSS()),l(c,i(e,u,d)),1===e?(l(a,{transition:"none",opacity:1}),a.offsetWidth,setTimeout((function(){l(a,{transition:"all "+u+"ms linear",opacity:0}),setTimeout((function(){n.remove(),t()}),u)}),u)):setTimeout(t,u)})),this},n.isStarted=function(){return"number"==typeof n.status},n.start=function(){n.status||n.set(0);var e=function(){setTimeout((function(){n.status&&(n.trickle(),e())}),r.trickleSpeed)};return r.trickle&&e(),this},n.done=function(e){return e||n.status?n.inc(.3+.5*Math.random()).set(1):this},n.inc=function(e){var t=n.status;return t?("number"!=typeof e&&(e=(1-t)*o(Math.random()*t,.1,.95)),t=o(t+e,0,.994),n.set(t)):n.start()},n.trickle=function(){return n.inc(Math.random()*r.trickleRate)},e=0,t=0,n.promise=function(r){return r&&"resolved"!==r.state()?(0===t&&n.start(),e++,t++,r.always((function(){0==--t?(e=0,n.done()):n.set((e-t)/e)})),this):this},n.render=function(e){if(n.isRendered())return document.getElementById("nprogress");u(document.documentElement,"nprogress-busy");var t=document.createElement("div");t.id="nprogress",t.innerHTML=r.template;var o,i=t.querySelector(r.barSelector),s=e?"-100":a(n.status||0),c=document.querySelector(r.parent);return l(i,{transition:"all 0 linear",transform:"translate3d("+s+"%,0,0)"}),r.showSpinner||(o=t.querySelector(r.spinnerSelector))&&f(o),c!=document.body&&u(c,"nprogress-custom-parent"),c.appendChild(t),t},n.remove=function(){d(document.documentElement,"nprogress-busy"),d(document.querySelector(r.parent),"nprogress-custom-parent");var e=document.getElementById("nprogress");e&&f(e)},n.isRendered=function(){return!!document.getElementById("nprogress")},n.getPositioningCSS=function(){var e=document.body.style,t="WebkitTransform"in e?"Webkit":"MozTransform"in e?"Moz":"msTransform"in e?"ms":"OTransform"in e?"O":"";return t+"Perspective"in e?"translate3d":t+"Transform"in e?"translate":"margin"};var s=function(){var e=[];function t(){var n=e.shift();n&&n(t)}return function(n){e.push(n),1==e.length&&t()}}(),l=function(){var e=["Webkit","O","Moz","ms"],t={};function n(e){return e.replace(/^-ms-/,"ms-").replace(/-([\da-z])/gi,(function(e,t){return t.toUpperCase()}))}function r(t){var n=document.body.style;if(t in n)return t;for(var r,o=e.length,a=t.charAt(0).toUpperCase()+t.slice(1);o--;)if((r=e[o]+a)in n)return r;return t}function o(e){return e=n(e),t[e]||(t[e]=r(e))}function a(e,t,n){t=o(t),e.style[t]=n}return function(e,t){var n,r,o=arguments;if(2==o.length)for(n in t)void 0!==(r=t[n])&&t.hasOwnProperty(n)&&a(e,n,r);else a(e,o[1],o[2])}}();function c(e,t){return("string"==typeof e?e:p(e)).indexOf(" "+t+" ")>=0}function u(e,t){var n=p(e),r=n+t;c(n,t)||(e.className=r.substring(1))}function d(e,t){var n,r=p(e);c(e,t)&&(n=r.replace(" "+t+" "," "),e.className=n.substring(1,n.length-1))}function p(e){return(" "+(e.className||"")+" ").replace(/\s+/gi," ")}function f(e){e&&e.parentNode&&e.parentNode.removeChild(e)}return n},void 0===(o="function"==typeof r?r.call(t,n,t,e):r)||(e.exports=o)},8015:(e,t,n)=>{"use strict";n.r(t),n.d(t,{default:()=>p});var r=n(4784),o=Object.assign||function(e){for(var t=1;t1&&void 0!==arguments[1]?arguments[1]:{},r=window.Promise||function(e){function t(){}e(t,t)},a=function(){for(var e=arguments.length,t=Array(e),n=0;n0&&void 0!==arguments[0]?arguments[0]:{}).target,t=function(){var e={width:document.documentElement.clientWidth,height:document.documentElement.clientHeight,left:0,top:0,right:0,bottom:0},t=void 0,n=void 0;if(b.container)if(b.container instanceof Object)t=(e=o({},e,b.container)).width-e.left-e.right-2*b.margin,n=e.height-e.top-e.bottom-2*b.margin;else{var r=(i(b.container)?b.container:document.querySelector(b.container)).getBoundingClientRect(),a=r.width,l=r.height,c=r.left,u=r.top;e=o({},e,{width:a,height:l,left:c,top:u})}t=t||e.width-2*b.margin,n=n||e.height-2*b.margin;var d=y.zoomedHd||y.original,p=s(d)?t:d.naturalWidth||t,f=s(d)?n:d.naturalHeight||n,h=d.getBoundingClientRect(),m=h.top,g=h.left,v=h.width,x=h.height,w=Math.min(Math.max(v,p),t)/v,S=Math.min(Math.max(x,f),n)/x,k=Math.min(w,S),_="scale("+k+") translate3d("+((t-v)/2-g+b.margin+e.left)/k+"px, "+((n-x)/2-m+b.margin+e.top)/k+"px, 0)";y.zoomed.style.transform=_,y.zoomedHd&&(y.zoomedHd.style.transform=_)};return new r((function(n){if(e&&-1===f.indexOf(e))n(x);else{if(y.zoomed)n(x);else{if(e)y.original=e;else{if(!(f.length>0))return void n(x);var r=f;y.original=r[0]}if(y.original.dispatchEvent(c("medium-zoom:open",{detail:{zoom:x}})),g=window.pageYOffset||document.documentElement.scrollTop||document.body.scrollTop||0,m=!0,y.zoomed=function(e){var t=e.getBoundingClientRect(),n=t.top,r=t.left,o=t.width,a=t.height,i=e.cloneNode(),s=window.pageYOffset||document.documentElement.scrollTop||document.body.scrollTop||0,l=window.pageXOffset||document.documentElement.scrollLeft||document.body.scrollLeft||0;return i.removeAttribute("id"),i.style.position="absolute",i.style.top=n+s+"px",i.style.left=r+l+"px",i.style.width=o+"px",i.style.height=a+"px",i.style.transform="",i}(y.original),document.body.appendChild(v),b.template){var o=i(b.template)?b.template:document.querySelector(b.template);y.template=document.createElement("div"),y.template.appendChild(o.content.cloneNode(!0)),document.body.appendChild(y.template)}if(y.original.parentElement&&"PICTURE"===y.original.parentElement.tagName&&y.original.currentSrc&&(y.zoomed.src=y.original.currentSrc),document.body.appendChild(y.zoomed),window.requestAnimationFrame((function(){document.body.classList.add("medium-zoom--opened")})),y.original.classList.add("medium-zoom-image--hidden"),y.zoomed.classList.add("medium-zoom-image--opened"),y.zoomed.addEventListener("click",d),y.zoomed.addEventListener("transitionend",(function e(){m=!1,y.zoomed.removeEventListener("transitionend",e),y.original.dispatchEvent(c("medium-zoom:opened",{detail:{zoom:x}})),n(x)})),y.original.getAttribute("data-zoom-src")){y.zoomedHd=y.zoomed.cloneNode(),y.zoomedHd.removeAttribute("srcset"),y.zoomedHd.removeAttribute("sizes"),y.zoomedHd.removeAttribute("loading"),y.zoomedHd.src=y.zoomed.getAttribute("data-zoom-src"),y.zoomedHd.onerror=function(){clearInterval(a),console.warn("Unable to reach the zoom image target "+y.zoomedHd.src),y.zoomedHd=null,t()};var a=setInterval((function(){y.zoomedHd.complete&&(clearInterval(a),y.zoomedHd.classList.add("medium-zoom-image--opened"),y.zoomedHd.addEventListener("click",d),document.body.appendChild(y.zoomedHd),t())}),10)}else if(y.original.hasAttribute("srcset")){y.zoomedHd=y.zoomed.cloneNode(),y.zoomedHd.removeAttribute("sizes"),y.zoomedHd.removeAttribute("loading");var s=y.zoomedHd.addEventListener("load",(function(){y.zoomedHd.removeEventListener("load",s),y.zoomedHd.classList.add("medium-zoom-image--opened"),y.zoomedHd.addEventListener("click",d),document.body.appendChild(y.zoomedHd),t()}))}else t()}}}))},d=function(){return new r((function(e){if(!m&&y.original){m=!0,document.body.classList.remove("medium-zoom--opened"),y.zoomed.style.transform="",y.zoomedHd&&(y.zoomedHd.style.transform=""),y.template&&(y.template.style.transition="opacity 150ms",y.template.style.opacity=0),y.original.dispatchEvent(c("medium-zoom:close",{detail:{zoom:x}})),y.zoomed.addEventListener("transitionend",(function t(){y.original.classList.remove("medium-zoom-image--hidden"),document.body.removeChild(y.zoomed),y.zoomedHd&&document.body.removeChild(y.zoomedHd),document.body.removeChild(v),y.zoomed.classList.remove("medium-zoom-image--opened"),y.template&&document.body.removeChild(y.template),m=!1,y.zoomed.removeEventListener("transitionend",t),y.original.dispatchEvent(c("medium-zoom:closed",{detail:{zoom:x}})),y.original=null,y.zoomed=null,y.zoomedHd=null,y.template=null,e(x)}))}else e(x)}))},p=function(){var e=(arguments.length>0&&void 0!==arguments[0]?arguments[0]:{}).target;return y.original?d():u({target:e})},f=[],h=[],m=!1,g=0,b=n,y={original:null,zoomed:null,zoomedHd:null,template:null};"[object Object]"===Object.prototype.toString.call(t)?b=t:(t||"string"==typeof t)&&a(t);var v=function(e){var t=document.createElement("div");return t.classList.add("medium-zoom-overlay"),t.style.background=e,t}((b=o({margin:0,background:"#fff",scrollOffset:40,container:null,template:null},b)).background);document.addEventListener("click",(function(e){var t=e.target;t!==v?-1!==f.indexOf(t)&&p({target:t}):d()})),document.addEventListener("keyup",(function(e){var t=e.key||e.keyCode;"Escape"!==t&&"Esc"!==t&&27!==t||d()})),document.addEventListener("scroll",(function(){if(!m&&y.original){var e=window.pageYOffset||document.documentElement.scrollTop||document.body.scrollTop||0;Math.abs(g-e)>b.scrollOffset&&setTimeout(d,150)}})),window.addEventListener("resize",d);var x={open:u,close:d,toggle:p,update:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},t=e;if(e.background&&(v.style.background=e.background),e.container&&e.container instanceof Object&&(t.container=o({},b.container,e.container)),e.template){var n=i(e.template)?e.template:document.querySelector(e.template);t.template=n}return b=o({},b,t),f.forEach((function(e){e.dispatchEvent(c("medium-zoom:update",{detail:{zoom:x}}))})),x},clone:function(){return e(o({},b,arguments.length>0&&void 0!==arguments[0]?arguments[0]:{}))},attach:a,detach:function(){for(var e=arguments.length,t=Array(e),n=0;n0?t.reduce((function(e,t){return[].concat(e,l(t))}),[]):f;return r.forEach((function(e){e.classList.remove("medium-zoom-image"),e.dispatchEvent(c("medium-zoom:detach",{detail:{zoom:x}}))})),f=f.filter((function(e){return-1===r.indexOf(e)})),x},on:function(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};return f.forEach((function(r){r.addEventListener("medium-zoom:"+e,t,n)})),h.push({type:"medium-zoom:"+e,listener:t,options:n}),x},off:function(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};return f.forEach((function(r){r.removeEventListener("medium-zoom:"+e,t,n)})),h=h.filter((function(n){return!(n.type==="medium-zoom:"+e&&n.listener.toString()===t.toString())})),x},getOptions:function(){return b},getImages:function(){return f},getZoomedImage:function(){return y.original}};return x},{themeConfig:d}=r.default,p=function(){if("undefined"==typeof window)return null;const{zoomSelector:e=".markdown img"}=d,{imageZoom:{selector:t=e,options:n}={}}=d;return setTimeout((()=>{u(t,n)}),1e3),{onRouteUpdate({location:e,previousLocation:r}){e&&e.hash&&e.hash.length||r&&e.pathname!==r.pathname&&setTimeout((()=>{u(t,n)}),1e3)}}}()},7022:()=>{!function(e){var t="\\b(?:BASH|BASHOPTS|BASH_ALIASES|BASH_ARGC|BASH_ARGV|BASH_CMDS|BASH_COMPLETION_COMPAT_DIR|BASH_LINENO|BASH_REMATCH|BASH_SOURCE|BASH_VERSINFO|BASH_VERSION|COLORTERM|COLUMNS|COMP_WORDBREAKS|DBUS_SESSION_BUS_ADDRESS|DEFAULTS_PATH|DESKTOP_SESSION|DIRSTACK|DISPLAY|EUID|GDMSESSION|GDM_LANG|GNOME_KEYRING_CONTROL|GNOME_KEYRING_PID|GPG_AGENT_INFO|GROUPS|HISTCONTROL|HISTFILE|HISTFILESIZE|HISTSIZE|HOME|HOSTNAME|HOSTTYPE|IFS|INSTANCE|JOB|LANG|LANGUAGE|LC_ADDRESS|LC_ALL|LC_IDENTIFICATION|LC_MEASUREMENT|LC_MONETARY|LC_NAME|LC_NUMERIC|LC_PAPER|LC_TELEPHONE|LC_TIME|LESSCLOSE|LESSOPEN|LINES|LOGNAME|LS_COLORS|MACHTYPE|MAILCHECK|MANDATORY_PATH|NO_AT_BRIDGE|OLDPWD|OPTERR|OPTIND|ORBIT_SOCKETDIR|OSTYPE|PAPERSIZE|PATH|PIPESTATUS|PPID|PS1|PS2|PS3|PS4|PWD|RANDOM|REPLY|SECONDS|SELINUX_INIT|SESSION|SESSIONTYPE|SESSION_MANAGER|SHELL|SHELLOPTS|SHLVL|SSH_AUTH_SOCK|TERM|UID|UPSTART_EVENTS|UPSTART_INSTANCE|UPSTART_JOB|UPSTART_SESSION|USER|WINDOWID|XAUTHORITY|XDG_CONFIG_DIRS|XDG_CURRENT_DESKTOP|XDG_DATA_DIRS|XDG_GREETER_DATA_DIR|XDG_MENU_PREFIX|XDG_RUNTIME_DIR|XDG_SEAT|XDG_SEAT_PATH|XDG_SESSION_DESKTOP|XDG_SESSION_ID|XDG_SESSION_PATH|XDG_SESSION_TYPE|XDG_VTNR|XMODIFIERS)\\b",n={pattern:/(^(["']?)\w+\2)[ \t]+\S.*/,lookbehind:!0,alias:"punctuation",inside:null},r={bash:n,environment:{pattern:RegExp("\\$"+t),alias:"constant"},variable:[{pattern:/\$?\(\([\s\S]+?\)\)/,greedy:!0,inside:{variable:[{pattern:/(^\$\(\([\s\S]+)\)\)/,lookbehind:!0},/^\$\(\(/],number:/\b0x[\dA-Fa-f]+\b|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:[Ee]-?\d+)?/,operator:/--|\+\+|\*\*=?|<<=?|>>=?|&&|\|\||[=!+\-*/%<>^&|]=?|[?~:]/,punctuation:/\(\(?|\)\)?|,|;/}},{pattern:/\$\((?:\([^)]+\)|[^()])+\)|`[^`]+`/,greedy:!0,inside:{variable:/^\$\(|^`|\)$|`$/}},{pattern:/\$\{[^}]+\}/,greedy:!0,inside:{operator:/:[-=?+]?|[!\/]|##?|%%?|\^\^?|,,?/,punctuation:/[\[\]]/,environment:{pattern:RegExp("(\\{)"+t),lookbehind:!0,alias:"constant"}}},/\$(?:\w+|[#?*!@$])/],entity:/\\(?:[abceEfnrtv\\"]|O?[0-7]{1,3}|U[0-9a-fA-F]{8}|u[0-9a-fA-F]{4}|x[0-9a-fA-F]{1,2})/};e.languages.bash={shebang:{pattern:/^#!\s*\/.*/,alias:"important"},comment:{pattern:/(^|[^"{\\$])#.*/,lookbehind:!0},"function-name":[{pattern:/(\bfunction\s+)[\w-]+(?=(?:\s*\(?:\s*\))?\s*\{)/,lookbehind:!0,alias:"function"},{pattern:/\b[\w-]+(?=\s*\(\s*\)\s*\{)/,alias:"function"}],"for-or-select":{pattern:/(\b(?:for|select)\s+)\w+(?=\s+in\s)/,alias:"variable",lookbehind:!0},"assign-left":{pattern:/(^|[\s;|&]|[<>]\()\w+(?:\.\w+)*(?=\+?=)/,inside:{environment:{pattern:RegExp("(^|[\\s;|&]|[<>]\\()"+t),lookbehind:!0,alias:"constant"}},alias:"variable",lookbehind:!0},parameter:{pattern:/(^|\s)-{1,2}(?:\w+:[+-]?)?\w+(?:\.\w+)*(?=[=\s]|$)/,alias:"variable",lookbehind:!0},string:[{pattern:/((?:^|[^<])<<-?\s*)(\w+)\s[\s\S]*?(?:\r?\n|\r)\2/,lookbehind:!0,greedy:!0,inside:r},{pattern:/((?:^|[^<])<<-?\s*)(["'])(\w+)\2\s[\s\S]*?(?:\r?\n|\r)\3/,lookbehind:!0,greedy:!0,inside:{bash:n}},{pattern:/(^|[^\\](?:\\\\)*)"(?:\\[\s\S]|\$\([^)]+\)|\$(?!\()|`[^`]+`|[^"\\`$])*"/,lookbehind:!0,greedy:!0,inside:r},{pattern:/(^|[^$\\])'[^']*'/,lookbehind:!0,greedy:!0},{pattern:/\$'(?:[^'\\]|\\[\s\S])*'/,greedy:!0,inside:{entity:r.entity}}],environment:{pattern:RegExp("\\$?"+t),alias:"constant"},variable:r.variable,function:{pattern:/(^|[\s;|&]|[<>]\()(?:add|apropos|apt|apt-cache|apt-get|aptitude|aspell|automysqlbackup|awk|basename|bash|bc|bconsole|bg|bzip2|cal|cargo|cat|cfdisk|chgrp|chkconfig|chmod|chown|chroot|cksum|clear|cmp|column|comm|composer|cp|cron|crontab|csplit|curl|cut|date|dc|dd|ddrescue|debootstrap|df|diff|diff3|dig|dir|dircolors|dirname|dirs|dmesg|docker|docker-compose|du|egrep|eject|env|ethtool|expand|expect|expr|fdformat|fdisk|fg|fgrep|file|find|fmt|fold|format|free|fsck|ftp|fuser|gawk|git|gparted|grep|groupadd|groupdel|groupmod|groups|grub-mkconfig|gzip|halt|head|hg|history|host|hostname|htop|iconv|id|ifconfig|ifdown|ifup|import|install|ip|java|jobs|join|kill|killall|less|link|ln|locate|logname|logrotate|look|lpc|lpr|lprint|lprintd|lprintq|lprm|ls|lsof|lynx|make|man|mc|mdadm|mkconfig|mkdir|mke2fs|mkfifo|mkfs|mkisofs|mknod|mkswap|mmv|more|most|mount|mtools|mtr|mutt|mv|nano|nc|netstat|nice|nl|node|nohup|notify-send|npm|nslookup|op|open|parted|passwd|paste|pathchk|ping|pkill|pnpm|podman|podman-compose|popd|pr|printcap|printenv|ps|pushd|pv|quota|quotacheck|quotactl|ram|rar|rcp|reboot|remsync|rename|renice|rev|rm|rmdir|rpm|rsync|scp|screen|sdiff|sed|sendmail|seq|service|sftp|sh|shellcheck|shuf|shutdown|sleep|slocate|sort|split|ssh|stat|strace|su|sudo|sum|suspend|swapon|sync|sysctl|tac|tail|tar|tee|time|timeout|top|touch|tr|traceroute|tsort|tty|umount|uname|unexpand|uniq|units|unrar|unshar|unzip|update-grub|uptime|useradd|userdel|usermod|users|uudecode|uuencode|v|vcpkg|vdir|vi|vim|virsh|vmstat|wait|watch|wc|wget|whereis|which|who|whoami|write|xargs|xdg-open|yarn|yes|zenity|zip|zsh|zypper)(?=$|[)\s;|&])/,lookbehind:!0},keyword:{pattern:/(^|[\s;|&]|[<>]\()(?:case|do|done|elif|else|esac|fi|for|function|if|in|select|then|until|while)(?=$|[)\s;|&])/,lookbehind:!0},builtin:{pattern:/(^|[\s;|&]|[<>]\()(?:\.|:|alias|bind|break|builtin|caller|cd|command|continue|declare|echo|enable|eval|exec|exit|export|getopts|hash|help|let|local|logout|mapfile|printf|pwd|read|readarray|readonly|return|set|shift|shopt|source|test|times|trap|type|typeset|ulimit|umask|unalias|unset)(?=$|[)\s;|&])/,lookbehind:!0,alias:"class-name"},boolean:{pattern:/(^|[\s;|&]|[<>]\()(?:false|true)(?=$|[)\s;|&])/,lookbehind:!0},"file-descriptor":{pattern:/\B&\d\b/,alias:"important"},operator:{pattern:/\d?<>|>\||\+=|=[=~]?|!=?|<<[<-]?|[&\d]?>>|\d[<>]&?|[<>][&=]?|&[>&]?|\|[&|]?/,inside:{"file-descriptor":{pattern:/^\d/,alias:"important"}}},punctuation:/\$?\(\(?|\)\)?|\.\.|[{}[\];\\]/,number:{pattern:/(^|\s)(?:[1-9]\d*|0)(?:[.,]\d+)?\b/,lookbehind:!0}},n.inside=e.languages.bash;for(var o=["comment","function-name","for-or-select","assign-left","parameter","string","environment","function","keyword","builtin","boolean","file-descriptor","operator","punctuation","number"],a=r.variable[1].inside,i=0;i{!function(e){e.languages.diff={coord:[/^(?:\*{3}|-{3}|\+{3}).*$/m,/^@@.*@@$/m,/^\d.*$/m]};var t={"deleted-sign":"-","deleted-arrow":"<","inserted-sign":"+","inserted-arrow":">",unchanged:" ",diff:"!"};Object.keys(t).forEach((function(n){var r=t[n],o=[];/^\w+$/.test(n)||o.push(/\w+/.exec(n)[0]),"diff"===n&&o.push("bold"),e.languages.diff[n]={pattern:RegExp("^(?:["+r+"].*(?:\r\n?|\n|(?![\\s\\S])))+","m"),alias:o,inside:{line:{pattern:/(.)(?=[\s\S]).*(?:\r\n?|\n)?/,lookbehind:!0},prefix:{pattern:/[\s\S]/,alias:/\w+/.exec(n)[0]}}}})),Object.defineProperty(e.languages.diff,"PREFIXES",{value:t})}(Prism)},6976:()=>{!function(e){var t=/\b(?:abstract|assert|boolean|break|byte|case|catch|char|class|const|continue|default|do|double|else|enum|exports|extends|final|finally|float|for|goto|if|implements|import|instanceof|int|interface|long|module|native|new|non-sealed|null|open|opens|package|permits|private|protected|provides|public|record(?!\s*[(){}[\]<>=%~.:,;?+\-*/&|^])|requires|return|sealed|short|static|strictfp|super|switch|synchronized|this|throw|throws|to|transient|transitive|try|uses|var|void|volatile|while|with|yield)\b/,n=/(?:[a-z]\w*\s*\.\s*)*(?:[A-Z]\w*\s*\.\s*)*/.source,r={pattern:RegExp(/(^|[^\w.])/.source+n+/[A-Z](?:[\d_A-Z]*[a-z]\w*)?\b/.source),lookbehind:!0,inside:{namespace:{pattern:/^[a-z]\w*(?:\s*\.\s*[a-z]\w*)*(?:\s*\.)?/,inside:{punctuation:/\./}},punctuation:/\./}};e.languages.java=e.languages.extend("clike",{string:{pattern:/(^|[^\\])"(?:\\.|[^"\\\r\n])*"/,lookbehind:!0,greedy:!0},"class-name":[r,{pattern:RegExp(/(^|[^\w.])/.source+n+/[A-Z]\w*(?=\s+\w+\s*[;,=()]|\s*(?:\[[\s,]*\]\s*)?::\s*new\b)/.source),lookbehind:!0,inside:r.inside},{pattern:RegExp(/(\b(?:class|enum|extends|implements|instanceof|interface|new|record|throws)\s+)/.source+n+/[A-Z]\w*\b/.source),lookbehind:!0,inside:r.inside}],keyword:t,function:[e.languages.clike.function,{pattern:/(::\s*)[a-z_]\w*/,lookbehind:!0}],number:/\b0b[01][01_]*L?\b|\b0x(?:\.[\da-f_p+-]+|[\da-f_]+(?:\.[\da-f_p+-]+)?)\b|(?:\b\d[\d_]*(?:\.[\d_]*)?|\B\.\d[\d_]*)(?:e[+-]?\d[\d_]*)?[dfl]?/i,operator:{pattern:/(^|[^.])(?:<<=?|>>>?=?|->|--|\+\+|&&|\|\||::|[?:~]|[-+*/%&|^!=<>]=?)/m,lookbehind:!0},constant:/\b[A-Z][A-Z_\d]+\b/}),e.languages.insertBefore("java","string",{"triple-quoted-string":{pattern:/"""[ \t]*[\r\n](?:(?:"|"")?(?:\\.|[^"\\]))*"""/,greedy:!0,alias:"string"},char:{pattern:/'(?:\\.|[^'\\\r\n]){1,6}'/,greedy:!0}}),e.languages.insertBefore("java","class-name",{annotation:{pattern:/(^|[^.])@\w+(?:\s*\.\s*\w+)*/,lookbehind:!0,alias:"punctuation"},generics:{pattern:/<(?:[\w\s,.?]|&(?!&)|<(?:[\w\s,.?]|&(?!&)|<(?:[\w\s,.?]|&(?!&)|<(?:[\w\s,.?]|&(?!&))*>)*>)*>)*>/,inside:{"class-name":r,keyword:t,punctuation:/[<>(),.:]/,operator:/[?&|]/}},import:[{pattern:RegExp(/(\bimport\s+)/.source+n+/(?:[A-Z]\w*|\*)(?=\s*;)/.source),lookbehind:!0,inside:{namespace:r.inside.namespace,punctuation:/\./,operator:/\*/,"class-name":/\w+/}},{pattern:RegExp(/(\bimport\s+static\s+)/.source+n+/(?:\w+|\*)(?=\s*;)/.source),lookbehind:!0,alias:"static",inside:{namespace:r.inside.namespace,static:/\b\w+$/,punctuation:/\./,operator:/\*/,"class-name":/\w+/}}],namespace:{pattern:RegExp(/(\b(?:exports|import(?:\s+static)?|module|open|opens|package|provides|requires|to|transitive|uses|with)\s+)(?!)[a-z]\w*(?:\.[a-z]\w*)*\.?/.source.replace(//g,(function(){return t.source}))),lookbehind:!0,inside:{punctuation:/\./}}})}(Prism)},2514:()=>{Prism.languages.json={property:{pattern:/(^|[^\\])"(?:\\.|[^\\"\r\n])*"(?=\s*:)/,lookbehind:!0,greedy:!0},string:{pattern:/(^|[^\\])"(?:\\.|[^\\"\r\n])*"(?!\s*:)/,lookbehind:!0,greedy:!0},comment:{pattern:/\/\/.*|\/\*[\s\S]*?(?:\*\/|$)/,greedy:!0},number:/-?\b\d+(?:\.\d+)?(?:e[+-]?\d+)?\b/i,punctuation:/[{}[\],]/,operator:/:/,boolean:/\b(?:false|true)\b/,null:{pattern:/\bnull\b/,alias:"keyword"}},Prism.languages.webmanifest=Prism.languages.json},5294:()=>{!function(e){var t=/\\(?:[^a-z()[\]]|[a-z*]+)/i,n={"equation-command":{pattern:t,alias:"regex"}};e.languages.latex={comment:/%.*/,cdata:{pattern:/(\\begin\{((?:lstlisting|verbatim)\*?)\})[\s\S]*?(?=\\end\{\2\})/,lookbehind:!0},equation:[{pattern:/\$\$(?:\\[\s\S]|[^\\$])+\$\$|\$(?:\\[\s\S]|[^\\$])+\$|\\\([\s\S]*?\\\)|\\\[[\s\S]*?\\\]/,inside:n,alias:"string"},{pattern:/(\\begin\{((?:align|eqnarray|equation|gather|math|multline)\*?)\})[\s\S]*?(?=\\end\{\2\})/,lookbehind:!0,inside:n,alias:"string"}],keyword:{pattern:/(\\(?:begin|cite|documentclass|end|label|ref|usepackage)(?:\[[^\]]+\])?\{)[^}]+(?=\})/,lookbehind:!0},url:{pattern:/(\\url\{)[^}]+(?=\})/,lookbehind:!0},headline:{pattern:/(\\(?:chapter|frametitle|paragraph|part|section|subparagraph|subsection|subsubparagraph|subsubsection|subsubsubparagraph)\*?(?:\[[^\]]+\])?\{)[^}]+(?=\})/,lookbehind:!0,alias:"class-name"},function:{pattern:t,alias:"selector"},punctuation:/[[\]{}&]/},e.languages.tex=e.languages.latex,e.languages.context=e.languages.latex}(Prism)},9700:()=>{!function(e){function t(e,t){return"___"+e.toUpperCase()+t+"___"}Object.defineProperties(e.languages["markup-templating"]={},{buildPlaceholders:{value:function(n,r,o,a){if(n.language===r){var i=n.tokenStack=[];n.code=n.code.replace(o,(function(e){if("function"==typeof a&&!a(e))return e;for(var o,s=i.length;-1!==n.code.indexOf(o=t(r,s));)++s;return i[s]=e,o})),n.grammar=e.languages.markup}}},tokenizePlaceholders:{value:function(n,r){if(n.language===r&&n.tokenStack){n.grammar=e.languages[r];var o=0,a=Object.keys(n.tokenStack);!function i(s){for(var l=0;l=a.length);l++){var c=s[l];if("string"==typeof c||c.content&&"string"==typeof c.content){var u=a[o],d=n.tokenStack[u],p="string"==typeof c?c:c.content,f=t(r,u),h=p.indexOf(f);if(h>-1){++o;var m=p.substring(0,h),g=new e.Token(r,e.tokenize(d,n.grammar),"language-"+r,d),b=p.substring(h+f.length),y=[];m&&y.push.apply(y,i([m])),y.push(g),b&&y.push.apply(y,i([b])),"string"==typeof c?s.splice.apply(s,[l,1].concat(y)):c.content=y}}else c.content&&i(c.content)}return s}(n.tokens)}}}})}(Prism)},875:(e,t,n)=>{var r={"./prism-bash":7022,"./prism-diff":7839,"./prism-java":6976,"./prism-json":2514,"./prism-latex":5294};function o(e){var t=a(e);return n(t)}function a(e){if(!n.o(r,e)){var t=new Error("Cannot find module '"+e+"'");throw t.code="MODULE_NOT_FOUND",t}return r[e]}o.keys=function(){return Object.keys(r)},o.resolve=a,e.exports=o,o.id=875},2694:(e,t,n)=>{"use strict";var r=n(6925);function o(){}function a(){}a.resetWarningCache=o,e.exports=function(){function e(e,t,n,o,a,i){if(i!==r){var s=new Error("Calling PropTypes validators directly is not supported by the `prop-types` package. Use PropTypes.checkPropTypes() to call them. Read more at http://fb.me/use-check-prop-types");throw s.name="Invariant Violation",s}}function t(){return e}e.isRequired=e;var n={array:e,bigint:e,bool:e,func:e,number:e,object:e,string:e,symbol:e,any:e,arrayOf:t,element:e,elementType:e,instanceOf:t,node:e,objectOf:t,oneOf:t,oneOfType:t,shape:t,exact:t,checkPropTypes:a,resetWarningCache:o};return n.PropTypes=n,n}},5556:(e,t,n)=>{e.exports=n(2694)()},6925:e=>{"use strict";e.exports="SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED"},2551:(e,t,n)=>{"use strict";var r=n(6540),o=n(9982);function a(e){for(var t="https://reactjs.org/docs/error-decoder.html?invariant="+e,n=1;n