From 3dc4d18452ea8802b2a72355ec07fadde232868c Mon Sep 17 00:00:00 2001 From: gh-actions Date: Fri, 30 Aug 2024 18:43:57 +0000 Subject: [PATCH] Deploy website - based on e078efbafcdf4fc3f5a4618347a7a281ef93338f --- 2021-02/index.html | 8 +-- 2021-03/index.html | 8 +-- 2021-06/index.html | 8 +-- 2022-04/index.html | 8 +-- 2022-06/index.html | 8 +-- 2022-07/index.html | 8 +-- 2022-08/index.html | 8 +-- 2023-03/index.html | 8 +-- 404.html | 8 +-- access/index.html | 8 +-- analyzing/index.html | 8 +-- android-custom-targeting/index.html | 8 +-- assets/js/62febced.7ac26e8d.js | 1 + assets/js/62febced.abf8eb42.js | 1 - assets/js/71fbae7b.eacfeada.js | 1 + assets/js/935f2afb.09d05ccd.js | 1 - assets/js/935f2afb.97af99ab.js | 1 + assets/js/b7510fea.4d9e7cf5.js | 1 + assets/js/b7510fea.505e2760.js | 1 - assets/js/main.9c9e9421.js | 2 - assets/js/main.c479bf0f.js | 2 + ...CENSE.txt => main.c479bf0f.js.LICENSE.txt} | 0 assets/js/runtime~main.2ed32ab8.js | 1 + assets/js/runtime~main.4d09a2a4.js | 1 - auto-sizing-cli/index.html | 8 +-- bucketing/index.html | 8 +-- capabilities/index.html | 8 +-- client-sdk-states-and-lifecycle/index.html | 8 +-- comms-sign-off/index.html | 8 +-- configuring/index.html | 8 +-- contributing/index.html | 8 +-- cookbook/fml/fml-cookbook/index.html | 8 +-- cookbook/fml/growable-collections/index.html | 8 +-- .../experimenter/branches-page/index.html | 8 +-- .../experimenter-state/index.html | 8 +-- deep-dives/experimenter/rollouts/index.html | 8 +-- .../jetstream/adding-a-platform/index.html | 8 +-- deep-dives/jetstream/configuration/index.html | 8 +-- deep-dives/jetstream/data-products/index.html | 8 +-- deep-dives/jetstream/metrics/index.html | 8 +-- deep-dives/jetstream/operations/index.html | 8 +-- deep-dives/jetstream/outcomes/index.html | 8 +-- deep-dives/jetstream/overview/index.html | 8 +-- deep-dives/jetstream/statistics/index.html | 8 +-- deep-dives/jetstream/testing/index.html | 8 +-- .../jetstream/troubleshooting/index.html | 8 +-- designing-experiments/index.html | 8 +-- desktop-enroll-locally/index.html | 10 ++-- desktop-feature-api-testing/index.html | 8 +-- desktop-feature-api/index.html | 8 +-- desktop-incident-response/index.html | 57 +++++++++++++++++++ desktop-migration-guide/index.html | 8 +-- desktop-pref-experiments/index.html | 18 +++--- desktop-targeting-debug/index.html | 10 ++-- ending/index.html | 8 +-- enrollment/experiment-enrollment/index.html | 8 +-- experiment-owners/index.html | 8 +-- experiment-sizing/index.html | 8 +-- exposure-faq/index.html | 8 +-- faq/branches/fml-errors/index.html | 8 +-- faq/branches/how-many-branches/index.html | 8 +-- faq/custom-configs/index.html | 8 +-- faq/desktop/desktop-prefs/index.html | 8 +-- faq/desktop/exposure/index.html | 8 +-- faq/early-startup/how-early/index.html | 8 +-- faq/early-startup/what-do-it-do/index.html | 8 +-- faq/ending-experiments/index.html | 8 +-- faq/feature-restart/index.html | 8 +-- faq/first-run/index.html | 8 +-- faq/general-faq/index.html | 8 +-- faq/mobile-faq/index.html | 8 +-- faq/warnings/index.html | 8 +-- feature-definition/index.html | 8 +-- feature-metrics/index.html | 8 +-- fml-spec/index.html | 8 +-- fml/coenrolling-features/index.html | 8 +-- fml/feature-metadata/index.html | 8 +-- fml/fml-cli/index.html | 8 +-- fml/fml-front-end-format/index.html | 8 +-- fml/fml-imports-and-includes/index.html | 8 +-- fml/fml-paths/index.html | 8 +-- fml/string-alias/index.html | 8 +-- fml/unimplemented/index.html | 8 +-- fml/using-prefs/index.html | 8 +-- for-leadership/index.html | 8 +-- for-product/index.html | 8 +-- .../engineers/for-engineers/index.html | 8 +-- .../index.html | 8 +-- .../index.html | 8 +-- .../index.html | 8 +-- .../index.html | 8 +-- glossary/index.html | 8 +-- help/index.html | 8 +-- index.html | 8 +-- integration-tests/index.html | 8 +-- ios-custom-targeting/index.html | 8 +-- ios-preview-testing/index.html | 8 +-- launching/index.html | 8 +-- legal-sign-off/index.html | 8 +-- local-enrollment/index.html | 8 +-- localization-process/index.html | 8 +-- message-consult/index.html | 8 +-- .../desktop-messaging-journey/index.html | 8 +-- .../desktop-messaging-surfaces/index.html | 8 +-- messaging/display-logic/index.html | 8 +-- .../experiments-and-user-messaging/index.html | 8 +-- messaging/frequency-cap/index.html | 8 +-- messaging/groups-and-campaigns/index.html | 8 +-- messaging/how-a-message-gets-shown/index.html | 8 +-- messaging/limitations/index.html | 8 +-- messaging/microsurveys/android/index.html | 8 +-- messaging/microsurveys/ios/index.html | 8 +-- messaging/mobile-messaging/index.html | 8 +-- messaging/remote-localization/index.html | 8 +-- messaging/telemetry/index.html | 8 +-- missing-exposure/index.html | 8 +-- mobile-behavioral-targeting/index.html | 8 +-- mobile-enrollment-state-machine/index.html | 8 +-- mobile-feature-api/index.html | 8 +-- mobile-first-run-experiments/index.html | 8 +-- mobile-surveys/index.html | 8 +-- monitoring/index.html | 8 +-- nimbus-cli/environment-variables/index.html | 8 +-- nimbus-cli/fml/index.html | 8 +-- nimbus-cli/getting-started/index.html | 8 +-- nimbus-cli/index.html | 8 +-- nimbus-cli/install/index.html | 8 +-- nimbus-cli/instrumentation/index.html | 8 +-- nimbus-cli/on-devices/index.html | 8 +-- nimbus-cli/opening-and-resetting/index.html | 8 +-- nimbus-cli/whats-new/index.html | 8 +-- nimbus-cli/working-with-features/index.html | 8 +-- nimbus-cli/working-with-files/index.html | 8 +-- nimbus-cli/working-with-logs/index.html | 8 +-- .../working-with-patch-files/index.html | 8 +-- notifications/index.html | 8 +-- .../onboarding-feature-android/index.html | 8 +-- onboarding/onboarding-feature-ios/index.html | 8 +-- overview/index.html | 8 +-- population-representativeness/index.html | 8 +-- previewing-experiments/index.html | 8 +-- qa-sign-off/index.html | 8 +-- results-availability/index.html | 8 +-- risk-mitigation/index.html | 8 +-- rollouts/rollouts-and-experiments/index.html | 8 +-- rollouts/saturation/index.html | 8 +-- rollouts/sizing/index.html | 8 +-- search-index-docs-default-current.json | 2 +- sitemap.xml | 2 +- system-architecture/index.html | 8 +-- targeting/advanced-targeting/index.html | 8 +-- targeting/version-targeting/index.html | 8 +-- telemetry/index.html | 8 +-- testing-on-mobile/index.html | 8 +-- types-of-risk/index.html | 8 +-- validating-experiments/index.html | 8 +-- vp-sign-off/index.html | 8 +-- warnings/index.html | 8 +-- whats-news/2023-Q2/index.html | 8 +-- whats-news/2023-Q4/index.html | 8 +-- whats-news/2023/2023-Q3/index.html | 8 +-- whats-news/2024-Q1/index.html | 8 +-- whats-news/2024-Q2/index.html | 8 +-- .../implementing/custom-audiences/index.html | 8 +-- .../onboarding-feature-desktop/index.html | 8 +-- workflow/overview/index.html | 8 +-- 166 files changed, 679 insertions(+), 617 deletions(-) create mode 100644 assets/js/62febced.7ac26e8d.js delete mode 100644 assets/js/62febced.abf8eb42.js create mode 100644 assets/js/71fbae7b.eacfeada.js delete mode 100644 assets/js/935f2afb.09d05ccd.js create mode 100644 assets/js/935f2afb.97af99ab.js create mode 100644 assets/js/b7510fea.4d9e7cf5.js delete mode 100644 assets/js/b7510fea.505e2760.js delete mode 100644 assets/js/main.9c9e9421.js create mode 100644 assets/js/main.c479bf0f.js rename assets/js/{main.9c9e9421.js.LICENSE.txt => main.c479bf0f.js.LICENSE.txt} (100%) create mode 100644 assets/js/runtime~main.2ed32ab8.js delete mode 100644 assets/js/runtime~main.4d09a2a4.js create mode 100644 desktop-incident-response/index.html diff --git a/2021-02/index.html b/2021-02/index.html index 148ca3b98..1fbb8c9de 100644 --- a/2021-02/index.html +++ b/2021-02/index.html @@ -4,13 +4,13 @@ What's Newsletter February 2021 | Experimenter Docs - - + +
Skip to main content

What's Newsletter

February 2021

Hey Nimbus customers!

Welcome to our very first edition of our “What’s New”-sletter. As our customers, we want to make sure we keep you in the loop with new Nimbus features and capabilities on a monthly basis.

Are you looking for a great Friday night movie? I'd highly recommend watching Les, Lauren, and Marina's video for a deep dive into all our new features.

Here is a sneak preview of some of the video highlights:

  • 📇 Curious to see upcoming or completed experiments? Check out our new Nimbus directory!
  • Data is now flowing into the Nimbus from Jetstream and you can navigate to experiment results from the Directory View or from the side bar!
  • 📈 P.S don’t forget to check out the results of the On/Off About:Welcome experiment
  • 📊 Speaking of metrics, we have added Days Of Use as our guardrail metrics in the visualization. We now also have added graphs in the visualizations so experiment owners can see how the metric progresses over time.
  • ⏸️ Don't have all the information to complete the page you're working on right now? Don't worry, we’ve removed some of the required fields so it’s easier to save your progress.
  • 🗂️ Have you ever felt really lost trying to juggle Confluence, Jira, Google Docs, and Nimbus to find all your docs and tickets? We sure have, so Nimbus now offers the ability to add your relevant tickets and documents into Nimbus, and you can easily access them then from our summary page in the future.
  • ⚠️ We know, there's nothing more frustrating than getting an error message and not knowing what it means! ⚠️ We just couldn't let that happen on Nimbus and now we have the right validation and error messages in our UI. Luckily, you will always know what's wrong now.

Curious about what's next?

If you're interested in seeing what visualizations might look like with primary and secondary probes, feel free to check out this storybook.

Curious for even more? You can always check out our Storybook link to see what's in the pipeline.

Notable mentions:

Interested in learning more about how to use Nimbus? Here is our Nimbus onboarding page. Let Ana or Chelsea know if you’d like to go through onboarding and start using the platform.

If you'd like your work to be added to Next months "What's New"-sletter please follow this page for instructions.

- - + + \ No newline at end of file diff --git a/2021-03/index.html b/2021-03/index.html index d97cdf57b..e49e64c46 100644 --- a/2021-03/index.html +++ b/2021-03/index.html @@ -4,8 +4,8 @@ What's Newsletter March 2021 | Experimenter Docs - - + +
@@ -13,7 +13,7 @@ Ana Medinac Application Services PM Toronto

- - + + \ No newline at end of file diff --git a/2021-06/index.html b/2021-06/index.html index 477afcc02..b996ff074 100644 --- a/2021-06/index.html +++ b/2021-06/index.html @@ -4,8 +4,8 @@ What's Newsletter June/July 2021 | Experimenter Docs - - + +
@@ -13,7 +13,7 @@ Ana Medinac Application Services PM Toronto

- - + + \ No newline at end of file diff --git a/2022-04/index.html b/2022-04/index.html index a0885f6b2..4b4f181af 100644 --- a/2022-04/index.html +++ b/2022-04/index.html @@ -4,8 +4,8 @@ What's Newsletter April 2021 | Experimenter Docs - - + +
@@ -14,7 +14,7 @@ Ana Medinac Application Services PM Toronto

- - + + \ No newline at end of file diff --git a/2022-06/index.html b/2022-06/index.html index aa3891296..5afdc0674 100644 --- a/2022-06/index.html +++ b/2022-06/index.html @@ -4,13 +4,13 @@ What's Newsletter June 2022 | Experimenter Docs - - + +
Skip to main content

What's New in Nimbus June 2022

Welcome

The Nimbus team has welcomed many new team members including:

  • Yashika Khurana, Web
  • Mike Williams, Web/Data
  • Daniel Berry, Data Science
  • Barret Rennie, Desktop

We're thrilled to have them all aboard!

Exciting Changes

Mobile Messaging

Nimbus now supports the ability to send messages to mobile clients through messaging surfaces in each mobile application. This unlocks the ability for Nimbus to run surveys, update users about important new information, or incorporate messages into other experiments/rollouts. More detailed information can be found here.

Mobile Language Targeting

Mobile devices use a different list of languages than desktop Firefox does, and so the locale field on the Audience page didn't work as expected for mobile experiments. To address this, we've added a new 'Language' field on the Audience page that can be used to target device languages for mobile experiments.

Mobile Country Targeting

Mobile devices do use the same list of countries that desktop Firefox does, and now country filtering has been implemented in the mobile client and so country targeting for mobile experiments is now available on the Audience page.

Analysis Fixes

There have been several ongoing bugs that affected the automatic analysis of many experiments, which have now been resolved. All experiments should now have access to the full analysis report including all metrics. If any experiment analyses are still missing information, please reach out on #ask-experimenter.

Reporting

Experimenter now has the ability to export a list of all Nimbus experiments as a CSV spreadsheet using the 'Reporting' button on the landing page. This can help organize large groups of experiments for review and planning.

Feature Imports

Nimbus Features are defined using manifest files in the code repositories of each supported Firefox application across desktop and mobile. All features for all supported applications are now automatically imported by Experimenter and automatically updated as new features or changes to existing features occur. Each Feature has a schema that is either specified in the manifest or automatically generated based on the Feature's variables, and is used to validate the JSON that is provided in each branch.

Sticky Targeting

Every experiment or rollout in Nimbus includes a targeting expression that clients use to determine whether to enroll or unenroll. The targeting expressions is frequently re evaluated after enrollment to determine if the client should unenroll early before the experiment ends. If any part of the targeting expression evaluates to False, then the client will unenroll. Sometimes this is the desired behaviour for an experiment, sometimes it is not. For cases where clients should not unenroll even if the targeting no longer matches, we now provide the option for Sticky Targeting, which can be found on the Audience page. If an experiment uses Sticky Targeting, then clients will not be unenrolled, even if the targeting becomes False, until the experiment ends.

- - + + \ No newline at end of file diff --git a/2022-07/index.html b/2022-07/index.html index 5d04815cf..ef2ca9580 100644 --- a/2022-07/index.html +++ b/2022-07/index.html @@ -4,13 +4,13 @@ What's Newsletter July 2022 | Experimenter Docs - - + +
Skip to main content

What's New in Nimbus July 2022

Welcome

The Nimbus team has welcomed a new team member: Charlie Humphreys, Mobile.

We're thrilled to have Charlie on board!

Exciting Changes

Sticky Enrollment

  • When creating a new experiment, users can now opt for sticky enrollment (clients will not be unenrolled, even if the targeting becomes false, until the experiment ends). This information is now visible on the experiment’s "Details" page so that the user can review if they have opted for sticky enrollment.

  • In addition to that, a new warning has been added when creating a new experiment. If an experiment is using a targeting configuration that requires sticky enrollment, sticky enrollment would be auto selected to support that targeting expression.

Normandy

Normandy will continue to be supported until Nimbus can take over for its responsibilities. So in the meanwhile, we have restored the create button in the old Experimenter interface.

Feedback

Now a feedback link is also available on the landing page. Don’t wait to give us any feedback!

Feature enabled

  • Desktop

    Firefox Desktop 104 is removing support for the feature enabled toggle, so experiments Firefox Desktop 104 and above will require feature enabled to be on for every branch.

  • Mobile

    The feature enabled flag has been disabled entirely for mobile experiments. Every branch of a mobile experiment must specify a feature value, which may explicitly be an empty object "{}".

Stay tuned for the next month's letter!

- - + + \ No newline at end of file diff --git a/2022-08/index.html b/2022-08/index.html index 40363176e..a15ebdb2d 100644 --- a/2022-08/index.html +++ b/2022-08/index.html @@ -4,14 +4,14 @@ What's Newsletter August 2022 | Experimenter Docs - - + +
Skip to main content

What's New in Nimbus August 2022

Welcome

The Nimbus team will have a demo booth at #moz-aloha All-Hands at the end of September! Come find us, chat about experimentation, and maybe even grab a sticker!

Exciting Changes

Mobile First Run

Mobile First Run refers to the work done in Nimbus to allow experiments during an user's first run of the Firefox mobile app.

  • Instrument Nimbus SDK in telemetry in order to provide experimental treatments during the onboarding experience.
    • This was affecting more than 100,000 clients and over 1.5M events/requests.

Improved Rollout Support

A Rollout is an experiment where instead of configuring control and treatment branches, a feature is slowly rolled out to a population of clients. Experimenter now has improved support for Rollouts.

  • A client can:
    • enroll in a rollout, receive feature values, send telemetry
    • explicitly unenroll from the client UI
    • be automatically unenrolled by unpublishing the record from RS
    • enroll in a rollout for a feature, and then ALSO enroll in an experiment for the same feature, receive the experiment feature configuration while enrolled in the experiment, then be unenrolled from the experiment and fall back to the rollout feature configuration
  • User Interface
    • Now just check a box to make your experiment a rollout!
    • For rollout experiments, branch configuration UI is removed.

Cancel Review

If you launch, end, or end enrollment for an experiment it automatically goes to Review. Now, there is an option to cancel that change and go back to an idle state where changes can be made.

UI/UX Updates

Various user experience updates to streamline workflows and provide more consistency throughout the tool, like:

  • Improved labels
  • Analysis Results Time -- now you can see on the Results page when the last analysis started
  • Performance improvements
  • All displayed dates now include the year

Improved Testing and Validation

  • Better integration testing
  • Better validation of configurations

Stay tuned for snakes, camels, and more in next month's edition of What's New in Nimbus!

- - + + \ No newline at end of file diff --git a/2023-03/index.html b/2023-03/index.html index 915b954f8..6e5e0a066 100644 --- a/2023-03/index.html +++ b/2023-03/index.html @@ -4,13 +4,13 @@ What's Newsletter March 2023 | Experimenter Docs - - + +
Skip to main content

What's New in Nimbus March 2023

Rollouts

Nimbus now supports edits for live rollouts! This allows owners to make changes to the population percentage and publish them. See our rollouts deep-dive for more info!

Nimbus Gradle Plugin

The Nimbus gradle plugin has been moved from Android Components to Application Services. Updated information for utilizing the plugin can be found here.

Testing tooling

For injecting experimental feature configurations for integration tests, we now have the following:

  • Added a malformedConfiguration event for app features to report bad configurations.
  • Added a record_past_event method to test display triggers based on the event store.

Messaging

We’re in the last stretch of QA for adding a notification surface to the Nimbus Messaging system on Android (thank you @twhite and @mheres). For iOS, the survey surface has landed (thank you to @yrios and @roux).

More exciting changes coming next month!

- - + + \ No newline at end of file diff --git a/404.html b/404.html index 0425fc39c..0d7861ba7 100644 --- a/404.html +++ b/404.html @@ -4,13 +4,13 @@ Page Not Found | Experimenter Docs - - + +
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.

- - + + \ No newline at end of file diff --git a/access/index.html b/access/index.html index 28d4ce284..7d20ea82d 100644 --- a/access/index.html +++ b/access/index.html @@ -4,15 +4,15 @@ Experiment Reviewers | Experimenter Docs - - + +
Skip to main content

Experiment Reviewers

With Nimbus experiments, instead of a centralized committee responsible for launching and running experiments we want you, the experiment owner, to drive the process from ideation to completion.

If you are interested in learning more about your responsibilities, you can find our complete Access Control Policy here.

Onboarding for New Authors/Owners (L2)

In order to use the Nimbus platform to create and launch experiments, you will need to go through the Experiment Owner onboarding process. Please ask in #ask-experimenter if you have any questions and for a shadow on the first experiments(s) you create.

Onboarding for New Reviewers (L3)

Assuming you have been vouched for by a Nimbus administrator + a Product Owner (product manager or engineering manager if the team doesn’t have a dedicated PM), you should go through the following steps to get review access on Nimbus:

Basic access

  • Read through rules and responsibilities for L3 users. Please note that you will have access to making changes in production for all experiments, and you should decline if you don't feel sufficiently qualified to review an experiment
  • Watch the half hour reviewer training video. The training slides are here for reference and links.
  • Follow the steps setup VPN
  • File a bug using this template to be added to either or all of the following collections: nimbus-experiments-desktop and/or nimbus-experiments-mobile and/or nimbus-web-experiments for your LDAP to be added on staging and production.
  • Note: on your first review(s) - please ask in #ask-experimenter for a shadow. It's very easy to partner with you sharing a screen to make sure you don't have any questions or uncertainties.

Testing Review Workflow on Staging

  • Connect to the VPN
  • Go to Nimbus Staging (not Production!). Ask someone to create a dummy experiment and request review.
  • Click "Approve" on the dummy experiment, and then "Open Remote Settings": imageimage
  • Sign in. You should see a review request like this, if you don't refresh the page image
  • CHECK TO MAKE SURE THE SLUG OF THE DIFF MATCHES THE CHANGE YOU ARE APPROVING This is important!!
  • Press approve if everything looks good. If anything looks wrong, Reject and alert nimbus core team in #ask-experiments
  • Congrats, you have tested the workflow. You are now ready to review real experiments on production!

Reviews

All changes to experiments and rollouts that impact production must be approved by a single L3 Nimbus reviewer, which you can request via the Nimbus console interface. You can find a list of recommended reviewers here.

- - + + \ No newline at end of file diff --git a/analyzing/index.html b/analyzing/index.html index e5f953aac..d608c87fe 100644 --- a/analyzing/index.html +++ b/analyzing/index.html @@ -4,13 +4,13 @@ Experiment Analysis | Experimenter Docs - - + +
Skip to main content

Experiment Analysis

Experiment results are availabe from the Results Link on your experiment page. Experiments typically take 24 hours after ending to generate the overall results.

At the top of your results page under "Analysis" is an information box that provides information on your results, if there were issues there will be an error here, if there were custom data modifications it will share what those are, etc. Please read this and ask questions to your assigned data scientist or in #ask-experimenter if you need help.

By default - results are shown by Exposure Events. If you don't see results for your experiment - trying going to the Results Config bar on the left of your Results page and click the "enrollments" radial button.

If you have questions about reading your results please ask the assigned data scientist, attend the mobile or desktop office hours, or you can look here for the basics on how to interpret.

See jetstream for more info.

- - + + \ No newline at end of file diff --git a/android-custom-targeting/index.html b/android-custom-targeting/index.html index 8dd2114a5..4951542f9 100644 --- a/android-custom-targeting/index.html +++ b/android-custom-targeting/index.html @@ -4,14 +4,14 @@ Adding new targeting attributes to Android | Experimenter Docs - - + +
Skip to main content

Adding new targeting attributes to Android

This page demonstrates how to add new targeting attributes to Android, enabling experiment creators more specific targeting. For more general documentation on targeting custom audiences, check out the custom audiences docs

Adding the attribute to the application

The Nimbus SDK exposes a new customTargetingAttributes parameter in its initializer that is a Map<String, String> map. We can take advantage of this parameter to pass in new targeting attributes without modifying the Nimbus SDK at all.

danger

A current limitation is that both the key and the value of the targeting attribute are strings. Please reach out to the Nimbus SDK team for any targeting attributes that require integer comparison, or any other richer JEXL expressions that cannot be done with strings.

How to add a new attribute

In NimbusSetup.kt NimbusAppInfo now optionally takes in a map customTargetingAttributes that will be used to add custom targeting. Simply add a new key-value pair to the map and it will be available for targeting. For example:

val appInfo = NimbusAppInfo(
appName = "fenix",
channel = BuildConfig.BUILD_TYPE,
customTargetingAttributes = mapOf(
"newTargetingAttributeName" to "targetingAttributeValue",
)
)

Note that since we need to add the targeting attributes on the client code, the attribute changes will have to ride the trains before they are available for targeting.

Adding the attribute on experimenter

After the targeting attribute is ready on the app, you will need to modify experimenter to allow creating experiments that target the attribute you created. Follow the instructions on the custom audiences page to add the new targeting on experimenter.

danger

The targeting JEXL expression on experimenter must use the same name as the key given to the SDK. For example, if the app defines a key-value pair, with key isFirstRun. experimenter expression must use the same name (i.e isFirstRun).

Example

- - + + \ No newline at end of file diff --git a/assets/js/62febced.7ac26e8d.js b/assets/js/62febced.7ac26e8d.js new file mode 100644 index 000000000..e7ee2abf7 --- /dev/null +++ b/assets/js/62febced.7ac26e8d.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkexperimenter_docs=self.webpackChunkexperimenter_docs||[]).push([[6174],{4137:(e,t,n)=>{n.d(t,{Zo:()=>u,kt:()=>b});var r=n(7294);function l(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function o(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function a(e){for(var t=1;t=0||(l[n]=e[n]);return l}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(l[n]=e[n])}return l}var p=r.createContext({}),s=function(e){var t=r.useContext(p),n=t;return e&&(n="function"==typeof e?e(t):a(a({},t),e)),n},u=function(e){var t=s(e.components);return r.createElement(p.Provider,{value:t},e.children)},d="mdxType",c={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},m=r.forwardRef((function(e,t){var n=e.components,l=e.mdxType,o=e.originalType,p=e.parentName,u=i(e,["components","mdxType","originalType","parentName"]),d=s(n),m=l,b=d["".concat(p,".").concat(m)]||d[m]||c[m]||o;return n?r.createElement(b,a(a({ref:t},u),{},{components:n})):r.createElement(b,a({ref:t},u))}));function b(e,t){var n=arguments,l=t&&t.mdxType;if("string"==typeof e||l){var o=n.length,a=new Array(o);a[0]=m;var i={};for(var p in t)hasOwnProperty.call(t,p)&&(i[p]=t[p]);i.originalType=e,i[d]="string"==typeof e?e:l,a[1]=i;for(var s=2;s{n.r(t),n.d(t,{assets:()=>p,contentTitle:()=>a,default:()=>c,frontMatter:()=>o,metadata:()=>i,toc:()=>s});var r=n(7462),l=(n(7294),n(4137));const o={id:"desktop-enroll-locally",title:"Desktop Local Experiment Iteration",slug:"/desktop-enroll-locally"},a="Debugging an experiment from experimenter locally",i={unversionedId:"deep-dives/desktop/desktop-enroll-locally",id:"deep-dives/desktop/desktop-enroll-locally",title:"Desktop Local Experiment Iteration",description:"Trying to iterate on an experiment in Preview on experimenter.services.mozilla.com can be painful, because even after you change something and post to preview, you have a wait a while for the updated recipe to be propagated to the CDN.",source:"@site/docs/deep-dives/desktop/desktop-enroll-locally.md",sourceDirName:"deep-dives/desktop",slug:"/desktop-enroll-locally",permalink:"/desktop-enroll-locally",draft:!1,editUrl:"https://github.com/mozilla/experimenter-docs/edit/main/docs/deep-dives/desktop/desktop-enroll-locally.md",tags:[],version:"current",frontMatter:{id:"desktop-enroll-locally",title:"Desktop Local Experiment Iteration",slug:"/desktop-enroll-locally"},sidebar:"sidebar",previous:{title:"Exposure Funnel and Population Representativeness",permalink:"/population-representativeness"},next:{title:"Launching Incident Response Pref Flips",permalink:"/desktop-incident-response"}},p={},s=[{value:"Enable Nimbus debugging",id:"enable-nimbus-debugging",level:2},{value:"Enable the Browser Toolbox",id:"enable-the-browser-toolbox",level:2},{value:"Prepare a few things:",id:"prepare-a-few-things",level:2},{value:"Do the Enrollment",id:"do-the-enrollment",level:2},{value:"Reload about:studies, and you should see the experiment",id:"reload-aboutstudies-and-you-should-see-the-experiment",level:2}],u={toc:s},d="wrapper";function c(e){let{components:t,...n}=e;return(0,l.kt)(d,(0,r.Z)({},u,n,{components:t,mdxType:"MDXLayout"}),(0,l.kt)("h1",{id:"debugging-an-experiment-from-experimenter-locally"},"Debugging an experiment from experimenter locally"),(0,l.kt)("p",null,"Trying to iterate on an experiment in Preview on experimenter.services.mozilla.com can be painful, because even after you change something and post to preview, you have a wait a while for the updated recipe to be propagated to the CDN."),(0,l.kt)("h2",{id:"enable-nimbus-debugging"},"Enable Nimbus debugging"),(0,l.kt)("ul",null,(0,l.kt)("li",{parentName:"ul"},"In ",(0,l.kt)("inlineCode",{parentName:"li"},"about:config"),", set:",(0,l.kt)("ul",{parentName:"li"},(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("inlineCode",{parentName:"li"},"nimbus.debug")," to ",(0,l.kt)("inlineCode",{parentName:"li"},"true"))))),(0,l.kt)("h2",{id:"enable-the-browser-toolbox"},"Enable the Browser Toolbox"),(0,l.kt)("ul",null,(0,l.kt)("li",{parentName:"ul"},"In ",(0,l.kt)("inlineCode",{parentName:"li"},"about:config"),", set:",(0,l.kt)("ul",{parentName:"li"},(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("inlineCode",{parentName:"li"},"devtools.chrome.enabled")," to ",(0,l.kt)("inlineCode",{parentName:"li"},"true")),(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("inlineCode",{parentName:"li"},"devtools.debugger.remote-enabled")," to ",(0,l.kt)("inlineCode",{parentName:"li"},"true"))))),(0,l.kt)("h2",{id:"prepare-a-few-things"},"Prepare a few things:"),(0,l.kt)("ul",null,(0,l.kt)("li",{parentName:"ul"},"Load ",(0,l.kt)("inlineCode",{parentName:"li"},"about:studies")," and unenroll this profile from anything that might interfere"),(0,l.kt)("li",{parentName:"ul"},"On the Experimenter page for your experiment, select the contents of the ",(0,l.kt)("inlineCode",{parentName:"li"},"Recipe JSON")," field from the ",(0,l.kt)("inlineCode",{parentName:"li"},"Details")," tab, and copy it into your Copy/Paste buffer")),(0,l.kt)("h2",{id:"do-the-enrollment"},"Do the Enrollment"),(0,l.kt)("ul",null,(0,l.kt)("li",{parentName:"ul"},"Open ",(0,l.kt)("inlineCode",{parentName:"li"},"Tools > Browser Tools > Browser Toolbox")),(0,l.kt)("li",{parentName:"ul"},"Switch to the browser console"),(0,l.kt)("li",{parentName:"ul"},"In the input area, do the following:",(0,l.kt)("ul",{parentName:"li"},(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("inlineCode",{parentName:"li"},"const branchSlug = 'treatment-a'; // or whatever branch you want")),(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("inlineCode",{parentName:"li"},"let recipe = ")," ",(0,l.kt)("em",{parentName:"li"},"paste_recipe_json_here")," ",(0,l.kt)("inlineCode",{parentName:"li"},";")),(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("inlineCode",{parentName:"li"},'const { ExperimentManager: em } = ChromeUtils.importESModule("resource://nimbus/lib/ExperimentManager.sys.mjs");')),(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("inlineCode",{parentName:"li"},"let branch = recipe.branches.find(b => b.slug == branchSlug);")),(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("inlineCode",{parentName:"li"},"em.forceEnroll(recipe, branch);"))))),(0,l.kt)("h2",{id:"reload-aboutstudies-and-you-should-see-the-experiment"},"Reload ",(0,l.kt)("inlineCode",{parentName:"h2"},"about:studies"),", and you should see the experiment"))}c.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/62febced.abf8eb42.js b/assets/js/62febced.abf8eb42.js deleted file mode 100644 index bd538ac8f..000000000 --- a/assets/js/62febced.abf8eb42.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkexperimenter_docs=self.webpackChunkexperimenter_docs||[]).push([[6174],{4137:(e,t,n)=>{n.d(t,{Zo:()=>u,kt:()=>b});var r=n(7294);function l(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function o(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function a(e){for(var t=1;t=0||(l[n]=e[n]);return l}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(l[n]=e[n])}return l}var p=r.createContext({}),s=function(e){var t=r.useContext(p),n=t;return e&&(n="function"==typeof e?e(t):a(a({},t),e)),n},u=function(e){var t=s(e.components);return r.createElement(p.Provider,{value:t},e.children)},d="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},c=r.forwardRef((function(e,t){var n=e.components,l=e.mdxType,o=e.originalType,p=e.parentName,u=i(e,["components","mdxType","originalType","parentName"]),d=s(n),c=l,b=d["".concat(p,".").concat(c)]||d[c]||m[c]||o;return n?r.createElement(b,a(a({ref:t},u),{},{components:n})):r.createElement(b,a({ref:t},u))}));function b(e,t){var n=arguments,l=t&&t.mdxType;if("string"==typeof e||l){var o=n.length,a=new Array(o);a[0]=c;var i={};for(var p in t)hasOwnProperty.call(t,p)&&(i[p]=t[p]);i.originalType=e,i[d]="string"==typeof e?e:l,a[1]=i;for(var s=2;s{n.r(t),n.d(t,{assets:()=>p,contentTitle:()=>a,default:()=>m,frontMatter:()=>o,metadata:()=>i,toc:()=>s});var r=n(7462),l=(n(7294),n(4137));const o={id:"desktop-enroll-locally",title:"Desktop Local Experiment Iteration",slug:"/desktop-enroll-locally"},a="Debugging an experiment from experimenter locally",i={unversionedId:"deep-dives/desktop/desktop-enroll-locally",id:"deep-dives/desktop/desktop-enroll-locally",title:"Desktop Local Experiment Iteration",description:"Trying to iterate on an experiment in Preview on experimenter.services.mozilla.com can be painful, because even after you change something and post to preview, you have a wait a while for the updated recipe to be propagated to the CDN.",source:"@site/docs/deep-dives/desktop/desktop-enroll-locally.md",sourceDirName:"deep-dives/desktop",slug:"/desktop-enroll-locally",permalink:"/desktop-enroll-locally",draft:!1,editUrl:"https://github.com/mozilla/experimenter-docs/edit/main/docs/deep-dives/desktop/desktop-enroll-locally.md",tags:[],version:"current",frontMatter:{id:"desktop-enroll-locally",title:"Desktop Local Experiment Iteration",slug:"/desktop-enroll-locally"},sidebar:"sidebar",previous:{title:"Exposure Funnel and Population Representativeness",permalink:"/population-representativeness"},next:{title:"Running Pref-setting Experiments on Desktop",permalink:"/desktop-pref-experiments"}},p={},s=[{value:"Enable Nimbus debugging",id:"enable-nimbus-debugging",level:2},{value:"Enable the Browser Toolbox",id:"enable-the-browser-toolbox",level:2},{value:"Prepare a few things:",id:"prepare-a-few-things",level:2},{value:"Do the Enrollment",id:"do-the-enrollment",level:2},{value:"Reload about:studies, and you should see the experiment",id:"reload-aboutstudies-and-you-should-see-the-experiment",level:2}],u={toc:s},d="wrapper";function m(e){let{components:t,...n}=e;return(0,l.kt)(d,(0,r.Z)({},u,n,{components:t,mdxType:"MDXLayout"}),(0,l.kt)("h1",{id:"debugging-an-experiment-from-experimenter-locally"},"Debugging an experiment from experimenter locally"),(0,l.kt)("p",null,"Trying to iterate on an experiment in Preview on experimenter.services.mozilla.com can be painful, because even after you change something and post to preview, you have a wait a while for the updated recipe to be propagated to the CDN."),(0,l.kt)("h2",{id:"enable-nimbus-debugging"},"Enable Nimbus debugging"),(0,l.kt)("ul",null,(0,l.kt)("li",{parentName:"ul"},"In ",(0,l.kt)("inlineCode",{parentName:"li"},"about:config"),", set:",(0,l.kt)("ul",{parentName:"li"},(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("inlineCode",{parentName:"li"},"nimbus.debug")," to ",(0,l.kt)("inlineCode",{parentName:"li"},"true"))))),(0,l.kt)("h2",{id:"enable-the-browser-toolbox"},"Enable the Browser Toolbox"),(0,l.kt)("ul",null,(0,l.kt)("li",{parentName:"ul"},"In ",(0,l.kt)("inlineCode",{parentName:"li"},"about:config"),", set:",(0,l.kt)("ul",{parentName:"li"},(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("inlineCode",{parentName:"li"},"devtools.chrome.enabled")," to ",(0,l.kt)("inlineCode",{parentName:"li"},"true")),(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("inlineCode",{parentName:"li"},"devtools.debugger.remote-enabled")," to ",(0,l.kt)("inlineCode",{parentName:"li"},"true"))))),(0,l.kt)("h2",{id:"prepare-a-few-things"},"Prepare a few things:"),(0,l.kt)("ul",null,(0,l.kt)("li",{parentName:"ul"},"Load ",(0,l.kt)("inlineCode",{parentName:"li"},"about:studies")," and unenroll this profile from anything that might interfere"),(0,l.kt)("li",{parentName:"ul"},"On the Experimenter page for your experiment, select the contents of the ",(0,l.kt)("inlineCode",{parentName:"li"},"Recipe JSON")," field from the ",(0,l.kt)("inlineCode",{parentName:"li"},"Details")," tab, and copy it into your Copy/Paste buffer")),(0,l.kt)("h2",{id:"do-the-enrollment"},"Do the Enrollment"),(0,l.kt)("ul",null,(0,l.kt)("li",{parentName:"ul"},"Open ",(0,l.kt)("inlineCode",{parentName:"li"},"Tools > Browser Tools > Browser Toolbox")),(0,l.kt)("li",{parentName:"ul"},"Switch to the browser console"),(0,l.kt)("li",{parentName:"ul"},"In the input area, do the following:",(0,l.kt)("ul",{parentName:"li"},(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("inlineCode",{parentName:"li"},"const branchSlug = 'treatment-a'; // or whatever branch you want")),(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("inlineCode",{parentName:"li"},"let recipe = ")," ",(0,l.kt)("em",{parentName:"li"},"paste_recipe_json_here")," ",(0,l.kt)("inlineCode",{parentName:"li"},";")),(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("inlineCode",{parentName:"li"},'const { ExperimentManager: em } = ChromeUtils.importESModule("resource://nimbus/lib/ExperimentManager.sys.mjs");')),(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("inlineCode",{parentName:"li"},"let branch = recipe.branches.find(b => b.slug == branchSlug);")),(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("inlineCode",{parentName:"li"},"em.forceEnroll(recipe, branch);"))))),(0,l.kt)("h2",{id:"reload-aboutstudies-and-you-should-see-the-experiment"},"Reload ",(0,l.kt)("inlineCode",{parentName:"h2"},"about:studies"),", and you should see the experiment"))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/71fbae7b.eacfeada.js b/assets/js/71fbae7b.eacfeada.js new file mode 100644 index 000000000..22598d956 --- /dev/null +++ b/assets/js/71fbae7b.eacfeada.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkexperimenter_docs=self.webpackChunkexperimenter_docs||[]).push([[4743],{4137:(e,t,n)=>{n.d(t,{Zo:()=>u,kt:()=>m});var r=n(7294);function l(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function a(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function i(e){for(var t=1;t=0||(l[n]=e[n]);return l}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(l[n]=e[n])}return l}var s=r.createContext({}),p=function(e){var t=r.useContext(s),n=t;return e&&(n="function"==typeof e?e(t):i(i({},t),e)),n},u=function(e){var t=p(e.components);return r.createElement(s.Provider,{value:t},e.children)},d="mdxType",c={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},h=r.forwardRef((function(e,t){var n=e.components,l=e.mdxType,a=e.originalType,s=e.parentName,u=o(e,["components","mdxType","originalType","parentName"]),d=p(n),h=l,m=d["".concat(s,".").concat(h)]||d[h]||c[h]||a;return n?r.createElement(m,i(i({ref:t},u),{},{components:n})):r.createElement(m,i({ref:t},u))}));function m(e,t){var n=arguments,l=t&&t.mdxType;if("string"==typeof e||l){var a=n.length,i=new Array(a);i[0]=h;var o={};for(var s in t)hasOwnProperty.call(t,s)&&(o[s]=t[s]);o.originalType=e,o[d]="string"==typeof e?e:l,i[1]=o;for(var p=2;p{n.r(t),n.d(t,{assets:()=>s,contentTitle:()=>i,default:()=>c,frontMatter:()=>a,metadata:()=>o,toc:()=>p});var r=n(7462),l=(n(7294),n(4137));const a={id:"desktop-incident-response",title:"Launching Incident Response Pref Flips",slug:"/desktop-incident-response"},i=void 0,o={unversionedId:"deep-dives/desktop/desktop-incident-response",id:"deep-dives/desktop/desktop-incident-response",title:"Launching Incident Response Pref Flips",description:"As of Firefox 129 (and 128.2 ESR), Firefox supports flipping any pref via",source:"@site/docs/deep-dives/desktop/desktop-incident-response.md",sourceDirName:"deep-dives/desktop",slug:"/desktop-incident-response",permalink:"/desktop-incident-response",draft:!1,editUrl:"https://github.com/mozilla/experimenter-docs/edit/main/docs/deep-dives/desktop/desktop-incident-response.md",tags:[],version:"current",frontMatter:{id:"desktop-incident-response",title:"Launching Incident Response Pref Flips",slug:"/desktop-incident-response"},sidebar:"sidebar",previous:{title:"Desktop Local Experiment Iteration",permalink:"/desktop-enroll-locally"},next:{title:"Running Pref-setting Experiments on Desktop",permalink:"/desktop-pref-experiments"}},s={},p=[{value:"Multi-feature",id:"multi-feature",level:2},{value:"Mismatched Types",id:"mismatched-types",level:2},{value:"Conflicts with setPref Experiments",id:"conflicts-with-setpref-experiments",level:2},{value:"User Pref Changes",id:"user-pref-changes",level:2}],u={toc:p},d="wrapper";function c(e){let{components:t,...n}=e;return(0,l.kt)(d,(0,r.Z)({},u,n,{components:t,mdxType:"MDXLayout"}),(0,l.kt)("p",null,"As of Firefox 129 (and 128.2 ESR), Firefox supports flipping any pref via\nNimbus. This is done with the ",(0,l.kt)("inlineCode",{parentName:"p"},"prefFlips")," feature. The JSON Schema definition\nfor the feature value can be found ",(0,l.kt)("a",{parentName:"p",href:"https://searchfox.org/mozilla-central/source/toolkit/components/nimbus/schemas/PrefFlipsFeature.schema.json"},"here"),"."),(0,l.kt)("h1",{id:"warning"},"Warning"),(0,l.kt)("p",null,"This feature is ",(0,l.kt)("em",{parentName:"p"},"not intended for use in experimentation"),". If you want to do an\nexperiment on some number of prefs in Firefox, you ",(0,l.kt)("strong",{parentName:"p"},"must")," register these prefs\nwith the ",(0,l.kt)("a",{parentName:"p",href:"https://searchfox.org/mozilla-central/source/toolkit/components/nimbus/FeatureManifest.yaml"},"Feature Manifest"),". This ensures that prefs\ncontrolled via Nimbus are subject to code review. See the docs on ",(0,l.kt)("a",{parentName:"p",href:"/desktop-pref-experiments"},"Desktop pref\nexperiments")," for more information."),(0,l.kt)("p",null,"Because the incident response feature can change ",(0,l.kt)("em",{parentName:"p"},"any pref"),", it should be used\nwith caution. Remember: with great power comes great responsibility."),(0,l.kt)("p",null,"Only the release management team can approve incident reponse pref flips."),(0,l.kt)("h1",{id:"behaviour"},"Behaviour"),(0,l.kt)("p",null,"When a client enrolls into an experiment/rollout using this feature, Nimbus will\nset (or unset) all the prefs to the values specified. Prefs on the ",(0,l.kt)("inlineCode",{parentName:"p"},"user")," branch\nwill persist through startup and be available immediately. Prefs set on the\n",(0,l.kt)("inlineCode",{parentName:"p"},"default")," branch will not persist through startup and will not have their\ncorrect values until Nimbus finishes initialization."),(0,l.kt)("p",null,"When the client unenrolls, all prefs will be restored to their values before\nenrollment. If the pref did not exist before enrollment, it will be cleared if\nit was set on the user branch. The default branch does not support clearing, so\nthe pref and its value from the enrollment will persist until the browser\ncloses."),(0,l.kt)("p",null,"If the client is enrolled in both an experiment and a rollout then only the\nexperiment will take effect. This behaviour is likely to change once multiple\nenrollment support is added to desktop."),(0,l.kt)("h2",{id:"multi-feature"},"Multi-feature"),(0,l.kt)("p",null,"The incident response feature ",(0,l.kt)("em",{parentName:"p"},"cannot")," be used with other features."),(0,l.kt)("h1",{id:"launching-a-pref-flip"},"Launching a Pref Flip"),(0,l.kt)("ol",null,(0,l.kt)("li",{parentName:"ol"},(0,l.kt)("p",{parentName:"li"},"Create a new experiment in\n",(0,l.kt)("a",{parentName:"p",href:"https://experimenter.services.mozilla.com/nimbus/"},"Experimenter")," with an\nappropriate public name (this will appear in ",(0,l.kt)("inlineCode",{parentName:"p"},"about:studies"),") for Firefox\nDesktop.")),(0,l.kt)("li",{parentName:"ol"},(0,l.kt)("p",{parentName:"li"},'Fill in the "overview" page as appropriate.')),(0,l.kt)("li",{parentName:"ol"},(0,l.kt)("p",{parentName:"li"},'Fill in the "branches" page:'),(0,l.kt)("ol",{parentName:"li"},(0,l.kt)("li",{parentName:"ol"},(0,l.kt)("p",{parentName:"li"},"Select the ",(0,l.kt)("inlineCode",{parentName:"p"},"prefFlips")," feature.")),(0,l.kt)("li",{parentName:"ol"},(0,l.kt)("p",{parentName:"li"},'Check the "This is a rollout (single branch)" checkbox.'),(0,l.kt)("p",{parentName:"li"},"This is not strictly required, but rollout enrollment can be dialed up or\ndown without requiring ending the experiment and re-launching. If you do\nnot want to use a rollout so that you can set different prefs on different\nbranches you likely want to run an experiment, in which case this feature\nis not appropriate for your use case.")),(0,l.kt)("li",{parentName:"ol"},(0,l.kt)("p",{parentName:"li"},'Enter a description for the "Control" branch.')),(0,l.kt)("li",{parentName:"ol"},(0,l.kt)("p",{parentName:"li"},"Enter a value for the ",(0,l.kt)("inlineCode",{parentName:"p"},"prefFlips")," (see the ",(0,l.kt)("a",{parentName:"p",href:"#example-configuration"},"example configuration"),").")))),(0,l.kt)("li",{parentName:"ol"},(0,l.kt)("p",{parentName:"li"},'Fill in the "Audience" page:'),(0,l.kt)("dl",null,(0,l.kt)("dt",null,"channel"),(0,l.kt)("dd",null,"You must specify a channel to use this feature. If you want to change a pref across multiple channels you must repeat this process for each channel."),(0,l.kt)("dt",null,"Min Version"),(0,l.kt)("dd",null,"You must specify a minimum version. The minimum versions supported are 129 on the Nightly, Beta, Aurora (developer edition), and Release channel and 128.2 on the ESR channel."),(0,l.kt)("dt",null,"Advanced Targeting"),(0,l.kt)("dd",null,(0,l.kt)("p",null,'If you want to enroll the entire population, choose "No Targeting - All users". Otherwise, select an appropriate targeting criteria.'),(0,l.kt)("p",null,"If a targeting criteria does not exist, one will have to be added. See the ",(0,l.kt)("a",{href:"/targeting/advanced-targeting#answer"},"advanced targeting FAQ")," or ask for help in ",(0,l.kt)("code",null,"#ask-experimenter")," on Slack.")),(0,l.kt)("dt",null,"Sticky Enrollment"),(0,l.kt)("dd",null,(0,l.kt)("p",null,"Experiment targeting is re-evaluated every time the client checks for new recipes. If you want the selected advanced targeting to only be evaluated during enrollment, check this box."),(0,l.kt)("p",null,(0,l.kt)("strong",null,"Note:")," Rollouts can re-enroll after unenrolling (e.g., if enrollment percentage decreased and then increased). In these cases, rollouts will re-evaluate targeting, ignoring the sticky flag.")),(0,l.kt)("dt",null,"Percent of Clients"),(0,l.kt)("dd",null,"Enter the percent of clients you wish to enroll. This value can be changed after launch for rollouts."))),(0,l.kt)("li",{parentName:"ol"},(0,l.kt)("p",{parentName:"li"},"On the Summary Page, request launch."),(0,l.kt)("p",{parentName:"li"},"Experiments and rollouts using the incident response feature cannot be\nlaunched to preview. We highly reccomend you QA these recipes on the ",(0,l.kt)("a",{parentName:"p",href:"https://stage.experimenter.nonprod.dataops.mozgcp.net/nimbus/"},"staging\ninstance of experimenter")," first."),(0,l.kt)("p",{parentName:"li"},(0,l.kt)("strong",{parentName:"p"},"Note:")," Experimenter may report errors with your recipe configuration. You\nmust fix them before requesting launch. Ask in ",(0,l.kt)("inlineCode",{parentName:"p"},"#ask-experimenter")," on Slack.")),(0,l.kt)("li",{parentName:"ol"},(0,l.kt)("p",{parentName:"li"},"Ask release management to approve and launch the rollout."),(0,l.kt)("p",{parentName:"li"},(0,l.kt)("strong",{parentName:"p"},"Note:")," If you are a member of release management, you must get ",(0,l.kt)("em",{parentName:"p"},"another"),"\nmember to to approve and launch. Experimenter requires a 2 person sign-off to\nlaunch experiments: the person who requests the launch cannot be the person\nwho approves it."))),(0,l.kt)("a",{id:"example-configuration"}),(0,l.kt)("h1",{id:"example-configuration"},"Example Configuration"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-json"},'{\n "prefs": {\n "the.pref.to.set": {\n "branch": "user",\n "value": "hello world"\n },\n "another.pref.to.set": {\n "branch": "default",\n "value": true\n },\n "unset.this.pref": {\n "branch": "user",\n "value": null\n }\n }\n}\n')),(0,l.kt)("h1",{id:"causes-of-unenrollment"},"Causes of Unenrollment"),(0,l.kt)("h2",{id:"mismatched-types"},"Mismatched Types"),(0,l.kt)("p",null,"If you attempt to set a pref to a value of the wrong type, the pref will fail to\nset. This will cause the enrollment to end.\nThis will result in a unenrollment event\n(",(0,l.kt)("a",{parentName:"p",href:"https://dictionary.telemetry.mozilla.org/apps/firefox_desktop/metrics/nimbus_events_unenrollment"},"glean"),", ",(0,l.kt)("a",{parentName:"p",href:"https://probes.telemetry.mozilla.org/?search=unenroll&view=detail&probeId=event%2Fnormandy.unenroll%23unenroll"},"legacy"),") being submitted with the\nfollowing data:"),(0,l.kt)("table",null,(0,l.kt)("thead",null,(0,l.kt)("tr",null,(0,l.kt)("th",null,"Glean Field"),(0,l.kt)("th",null,"Legacy Field"),(0,l.kt)("th",null,"Description"))),(0,l.kt)("tbody",null,(0,l.kt)("tr",null,(0,l.kt)("td",null,(0,l.kt)("code",null,"reason")),(0,l.kt)("td",null,(0,l.kt)("code",null,"reason")),(0,l.kt)("td",null,"The string ",(0,l.kt)("code",null,'"prefFlips-failed"'))),(0,l.kt)("tr",null,(0,l.kt)("td",null,(0,l.kt)("code",null,"pref_name")),(0,l.kt)("td",null,(0,l.kt)("code",null,"prefName")),(0,l.kt)("td",null,"The pref that that failed to set.")),(0,l.kt)("tr",null,(0,l.kt)("td",null,(0,l.kt)("code",null,"pref_type")),(0,l.kt)("td",null,(0,l.kt)("code",null,"prefType")),(0,l.kt)("td",null,"The type of the existing pref.")))),(0,l.kt)("h2",{id:"conflicts-with-setpref-experiments"},"Conflicts with setPref Experiments"),(0,l.kt)("p",null,"If a user is enrolled in a incident response pref flip and then enrolls in a\n",(0,l.kt)("a",{parentName:"p",href:"/desktop-pref-experiments"},"setPref")," experiment that changes the same prefs, they will be unenrolled from\nthe incident response rollout. This will result in a unenrollment event\n(",(0,l.kt)("a",{parentName:"p",href:"https://dictionary.telemetry.mozilla.org/apps/firefox_desktop/metrics/nimbus_events_unenrollment"},"glean"),", ",(0,l.kt)("a",{parentName:"p",href:"https://probes.telemetry.mozilla.org/?search=unenroll&view=detail&probeId=event%2Fnormandy.unenroll%23unenroll"},"legacy"),") being submitted with the\nfollowing data:"),(0,l.kt)("table",null,(0,l.kt)("thead",null,(0,l.kt)("tr",null,(0,l.kt)("th",null,"Glean Field"),(0,l.kt)("th",null,"Legacy Field"),(0,l.kt)("th",null,"Description"))),(0,l.kt)("tbody",null,(0,l.kt)("tr",null,(0,l.kt)("td",null,(0,l.kt)("code",null,"reason")),(0,l.kt)("td",null,(0,l.kt)("code",null,"reason")),(0,l.kt)("td",null,"The string ",(0,l.kt)("code",null,'"prefFlips-conflict"'))),(0,l.kt)("tr",null,(0,l.kt)("td",null,(0,l.kt)("code",null,"conflicting_slug")),(0,l.kt)("td",null,(0,l.kt)("code",null,"conflictingSlug")),(0,l.kt)("td",null,"The slug of the experiment that caused the unenrollment.")))),(0,l.kt)("h2",{id:"user-pref-changes"},"User Pref Changes"),(0,l.kt)("p",null,"If a pref that is controlled by an incident response rollout is changed, either\nby the user or client code, the client will be unenrolled. This will result in an\nunenrollment event (",(0,l.kt)("a",{parentName:"p",href:"https://dictionary.telemetry.mozilla.org/apps/firefox_desktop/metrics/nimbus_events_unenrollment"},"glean"),", ",(0,l.kt)("a",{parentName:"p",href:"https://probes.telemetry.mozilla.org/?search=unenroll&view=detail&probeId=event%2Fnormandy.unenroll%23unenroll"},"legacy"),") being\nsubmitted with the following data:"),(0,l.kt)("table",null,(0,l.kt)("thead",null,(0,l.kt)("tr",null,(0,l.kt)("th",null,"Glean Field"),(0,l.kt)("th",null,"Legacy Field"),(0,l.kt)("th",null,"Description"))),(0,l.kt)("tbody",null,(0,l.kt)("tr",null,(0,l.kt)("td",null,(0,l.kt)("code",null,"reason")),(0,l.kt)("td",null,(0,l.kt)("code",null,"reason")),(0,l.kt)("td",null,"The string ",(0,l.kt)("code",null,'"changed-pref"'))),(0,l.kt)("tr",null,(0,l.kt)("td",null,(0,l.kt)("code",null,"changed_pref")),(0,l.kt)("td",null,(0,l.kt)("code",null,"changedPref")),(0,l.kt)("td",null,"The pref that triggered the unenrollment.")))))}c.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/935f2afb.09d05ccd.js b/assets/js/935f2afb.09d05ccd.js deleted file mode 100644 index 0a7cb0b5e..000000000 --- a/assets/js/935f2afb.09d05ccd.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkexperimenter_docs=self.webpackChunkexperimenter_docs||[]).push([[53],{1109:e=>{e.exports=JSON.parse('{"pluginId":"default","version":"current","label":"Next","banner":null,"badge":false,"noIndex":false,"className":"docs-version-current","isLast":true,"docsSidebars":{"sidebar":[{"type":"category","label":"Welcome","items":[{"type":"link","label":"Introduction","href":"/","docId":"homepage/intro"},{"type":"link","label":"Finding Help","href":"/help","docId":"homepage/finding-help"},{"type":"link","label":"Features","href":"/capabilities","docId":"homepage/capabilities"}],"collapsed":true,"collapsible":true},{"type":"category","label":"What\'s Newsletter","items":[{"type":"category","label":"2024","items":[{"type":"link","label":"What\'s Newsletter Q1","href":"/whats-news/2024-Q1","docId":"whats-news/2024/2024-Q1"},{"type":"link","label":"What\'s Newsletter Q2","href":"/whats-news/2024-Q2","docId":"whats-news/2024/2024-Q2"}],"collapsed":true,"collapsible":true},{"type":"category","label":"2023","items":[{"type":"link","label":"What\'s Newsletter Q4 2023","href":"/whats-news/2023-Q4","docId":"whats-news/2023/2023-Q4"},{"type":"link","label":"What\'s Newsletter Q3 2023","href":"/whats-news/2023/2023-Q3","docId":"whats-news/2023/2023-Q3"},{"type":"link","label":"What\'s Newsletter Q2 2023","href":"/whats-news/2023-Q2","docId":"whats-news/2023/2023-Q2"},{"type":"link","label":"What\'s Newsletter March 2023","href":"/2023-03","docId":"whats-news/2023/2023-03"}],"collapsed":true,"collapsible":true},{"type":"category","label":"2022","items":[{"type":"link","label":"What\'s Newsletter June 2022","href":"/2022-06","docId":"whats-news/2022/2022-06"},{"type":"link","label":"What\'s Newsletter July 2022","href":"/2022-07","docId":"whats-news/2022/2022-07"},{"type":"link","label":"What\'s Newsletter August 2022","href":"/2022-08","docId":"whats-news/2022/2022-08"}],"collapsed":true,"collapsible":true},{"type":"category","label":"2021","items":[{"type":"link","label":"What\'s Newsletter February 2021","href":"/2021-02","docId":"whats-news/2021/2022-02"},{"type":"link","label":"What\'s Newsletter March 2021","href":"/2021-03","docId":"whats-news/2021/2021-03"},{"type":"link","label":"What\'s Newsletter April 2021","href":"/2022-04","docId":"whats-news/2021/2021-04"},{"type":"link","label":"What\'s Newsletter June/July 2021","href":"/2021-06","docId":"whats-news/2021/2021-06"}],"collapsed":true,"collapsible":true}],"collapsed":true,"collapsible":true},{"type":"category","label":"Getting Started","items":[{"type":"link","label":"Experiment Reviewers","href":"/access","docId":"getting-started/access"},{"type":"category","label":"Data Scientists","items":[{"type":"link","label":"Overview","href":"/overview","docId":"getting-started/data-scientists/overview"},{"type":"link","label":"Experiment Sizing Command-line Interface","href":"/auto-sizing-cli","docId":"getting-started/data-scientists/auto-sizing-cli"},{"type":"link","label":"Sizing using Mozanalysis","href":"/experiment-sizing","docId":"getting-started/data-scientists/experiment-sizing"},{"type":"link","label":"Telemetry for Experiments","href":"/telemetry","docId":"getting-started/data-scientists/telemetry"},{"type":"link","label":"Validating Experiments","href":"/validating-experiments","docId":"getting-started/data-scientists/validating-experiments"}],"collapsed":true,"collapsible":true},{"type":"category","label":"Engineers","items":[{"type":"link","label":"Getting started with implementation","href":"/getting-started/engineers/for-engineers","docId":"getting-started/engineers/for-engineers"},{"type":"link","label":"Getting Started for Android Engineers","href":"/getting-started/engineers/getting-started-for-android-engineers","docId":"getting-started/engineers/getting-started-for-android-engineers"},{"type":"link","label":"Getting Started for iOS Engineers","href":"/getting-started/engineers/getting-started-for-ios-engineers","docId":"getting-started/engineers/getting-started-for-ios-engineers"},{"type":"link","label":"Getting Started for Nimbus Web Integration","href":"/getting-started/engineers/getting-started-for-nimbus-web-integration","docId":"getting-started/engineers/getting-started-for-nimbus-web-integration"},{"type":"link","label":"Desktop Feature API (JS and C++)","href":"/desktop-feature-api","docId":"getting-started/engineers/desktop-feature-api"},{"type":"link","label":"Desktop Migration Guide (JS)","href":"/desktop-migration-guide","docId":"getting-started/engineers/desktop-migration-guide"},{"type":"link","label":"Required UI for Mobile Integration","href":"/getting-started/engineers/getting-started-mobile-required-ui","docId":"getting-started/engineers/getting-started-mobile-required-ui"}],"collapsed":true,"collapsible":true},{"type":"link","label":"Product Managers","href":"/for-product","docId":"getting-started/for-product"},{"type":"link","label":"Leadership","href":"/for-leadership","docId":"getting-started/for-leadership"}],"collapsed":true,"collapsible":true},{"type":"category","label":"Experimentation Workflow","items":[{"type":"link","label":"Overview","href":"/workflow/overview","docId":"workflow/overview"},{"type":"category","label":"Designing","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Designing Your Experiment","href":"/designing-experiments","docId":"workflow/designing/designing"},{"type":"link","label":"Localization","href":"/localization-process","docId":"workflow/designing/localization-process"}]},{"type":"category","label":"Implementing","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Experiment Owners","href":"/experiment-owners","docId":"workflow/implementing/experiment-owners"},{"type":"link","label":"Feature Definition","href":"/feature-definition","docId":"workflow/implementing/feature-definition"},{"type":"link","label":"Custom Audiences","href":"/workflow/implementing/custom-audiences","docId":"workflow/implementing/custom-audiences"},{"type":"category","label":"Risk Mitigation","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"QA Sign-off","href":"/qa-sign-off","docId":"workflow/implementing/risk-mitigation/qa-sign-off/qa-sign-off"},{"type":"link","label":"VP Sign-off","href":"/vp-sign-off","docId":"workflow/implementing/risk-mitigation/vp-sign-off/vp-sign-off"},{"type":"link","label":"Legal Sign-off","href":"/legal-sign-off","docId":"workflow/implementing/risk-mitigation/legal-sign-off/legal-sign-off"},{"type":"link","label":"Comms Sign-off","href":"/comms-sign-off","docId":"workflow/implementing/risk-mitigation/comms-sign-off/comms-sign-off"},{"type":"link","label":"Message Consult","href":"/message-consult","docId":"workflow/implementing/risk-mitigation/message-consult/message-consult"},{"type":"link","label":"Risk Types","href":"/types-of-risk","docId":"workflow/implementing/risk-mitigation/types-of-risk/types-of-risk"}],"href":"/risk-mitigation"},{"type":"category","label":"Desktop Onboarding","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Introduction","href":"/workflow/implementing/desktop-onboarding/onboarding-feature-desktop","docId":"workflow/implementing/desktop-onboarding/onboarding-feature-desktop"}]},{"type":"category","label":"Messaging","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Experiments & User Messaging","href":"/messaging/experiments-and-user-messaging","docId":"workflow/implementing/messaging/experiments-and-user-messaging"},{"type":"link","label":"Messaging Display Logic","href":"/messaging/display-logic","docId":"workflow/implementing/messaging/display-logic"},{"type":"link","label":"How a Message Gets Shown","href":"/messaging/how-a-message-gets-shown","docId":"workflow/implementing/messaging/how-a-message-gets-shown"},{"type":"link","label":"Messaging Telemetry","href":"/messaging/telemetry","docId":"workflow/implementing/messaging/messaging-telemetry"},{"type":"link","label":"Messaging System Frequency cap","href":"/messaging/frequency-cap","docId":"workflow/implementing/messaging/frequency-cap"},{"type":"link","label":"Desktop Messaging Surfaces","href":"/messaging/desktop-messaging-surfaces","docId":"workflow/implementing/messaging/messaging-surfaces"},{"type":"link","label":"Desktop Messaging Journey","href":"/messaging/desktop-messaging-journey","docId":"workflow/implementing/messaging/messaging-journey"},{"type":"link","label":"Mobile Messaging","href":"/messaging/mobile-messaging","docId":"workflow/implementing/messaging/mobile-messaging"},{"type":"link","label":"Groups & Campaigns","href":"/messaging/groups-and-campaigns","docId":"workflow/implementing/messaging/groups-and-campaigns"},{"type":"link","label":"Limitations","href":"/messaging/limitations","docId":"workflow/implementing/messaging/limitations"},{"type":"category","label":"Microsurveys","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Android Microsurveys","href":"/messaging/microsurveys/android","docId":"workflow/implementing/messaging/microsurveys/android-microsurveys"},{"type":"link","label":"Microsurvey Feature for iOS","href":"/messaging/microsurveys/ios","docId":"workflow/implementing/messaging/microsurveys/ios-microsurveys"}]},{"type":"link","label":"Remote Localization","href":"/messaging/remote-localization","docId":"workflow/implementing/messaging/remote-localization"}]},{"type":"category","label":"Mobile Targeting","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Adding new targeting attributes to Android","href":"/android-custom-targeting","docId":"workflow/implementing/mobile-targeting/android-custom-targeting"},{"type":"link","label":"Adding new targeting attributes to iOS","href":"/ios-custom-targeting","docId":"workflow/implementing/mobile-targeting/ios-custom-targeting"}]},{"type":"category","label":"Mobile Onboarding","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Onboarding Feature for Android","href":"/onboarding/onboarding-feature-android","docId":"workflow/implementing/onboarding/onboarding-feature-android"},{"type":"link","label":"Onboarding Feature for iOS","href":"/onboarding/onboarding-feature-ios","docId":"workflow/implementing/onboarding/onboarding-feature-ios"}]}]},{"type":"link","label":"Configuring","href":"/configuring","docId":"workflow/configuring/configuring"},{"type":"category","label":"Testing","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Previewing Experiments","href":"/previewing-experiments","docId":"workflow/testing/preview"},{"type":"link","label":"Desktop Feature API testing","href":"/desktop-feature-api-testing","docId":"workflow/testing/desktop-feature-api-testing"},{"type":"link","label":"Testing the preview flow on iOS","href":"/ios-preview-testing","docId":"workflow/testing/ios-preview-testing"},{"type":"link","label":"Testing on mobile","href":"/testing-on-mobile","docId":"workflow/testing/testing-on-mobile"}]},{"type":"link","label":"Launching","href":"/launching","docId":"workflow/launching/launching"},{"type":"link","label":"Monitoring","href":"/monitoring","docId":"workflow/monitoring/monitoring"},{"type":"link","label":"Ending","href":"/ending","docId":"workflow/ending/ending"},{"type":"link","label":"Analyzing","href":"/analyzing","docId":"workflow/analyzing/analyzing"}],"collapsed":true,"collapsible":true},{"type":"category","label":"Deep Dives","items":[{"type":"category","label":"Jetstream","items":[{"type":"link","label":"Overview","href":"/deep-dives/jetstream/overview","docId":"deep-dives/jetstream/overview"},{"type":"link","label":"Metrics","href":"/deep-dives/jetstream/metrics","docId":"deep-dives/jetstream/metrics"},{"type":"link","label":"Statistics","href":"/deep-dives/jetstream/statistics","docId":"deep-dives/jetstream/statistics"},{"type":"link","label":"Outcomes","href":"/deep-dives/jetstream/outcomes","docId":"deep-dives/jetstream/outcomes"},{"type":"link","label":"Configuring Jetstream","href":"/deep-dives/jetstream/configuration","docId":"deep-dives/jetstream/configuration"},{"type":"link","label":"Data products","href":"/deep-dives/jetstream/data-products","docId":"deep-dives/jetstream/data-products"},{"type":"link","label":"Architecture and Operations","href":"/deep-dives/jetstream/operations","docId":"deep-dives/jetstream/operations"},{"type":"link","label":"Troubleshooting","href":"/deep-dives/jetstream/troubleshooting","docId":"deep-dives/jetstream/troubleshooting"},{"type":"link","label":"Testing Jetstream Configs","href":"/deep-dives/jetstream/testing","docId":"deep-dives/jetstream/testing"},{"type":"link","label":"Adding a Platform","href":"/deep-dives/jetstream/adding-a-platform","docId":"deep-dives/jetstream/adding-a-platform"},{"type":"link","label":"Jetstream GitHub","href":"https://github.com/mozilla/jetstream"}],"collapsed":true,"collapsible":true},{"type":"category","label":"Data topics","items":[{"type":"link","label":"Bucketing","href":"/bucketing","docId":"deep-dives/data/bucketing"},{"type":"link","label":"Missing Exposure-based Analysis?","href":"/missing-exposure","docId":"deep-dives/data/missing_exposures"},{"type":"link","label":"Exposure Funnel and Population Representativeness","href":"/population-representativeness","docId":"deep-dives/data/population_representativeness"}],"collapsed":true,"collapsible":true},{"type":"category","label":"Desktop topics","items":[{"type":"link","label":"Desktop Local Experiment Iteration","href":"/desktop-enroll-locally","docId":"deep-dives/desktop/desktop-enroll-locally"},{"type":"link","label":"Running Pref-setting Experiments on Desktop","href":"/desktop-pref-experiments","docId":"deep-dives/desktop/desktop-pref-experiments"},{"type":"link","label":"Desktop Targeting debug","href":"/desktop-targeting-debug","docId":"deep-dives/desktop/desktop-targeting-debug"}],"collapsed":true,"collapsible":true},{"type":"category","label":"Mobile topics","items":[{"type":"link","label":"Behavioral Targeting","href":"/mobile-behavioral-targeting","docId":"deep-dives/mobile/mobile-behavioral-targeting"},{"type":"link","label":"Enrollment State Machine","href":"/mobile-enrollment-state-machine","docId":"deep-dives/mobile/mobile-enrollment-state-machine"},{"type":"link","label":"Feature API","href":"/mobile-feature-api","docId":"deep-dives/mobile/mobile-feature-api"},{"type":"link","label":"First Run Experiments","href":"/mobile-first-run-experiments","docId":"deep-dives/mobile/mobile-first-run-experiments"},{"type":"link","label":"Surveys","href":"/mobile-surveys","docId":"deep-dives/mobile/mobile-surveys"},{"type":"category","label":"Nimbus CLI","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Introduction","href":"/nimbus-cli","docId":"deep-dives/mobile/nimbus-cli/nimbus-cli-introduction"},{"type":"link","label":"Installation Guide","href":"/nimbus-cli/install","docId":"deep-dives/mobile/nimbus-cli/nimbus-cli-install"},{"type":"link","label":"Getting Started","href":"/nimbus-cli/getting-started","docId":"deep-dives/mobile/nimbus-cli/nimbus-cli-getting-started"},{"type":"link","label":"Opening and resetting the app","href":"/nimbus-cli/opening-and-resetting","docId":"deep-dives/mobile/nimbus-cli/nimbus-cli-opening-and-resetting"},{"type":"link","label":"Working with Features","href":"/nimbus-cli/working-with-features","docId":"deep-dives/mobile/nimbus-cli/nimbus-cli-working-with-features"},{"type":"link","label":"Working with Files","href":"/nimbus-cli/working-with-files","docId":"deep-dives/mobile/nimbus-cli/nimbus-cli-working-with-files"},{"type":"link","label":"Working with Patch Files","href":"/nimbus-cli/working-with-patch-files","docId":"deep-dives/mobile/nimbus-cli/nimbus-cli-working-with-patch-files"},{"type":"link","label":"Working with Logs","href":"/nimbus-cli/working-with-logs","docId":"deep-dives/mobile/nimbus-cli/nimbus-cli-working-with-logs"},{"type":"link","label":"Working with Feature Manifests","href":"/nimbus-cli/fml","docId":"deep-dives/mobile/nimbus-cli/nimbus-cli-working-with-fml"},{"type":"link","label":"Working with Devices","href":"/nimbus-cli/on-devices","docId":"deep-dives/mobile/nimbus-cli/nimbus-cli-working-with-devices"},{"type":"link","label":"Using Environment variables","href":"/nimbus-cli/environment-variables","docId":"deep-dives/mobile/nimbus-cli/nimbus-cli-environment-vars"},{"type":"link","label":"Instrumentation Guide","href":"/nimbus-cli/instrumentation","docId":"deep-dives/mobile/nimbus-cli/nimbus-cli-instrumentation"},{"type":"link","label":"What\'s New","href":"/nimbus-cli/whats-new","docId":"deep-dives/mobile/nimbus-cli/nimbus-cli-changelog"}]}],"collapsed":true,"collapsible":true},{"type":"category","label":"Experimenter topics","items":[{"type":"link","label":"Branches","href":"/deep-dives/experimenter/branches-page","docId":"deep-dives/experimenter/branches-page-deep-dive"},{"type":"link","label":"Notifications","href":"/notifications","docId":"deep-dives/experimenter/notificationse"},{"type":"link","label":"Rollouts","href":"/deep-dives/experimenter/rollouts","docId":"deep-dives/experimenter/rollouts-deep-dive"},{"type":"link","label":"Experimenter state and Kinto integration","href":"/deep-dives/experimenter/experimenter-state","docId":"deep-dives/experimenter/experimenter-state"},{"type":"link","label":"Experimenter warnings","href":"/warnings","docId":"deep-dives/experimenter/warnings"}],"collapsed":true,"collapsible":true},{"type":"category","label":"Specifications","items":[{"type":"link","label":"Client SDK States & Lifecycle","href":"/client-sdk-states-and-lifecycle","docId":"deep-dives/specifications/client-sdk-states-and-lifecycle"},{"type":"category","label":"Feature Manifest Language","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"The Feature Manifest Language","href":"/fml-spec","docId":"deep-dives/specifications/fml/fml-spec"},{"type":"link","label":"Using paths in FML","href":"/fml/fml-paths","docId":"deep-dives/specifications/fml/fml-paths"},{"type":"link","label":"Componentizing the Nimbus Feature Manifest","href":"/fml/fml-imports-and-includes","docId":"deep-dives/specifications/fml/fml-imports"},{"type":"link","label":"Nimbus FML command line interface","href":"/fml/fml-cli","docId":"deep-dives/specifications/fml/fml-cli"},{"type":"link","label":"Co-enrolling Features","href":"/fml/coenrolling-features","docId":"deep-dives/specifications/fml/coenrolling-features"},{"type":"link","label":"Using string alias","href":"/fml/string-alias","docId":"deep-dives/specifications/fml/fml-string-alias"},{"type":"link","label":"Using prefs to override feature variables","href":"/fml/using-prefs","docId":"deep-dives/specifications/fml/using-prefs"},{"type":"link","label":"Providing feature metadata","href":"/fml/feature-metadata","docId":"deep-dives/specifications/fml/feature-metadata"},{"type":"link","label":"A history of considered changes for Feature Manifest Language","href":"/fml/unimplemented","docId":"deep-dives/specifications/fml/fm-unimplemented-spec"},{"type":"link","label":"Feature Manifest Language Front-end Format As YAML","href":"/fml/fml-front-end-format","docId":"deep-dives/specifications/fml/fml-front-end-format"}]}],"collapsed":true,"collapsible":true}],"collapsed":true,"collapsible":true},{"type":"category","label":"Experimentation Cookbook","items":[{"type":"link","label":"Feature Manifest Cookbook","href":"/cookbook/fml/fml-cookbook","docId":"cookbook/fml/fml-cookbook"},{"type":"link","label":"Managing collections not known before release","href":"/cookbook/fml/growable-collections","docId":"cookbook/fml/growable-collections"}],"collapsed":true,"collapsible":true},{"type":"category","label":"FAQ","items":[{"type":"link","label":"General FAQ","href":"/faq/general-faq","docId":"faq/general-faq/general-faq"},{"type":"category","label":"Branches","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"FML Errors","href":"/faq/branches/fml-errors","docId":"faq/branches/fml-errors"},{"type":"link","label":"How many branches?","href":"/faq/branches/how-many-branches","docId":"faq/branches/how-many-branches"}]},{"type":"link","label":"Custom configs","href":"/faq/custom-configs","docId":"faq/custom-configs/custom-configs"},{"type":"category","label":"Desktop","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Desktop prefs","href":"/faq/desktop/desktop-prefs","docId":"faq/desktop/desktop-prefs"},{"type":"link","label":"Exposure","href":"/faq/desktop/exposure","docId":"faq/desktop/exposure"}]},{"type":"category","label":"Early startup","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"What does early startup do?","href":"/faq/early-startup/what-do-it-do","docId":"faq/early-startup/what-do-it-do"},{"type":"link","label":"How early is early?","href":"/faq/early-startup/how-early","docId":"faq/early-startup/how-early"}]},{"type":"link","label":"Ending experiments","href":"/faq/ending-experiments","docId":"faq/ending-experiments/ending-experiments"},{"type":"link","label":"Enrollment","href":"/enrollment/experiment-enrollment","docId":"faq/enrollment/experiment-enrollment"},{"type":"link","label":"Exposure","href":"/exposure-faq","docId":"faq/exposure/exposure-faq"},{"type":"link","label":"Feature restart","href":"/faq/feature-restart","docId":"faq/feature-restart/feature-restart"},{"type":"category","label":"Metrics","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Feature metrics","href":"/feature-metrics","docId":"faq/metrics/feature-metrics"}]},{"type":"category","label":"Mobile","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Mobile First Run","href":"/faq/first-run","docId":"faq/mobile/first-run"},{"type":"link","label":"Mobile FAQ","href":"/faq/mobile-faq","docId":"faq/mobile/mobile-faq"}]},{"type":"category","label":"Results","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Results","href":"/results-availability","docId":"faq/results/results-availability"}]},{"type":"category","label":"Rollouts","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Rollouts and Experiment Interaction","href":"/rollouts/rollouts-and-experiments","docId":"faq/rollouts/rollouts-and-experiments"},{"type":"link","label":"Rollout feature saturation","href":"/rollouts/saturation","docId":"faq/rollouts/saturation"},{"type":"link","label":"Sizing rollouts","href":"/rollouts/sizing","docId":"faq/rollouts/sizing-rollouts"}]},{"type":"category","label":"Targeting","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Advanced targeting","href":"/targeting/advanced-targeting","docId":"faq/targeting/advanced-targeting"},{"type":"link","label":"Targeting dot releases or specific betas","href":"/targeting/version-targeting","docId":"faq/targeting/version-targeting"}]},{"type":"link","label":"Warnings","href":"/faq/warnings","docId":"faq/warnings/warnings"}],"collapsed":true,"collapsible":true},{"type":"link","label":"Glossary","href":"/glossary","docId":"glossary"},{"type":"category","label":"Additional Links","items":[{"type":"link","label":"Integration Test Docs","href":"/integration-tests","docId":"additional-links/integration-tests"},{"type":"link","label":"Local configuration for natural enrollments","href":"/local-enrollment","docId":"additional-links/local-enrollment"},{"type":"link","label":"System architecture / components","href":"/system-architecture","docId":"additional-links/system-architecture"},{"type":"link","label":"Experimenter GH Repo","href":"https://github.com/mozilla/experimenter"},{"type":"link","label":"How to Launch a Nimbus Experiment","href":"https://mozilla-hub.atlassian.net/wiki/spaces/FJT/pages/11469776/Nimbus+Onboarding#NimbusOnboarding-LaunchingExperimentsusingNimbus!"},{"type":"link","label":"Nimbus Data Transfer Object","href":"https://mozilla-hub.atlassian.net/wiki/spaces/FJT/pages/11469537/The+Nimbus+Data+Transfer+Object+DTO"},{"type":"link","label":"Experiment Telemetry","href":"https://mozilla-hub.atlassian.net/wiki/spaces/FJT/pages/11469458/Nimbus+Engineering#NimbusEngineering-ExperimentTelemetry"},{"type":"link","label":"Lessons Learned","href":"https://mozilla-hub.atlassian.net/wiki/spaces/FJT/pages/11470136/Lessons+Learned+-+Experiment+Incidents+and+Close+Calls"}],"collapsed":true,"collapsible":true}]},"docs":{"additional-links/integration-tests":{"id":"additional-links/integration-tests","title":"Integration Test Docs","description":"About","sidebar":"sidebar"},"additional-links/local-enrollment":{"id":"additional-links/local-enrollment","title":"Local configuration for natural enrollments","description":"Desktop","sidebar":"sidebar"},"additional-links/system-architecture":{"id":"additional-links/system-architecture","title":"System architecture / components","description":"original lives here","sidebar":"sidebar"},"cookbook/fml/fml-cookbook":{"id":"cookbook/fml/fml-cookbook","title":"Feature Manifest Cookbook","description":"The Feature Manifest Language is a tool and specification designed to help application developers manage tooling to interact with Nimbus. It sits on top of the Feature Variables API, and eliminates many of the weaknesses of that API:","sidebar":"sidebar"},"cookbook/fml/growable-collections":{"id":"cookbook/fml/growable-collections","title":"Managing collections not known before release","description":"Problem","sidebar":"sidebar"},"deep-dives/data/bucketing":{"id":"deep-dives/data/bucketing","title":"Bucketing","description":"Bucketing is the process of randomly assigning users to experiment branches. When a user is \u201cbucketed\u201d into an experiment, it means that the configuration in one of its branches (such as a change to part of the UI) can be activated, and that any interactions we record from that moment on can be associated with the experiment and branch identifier. The concept is explained in this video / presentation.","sidebar":"sidebar"},"deep-dives/data/missing_exposures":{"id":"deep-dives/data/missing_exposures","title":"Missing Exposure-based Analysis?","description":"In a Nimbus experiment, not every enrolled client actually experiences the experimental intervention or treatment. We refer to \\"experiencing the experimental treatment\\" as exposure. For example, in a messaging experiment, some enrolled users do not meet the conditions to be shown the message. As another example, some experimental treatments require the user to restart their browser to take effect, so users who do not restart do not experience the treatment. Calculating results based on all enrolled users, when many users are not exposed, results in a diluted estimate of the treatment impact. For the highest precision, experiments should be configured with an Exposure Signal, which allows the analysis system to determine which enrolled users were exposed. See this page for more info including interpreting different bases.","sidebar":"sidebar"},"deep-dives/data/population_representativeness":{"id":"deep-dives/data/population_representativeness","title":"Exposure Funnel and Population Representativeness","description":"It is desirable for the group enrolled in a delivery (experiment, (micro)survey, etc.) to be a representative sample of the targeted population. A lack of representativeness could indicate selection biases that would invalidate learnings. We term a lack of representativeness as a \\"representativeness failure\\". This page documents common causes of representativeness failures. For simplicity, this document will use the term \\"experiment\\", but the same issues apply to non-experiment deliveries (surveys, rollouts, etc.).","sidebar":"sidebar"},"deep-dives/desktop/desktop-enroll-locally":{"id":"deep-dives/desktop/desktop-enroll-locally","title":"Desktop Local Experiment Iteration","description":"Trying to iterate on an experiment in Preview on experimenter.services.mozilla.com can be painful, because even after you change something and post to preview, you have a wait a while for the updated recipe to be propagated to the CDN.","sidebar":"sidebar"},"deep-dives/desktop/desktop-pref-experiments":{"id":"deep-dives/desktop/desktop-pref-experiments","title":"Running Pref-setting Experiments on Desktop","description":"As of Firefox 107, Nimbus supports experiments that set preferences on Desktop.","sidebar":"sidebar"},"deep-dives/desktop/desktop-targeting-debug":{"id":"deep-dives/desktop/desktop-targeting-debug","title":"Desktop Targeting debug","description":"How to enable ASRouter devtools","sidebar":"sidebar"},"deep-dives/experimenter/branches-page-deep-dive":{"id":"deep-dives/experimenter/branches-page-deep-dive","title":"Branches","description":"Feature Manifest Language errors (mobile only)","sidebar":"sidebar"},"deep-dives/experimenter/experimenter-state":{"id":"deep-dives/experimenter/experimenter-state","title":"Experimenter state and Kinto integration","description":"Learn more about experiment states, lifecycles, and workflows in Experimenter here!","sidebar":"sidebar"},"deep-dives/experimenter/notificationse":{"id":"deep-dives/experimenter/notificationse","title":"Notifications","description":"Notifications exist on Experimenter to remind experiment owners of the following dates:","sidebar":"sidebar"},"deep-dives/experimenter/rollouts-deep-dive":{"id":"deep-dives/experimenter/rollouts-deep-dive","title":"Rollouts","description":"Want more info on rollouts?","sidebar":"sidebar"},"deep-dives/experimenter/warnings":{"id":"deep-dives/experimenter/warnings","title":"Experimenter warnings","description":"See the Warnings FAQ for any warnings you may encounter on Experimenter.","sidebar":"sidebar"},"deep-dives/jetstream/adding-a-platform":{"id":"deep-dives/jetstream/adding-a-platform","title":"Adding a Platform","description":"Jetstream runs analyses for experiments launched on several different platforms, such as Fenix or Firefox Desktop. When adding a new platform in Experimenter, the new platform also needs to be configured in Jetstream to enable automated analyses for launched experiments.","sidebar":"sidebar"},"deep-dives/jetstream/configuration":{"id":"deep-dives/jetstream/configuration","title":"Configuring Jetstream","description":"About configurations","sidebar":"sidebar"},"deep-dives/jetstream/data-products":{"id":"deep-dives/jetstream/data-products","title":"Jetstream Data Products","description":"Jetstream writes analysis results and enrollments information to BigQuery. Statistics data and metadata gets exported to GCS to make it accessible to the Experimenter console.","sidebar":"sidebar"},"deep-dives/jetstream/metrics":{"id":"deep-dives/jetstream/metrics","title":"Metrics","description":"A metric describes an aggregation of user activity,","sidebar":"sidebar"},"deep-dives/jetstream/operations":{"id":"deep-dives/jetstream/operations","title":"Jetstream Architecture and Operations","description":"Jetstream is part of the Cirrus ecosystem and depends on some external services.","sidebar":"sidebar"},"deep-dives/jetstream/outcomes":{"id":"deep-dives/jetstream/outcomes","title":"Outcomes","description":"An Outcome is a reusable configuration snippet","sidebar":"sidebar"},"deep-dives/jetstream/overview":{"id":"deep-dives/jetstream/overview","title":"Overview","description":"[Jetstream] is an analysis framework for experiments.","sidebar":"sidebar"},"deep-dives/jetstream/statistics":{"id":"deep-dives/jetstream/statistics","title":"Statistics","description":"Statistics reduce observations of many clients","sidebar":"sidebar"},"deep-dives/jetstream/testing":{"id":"deep-dives/jetstream/testing","title":"Testing Jetstream Configs","description":"Validation via Continuous Integration (CI)","sidebar":"sidebar"},"deep-dives/jetstream/troubleshooting":{"id":"deep-dives/jetstream/troubleshooting","title":"Troubleshooting Jetstream","description":"How can I see what Jetstream is doing?","sidebar":"sidebar"},"deep-dives/mobile/mobile-behavioral-targeting":{"id":"deep-dives/mobile/mobile-behavioral-targeting","title":"Behavioral Targeting","description":"Behavioral targeting is a term used to describe a set of jexl transforms which can be used to target specific user behaviors. User behaviors might be the user opened the app, the user logged in, the user navigated to a specific view, or any user-triggered event that has Glean metrics associated with it.","sidebar":"sidebar"},"deep-dives/mobile/mobile-enrollment-state-machine":{"id":"deep-dives/mobile/mobile-enrollment-state-machine","title":"Enrollment State Machine","description":"Possible States","sidebar":"sidebar"},"deep-dives/mobile/mobile-feature-api":{"id":"deep-dives/mobile/mobile-feature-api","title":"Feature API","description":"About this document","sidebar":"sidebar"},"deep-dives/mobile/mobile-first-run-experiments":{"id":"deep-dives/mobile/mobile-first-run-experiments","title":"First Run Experiments","description":"First Run Experiments are incredibly important to the experimentation ecosystem, but their functionality comes with some key differences from standard experiments. It is highly advised that experiment owners read through this documentation before writing First Run Experiments.","sidebar":"sidebar"},"deep-dives/mobile/mobile-surveys":{"id":"deep-dives/mobile/mobile-surveys","title":"Surveys","description":"The required general steps to launch a mobile survey are:","sidebar":"sidebar"},"deep-dives/mobile/nimbus-cli/nimbus-cli-changelog":{"id":"deep-dives/mobile/nimbus-cli/nimbus-cli-changelog","title":"What\'s New","description":"0.4.0","sidebar":"sidebar"},"deep-dives/mobile/nimbus-cli/nimbus-cli-environment-vars":{"id":"deep-dives/mobile/nimbus-cli/nimbus-cli-environment-vars","title":"Using Environment variables","description":"adb and xcrun","sidebar":"sidebar"},"deep-dives/mobile/nimbus-cli/nimbus-cli-getting-started":{"id":"deep-dives/mobile/nimbus-cli/nimbus-cli-getting-started","title":"Getting Started","description":"Most nimbus-cli commands need an --app and --channel parameter. These should correspond to the app as it is installed on the simulator or emulator.","sidebar":"sidebar"},"deep-dives/mobile/nimbus-cli/nimbus-cli-install":{"id":"deep-dives/mobile/nimbus-cli/nimbus-cli-install","title":"Installation Guide","description":"The nimbus-cli is a command line tool to help develop and test experiments and features on an instrumented mobile app.","sidebar":"sidebar"},"deep-dives/mobile/nimbus-cli/nimbus-cli-instrumentation":{"id":"deep-dives/mobile/nimbus-cli/nimbus-cli-instrumentation","title":"Instrumentation Guide","description":"The nimbus-cli is a tool to communicate with the Nimbus SDK that is embedded in an app.","sidebar":"sidebar"},"deep-dives/mobile/nimbus-cli/nimbus-cli-introduction":{"id":"deep-dives/mobile/nimbus-cli/nimbus-cli-introduction","title":"Introduction","description":"The nimbus-cli is a command line tool for interacting with the Nimbus SDK embedded in Mozilla\'s mobile applications.","sidebar":"sidebar"},"deep-dives/mobile/nimbus-cli/nimbus-cli-opening-and-resetting":{"id":"deep-dives/mobile/nimbus-cli/nimbus-cli-opening-and-resetting","title":"Opening and resetting the app","description":"The commands that open the app do so by simulating the app\'s launch as if the user tapped on the app icon on the phone; these are:","sidebar":"sidebar"},"deep-dives/mobile/nimbus-cli/nimbus-cli-working-with-devices":{"id":"deep-dives/mobile/nimbus-cli/nimbus-cli-working-with-devices","title":"Working with Devices","description":"nimbus-cli works best with iOS when working directly with the simulator, via xcrun simctl.","sidebar":"sidebar"},"deep-dives/mobile/nimbus-cli/nimbus-cli-working-with-features":{"id":"deep-dives/mobile/nimbus-cli/nimbus-cli-working-with-features","title":"Working with Features","description":"The nimbus-cli provides features to download experiments from Remote Settings. However, sometimes you wish to do some exploratory testing of a feature without going through the experimenter interface.","sidebar":"sidebar"},"deep-dives/mobile/nimbus-cli/nimbus-cli-working-with-files":{"id":"deep-dives/mobile/nimbus-cli/nimbus-cli-working-with-files","title":"Working with Files","description":"fetch","sidebar":"sidebar"},"deep-dives/mobile/nimbus-cli/nimbus-cli-working-with-fml":{"id":"deep-dives/mobile/nimbus-cli/nimbus-cli-working-with-fml","title":"Working with Feature Manifests","description":"The Feature Manifest Language is a powerful way of specify the shape of the feature configurations that each branch is made up of.","sidebar":"sidebar"},"deep-dives/mobile/nimbus-cli/nimbus-cli-working-with-logs":{"id":"deep-dives/mobile/nimbus-cli/nimbus-cli-working-with-logs","title":"Working with Logs","description":"Log files are especially helpful to developers, but not always very easy to access.","sidebar":"sidebar"},"deep-dives/mobile/nimbus-cli/nimbus-cli-working-with-patch-files":{"id":"deep-dives/mobile/nimbus-cli/nimbus-cli-working-with-patch-files","title":"Working with Patch Files","description":"The nimbus-cli lets you source experiments from multiple places and then change them before inserting them into the app where they can be evaluated, and the app can naturally enroll into them.","sidebar":"sidebar"},"deep-dives/specifications/client-sdk-states-and-lifecycle":{"id":"deep-dives/specifications/client-sdk-states-and-lifecycle","title":"Client SDK States & Lifecycle","description":"Nimbus SDK Experiment States and Lifecycle","sidebar":"sidebar"},"deep-dives/specifications/fml/coenrolling-features":{"id":"deep-dives/specifications/fml/coenrolling-features","title":"Co-enrolling Features","description":"A feature which allows co-enrollment allows a client to be enrolled in any number of experiments/rollouts for that feature.","sidebar":"sidebar"},"deep-dives/specifications/fml/feature-metadata":{"id":"deep-dives/specifications/fml/feature-metadata","title":"Providing feature metadata","description":"The feature manifest defines \\"features\\" which are used to:","sidebar":"sidebar"},"deep-dives/specifications/fml/fm-unimplemented-spec":{"id":"deep-dives/specifications/fml/fm-unimplemented-spec","title":"A history of considered changes for Feature Manifest Language","description":"Future specifications","sidebar":"sidebar"},"deep-dives/specifications/fml/fml-cli":{"id":"deep-dives/specifications/fml/fml-cli","title":"Nimbus FML command line interface","description":"Generating code for an mobile application","sidebar":"sidebar"},"deep-dives/specifications/fml/fml-front-end-format":{"id":"deep-dives/specifications/fml/fml-front-end-format","title":"Feature Manifest Language Front-end Format As YAML","description":"- Status: accepted","sidebar":"sidebar"},"deep-dives/specifications/fml/fml-imports":{"id":"deep-dives/specifications/fml/fml-imports","title":"Componentizing the Nimbus Feature Manifest","description":"In the first iteration of the nimbus-fml, the tooling was only able to work on one file at a time.","sidebar":"sidebar"},"deep-dives/specifications/fml/fml-paths":{"id":"deep-dives/specifications/fml/fml-paths","title":"Using paths in FML","description":"In several places paths to link one .fml.yaml file to another.","sidebar":"sidebar"},"deep-dives/specifications/fml/fml-spec":{"id":"deep-dives/specifications/fml/fml-spec","title":"The Feature Manifest Language","description":"About this document","sidebar":"sidebar"},"deep-dives/specifications/fml/fml-string-alias":{"id":"deep-dives/specifications/fml/fml-string-alias","title":"Using string alias","description":"string-alias is a type alias annotations for feature variables in the feature manifest language. It defines a named set of strings which can be used and validated elsewhere in the feature manifest.","sidebar":"sidebar"},"deep-dives/specifications/fml/using-prefs":{"id":"deep-dives/specifications/fml/using-prefs","title":"Using prefs to override feature variables","description":"This page details adding pref-key to a feature definition. This cause the FML generated code to check the user preferences (UserDefaults or SharedPrefences) before checking the Nimbus configuration store or the default.","sidebar":"sidebar"},"faq/branches/fml-errors":{"id":"faq/branches/fml-errors","title":"FML Errors","description":"When creating your experiment, you may come across Feature Manifest errors on the Branches page:","sidebar":"sidebar"},"faq/branches/how-many-branches":{"id":"faq/branches/how-many-branches","title":"How many branches can I have?","description":"While you might want to try out lots of variations for your experiment - each variation reduces your chance of detecting changes. We highly recommend running as few variations as possible. Trying to cram too many changes into one experiment can lead to learning nothing about all branches.","sidebar":"sidebar"},"faq/custom-configs/custom-configs":{"id":"faq/custom-configs/custom-configs","title":"Custom configs","description":"Question","sidebar":"sidebar"},"faq/desktop/desktop-prefs":{"id":"faq/desktop/desktop-prefs","title":"Desktop prefs","description":"See the deep dive on desktop prefs for more information","sidebar":"sidebar"},"faq/desktop/exposure":{"id":"faq/desktop/exposure","title":"Exposure","description":"See the deep dive on growable collections and Jetstream enrollment vs. exposure for more information","sidebar":"sidebar"},"faq/early-startup/how-early":{"id":"faq/early-startup/how-early","title":"How early is early?","description":"Early on Desktop","sidebar":"sidebar"},"faq/early-startup/what-do-it-do":{"id":"faq/early-startup/what-do-it-do","title":"What does early startup do?","description":"There is info on how to use Early Startup here in the documentation","sidebar":"sidebar"},"faq/ending-experiments/ending-experiments":{"id":"faq/ending-experiments/ending-experiments","title":"Ending experiments","description":"What happens at experiment end?","sidebar":"sidebar"},"faq/enrollment/experiment-enrollment":{"id":"faq/enrollment/experiment-enrollment","title":"Experiment enrollment","description":"When is a user enrolled?","sidebar":"sidebar"},"faq/exposure/exposure-faq":{"id":"faq/exposure/exposure-faq","title":"Exposure","description":"Question","sidebar":"sidebar"},"faq/feature-restart/feature-restart":{"id":"faq/feature-restart/feature-restart","title":"Feature restart","description":"Question","sidebar":"sidebar"},"faq/general-faq/general-faq":{"id":"faq/general-faq/general-faq","title":"General FAQ","description":"What\'s the difference between \\"Experimenter\\" and \\"Nimbus\\"?","sidebar":"sidebar"},"faq/metrics/feature-metrics":{"id":"faq/metrics/feature-metrics","title":"Feature metrics","description":"Question","sidebar":"sidebar"},"faq/mobile/first-run":{"id":"faq/mobile/first-run","title":"Mobile First Run","description":"Question","sidebar":"sidebar"},"faq/mobile/mobile-faq":{"id":"faq/mobile/mobile-faq","title":"Mobile FAQ","description":"Question","sidebar":"sidebar"},"faq/results/results-availability":{"id":"faq/results/results-availability","title":"Results","description":"Question","sidebar":"sidebar"},"faq/rollouts/rollouts-and-experiments":{"id":"faq/rollouts/rollouts-and-experiments","title":"Rollouts and Experiment Interaction","description":"See the Rollout FAQ for general rollout information","sidebar":"sidebar"},"faq/rollouts/saturation":{"id":"faq/rollouts/saturation","title":"Rollout feature saturation","description":"See the Rollout FAQ for general rollout information","sidebar":"sidebar"},"faq/rollouts/sizing-rollouts":{"id":"faq/rollouts/sizing-rollouts","title":"Sizing rollouts","description":"See the Rollout FAQ for general rollout information","sidebar":"sidebar"},"faq/targeting/advanced-targeting":{"id":"faq/targeting/advanced-targeting","title":"Advanced targeting","description":"Question","sidebar":"sidebar"},"faq/targeting/version-targeting":{"id":"faq/targeting/version-targeting","title":"Targeting dot releases or specific betas","description":"Question","sidebar":"sidebar"},"faq/warnings/warnings":{"id":"faq/warnings/warnings","title":"Experimenter warnings","description":"There are a number of warning messages that you may encounter on Experimenter in the course of launching your experiment. These warnings are listed below, along with any restrictions that they may impose on an experiment.","sidebar":"sidebar"},"getting-started/access":{"id":"getting-started/access","title":"Experiment Reviewers","description":"With Nimbus experiments, instead of a centralized committee responsible for launching and running experiments we want you, the experiment owner, to drive the process from ideation to completion.","sidebar":"sidebar"},"getting-started/contributing":{"id":"getting-started/contributing","title":"Contributing","description":"The Experimenter documentation hub is managed in the mozilla/experimenter-docs repository. You will need a GitHub account to contribute, and if you are not already in the Project Nimbus GitHub team, you may need to request write access in the #nimbus-project Slack channel."},"getting-started/data-scientists/auto-sizing-cli":{"id":"getting-started/data-scientists/auto-sizing-cli","title":"Experiment Sizing Command-line Interface","description":"The sample size calculation functionality contained in the [Mozanalysis] library is accessible via a command-line interface (CLI), [auto-sizing]. This CLI is intended to enable rapid analyses for simple experiments or experiments with targeting similar to past experiments.","sidebar":"sidebar"},"getting-started/data-scientists/experiment-sizing":{"id":"getting-started/data-scientists/experiment-sizing","title":"Sizing Experiments Using Mozanalysis","description":"This page gives an overview of how Mozanalysis can be used to do experiment sizing. [Mozanalysis] is a library used to standardize experiment analysis at Mozilla. Mozanalysis contains the statistical tools used by [Jetstream] to produce results from experiments, as well as tools to pull historical data from BigQuery to calculate necessary sample sizes to carry out experiments. The results of the tool are the sample size and percent of the total target population required per branch of an experiment with a balanced design to achieve a given power.","sidebar":"sidebar"},"getting-started/data-scientists/overview":{"id":"getting-started/data-scientists/overview","title":"Experimentation for data scientists","description":"This page describes the roles data scientists play in experimentation at Mozilla.","sidebar":"sidebar"},"getting-started/data-scientists/telemetry":{"id":"getting-started/data-scientists/telemetry","title":"Telemetry for Experiments","description":"This section is an overview of Nimbus Telemetry intended for the analysis of experiments.","sidebar":"sidebar"},"getting-started/data-scientists/validating-experiments":{"id":"getting-started/data-scientists/validating-experiments","title":"Validating Experiments","description":"This section describes some common problems with experiments that you should look out for, how we recommend testing for them, and some potential causes to investigate if you do see that something is wrong.","sidebar":"sidebar"},"getting-started/engineers/desktop-feature-api":{"id":"getting-started/engineers/desktop-feature-api","title":"Desktop Feature API (JS and C++)","description":"This guide will help you use the Nimbus Feature API in Desktop Firefox to run experiments, set values remotely, and manage user preferences. If you are familiar with Normandy and are trying to migrate a feature, you may want to check out the Migration Guide for Pref Experiments.","sidebar":"sidebar"},"getting-started/engineers/desktop-migration-guide":{"id":"getting-started/engineers/desktop-migration-guide","title":"Desktop Migration Guide (JS)","description":"To migrate front-end normandy prefs to Nimbus controlled experiments or rollouts","sidebar":"sidebar"},"getting-started/engineers/for-engineers":{"id":"getting-started/engineers/for-engineers","title":"Getting started with implementation","description":"Engineers are typically tasked with implementing an experiment on a new surface with an experiment that has been designed by their product manager in partnership with a data scientist.","sidebar":"sidebar"},"getting-started/engineers/getting-started-for-android-engineers":{"id":"getting-started/engineers/getting-started-for-android-engineers","title":"Getting Started for Android Engineers","description":"Nimbus is an experimentation platform from Mozilla.","sidebar":"sidebar"},"getting-started/engineers/getting-started-for-ios-engineers":{"id":"getting-started/engineers/getting-started-for-ios-engineers","title":"Getting Started for iOS Engineers","description":"Introduction","sidebar":"sidebar"},"getting-started/engineers/getting-started-for-nimbus-web-integration":{"id":"getting-started/engineers/getting-started-for-nimbus-web-integration","title":"Getting Started for Nimbus Web Integration","description":"Introduction","sidebar":"sidebar"},"getting-started/engineers/getting-started-mobile-required-ui":{"id":"getting-started/engineers/getting-started-mobile-required-ui","title":"Required UI for Mobile Integration","description":"Currently Nimbus provides no user-interface components of its own, though provides API to connect to existing settings screens.","sidebar":"sidebar"},"getting-started/for-leadership":{"id":"getting-started/for-leadership","title":"Leadership","description":"How can leadership interact with experiments?","sidebar":"sidebar"},"getting-started/for-product":{"id":"getting-started/for-product","title":"Product Managers","description":"What is the role of Product in experimentation?","sidebar":"sidebar"},"glossary":{"id":"glossary","title":"Glossary","description":"A","sidebar":"sidebar"},"homepage/capabilities":{"id":"homepage/capabilities","title":"Nimbus Features","description":"Nimbus is a full-featured experimentation platform that provides configuration, analysis and client libraries for both experiments and rollouts.","sidebar":"sidebar"},"homepage/finding-help":{"id":"homepage/finding-help","title":"finding-help","description":"Need help? Not sure where to start?","sidebar":"sidebar"},"homepage/intro":{"id":"homepage/intro","title":"Welcome","description":"Welcome to the Experimenter documentation hub, your central resource for A/B experiments and feature rollouts in Firefox Mobile and Desktop. You should find these documents helpful if you are:","sidebar":"sidebar"},"whats-news/2021/2021-03":{"id":"whats-news/2021/2021-03","title":"What\'s Newsletter March 2021","description":"March 2021","sidebar":"sidebar"},"whats-news/2021/2021-04":{"id":"whats-news/2021/2021-04","title":"What\'s Newsletter April 2021","description":"April 2021","sidebar":"sidebar"},"whats-news/2021/2021-06":{"id":"whats-news/2021/2021-06","title":"What\'s Newsletter June/July 2021","description":"Through June and early July, in addition to some great time away for Wellness Week and holidays, we\u2019ve been hard at work making improvements to Nimbus. Here are some of our Release 91 updates:","sidebar":"sidebar"},"whats-news/2021/2022-02":{"id":"whats-news/2021/2022-02","title":"What\'s Newsletter February 2021","description":"February 2021","sidebar":"sidebar"},"whats-news/2022/2022-06":{"id":"whats-news/2022/2022-06","title":"What\'s Newsletter June 2022","description":"Welcome","sidebar":"sidebar"},"whats-news/2022/2022-07":{"id":"whats-news/2022/2022-07","title":"What\'s Newsletter July 2022","description":"Welcome","sidebar":"sidebar"},"whats-news/2022/2022-08":{"id":"whats-news/2022/2022-08","title":"What\'s Newsletter August 2022","description":"Welcome","sidebar":"sidebar"},"whats-news/2023/2023-03":{"id":"whats-news/2023/2023-03","title":"What\'s Newsletter March 2023","description":"Rollouts","sidebar":"sidebar"},"whats-news/2023/2023-Q2":{"id":"whats-news/2023/2023-Q2","title":"What\'s New in Nimbus - Q2 2023","description":"This is a non-exhaustive list of the Nimbus team\'s accomplishments in Q2, including some deep dives into a few of the more exciting features that have landed.","sidebar":"sidebar"},"whats-news/2023/2023-Q3":{"id":"whats-news/2023/2023-Q3","title":"What\'s New in Nimbus - Q3 2023","description":"Mobile","sidebar":"sidebar"},"whats-news/2023/2023-Q4":{"id":"whats-news/2023/2023-Q4","title":"What\'s New in Nimbus - Q4 2023","description":"Experimenter","sidebar":"sidebar"},"whats-news/2024/2024-Q1":{"id":"whats-news/2024/2024-Q1","title":"What\'s New in Nimbus - Q1 2024","description":"Experimenter","sidebar":"sidebar"},"whats-news/2024/2024-Q2":{"id":"whats-news/2024/2024-Q2","title":"What\'s New in Nimbus - Q2 2024","description":"Experimenter","sidebar":"sidebar"},"workflow/analyzing/analyzing":{"id":"workflow/analyzing/analyzing","title":"Experiment Analysis","description":"Experiment results are availabe from the Results Link on your experiment page. Experiments typically take 24 hours after ending to generate the overall results.","sidebar":"sidebar"},"workflow/configuring/configuring":{"id":"workflow/configuring/configuring","title":"Experiment Configuration","description":"From our perspective as experiment owners, experiments are composed of two time periods: the enrollment period and the observation window.","sidebar":"sidebar"},"workflow/designing/designing":{"id":"workflow/designing/designing","title":"Designing Your Experiment","description":"WARNING: below is a sample image only of this part of the flow - see this LIVE and CURRENT workflow for the most accurate information, including maintained links and flow","sidebar":"sidebar"},"workflow/designing/localization-process":{"id":"workflow/designing/localization-process","title":"Localization","description":"Localization support for Nimbus experiments is constantly improving. Make sure to check this page again before setting up new experiments.","sidebar":"sidebar"},"workflow/ending/ending":{"id":"workflow/ending/ending","title":"Ending Your Experiment","description":"To end enrollment","sidebar":"sidebar"},"workflow/implementing/custom-audiences":{"id":"workflow/implementing/custom-audiences","title":"Custom Audiences","description":"Custom audiences let you target specific groups of users beyond the regular targeting options. Custom audiences can be configured for any experiment through the experimenter UI:","sidebar":"sidebar"},"workflow/implementing/desktop-onboarding/onboarding-feature-desktop":{"id":"workflow/implementing/desktop-onboarding/onboarding-feature-desktop","title":"Introduction","description":"The onboarding feature enables experimentation with the \'new user onboarding flow\'. The onboarding flow is presented to the user on each new install and is made up of a series of full screen \'views\', referred to as \'cards\'. The purpose of the onboarding flow is to enable the user to configure a small number of app enhancing settings. Each card provides context for each setting and the ability to enable/skip.","sidebar":"sidebar"},"workflow/implementing/experiment-owners":{"id":"workflow/implementing/experiment-owners","title":"Experiment Owners","description":"For an overview of experiment lifecycle, See Experiment Workflow Overview","sidebar":"sidebar"},"workflow/implementing/feature-definition":{"id":"workflow/implementing/feature-definition","title":"Feature Definition","description":"In the experimentation ecosystem, experiment surfaces are described as features. A feature is an area of code instrumented with telemetry and accessible for remote configuration. It can be as small as a single function or as complex as a whole page. Some examples:","sidebar":"sidebar"},"workflow/implementing/messaging/display-logic":{"id":"workflow/implementing/messaging/display-logic","title":"Messaging Display Logic","description":"There are three types of display logic you should consider when using any of the messaging surfaces:","sidebar":"sidebar"},"workflow/implementing/messaging/experiments-and-user-messaging":{"id":"workflow/implementing/messaging/experiments-and-user-messaging","title":"Experiments & User Messaging","description":"Experiments enforce the rule that a user cannot enroll in multiple experiments of the same type (feature). Each messaging surface corresponds to a feature so we can only run a single experiment for any given messaging surface per cohort of users.","sidebar":"sidebar"},"workflow/implementing/messaging/frequency-cap":{"id":"workflow/implementing/messaging/frequency-cap","title":"Messaging System Frequency cap","description":"How often and now many times a user should see a message is configured through frequency.","sidebar":"sidebar"},"workflow/implementing/messaging/groups-and-campaigns":{"id":"workflow/implementing/messaging/groups-and-campaigns","title":"Groups & Campaigns","description":"Message Groups","sidebar":"sidebar"},"workflow/implementing/messaging/how-a-message-gets-shown":{"id":"workflow/implementing/messaging/how-a-message-gets-shown","title":"How a Message Gets Shown","description":"All messages belong to a message provider (a source):","sidebar":"sidebar"},"workflow/implementing/messaging/limitations":{"id":"workflow/implementing/messaging/limitations","title":"Limitations","description":"History state of past experiments","sidebar":"sidebar"},"workflow/implementing/messaging/messaging-journey":{"id":"workflow/implementing/messaging/messaging-journey","title":"Desktop Messaging Journey","description":"From inception to launch, a message goes through the below three steps for Firefox Desktop:","sidebar":"sidebar"},"workflow/implementing/messaging/messaging-surfaces":{"id":"workflow/implementing/messaging/messaging-surfaces","title":"Desktop Messaging Surfaces","description":"The following messaging surfaces are currently remotely available in Firefox Desktop, meaning that you create new messages without shipping code changes.","sidebar":"sidebar"},"workflow/implementing/messaging/messaging-telemetry":{"id":"workflow/implementing/messaging/messaging-telemetry","title":"Messaging Telemetry","description":"Event telemetry is sent for any interaction with the messaging surfaces and additionally for impressions (when the message is shown). The following types of user interaction is captured by telemetry:","sidebar":"sidebar"},"workflow/implementing/messaging/microsurveys/android-microsurveys":{"id":"workflow/implementing/messaging/microsurveys/android-microsurveys","title":"Android Microsurveys","description":"Introduction","sidebar":"sidebar"},"workflow/implementing/messaging/microsurveys/ios-microsurveys":{"id":"workflow/implementing/messaging/microsurveys/ios-microsurveys","title":"Microsurvey Feature for iOS","description":"Introduction","sidebar":"sidebar"},"workflow/implementing/messaging/mobile-messaging":{"id":"workflow/implementing/messaging/mobile-messaging","title":"Mobile Messaging","description":"The mobile messaging system is a feature of Firefox on iOS and Android, designed to send in-app messages directly to users without going through a release cycle.","sidebar":"sidebar"},"workflow/implementing/messaging/remote-localization":{"id":"workflow/implementing/messaging/remote-localization","title":"Remote Localization","description":"Remote localization is available for all message types but it does require that strings are landed early to give localizers enough time. This is done via the ms-language-packs repo.","sidebar":"sidebar"},"workflow/implementing/mobile-targeting/android-custom-targeting":{"id":"workflow/implementing/mobile-targeting/android-custom-targeting","title":"Adding new targeting attributes to Android","description":"This page demonstrates how to add new targeting attributes to Android, enabling experiment creators more specific targeting.","sidebar":"sidebar"},"workflow/implementing/mobile-targeting/ios-custom-targeting":{"id":"workflow/implementing/mobile-targeting/ios-custom-targeting","title":"Adding new targeting attributes to iOS","description":"This page demonstrates how to add new targeting attributes to iOS, enabling experiment creators more specific targeting.","sidebar":"sidebar"},"workflow/implementing/onboarding/onboarding-feature-android":{"id":"workflow/implementing/onboarding/onboarding-feature-android","title":"Onboarding Feature for Android","description":"The onboarding feature enables experimentation with the \'new user onboarding flow\'. The onboarding flow is presented to the user on each new install and is made up of a series of full screen \'views\', referred to as \'cards\'. The purpose of the onboarding flow is to enable the user to configure a small number of app enhancing settings. Each card provides context for each setting and the ability to enable/skip.","sidebar":"sidebar"},"workflow/implementing/onboarding/onboarding-feature-ios":{"id":"workflow/implementing/onboarding/onboarding-feature-ios","title":"Onboarding Feature for iOS","description":"The onboarding feature enables experimentating with the \'new user onboarding flow\'. The onboarding flow is presented to the user on each new install, and is made up of a series of full screen \'views\', referred to as \'cards\'. The purpose of the onboarding flow is to enable the user to configure a small number of app enhancing settings. Each card provides context for each setting and the ability to take an appropratie action, or skip to the next card.","sidebar":"sidebar"},"workflow/implementing/risk-mitigation/comms-sign-off/comms-sign-off":{"id":"workflow/implementing/risk-mitigation/comms-sign-off/comms-sign-off","title":"Comms Sign-off","description":"Ideally work with your comms or PR contact for your area to let them know the details of the experiment and why a risk has been identified. If you don\u2019t know where to start for Comms help for your area - #cccc is a channel where you can get help. That channel also has a runbook document linked that has some more information on ways to engage with the Comms team.","sidebar":"sidebar"},"workflow/implementing/risk-mitigation/legal-sign-off/legal-sign-off":{"id":"workflow/implementing/risk-mitigation/legal-sign-off/legal-sign-off","title":"Legal Sign-off","description":"If Legal Review shows as Required, the answer to one of the Risk questions determined legal review will help mitigate a risk. Please write legal-product@mozilla.com and explain what you want to do, to how many people (% of population and channel), and the potential outcomes. In your conversation with Legal, you may determine a Legal Bug is needed.","sidebar":"sidebar"},"workflow/implementing/risk-mitigation/message-consult/message-consult":{"id":"workflow/implementing/risk-mitigation/message-consult/message-consult","title":"Message Consult","description":"If your experiment includes ANY message, make sure you had an in-product message consult and filed an FXE Jira ticket that was triaged via the Desktop or Mobile messaging leads (Venetia and Courtney).","sidebar":"sidebar"},"workflow/implementing/risk-mitigation/qa-sign-off/qa-sign-off":{"id":"workflow/implementing/risk-mitigation/qa-sign-off/qa-sign-off","title":"QA Sign-off","description":"Feature testing alone is not enough for experiments or rollouts. There is testing specific to see that the turning on and off of your feature works through Nimbus. There is also testing if you are changing configurations (does it work in different locals? platforms?), if there is new advanced targeting that needs testing, and if there is new telemetry.","sidebar":"sidebar"},"workflow/implementing/risk-mitigation/risk-mitigation":{"id":"workflow/implementing/risk-mitigation/risk-mitigation","title":"Risk Mitigation","description":"Experiments and Rollouts are making remote changes to the experience of live users, often millions of people. Doing QA and answering the risk questions carefully helps reduce the chance of production incidents. These are all \u201csoft sign-offs\u201d - in that you can check them yourself saying you have followed the guidance and are satisfied the risk is mitigated.","sidebar":"sidebar"},"workflow/implementing/risk-mitigation/types-of-risk/types-of-risk":{"id":"workflow/implementing/risk-mitigation/types-of-risk/types-of-risk","title":"Types of Risk","description":"We\'ve learned a few ways to de-risk experiments and rollouts before they launch. Below is not an exhausive list for every situation - but a list of the some common situations to help you avoid known pitfalls.","sidebar":"sidebar"},"workflow/implementing/risk-mitigation/vp-sign-off/vp-sign-off":{"id":"workflow/implementing/risk-mitigation/vp-sign-off/vp-sign-off","title":"VP Sign-off","description":"Experiment owners are responsible for securing VP sign-off. Sign-off isn\u2019t a technically blocking step to launch - but your acceptance that you have communicated effectively to the VP(s) who would get any escalations if there is an incident. Good details avoid assumptions and delays by providing the information necessary for the VP(s) to have an informed opinion.","sidebar":"sidebar"},"workflow/launching/launching":{"id":"workflow/launching/launching","title":"Launching Your Experiment","description":"After you\'re experiment has passed QA and you\'ve mitigated the risks, you are ready to launch!","sidebar":"sidebar"},"workflow/monitoring/monitoring":{"id":"workflow/monitoring/monitoring","title":"Monitoring Your Experiment","description":"Once your experiment has launched, from your experimenter page you will now have a \\"Live Monitoring Dashboard\\" link in the gray sidebar (on the left of the page).","sidebar":"sidebar"},"workflow/overview":{"id":"workflow/overview","title":"Workflow","description":"Experimentation Workflow","sidebar":"sidebar"},"workflow/testing/desktop-feature-api-testing":{"id":"workflow/testing/desktop-feature-api-testing","title":"Desktop Feature API testing","description":"In order to make testing easier we created some helpers that can be accessed by including","sidebar":"sidebar"},"workflow/testing/ios-preview-testing":{"id":"workflow/testing/ios-preview-testing","title":"Testing the preview flow on iOS","description":"Launching an experiment to Preview the stage server","sidebar":"sidebar"},"workflow/testing/preview":{"id":"workflow/testing/preview","title":"Previewing Experiments","description":"This guide will help you preview what each branch of an experiment will look like for users in the target application.","sidebar":"sidebar"},"workflow/testing/testing-on-mobile":{"id":"workflow/testing/testing-on-mobile","title":"Testing on mobile","description":"We have three parts to test:","sidebar":"sidebar"}}}')}}]); \ No newline at end of file diff --git a/assets/js/935f2afb.97af99ab.js b/assets/js/935f2afb.97af99ab.js new file mode 100644 index 000000000..f0e0e77bf --- /dev/null +++ b/assets/js/935f2afb.97af99ab.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkexperimenter_docs=self.webpackChunkexperimenter_docs||[]).push([[53],{1109:e=>{e.exports=JSON.parse('{"pluginId":"default","version":"current","label":"Next","banner":null,"badge":false,"noIndex":false,"className":"docs-version-current","isLast":true,"docsSidebars":{"sidebar":[{"type":"category","label":"Welcome","items":[{"type":"link","label":"Introduction","href":"/","docId":"homepage/intro"},{"type":"link","label":"Finding Help","href":"/help","docId":"homepage/finding-help"},{"type":"link","label":"Features","href":"/capabilities","docId":"homepage/capabilities"}],"collapsed":true,"collapsible":true},{"type":"category","label":"What\'s Newsletter","items":[{"type":"category","label":"2024","items":[{"type":"link","label":"What\'s Newsletter Q1","href":"/whats-news/2024-Q1","docId":"whats-news/2024/2024-Q1"},{"type":"link","label":"What\'s Newsletter Q2","href":"/whats-news/2024-Q2","docId":"whats-news/2024/2024-Q2"}],"collapsed":true,"collapsible":true},{"type":"category","label":"2023","items":[{"type":"link","label":"What\'s Newsletter Q4 2023","href":"/whats-news/2023-Q4","docId":"whats-news/2023/2023-Q4"},{"type":"link","label":"What\'s Newsletter Q3 2023","href":"/whats-news/2023/2023-Q3","docId":"whats-news/2023/2023-Q3"},{"type":"link","label":"What\'s Newsletter Q2 2023","href":"/whats-news/2023-Q2","docId":"whats-news/2023/2023-Q2"},{"type":"link","label":"What\'s Newsletter March 2023","href":"/2023-03","docId":"whats-news/2023/2023-03"}],"collapsed":true,"collapsible":true},{"type":"category","label":"2022","items":[{"type":"link","label":"What\'s Newsletter June 2022","href":"/2022-06","docId":"whats-news/2022/2022-06"},{"type":"link","label":"What\'s Newsletter July 2022","href":"/2022-07","docId":"whats-news/2022/2022-07"},{"type":"link","label":"What\'s Newsletter August 2022","href":"/2022-08","docId":"whats-news/2022/2022-08"}],"collapsed":true,"collapsible":true},{"type":"category","label":"2021","items":[{"type":"link","label":"What\'s Newsletter February 2021","href":"/2021-02","docId":"whats-news/2021/2022-02"},{"type":"link","label":"What\'s Newsletter March 2021","href":"/2021-03","docId":"whats-news/2021/2021-03"},{"type":"link","label":"What\'s Newsletter April 2021","href":"/2022-04","docId":"whats-news/2021/2021-04"},{"type":"link","label":"What\'s Newsletter June/July 2021","href":"/2021-06","docId":"whats-news/2021/2021-06"}],"collapsed":true,"collapsible":true}],"collapsed":true,"collapsible":true},{"type":"category","label":"Getting Started","items":[{"type":"link","label":"Experiment Reviewers","href":"/access","docId":"getting-started/access"},{"type":"category","label":"Data Scientists","items":[{"type":"link","label":"Overview","href":"/overview","docId":"getting-started/data-scientists/overview"},{"type":"link","label":"Experiment Sizing Command-line Interface","href":"/auto-sizing-cli","docId":"getting-started/data-scientists/auto-sizing-cli"},{"type":"link","label":"Sizing using Mozanalysis","href":"/experiment-sizing","docId":"getting-started/data-scientists/experiment-sizing"},{"type":"link","label":"Telemetry for Experiments","href":"/telemetry","docId":"getting-started/data-scientists/telemetry"},{"type":"link","label":"Validating Experiments","href":"/validating-experiments","docId":"getting-started/data-scientists/validating-experiments"}],"collapsed":true,"collapsible":true},{"type":"category","label":"Engineers","items":[{"type":"link","label":"Getting started with implementation","href":"/getting-started/engineers/for-engineers","docId":"getting-started/engineers/for-engineers"},{"type":"link","label":"Getting Started for Android Engineers","href":"/getting-started/engineers/getting-started-for-android-engineers","docId":"getting-started/engineers/getting-started-for-android-engineers"},{"type":"link","label":"Getting Started for iOS Engineers","href":"/getting-started/engineers/getting-started-for-ios-engineers","docId":"getting-started/engineers/getting-started-for-ios-engineers"},{"type":"link","label":"Getting Started for Nimbus Web Integration","href":"/getting-started/engineers/getting-started-for-nimbus-web-integration","docId":"getting-started/engineers/getting-started-for-nimbus-web-integration"},{"type":"link","label":"Desktop Feature API (JS and C++)","href":"/desktop-feature-api","docId":"getting-started/engineers/desktop-feature-api"},{"type":"link","label":"Desktop Migration Guide (JS)","href":"/desktop-migration-guide","docId":"getting-started/engineers/desktop-migration-guide"},{"type":"link","label":"Required UI for Mobile Integration","href":"/getting-started/engineers/getting-started-mobile-required-ui","docId":"getting-started/engineers/getting-started-mobile-required-ui"}],"collapsed":true,"collapsible":true},{"type":"link","label":"Product Managers","href":"/for-product","docId":"getting-started/for-product"},{"type":"link","label":"Leadership","href":"/for-leadership","docId":"getting-started/for-leadership"}],"collapsed":true,"collapsible":true},{"type":"category","label":"Experimentation Workflow","items":[{"type":"link","label":"Overview","href":"/workflow/overview","docId":"workflow/overview"},{"type":"category","label":"Designing","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Designing Your Experiment","href":"/designing-experiments","docId":"workflow/designing/designing"},{"type":"link","label":"Localization","href":"/localization-process","docId":"workflow/designing/localization-process"}]},{"type":"category","label":"Implementing","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Experiment Owners","href":"/experiment-owners","docId":"workflow/implementing/experiment-owners"},{"type":"link","label":"Feature Definition","href":"/feature-definition","docId":"workflow/implementing/feature-definition"},{"type":"link","label":"Custom Audiences","href":"/workflow/implementing/custom-audiences","docId":"workflow/implementing/custom-audiences"},{"type":"category","label":"Risk Mitigation","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"QA Sign-off","href":"/qa-sign-off","docId":"workflow/implementing/risk-mitigation/qa-sign-off/qa-sign-off"},{"type":"link","label":"VP Sign-off","href":"/vp-sign-off","docId":"workflow/implementing/risk-mitigation/vp-sign-off/vp-sign-off"},{"type":"link","label":"Legal Sign-off","href":"/legal-sign-off","docId":"workflow/implementing/risk-mitigation/legal-sign-off/legal-sign-off"},{"type":"link","label":"Comms Sign-off","href":"/comms-sign-off","docId":"workflow/implementing/risk-mitigation/comms-sign-off/comms-sign-off"},{"type":"link","label":"Message Consult","href":"/message-consult","docId":"workflow/implementing/risk-mitigation/message-consult/message-consult"},{"type":"link","label":"Risk Types","href":"/types-of-risk","docId":"workflow/implementing/risk-mitigation/types-of-risk/types-of-risk"}],"href":"/risk-mitigation"},{"type":"category","label":"Desktop Onboarding","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Introduction","href":"/workflow/implementing/desktop-onboarding/onboarding-feature-desktop","docId":"workflow/implementing/desktop-onboarding/onboarding-feature-desktop"}]},{"type":"category","label":"Messaging","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Experiments & User Messaging","href":"/messaging/experiments-and-user-messaging","docId":"workflow/implementing/messaging/experiments-and-user-messaging"},{"type":"link","label":"Messaging Display Logic","href":"/messaging/display-logic","docId":"workflow/implementing/messaging/display-logic"},{"type":"link","label":"How a Message Gets Shown","href":"/messaging/how-a-message-gets-shown","docId":"workflow/implementing/messaging/how-a-message-gets-shown"},{"type":"link","label":"Messaging Telemetry","href":"/messaging/telemetry","docId":"workflow/implementing/messaging/messaging-telemetry"},{"type":"link","label":"Messaging System Frequency cap","href":"/messaging/frequency-cap","docId":"workflow/implementing/messaging/frequency-cap"},{"type":"link","label":"Desktop Messaging Surfaces","href":"/messaging/desktop-messaging-surfaces","docId":"workflow/implementing/messaging/messaging-surfaces"},{"type":"link","label":"Desktop Messaging Journey","href":"/messaging/desktop-messaging-journey","docId":"workflow/implementing/messaging/messaging-journey"},{"type":"link","label":"Mobile Messaging","href":"/messaging/mobile-messaging","docId":"workflow/implementing/messaging/mobile-messaging"},{"type":"link","label":"Groups & Campaigns","href":"/messaging/groups-and-campaigns","docId":"workflow/implementing/messaging/groups-and-campaigns"},{"type":"link","label":"Limitations","href":"/messaging/limitations","docId":"workflow/implementing/messaging/limitations"},{"type":"category","label":"Microsurveys","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Android Microsurveys","href":"/messaging/microsurveys/android","docId":"workflow/implementing/messaging/microsurveys/android-microsurveys"},{"type":"link","label":"Microsurvey Feature for iOS","href":"/messaging/microsurveys/ios","docId":"workflow/implementing/messaging/microsurveys/ios-microsurveys"}]},{"type":"link","label":"Remote Localization","href":"/messaging/remote-localization","docId":"workflow/implementing/messaging/remote-localization"}]},{"type":"category","label":"Mobile Targeting","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Adding new targeting attributes to Android","href":"/android-custom-targeting","docId":"workflow/implementing/mobile-targeting/android-custom-targeting"},{"type":"link","label":"Adding new targeting attributes to iOS","href":"/ios-custom-targeting","docId":"workflow/implementing/mobile-targeting/ios-custom-targeting"}]},{"type":"category","label":"Mobile Onboarding","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Onboarding Feature for Android","href":"/onboarding/onboarding-feature-android","docId":"workflow/implementing/onboarding/onboarding-feature-android"},{"type":"link","label":"Onboarding Feature for iOS","href":"/onboarding/onboarding-feature-ios","docId":"workflow/implementing/onboarding/onboarding-feature-ios"}]}]},{"type":"link","label":"Configuring","href":"/configuring","docId":"workflow/configuring/configuring"},{"type":"category","label":"Testing","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Previewing Experiments","href":"/previewing-experiments","docId":"workflow/testing/preview"},{"type":"link","label":"Desktop Feature API testing","href":"/desktop-feature-api-testing","docId":"workflow/testing/desktop-feature-api-testing"},{"type":"link","label":"Testing the preview flow on iOS","href":"/ios-preview-testing","docId":"workflow/testing/ios-preview-testing"},{"type":"link","label":"Testing on mobile","href":"/testing-on-mobile","docId":"workflow/testing/testing-on-mobile"}]},{"type":"link","label":"Launching","href":"/launching","docId":"workflow/launching/launching"},{"type":"link","label":"Monitoring","href":"/monitoring","docId":"workflow/monitoring/monitoring"},{"type":"link","label":"Ending","href":"/ending","docId":"workflow/ending/ending"},{"type":"link","label":"Analyzing","href":"/analyzing","docId":"workflow/analyzing/analyzing"}],"collapsed":true,"collapsible":true},{"type":"category","label":"Deep Dives","items":[{"type":"category","label":"Jetstream","items":[{"type":"link","label":"Overview","href":"/deep-dives/jetstream/overview","docId":"deep-dives/jetstream/overview"},{"type":"link","label":"Metrics","href":"/deep-dives/jetstream/metrics","docId":"deep-dives/jetstream/metrics"},{"type":"link","label":"Statistics","href":"/deep-dives/jetstream/statistics","docId":"deep-dives/jetstream/statistics"},{"type":"link","label":"Outcomes","href":"/deep-dives/jetstream/outcomes","docId":"deep-dives/jetstream/outcomes"},{"type":"link","label":"Configuring Jetstream","href":"/deep-dives/jetstream/configuration","docId":"deep-dives/jetstream/configuration"},{"type":"link","label":"Data products","href":"/deep-dives/jetstream/data-products","docId":"deep-dives/jetstream/data-products"},{"type":"link","label":"Architecture and Operations","href":"/deep-dives/jetstream/operations","docId":"deep-dives/jetstream/operations"},{"type":"link","label":"Troubleshooting","href":"/deep-dives/jetstream/troubleshooting","docId":"deep-dives/jetstream/troubleshooting"},{"type":"link","label":"Testing Jetstream Configs","href":"/deep-dives/jetstream/testing","docId":"deep-dives/jetstream/testing"},{"type":"link","label":"Adding a Platform","href":"/deep-dives/jetstream/adding-a-platform","docId":"deep-dives/jetstream/adding-a-platform"},{"type":"link","label":"Jetstream GitHub","href":"https://github.com/mozilla/jetstream"}],"collapsed":true,"collapsible":true},{"type":"category","label":"Data topics","items":[{"type":"link","label":"Bucketing","href":"/bucketing","docId":"deep-dives/data/bucketing"},{"type":"link","label":"Missing Exposure-based Analysis?","href":"/missing-exposure","docId":"deep-dives/data/missing_exposures"},{"type":"link","label":"Exposure Funnel and Population Representativeness","href":"/population-representativeness","docId":"deep-dives/data/population_representativeness"}],"collapsed":true,"collapsible":true},{"type":"category","label":"Desktop topics","items":[{"type":"link","label":"Desktop Local Experiment Iteration","href":"/desktop-enroll-locally","docId":"deep-dives/desktop/desktop-enroll-locally"},{"type":"link","label":"Launching Incident Response Pref Flips","href":"/desktop-incident-response","docId":"deep-dives/desktop/desktop-incident-response"},{"type":"link","label":"Running Pref-setting Experiments on Desktop","href":"/desktop-pref-experiments","docId":"deep-dives/desktop/desktop-pref-experiments"},{"type":"link","label":"Desktop Targeting debug","href":"/desktop-targeting-debug","docId":"deep-dives/desktop/desktop-targeting-debug"}],"collapsed":true,"collapsible":true},{"type":"category","label":"Mobile topics","items":[{"type":"link","label":"Behavioral Targeting","href":"/mobile-behavioral-targeting","docId":"deep-dives/mobile/mobile-behavioral-targeting"},{"type":"link","label":"Enrollment State Machine","href":"/mobile-enrollment-state-machine","docId":"deep-dives/mobile/mobile-enrollment-state-machine"},{"type":"link","label":"Feature API","href":"/mobile-feature-api","docId":"deep-dives/mobile/mobile-feature-api"},{"type":"link","label":"First Run Experiments","href":"/mobile-first-run-experiments","docId":"deep-dives/mobile/mobile-first-run-experiments"},{"type":"link","label":"Surveys","href":"/mobile-surveys","docId":"deep-dives/mobile/mobile-surveys"},{"type":"category","label":"Nimbus CLI","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Introduction","href":"/nimbus-cli","docId":"deep-dives/mobile/nimbus-cli/nimbus-cli-introduction"},{"type":"link","label":"Installation Guide","href":"/nimbus-cli/install","docId":"deep-dives/mobile/nimbus-cli/nimbus-cli-install"},{"type":"link","label":"Getting Started","href":"/nimbus-cli/getting-started","docId":"deep-dives/mobile/nimbus-cli/nimbus-cli-getting-started"},{"type":"link","label":"Opening and resetting the app","href":"/nimbus-cli/opening-and-resetting","docId":"deep-dives/mobile/nimbus-cli/nimbus-cli-opening-and-resetting"},{"type":"link","label":"Working with Features","href":"/nimbus-cli/working-with-features","docId":"deep-dives/mobile/nimbus-cli/nimbus-cli-working-with-features"},{"type":"link","label":"Working with Files","href":"/nimbus-cli/working-with-files","docId":"deep-dives/mobile/nimbus-cli/nimbus-cli-working-with-files"},{"type":"link","label":"Working with Patch Files","href":"/nimbus-cli/working-with-patch-files","docId":"deep-dives/mobile/nimbus-cli/nimbus-cli-working-with-patch-files"},{"type":"link","label":"Working with Logs","href":"/nimbus-cli/working-with-logs","docId":"deep-dives/mobile/nimbus-cli/nimbus-cli-working-with-logs"},{"type":"link","label":"Working with Feature Manifests","href":"/nimbus-cli/fml","docId":"deep-dives/mobile/nimbus-cli/nimbus-cli-working-with-fml"},{"type":"link","label":"Working with Devices","href":"/nimbus-cli/on-devices","docId":"deep-dives/mobile/nimbus-cli/nimbus-cli-working-with-devices"},{"type":"link","label":"Using Environment variables","href":"/nimbus-cli/environment-variables","docId":"deep-dives/mobile/nimbus-cli/nimbus-cli-environment-vars"},{"type":"link","label":"Instrumentation Guide","href":"/nimbus-cli/instrumentation","docId":"deep-dives/mobile/nimbus-cli/nimbus-cli-instrumentation"},{"type":"link","label":"What\'s New","href":"/nimbus-cli/whats-new","docId":"deep-dives/mobile/nimbus-cli/nimbus-cli-changelog"}]}],"collapsed":true,"collapsible":true},{"type":"category","label":"Experimenter topics","items":[{"type":"link","label":"Branches","href":"/deep-dives/experimenter/branches-page","docId":"deep-dives/experimenter/branches-page-deep-dive"},{"type":"link","label":"Notifications","href":"/notifications","docId":"deep-dives/experimenter/notificationse"},{"type":"link","label":"Rollouts","href":"/deep-dives/experimenter/rollouts","docId":"deep-dives/experimenter/rollouts-deep-dive"},{"type":"link","label":"Experimenter state and Kinto integration","href":"/deep-dives/experimenter/experimenter-state","docId":"deep-dives/experimenter/experimenter-state"},{"type":"link","label":"Experimenter warnings","href":"/warnings","docId":"deep-dives/experimenter/warnings"}],"collapsed":true,"collapsible":true},{"type":"category","label":"Specifications","items":[{"type":"link","label":"Client SDK States & Lifecycle","href":"/client-sdk-states-and-lifecycle","docId":"deep-dives/specifications/client-sdk-states-and-lifecycle"},{"type":"category","label":"Feature Manifest Language","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"The Feature Manifest Language","href":"/fml-spec","docId":"deep-dives/specifications/fml/fml-spec"},{"type":"link","label":"Using paths in FML","href":"/fml/fml-paths","docId":"deep-dives/specifications/fml/fml-paths"},{"type":"link","label":"Componentizing the Nimbus Feature Manifest","href":"/fml/fml-imports-and-includes","docId":"deep-dives/specifications/fml/fml-imports"},{"type":"link","label":"Nimbus FML command line interface","href":"/fml/fml-cli","docId":"deep-dives/specifications/fml/fml-cli"},{"type":"link","label":"Co-enrolling Features","href":"/fml/coenrolling-features","docId":"deep-dives/specifications/fml/coenrolling-features"},{"type":"link","label":"Using string alias","href":"/fml/string-alias","docId":"deep-dives/specifications/fml/fml-string-alias"},{"type":"link","label":"Using prefs to override feature variables","href":"/fml/using-prefs","docId":"deep-dives/specifications/fml/using-prefs"},{"type":"link","label":"Providing feature metadata","href":"/fml/feature-metadata","docId":"deep-dives/specifications/fml/feature-metadata"},{"type":"link","label":"A history of considered changes for Feature Manifest Language","href":"/fml/unimplemented","docId":"deep-dives/specifications/fml/fm-unimplemented-spec"},{"type":"link","label":"Feature Manifest Language Front-end Format As YAML","href":"/fml/fml-front-end-format","docId":"deep-dives/specifications/fml/fml-front-end-format"}]}],"collapsed":true,"collapsible":true}],"collapsed":true,"collapsible":true},{"type":"category","label":"Experimentation Cookbook","items":[{"type":"link","label":"Feature Manifest Cookbook","href":"/cookbook/fml/fml-cookbook","docId":"cookbook/fml/fml-cookbook"},{"type":"link","label":"Managing collections not known before release","href":"/cookbook/fml/growable-collections","docId":"cookbook/fml/growable-collections"}],"collapsed":true,"collapsible":true},{"type":"category","label":"FAQ","items":[{"type":"link","label":"General FAQ","href":"/faq/general-faq","docId":"faq/general-faq/general-faq"},{"type":"category","label":"Branches","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"FML Errors","href":"/faq/branches/fml-errors","docId":"faq/branches/fml-errors"},{"type":"link","label":"How many branches?","href":"/faq/branches/how-many-branches","docId":"faq/branches/how-many-branches"}]},{"type":"link","label":"Custom configs","href":"/faq/custom-configs","docId":"faq/custom-configs/custom-configs"},{"type":"category","label":"Desktop","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Desktop prefs","href":"/faq/desktop/desktop-prefs","docId":"faq/desktop/desktop-prefs"},{"type":"link","label":"Exposure","href":"/faq/desktop/exposure","docId":"faq/desktop/exposure"}]},{"type":"category","label":"Early startup","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"What does early startup do?","href":"/faq/early-startup/what-do-it-do","docId":"faq/early-startup/what-do-it-do"},{"type":"link","label":"How early is early?","href":"/faq/early-startup/how-early","docId":"faq/early-startup/how-early"}]},{"type":"link","label":"Ending experiments","href":"/faq/ending-experiments","docId":"faq/ending-experiments/ending-experiments"},{"type":"link","label":"Enrollment","href":"/enrollment/experiment-enrollment","docId":"faq/enrollment/experiment-enrollment"},{"type":"link","label":"Exposure","href":"/exposure-faq","docId":"faq/exposure/exposure-faq"},{"type":"link","label":"Feature restart","href":"/faq/feature-restart","docId":"faq/feature-restart/feature-restart"},{"type":"category","label":"Metrics","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Feature metrics","href":"/feature-metrics","docId":"faq/metrics/feature-metrics"}]},{"type":"category","label":"Mobile","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Mobile First Run","href":"/faq/first-run","docId":"faq/mobile/first-run"},{"type":"link","label":"Mobile FAQ","href":"/faq/mobile-faq","docId":"faq/mobile/mobile-faq"}]},{"type":"category","label":"Results","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Results","href":"/results-availability","docId":"faq/results/results-availability"}]},{"type":"category","label":"Rollouts","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Rollouts and Experiment Interaction","href":"/rollouts/rollouts-and-experiments","docId":"faq/rollouts/rollouts-and-experiments"},{"type":"link","label":"Rollout feature saturation","href":"/rollouts/saturation","docId":"faq/rollouts/saturation"},{"type":"link","label":"Sizing rollouts","href":"/rollouts/sizing","docId":"faq/rollouts/sizing-rollouts"}]},{"type":"category","label":"Targeting","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Advanced targeting","href":"/targeting/advanced-targeting","docId":"faq/targeting/advanced-targeting"},{"type":"link","label":"Targeting dot releases or specific betas","href":"/targeting/version-targeting","docId":"faq/targeting/version-targeting"}]},{"type":"link","label":"Warnings","href":"/faq/warnings","docId":"faq/warnings/warnings"}],"collapsed":true,"collapsible":true},{"type":"link","label":"Glossary","href":"/glossary","docId":"glossary"},{"type":"category","label":"Additional Links","items":[{"type":"link","label":"Integration Test Docs","href":"/integration-tests","docId":"additional-links/integration-tests"},{"type":"link","label":"Local configuration for natural enrollments","href":"/local-enrollment","docId":"additional-links/local-enrollment"},{"type":"link","label":"System architecture / components","href":"/system-architecture","docId":"additional-links/system-architecture"},{"type":"link","label":"Experimenter GH Repo","href":"https://github.com/mozilla/experimenter"},{"type":"link","label":"How to Launch a Nimbus Experiment","href":"https://mozilla-hub.atlassian.net/wiki/spaces/FJT/pages/11469776/Nimbus+Onboarding#NimbusOnboarding-LaunchingExperimentsusingNimbus!"},{"type":"link","label":"Nimbus Data Transfer Object","href":"https://mozilla-hub.atlassian.net/wiki/spaces/FJT/pages/11469537/The+Nimbus+Data+Transfer+Object+DTO"},{"type":"link","label":"Experiment Telemetry","href":"https://mozilla-hub.atlassian.net/wiki/spaces/FJT/pages/11469458/Nimbus+Engineering#NimbusEngineering-ExperimentTelemetry"},{"type":"link","label":"Lessons Learned","href":"https://mozilla-hub.atlassian.net/wiki/spaces/FJT/pages/11470136/Lessons+Learned+-+Experiment+Incidents+and+Close+Calls"}],"collapsed":true,"collapsible":true}]},"docs":{"additional-links/integration-tests":{"id":"additional-links/integration-tests","title":"Integration Test Docs","description":"About","sidebar":"sidebar"},"additional-links/local-enrollment":{"id":"additional-links/local-enrollment","title":"Local configuration for natural enrollments","description":"Desktop","sidebar":"sidebar"},"additional-links/system-architecture":{"id":"additional-links/system-architecture","title":"System architecture / components","description":"original lives here","sidebar":"sidebar"},"cookbook/fml/fml-cookbook":{"id":"cookbook/fml/fml-cookbook","title":"Feature Manifest Cookbook","description":"The Feature Manifest Language is a tool and specification designed to help application developers manage tooling to interact with Nimbus. It sits on top of the Feature Variables API, and eliminates many of the weaknesses of that API:","sidebar":"sidebar"},"cookbook/fml/growable-collections":{"id":"cookbook/fml/growable-collections","title":"Managing collections not known before release","description":"Problem","sidebar":"sidebar"},"deep-dives/data/bucketing":{"id":"deep-dives/data/bucketing","title":"Bucketing","description":"Bucketing is the process of randomly assigning users to experiment branches. When a user is \u201cbucketed\u201d into an experiment, it means that the configuration in one of its branches (such as a change to part of the UI) can be activated, and that any interactions we record from that moment on can be associated with the experiment and branch identifier. The concept is explained in this video / presentation.","sidebar":"sidebar"},"deep-dives/data/missing_exposures":{"id":"deep-dives/data/missing_exposures","title":"Missing Exposure-based Analysis?","description":"In a Nimbus experiment, not every enrolled client actually experiences the experimental intervention or treatment. We refer to \\"experiencing the experimental treatment\\" as exposure. For example, in a messaging experiment, some enrolled users do not meet the conditions to be shown the message. As another example, some experimental treatments require the user to restart their browser to take effect, so users who do not restart do not experience the treatment. Calculating results based on all enrolled users, when many users are not exposed, results in a diluted estimate of the treatment impact. For the highest precision, experiments should be configured with an Exposure Signal, which allows the analysis system to determine which enrolled users were exposed. See this page for more info including interpreting different bases.","sidebar":"sidebar"},"deep-dives/data/population_representativeness":{"id":"deep-dives/data/population_representativeness","title":"Exposure Funnel and Population Representativeness","description":"It is desirable for the group enrolled in a delivery (experiment, (micro)survey, etc.) to be a representative sample of the targeted population. A lack of representativeness could indicate selection biases that would invalidate learnings. We term a lack of representativeness as a \\"representativeness failure\\". This page documents common causes of representativeness failures. For simplicity, this document will use the term \\"experiment\\", but the same issues apply to non-experiment deliveries (surveys, rollouts, etc.).","sidebar":"sidebar"},"deep-dives/desktop/desktop-enroll-locally":{"id":"deep-dives/desktop/desktop-enroll-locally","title":"Desktop Local Experiment Iteration","description":"Trying to iterate on an experiment in Preview on experimenter.services.mozilla.com can be painful, because even after you change something and post to preview, you have a wait a while for the updated recipe to be propagated to the CDN.","sidebar":"sidebar"},"deep-dives/desktop/desktop-incident-response":{"id":"deep-dives/desktop/desktop-incident-response","title":"Launching Incident Response Pref Flips","description":"As of Firefox 129 (and 128.2 ESR), Firefox supports flipping any pref via","sidebar":"sidebar"},"deep-dives/desktop/desktop-pref-experiments":{"id":"deep-dives/desktop/desktop-pref-experiments","title":"Running Pref-setting Experiments on Desktop","description":"test","sidebar":"sidebar"},"deep-dives/desktop/desktop-targeting-debug":{"id":"deep-dives/desktop/desktop-targeting-debug","title":"Desktop Targeting debug","description":"How to enable ASRouter devtools","sidebar":"sidebar"},"deep-dives/experimenter/branches-page-deep-dive":{"id":"deep-dives/experimenter/branches-page-deep-dive","title":"Branches","description":"Feature Manifest Language errors (mobile only)","sidebar":"sidebar"},"deep-dives/experimenter/experimenter-state":{"id":"deep-dives/experimenter/experimenter-state","title":"Experimenter state and Kinto integration","description":"Learn more about experiment states, lifecycles, and workflows in Experimenter here!","sidebar":"sidebar"},"deep-dives/experimenter/notificationse":{"id":"deep-dives/experimenter/notificationse","title":"Notifications","description":"Notifications exist on Experimenter to remind experiment owners of the following dates:","sidebar":"sidebar"},"deep-dives/experimenter/rollouts-deep-dive":{"id":"deep-dives/experimenter/rollouts-deep-dive","title":"Rollouts","description":"Want more info on rollouts?","sidebar":"sidebar"},"deep-dives/experimenter/warnings":{"id":"deep-dives/experimenter/warnings","title":"Experimenter warnings","description":"See the Warnings FAQ for any warnings you may encounter on Experimenter.","sidebar":"sidebar"},"deep-dives/jetstream/adding-a-platform":{"id":"deep-dives/jetstream/adding-a-platform","title":"Adding a Platform","description":"Jetstream runs analyses for experiments launched on several different platforms, such as Fenix or Firefox Desktop. When adding a new platform in Experimenter, the new platform also needs to be configured in Jetstream to enable automated analyses for launched experiments.","sidebar":"sidebar"},"deep-dives/jetstream/configuration":{"id":"deep-dives/jetstream/configuration","title":"Configuring Jetstream","description":"About configurations","sidebar":"sidebar"},"deep-dives/jetstream/data-products":{"id":"deep-dives/jetstream/data-products","title":"Jetstream Data Products","description":"Jetstream writes analysis results and enrollments information to BigQuery. Statistics data and metadata gets exported to GCS to make it accessible to the Experimenter console.","sidebar":"sidebar"},"deep-dives/jetstream/metrics":{"id":"deep-dives/jetstream/metrics","title":"Metrics","description":"A metric describes an aggregation of user activity,","sidebar":"sidebar"},"deep-dives/jetstream/operations":{"id":"deep-dives/jetstream/operations","title":"Jetstream Architecture and Operations","description":"Jetstream is part of the Cirrus ecosystem and depends on some external services.","sidebar":"sidebar"},"deep-dives/jetstream/outcomes":{"id":"deep-dives/jetstream/outcomes","title":"Outcomes","description":"An Outcome is a reusable configuration snippet","sidebar":"sidebar"},"deep-dives/jetstream/overview":{"id":"deep-dives/jetstream/overview","title":"Overview","description":"[Jetstream] is an analysis framework for experiments.","sidebar":"sidebar"},"deep-dives/jetstream/statistics":{"id":"deep-dives/jetstream/statistics","title":"Statistics","description":"Statistics reduce observations of many clients","sidebar":"sidebar"},"deep-dives/jetstream/testing":{"id":"deep-dives/jetstream/testing","title":"Testing Jetstream Configs","description":"Validation via Continuous Integration (CI)","sidebar":"sidebar"},"deep-dives/jetstream/troubleshooting":{"id":"deep-dives/jetstream/troubleshooting","title":"Troubleshooting Jetstream","description":"How can I see what Jetstream is doing?","sidebar":"sidebar"},"deep-dives/mobile/mobile-behavioral-targeting":{"id":"deep-dives/mobile/mobile-behavioral-targeting","title":"Behavioral Targeting","description":"Behavioral targeting is a term used to describe a set of jexl transforms which can be used to target specific user behaviors. User behaviors might be the user opened the app, the user logged in, the user navigated to a specific view, or any user-triggered event that has Glean metrics associated with it.","sidebar":"sidebar"},"deep-dives/mobile/mobile-enrollment-state-machine":{"id":"deep-dives/mobile/mobile-enrollment-state-machine","title":"Enrollment State Machine","description":"Possible States","sidebar":"sidebar"},"deep-dives/mobile/mobile-feature-api":{"id":"deep-dives/mobile/mobile-feature-api","title":"Feature API","description":"About this document","sidebar":"sidebar"},"deep-dives/mobile/mobile-first-run-experiments":{"id":"deep-dives/mobile/mobile-first-run-experiments","title":"First Run Experiments","description":"First Run Experiments are incredibly important to the experimentation ecosystem, but their functionality comes with some key differences from standard experiments. It is highly advised that experiment owners read through this documentation before writing First Run Experiments.","sidebar":"sidebar"},"deep-dives/mobile/mobile-surveys":{"id":"deep-dives/mobile/mobile-surveys","title":"Surveys","description":"The required general steps to launch a mobile survey are:","sidebar":"sidebar"},"deep-dives/mobile/nimbus-cli/nimbus-cli-changelog":{"id":"deep-dives/mobile/nimbus-cli/nimbus-cli-changelog","title":"What\'s New","description":"0.4.0","sidebar":"sidebar"},"deep-dives/mobile/nimbus-cli/nimbus-cli-environment-vars":{"id":"deep-dives/mobile/nimbus-cli/nimbus-cli-environment-vars","title":"Using Environment variables","description":"adb and xcrun","sidebar":"sidebar"},"deep-dives/mobile/nimbus-cli/nimbus-cli-getting-started":{"id":"deep-dives/mobile/nimbus-cli/nimbus-cli-getting-started","title":"Getting Started","description":"Most nimbus-cli commands need an --app and --channel parameter. These should correspond to the app as it is installed on the simulator or emulator.","sidebar":"sidebar"},"deep-dives/mobile/nimbus-cli/nimbus-cli-install":{"id":"deep-dives/mobile/nimbus-cli/nimbus-cli-install","title":"Installation Guide","description":"The nimbus-cli is a command line tool to help develop and test experiments and features on an instrumented mobile app.","sidebar":"sidebar"},"deep-dives/mobile/nimbus-cli/nimbus-cli-instrumentation":{"id":"deep-dives/mobile/nimbus-cli/nimbus-cli-instrumentation","title":"Instrumentation Guide","description":"The nimbus-cli is a tool to communicate with the Nimbus SDK that is embedded in an app.","sidebar":"sidebar"},"deep-dives/mobile/nimbus-cli/nimbus-cli-introduction":{"id":"deep-dives/mobile/nimbus-cli/nimbus-cli-introduction","title":"Introduction","description":"The nimbus-cli is a command line tool for interacting with the Nimbus SDK embedded in Mozilla\'s mobile applications.","sidebar":"sidebar"},"deep-dives/mobile/nimbus-cli/nimbus-cli-opening-and-resetting":{"id":"deep-dives/mobile/nimbus-cli/nimbus-cli-opening-and-resetting","title":"Opening and resetting the app","description":"The commands that open the app do so by simulating the app\'s launch as if the user tapped on the app icon on the phone; these are:","sidebar":"sidebar"},"deep-dives/mobile/nimbus-cli/nimbus-cli-working-with-devices":{"id":"deep-dives/mobile/nimbus-cli/nimbus-cli-working-with-devices","title":"Working with Devices","description":"nimbus-cli works best with iOS when working directly with the simulator, via xcrun simctl.","sidebar":"sidebar"},"deep-dives/mobile/nimbus-cli/nimbus-cli-working-with-features":{"id":"deep-dives/mobile/nimbus-cli/nimbus-cli-working-with-features","title":"Working with Features","description":"The nimbus-cli provides features to download experiments from Remote Settings. However, sometimes you wish to do some exploratory testing of a feature without going through the experimenter interface.","sidebar":"sidebar"},"deep-dives/mobile/nimbus-cli/nimbus-cli-working-with-files":{"id":"deep-dives/mobile/nimbus-cli/nimbus-cli-working-with-files","title":"Working with Files","description":"fetch","sidebar":"sidebar"},"deep-dives/mobile/nimbus-cli/nimbus-cli-working-with-fml":{"id":"deep-dives/mobile/nimbus-cli/nimbus-cli-working-with-fml","title":"Working with Feature Manifests","description":"The Feature Manifest Language is a powerful way of specify the shape of the feature configurations that each branch is made up of.","sidebar":"sidebar"},"deep-dives/mobile/nimbus-cli/nimbus-cli-working-with-logs":{"id":"deep-dives/mobile/nimbus-cli/nimbus-cli-working-with-logs","title":"Working with Logs","description":"Log files are especially helpful to developers, but not always very easy to access.","sidebar":"sidebar"},"deep-dives/mobile/nimbus-cli/nimbus-cli-working-with-patch-files":{"id":"deep-dives/mobile/nimbus-cli/nimbus-cli-working-with-patch-files","title":"Working with Patch Files","description":"The nimbus-cli lets you source experiments from multiple places and then change them before inserting them into the app where they can be evaluated, and the app can naturally enroll into them.","sidebar":"sidebar"},"deep-dives/specifications/client-sdk-states-and-lifecycle":{"id":"deep-dives/specifications/client-sdk-states-and-lifecycle","title":"Client SDK States & Lifecycle","description":"Nimbus SDK Experiment States and Lifecycle","sidebar":"sidebar"},"deep-dives/specifications/fml/coenrolling-features":{"id":"deep-dives/specifications/fml/coenrolling-features","title":"Co-enrolling Features","description":"A feature which allows co-enrollment allows a client to be enrolled in any number of experiments/rollouts for that feature.","sidebar":"sidebar"},"deep-dives/specifications/fml/feature-metadata":{"id":"deep-dives/specifications/fml/feature-metadata","title":"Providing feature metadata","description":"The feature manifest defines \\"features\\" which are used to:","sidebar":"sidebar"},"deep-dives/specifications/fml/fm-unimplemented-spec":{"id":"deep-dives/specifications/fml/fm-unimplemented-spec","title":"A history of considered changes for Feature Manifest Language","description":"Future specifications","sidebar":"sidebar"},"deep-dives/specifications/fml/fml-cli":{"id":"deep-dives/specifications/fml/fml-cli","title":"Nimbus FML command line interface","description":"Generating code for an mobile application","sidebar":"sidebar"},"deep-dives/specifications/fml/fml-front-end-format":{"id":"deep-dives/specifications/fml/fml-front-end-format","title":"Feature Manifest Language Front-end Format As YAML","description":"- Status: accepted","sidebar":"sidebar"},"deep-dives/specifications/fml/fml-imports":{"id":"deep-dives/specifications/fml/fml-imports","title":"Componentizing the Nimbus Feature Manifest","description":"In the first iteration of the nimbus-fml, the tooling was only able to work on one file at a time.","sidebar":"sidebar"},"deep-dives/specifications/fml/fml-paths":{"id":"deep-dives/specifications/fml/fml-paths","title":"Using paths in FML","description":"In several places paths to link one .fml.yaml file to another.","sidebar":"sidebar"},"deep-dives/specifications/fml/fml-spec":{"id":"deep-dives/specifications/fml/fml-spec","title":"The Feature Manifest Language","description":"About this document","sidebar":"sidebar"},"deep-dives/specifications/fml/fml-string-alias":{"id":"deep-dives/specifications/fml/fml-string-alias","title":"Using string alias","description":"string-alias is a type alias annotations for feature variables in the feature manifest language. It defines a named set of strings which can be used and validated elsewhere in the feature manifest.","sidebar":"sidebar"},"deep-dives/specifications/fml/using-prefs":{"id":"deep-dives/specifications/fml/using-prefs","title":"Using prefs to override feature variables","description":"This page details adding pref-key to a feature definition. This cause the FML generated code to check the user preferences (UserDefaults or SharedPrefences) before checking the Nimbus configuration store or the default.","sidebar":"sidebar"},"faq/branches/fml-errors":{"id":"faq/branches/fml-errors","title":"FML Errors","description":"When creating your experiment, you may come across Feature Manifest errors on the Branches page:","sidebar":"sidebar"},"faq/branches/how-many-branches":{"id":"faq/branches/how-many-branches","title":"How many branches can I have?","description":"While you might want to try out lots of variations for your experiment - each variation reduces your chance of detecting changes. We highly recommend running as few variations as possible. Trying to cram too many changes into one experiment can lead to learning nothing about all branches.","sidebar":"sidebar"},"faq/custom-configs/custom-configs":{"id":"faq/custom-configs/custom-configs","title":"Custom configs","description":"Question","sidebar":"sidebar"},"faq/desktop/desktop-prefs":{"id":"faq/desktop/desktop-prefs","title":"Desktop prefs","description":"See the deep dive on desktop prefs for more information","sidebar":"sidebar"},"faq/desktop/exposure":{"id":"faq/desktop/exposure","title":"Exposure","description":"See the deep dive on growable collections and Jetstream enrollment vs. exposure for more information","sidebar":"sidebar"},"faq/early-startup/how-early":{"id":"faq/early-startup/how-early","title":"How early is early?","description":"Early on Desktop","sidebar":"sidebar"},"faq/early-startup/what-do-it-do":{"id":"faq/early-startup/what-do-it-do","title":"What does early startup do?","description":"There is info on how to use Early Startup here in the documentation","sidebar":"sidebar"},"faq/ending-experiments/ending-experiments":{"id":"faq/ending-experiments/ending-experiments","title":"Ending experiments","description":"What happens at experiment end?","sidebar":"sidebar"},"faq/enrollment/experiment-enrollment":{"id":"faq/enrollment/experiment-enrollment","title":"Experiment enrollment","description":"When is a user enrolled?","sidebar":"sidebar"},"faq/exposure/exposure-faq":{"id":"faq/exposure/exposure-faq","title":"Exposure","description":"Question","sidebar":"sidebar"},"faq/feature-restart/feature-restart":{"id":"faq/feature-restart/feature-restart","title":"Feature restart","description":"Question","sidebar":"sidebar"},"faq/general-faq/general-faq":{"id":"faq/general-faq/general-faq","title":"General FAQ","description":"What\'s the difference between \\"Experimenter\\" and \\"Nimbus\\"?","sidebar":"sidebar"},"faq/metrics/feature-metrics":{"id":"faq/metrics/feature-metrics","title":"Feature metrics","description":"Question","sidebar":"sidebar"},"faq/mobile/first-run":{"id":"faq/mobile/first-run","title":"Mobile First Run","description":"Question","sidebar":"sidebar"},"faq/mobile/mobile-faq":{"id":"faq/mobile/mobile-faq","title":"Mobile FAQ","description":"Question","sidebar":"sidebar"},"faq/results/results-availability":{"id":"faq/results/results-availability","title":"Results","description":"Question","sidebar":"sidebar"},"faq/rollouts/rollouts-and-experiments":{"id":"faq/rollouts/rollouts-and-experiments","title":"Rollouts and Experiment Interaction","description":"See the Rollout FAQ for general rollout information","sidebar":"sidebar"},"faq/rollouts/saturation":{"id":"faq/rollouts/saturation","title":"Rollout feature saturation","description":"See the Rollout FAQ for general rollout information","sidebar":"sidebar"},"faq/rollouts/sizing-rollouts":{"id":"faq/rollouts/sizing-rollouts","title":"Sizing rollouts","description":"See the Rollout FAQ for general rollout information","sidebar":"sidebar"},"faq/targeting/advanced-targeting":{"id":"faq/targeting/advanced-targeting","title":"Advanced targeting","description":"Question","sidebar":"sidebar"},"faq/targeting/version-targeting":{"id":"faq/targeting/version-targeting","title":"Targeting dot releases or specific betas","description":"Question","sidebar":"sidebar"},"faq/warnings/warnings":{"id":"faq/warnings/warnings","title":"Experimenter warnings","description":"There are a number of warning messages that you may encounter on Experimenter in the course of launching your experiment. These warnings are listed below, along with any restrictions that they may impose on an experiment.","sidebar":"sidebar"},"getting-started/access":{"id":"getting-started/access","title":"Experiment Reviewers","description":"With Nimbus experiments, instead of a centralized committee responsible for launching and running experiments we want you, the experiment owner, to drive the process from ideation to completion.","sidebar":"sidebar"},"getting-started/contributing":{"id":"getting-started/contributing","title":"Contributing","description":"The Experimenter documentation hub is managed in the mozilla/experimenter-docs repository. You will need a GitHub account to contribute, and if you are not already in the Project Nimbus GitHub team, you may need to request write access in the #nimbus-project Slack channel."},"getting-started/data-scientists/auto-sizing-cli":{"id":"getting-started/data-scientists/auto-sizing-cli","title":"Experiment Sizing Command-line Interface","description":"The sample size calculation functionality contained in the [Mozanalysis] library is accessible via a command-line interface (CLI), [auto-sizing]. This CLI is intended to enable rapid analyses for simple experiments or experiments with targeting similar to past experiments.","sidebar":"sidebar"},"getting-started/data-scientists/experiment-sizing":{"id":"getting-started/data-scientists/experiment-sizing","title":"Sizing Experiments Using Mozanalysis","description":"This page gives an overview of how Mozanalysis can be used to do experiment sizing. [Mozanalysis] is a library used to standardize experiment analysis at Mozilla. Mozanalysis contains the statistical tools used by [Jetstream] to produce results from experiments, as well as tools to pull historical data from BigQuery to calculate necessary sample sizes to carry out experiments. The results of the tool are the sample size and percent of the total target population required per branch of an experiment with a balanced design to achieve a given power.","sidebar":"sidebar"},"getting-started/data-scientists/overview":{"id":"getting-started/data-scientists/overview","title":"Experimentation for data scientists","description":"This page describes the roles data scientists play in experimentation at Mozilla.","sidebar":"sidebar"},"getting-started/data-scientists/telemetry":{"id":"getting-started/data-scientists/telemetry","title":"Telemetry for Experiments","description":"This section is an overview of Nimbus Telemetry intended for the analysis of experiments.","sidebar":"sidebar"},"getting-started/data-scientists/validating-experiments":{"id":"getting-started/data-scientists/validating-experiments","title":"Validating Experiments","description":"This section describes some common problems with experiments that you should look out for, how we recommend testing for them, and some potential causes to investigate if you do see that something is wrong.","sidebar":"sidebar"},"getting-started/engineers/desktop-feature-api":{"id":"getting-started/engineers/desktop-feature-api","title":"Desktop Feature API (JS and C++)","description":"This guide will help you use the Nimbus Feature API in Desktop Firefox to run experiments, set values remotely, and manage user preferences. If you are familiar with Normandy and are trying to migrate a feature, you may want to check out the Migration Guide for Pref Experiments.","sidebar":"sidebar"},"getting-started/engineers/desktop-migration-guide":{"id":"getting-started/engineers/desktop-migration-guide","title":"Desktop Migration Guide (JS)","description":"To migrate front-end normandy prefs to Nimbus controlled experiments or rollouts","sidebar":"sidebar"},"getting-started/engineers/for-engineers":{"id":"getting-started/engineers/for-engineers","title":"Getting started with implementation","description":"Engineers are typically tasked with implementing an experiment on a new surface with an experiment that has been designed by their product manager in partnership with a data scientist.","sidebar":"sidebar"},"getting-started/engineers/getting-started-for-android-engineers":{"id":"getting-started/engineers/getting-started-for-android-engineers","title":"Getting Started for Android Engineers","description":"Nimbus is an experimentation platform from Mozilla.","sidebar":"sidebar"},"getting-started/engineers/getting-started-for-ios-engineers":{"id":"getting-started/engineers/getting-started-for-ios-engineers","title":"Getting Started for iOS Engineers","description":"Introduction","sidebar":"sidebar"},"getting-started/engineers/getting-started-for-nimbus-web-integration":{"id":"getting-started/engineers/getting-started-for-nimbus-web-integration","title":"Getting Started for Nimbus Web Integration","description":"Introduction","sidebar":"sidebar"},"getting-started/engineers/getting-started-mobile-required-ui":{"id":"getting-started/engineers/getting-started-mobile-required-ui","title":"Required UI for Mobile Integration","description":"Currently Nimbus provides no user-interface components of its own, though provides API to connect to existing settings screens.","sidebar":"sidebar"},"getting-started/for-leadership":{"id":"getting-started/for-leadership","title":"Leadership","description":"How can leadership interact with experiments?","sidebar":"sidebar"},"getting-started/for-product":{"id":"getting-started/for-product","title":"Product Managers","description":"What is the role of Product in experimentation?","sidebar":"sidebar"},"glossary":{"id":"glossary","title":"Glossary","description":"A","sidebar":"sidebar"},"homepage/capabilities":{"id":"homepage/capabilities","title":"Nimbus Features","description":"Nimbus is a full-featured experimentation platform that provides configuration, analysis and client libraries for both experiments and rollouts.","sidebar":"sidebar"},"homepage/finding-help":{"id":"homepage/finding-help","title":"finding-help","description":"Need help? Not sure where to start?","sidebar":"sidebar"},"homepage/intro":{"id":"homepage/intro","title":"Welcome","description":"Welcome to the Experimenter documentation hub, your central resource for A/B experiments and feature rollouts in Firefox Mobile and Desktop. You should find these documents helpful if you are:","sidebar":"sidebar"},"whats-news/2021/2021-03":{"id":"whats-news/2021/2021-03","title":"What\'s Newsletter March 2021","description":"March 2021","sidebar":"sidebar"},"whats-news/2021/2021-04":{"id":"whats-news/2021/2021-04","title":"What\'s Newsletter April 2021","description":"April 2021","sidebar":"sidebar"},"whats-news/2021/2021-06":{"id":"whats-news/2021/2021-06","title":"What\'s Newsletter June/July 2021","description":"Through June and early July, in addition to some great time away for Wellness Week and holidays, we\u2019ve been hard at work making improvements to Nimbus. Here are some of our Release 91 updates:","sidebar":"sidebar"},"whats-news/2021/2022-02":{"id":"whats-news/2021/2022-02","title":"What\'s Newsletter February 2021","description":"February 2021","sidebar":"sidebar"},"whats-news/2022/2022-06":{"id":"whats-news/2022/2022-06","title":"What\'s Newsletter June 2022","description":"Welcome","sidebar":"sidebar"},"whats-news/2022/2022-07":{"id":"whats-news/2022/2022-07","title":"What\'s Newsletter July 2022","description":"Welcome","sidebar":"sidebar"},"whats-news/2022/2022-08":{"id":"whats-news/2022/2022-08","title":"What\'s Newsletter August 2022","description":"Welcome","sidebar":"sidebar"},"whats-news/2023/2023-03":{"id":"whats-news/2023/2023-03","title":"What\'s Newsletter March 2023","description":"Rollouts","sidebar":"sidebar"},"whats-news/2023/2023-Q2":{"id":"whats-news/2023/2023-Q2","title":"What\'s New in Nimbus - Q2 2023","description":"This is a non-exhaustive list of the Nimbus team\'s accomplishments in Q2, including some deep dives into a few of the more exciting features that have landed.","sidebar":"sidebar"},"whats-news/2023/2023-Q3":{"id":"whats-news/2023/2023-Q3","title":"What\'s New in Nimbus - Q3 2023","description":"Mobile","sidebar":"sidebar"},"whats-news/2023/2023-Q4":{"id":"whats-news/2023/2023-Q4","title":"What\'s New in Nimbus - Q4 2023","description":"Experimenter","sidebar":"sidebar"},"whats-news/2024/2024-Q1":{"id":"whats-news/2024/2024-Q1","title":"What\'s New in Nimbus - Q1 2024","description":"Experimenter","sidebar":"sidebar"},"whats-news/2024/2024-Q2":{"id":"whats-news/2024/2024-Q2","title":"What\'s New in Nimbus - Q2 2024","description":"Experimenter","sidebar":"sidebar"},"workflow/analyzing/analyzing":{"id":"workflow/analyzing/analyzing","title":"Experiment Analysis","description":"Experiment results are availabe from the Results Link on your experiment page. Experiments typically take 24 hours after ending to generate the overall results.","sidebar":"sidebar"},"workflow/configuring/configuring":{"id":"workflow/configuring/configuring","title":"Experiment Configuration","description":"From our perspective as experiment owners, experiments are composed of two time periods: the enrollment period and the observation window.","sidebar":"sidebar"},"workflow/designing/designing":{"id":"workflow/designing/designing","title":"Designing Your Experiment","description":"WARNING: below is a sample image only of this part of the flow - see this LIVE and CURRENT workflow for the most accurate information, including maintained links and flow","sidebar":"sidebar"},"workflow/designing/localization-process":{"id":"workflow/designing/localization-process","title":"Localization","description":"Localization support for Nimbus experiments is constantly improving. Make sure to check this page again before setting up new experiments.","sidebar":"sidebar"},"workflow/ending/ending":{"id":"workflow/ending/ending","title":"Ending Your Experiment","description":"To end enrollment","sidebar":"sidebar"},"workflow/implementing/custom-audiences":{"id":"workflow/implementing/custom-audiences","title":"Custom Audiences","description":"Custom audiences let you target specific groups of users beyond the regular targeting options. Custom audiences can be configured for any experiment through the experimenter UI:","sidebar":"sidebar"},"workflow/implementing/desktop-onboarding/onboarding-feature-desktop":{"id":"workflow/implementing/desktop-onboarding/onboarding-feature-desktop","title":"Introduction","description":"The onboarding feature enables experimentation with the \'new user onboarding flow\'. The onboarding flow is presented to the user on each new install and is made up of a series of full screen \'views\', referred to as \'cards\'. The purpose of the onboarding flow is to enable the user to configure a small number of app enhancing settings. Each card provides context for each setting and the ability to enable/skip.","sidebar":"sidebar"},"workflow/implementing/experiment-owners":{"id":"workflow/implementing/experiment-owners","title":"Experiment Owners","description":"For an overview of experiment lifecycle, See Experiment Workflow Overview","sidebar":"sidebar"},"workflow/implementing/feature-definition":{"id":"workflow/implementing/feature-definition","title":"Feature Definition","description":"In the experimentation ecosystem, experiment surfaces are described as features. A feature is an area of code instrumented with telemetry and accessible for remote configuration. It can be as small as a single function or as complex as a whole page. Some examples:","sidebar":"sidebar"},"workflow/implementing/messaging/display-logic":{"id":"workflow/implementing/messaging/display-logic","title":"Messaging Display Logic","description":"There are three types of display logic you should consider when using any of the messaging surfaces:","sidebar":"sidebar"},"workflow/implementing/messaging/experiments-and-user-messaging":{"id":"workflow/implementing/messaging/experiments-and-user-messaging","title":"Experiments & User Messaging","description":"Experiments enforce the rule that a user cannot enroll in multiple experiments of the same type (feature). Each messaging surface corresponds to a feature so we can only run a single experiment for any given messaging surface per cohort of users.","sidebar":"sidebar"},"workflow/implementing/messaging/frequency-cap":{"id":"workflow/implementing/messaging/frequency-cap","title":"Messaging System Frequency cap","description":"How often and now many times a user should see a message is configured through frequency.","sidebar":"sidebar"},"workflow/implementing/messaging/groups-and-campaigns":{"id":"workflow/implementing/messaging/groups-and-campaigns","title":"Groups & Campaigns","description":"Message Groups","sidebar":"sidebar"},"workflow/implementing/messaging/how-a-message-gets-shown":{"id":"workflow/implementing/messaging/how-a-message-gets-shown","title":"How a Message Gets Shown","description":"All messages belong to a message provider (a source):","sidebar":"sidebar"},"workflow/implementing/messaging/limitations":{"id":"workflow/implementing/messaging/limitations","title":"Limitations","description":"History state of past experiments","sidebar":"sidebar"},"workflow/implementing/messaging/messaging-journey":{"id":"workflow/implementing/messaging/messaging-journey","title":"Desktop Messaging Journey","description":"From inception to launch, a message goes through the below three steps for Firefox Desktop:","sidebar":"sidebar"},"workflow/implementing/messaging/messaging-surfaces":{"id":"workflow/implementing/messaging/messaging-surfaces","title":"Desktop Messaging Surfaces","description":"The following messaging surfaces are currently remotely available in Firefox Desktop, meaning that you create new messages without shipping code changes.","sidebar":"sidebar"},"workflow/implementing/messaging/messaging-telemetry":{"id":"workflow/implementing/messaging/messaging-telemetry","title":"Messaging Telemetry","description":"Event telemetry is sent for any interaction with the messaging surfaces and additionally for impressions (when the message is shown). The following types of user interaction is captured by telemetry:","sidebar":"sidebar"},"workflow/implementing/messaging/microsurveys/android-microsurveys":{"id":"workflow/implementing/messaging/microsurveys/android-microsurveys","title":"Android Microsurveys","description":"Introduction","sidebar":"sidebar"},"workflow/implementing/messaging/microsurveys/ios-microsurveys":{"id":"workflow/implementing/messaging/microsurveys/ios-microsurveys","title":"Microsurvey Feature for iOS","description":"Introduction","sidebar":"sidebar"},"workflow/implementing/messaging/mobile-messaging":{"id":"workflow/implementing/messaging/mobile-messaging","title":"Mobile Messaging","description":"The mobile messaging system is a feature of Firefox on iOS and Android, designed to send in-app messages directly to users without going through a release cycle.","sidebar":"sidebar"},"workflow/implementing/messaging/remote-localization":{"id":"workflow/implementing/messaging/remote-localization","title":"Remote Localization","description":"Remote localization is available for all message types but it does require that strings are landed early to give localizers enough time. This is done via the ms-language-packs repo.","sidebar":"sidebar"},"workflow/implementing/mobile-targeting/android-custom-targeting":{"id":"workflow/implementing/mobile-targeting/android-custom-targeting","title":"Adding new targeting attributes to Android","description":"This page demonstrates how to add new targeting attributes to Android, enabling experiment creators more specific targeting.","sidebar":"sidebar"},"workflow/implementing/mobile-targeting/ios-custom-targeting":{"id":"workflow/implementing/mobile-targeting/ios-custom-targeting","title":"Adding new targeting attributes to iOS","description":"This page demonstrates how to add new targeting attributes to iOS, enabling experiment creators more specific targeting.","sidebar":"sidebar"},"workflow/implementing/onboarding/onboarding-feature-android":{"id":"workflow/implementing/onboarding/onboarding-feature-android","title":"Onboarding Feature for Android","description":"The onboarding feature enables experimentation with the \'new user onboarding flow\'. The onboarding flow is presented to the user on each new install and is made up of a series of full screen \'views\', referred to as \'cards\'. The purpose of the onboarding flow is to enable the user to configure a small number of app enhancing settings. Each card provides context for each setting and the ability to enable/skip.","sidebar":"sidebar"},"workflow/implementing/onboarding/onboarding-feature-ios":{"id":"workflow/implementing/onboarding/onboarding-feature-ios","title":"Onboarding Feature for iOS","description":"The onboarding feature enables experimentating with the \'new user onboarding flow\'. The onboarding flow is presented to the user on each new install, and is made up of a series of full screen \'views\', referred to as \'cards\'. The purpose of the onboarding flow is to enable the user to configure a small number of app enhancing settings. Each card provides context for each setting and the ability to take an appropratie action, or skip to the next card.","sidebar":"sidebar"},"workflow/implementing/risk-mitigation/comms-sign-off/comms-sign-off":{"id":"workflow/implementing/risk-mitigation/comms-sign-off/comms-sign-off","title":"Comms Sign-off","description":"Ideally work with your comms or PR contact for your area to let them know the details of the experiment and why a risk has been identified. If you don\u2019t know where to start for Comms help for your area - #cccc is a channel where you can get help. That channel also has a runbook document linked that has some more information on ways to engage with the Comms team.","sidebar":"sidebar"},"workflow/implementing/risk-mitigation/legal-sign-off/legal-sign-off":{"id":"workflow/implementing/risk-mitigation/legal-sign-off/legal-sign-off","title":"Legal Sign-off","description":"If Legal Review shows as Required, the answer to one of the Risk questions determined legal review will help mitigate a risk. Please write legal-product@mozilla.com and explain what you want to do, to how many people (% of population and channel), and the potential outcomes. In your conversation with Legal, you may determine a Legal Bug is needed.","sidebar":"sidebar"},"workflow/implementing/risk-mitigation/message-consult/message-consult":{"id":"workflow/implementing/risk-mitigation/message-consult/message-consult","title":"Message Consult","description":"If your experiment includes ANY message, make sure you had an in-product message consult and filed an FXE Jira ticket that was triaged via the Desktop or Mobile messaging leads (Venetia and Courtney).","sidebar":"sidebar"},"workflow/implementing/risk-mitigation/qa-sign-off/qa-sign-off":{"id":"workflow/implementing/risk-mitigation/qa-sign-off/qa-sign-off","title":"QA Sign-off","description":"Feature testing alone is not enough for experiments or rollouts. There is testing specific to see that the turning on and off of your feature works through Nimbus. There is also testing if you are changing configurations (does it work in different locals? platforms?), if there is new advanced targeting that needs testing, and if there is new telemetry.","sidebar":"sidebar"},"workflow/implementing/risk-mitigation/risk-mitigation":{"id":"workflow/implementing/risk-mitigation/risk-mitigation","title":"Risk Mitigation","description":"Experiments and Rollouts are making remote changes to the experience of live users, often millions of people. Doing QA and answering the risk questions carefully helps reduce the chance of production incidents. These are all \u201csoft sign-offs\u201d - in that you can check them yourself saying you have followed the guidance and are satisfied the risk is mitigated.","sidebar":"sidebar"},"workflow/implementing/risk-mitigation/types-of-risk/types-of-risk":{"id":"workflow/implementing/risk-mitigation/types-of-risk/types-of-risk","title":"Types of Risk","description":"We\'ve learned a few ways to de-risk experiments and rollouts before they launch. Below is not an exhausive list for every situation - but a list of the some common situations to help you avoid known pitfalls.","sidebar":"sidebar"},"workflow/implementing/risk-mitigation/vp-sign-off/vp-sign-off":{"id":"workflow/implementing/risk-mitigation/vp-sign-off/vp-sign-off","title":"VP Sign-off","description":"Experiment owners are responsible for securing VP sign-off. Sign-off isn\u2019t a technically blocking step to launch - but your acceptance that you have communicated effectively to the VP(s) who would get any escalations if there is an incident. Good details avoid assumptions and delays by providing the information necessary for the VP(s) to have an informed opinion.","sidebar":"sidebar"},"workflow/launching/launching":{"id":"workflow/launching/launching","title":"Launching Your Experiment","description":"After you\'re experiment has passed QA and you\'ve mitigated the risks, you are ready to launch!","sidebar":"sidebar"},"workflow/monitoring/monitoring":{"id":"workflow/monitoring/monitoring","title":"Monitoring Your Experiment","description":"Once your experiment has launched, from your experimenter page you will now have a \\"Live Monitoring Dashboard\\" link in the gray sidebar (on the left of the page).","sidebar":"sidebar"},"workflow/overview":{"id":"workflow/overview","title":"Workflow","description":"Experimentation Workflow","sidebar":"sidebar"},"workflow/testing/desktop-feature-api-testing":{"id":"workflow/testing/desktop-feature-api-testing","title":"Desktop Feature API testing","description":"In order to make testing easier we created some helpers that can be accessed by including","sidebar":"sidebar"},"workflow/testing/ios-preview-testing":{"id":"workflow/testing/ios-preview-testing","title":"Testing the preview flow on iOS","description":"Launching an experiment to Preview the stage server","sidebar":"sidebar"},"workflow/testing/preview":{"id":"workflow/testing/preview","title":"Previewing Experiments","description":"This guide will help you preview what each branch of an experiment will look like for users in the target application.","sidebar":"sidebar"},"workflow/testing/testing-on-mobile":{"id":"workflow/testing/testing-on-mobile","title":"Testing on mobile","description":"We have three parts to test:","sidebar":"sidebar"}}}')}}]); \ No newline at end of file diff --git a/assets/js/b7510fea.4d9e7cf5.js b/assets/js/b7510fea.4d9e7cf5.js new file mode 100644 index 000000000..f410b7048 --- /dev/null +++ b/assets/js/b7510fea.4d9e7cf5.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkexperimenter_docs=self.webpackChunkexperimenter_docs||[]).push([[3363],{4137:(e,t,n)=>{n.d(t,{Zo:()=>u,kt:()=>m});var r=n(7294);function l(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function i(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function a(e){for(var t=1;t=0||(l[n]=e[n]);return l}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(l[n]=e[n])}return l}var o=r.createContext({}),p=function(e){var t=r.useContext(o),n=t;return e&&(n="function"==typeof e?e(t):a(a({},t),e)),n},u=function(e){var t=p(e.components);return r.createElement(o.Provider,{value:t},e.children)},f="mdxType",c={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},d=r.forwardRef((function(e,t){var n=e.components,l=e.mdxType,i=e.originalType,o=e.parentName,u=s(e,["components","mdxType","originalType","parentName"]),f=p(n),d=l,m=f["".concat(o,".").concat(d)]||f[d]||c[d]||i;return n?r.createElement(m,a(a({ref:t},u),{},{components:n})):r.createElement(m,a({ref:t},u))}));function m(e,t){var n=arguments,l=t&&t.mdxType;if("string"==typeof e||l){var i=n.length,a=new Array(i);a[0]=d;var s={};for(var o in t)hasOwnProperty.call(t,o)&&(s[o]=t[o]);s.originalType=e,s[f]="string"==typeof e?e:l,a[1]=s;for(var p=2;p{n.r(t),n.d(t,{assets:()=>o,contentTitle:()=>a,default:()=>c,frontMatter:()=>i,metadata:()=>s,toc:()=>p});var r=n(7462),l=(n(7294),n(4137));const i={id:"desktop-pref-experiments",title:"Running Pref-setting Experiments on Desktop",slug:"/desktop-pref-experiments"},a=void 0,s={unversionedId:"deep-dives/desktop/desktop-pref-experiments",id:"deep-dives/desktop/desktop-pref-experiments",title:"Running Pref-setting Experiments on Desktop",description:"test",source:"@site/docs/deep-dives/desktop/desktop-pref-experiments.md",sourceDirName:"deep-dives/desktop",slug:"/desktop-pref-experiments",permalink:"/desktop-pref-experiments",draft:!1,editUrl:"https://github.com/mozilla/experimenter-docs/edit/main/docs/deep-dives/desktop/desktop-pref-experiments.md",tags:[],version:"current",frontMatter:{id:"desktop-pref-experiments",title:"Running Pref-setting Experiments on Desktop",slug:"/desktop-pref-experiments"},sidebar:"sidebar",previous:{title:"Launching Incident Response Pref Flips",permalink:"/desktop-incident-response"},next:{title:"Desktop Targeting debug",permalink:"/desktop-targeting-debug"}},o={},p=[{value:"Example Feature",id:"example-feature",level:2},{value:"Experiments vs Rollouts",id:"experiments-vs-rollouts",level:2},{value:"Pref branches",id:"pref-branches",level:2},{value:"User Preference Changes",id:"user-preference-changes",level:2},{value:"Manifest Changes",id:"manifest-changes",level:2},{value:"Restrictions with Fallback Prefs",id:"restrictions-with-fallback-prefs",level:2},{value:"Conflicts with Incident Response Pref Flips",id:"conflicts-with-incident-response-pref-flips",level:2}],u={toc:p},f="wrapper";function c(e){let{components:t,...n}=e;return(0,l.kt)(f,(0,r.Z)({},u,n,{components:t,mdxType:"MDXLayout"}),(0,l.kt)("p",null,(0,l.kt)("a",{parentName:"p",href:"/desktop-incident-response"},"test")),(0,l.kt)("p",null,"As of Firefox 107, Nimbus supports experiments that set preferences on Desktop.\nUnlike Normandy, Nimbus cannot set arbitrary preferences; instead, the\npreferences that may be set are determined by the feature manifest."),(0,l.kt)("p",null,"Each variable in a Nimbus feature can set a single pref of any type."),(0,l.kt)("p",null,"NB: Support for JSON variables was added in Firefox 126. The value of the pref\nwill be ",(0,l.kt)("inlineCode",{parentName:"p"},"JSON.stringify(value)"),"."),(0,l.kt)("h2",{id:"example-feature"},"Example Feature"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-yaml"},"my-feature:\n description: A description of my feature\n owner: whoami@mozilla.com\n variables:\n enabled:\n description: A variable setting a boolean pref to enable a feature.\n type: boolean\n setPref:\n branch: user\n pref: my_feature.enabled\n name:\n description: A variable setting a string pref to determine some name.\n type: string\n setPref:\n branch: user\n pref: my_feature.name\n count:\n description: A variable setting an integer pref to determine some count.\n type: int\n setPref:\n branch: default\n pref: my_feature.count\n")),(0,l.kt)("h2",{id:"experiments-vs-rollouts"},"Experiments vs Rollouts"),(0,l.kt)("p",null,"Users can be enrolled in an experiment and rollout for the same feature. If both\nan experiment and rollout set a variable that sets a pref, then the experiment\nwill take precedence. If the user unenrolls from the experiment, then the pref\nwill be set to the value specified in the rollout."),(0,l.kt)("p",null,"When the user is no longer enrolled in either an experiment or a rollout setting\na given pref, then it will be reset to its original value at the time of the\nfirst enrollment, with some caveats:"),(0,l.kt)("ul",null,(0,l.kt)("li",{parentName:"ul"},"If the pref is set on the default branch (see ",(0,l.kt)("a",{parentName:"li",href:"#pref-branches"},"below"),") and the\npref was not set before enrollment, then the pref will not change until the\nnext restart. This is due to a technical limitation: default branch values\ncannot be cleared."),(0,l.kt)("li",{parentName:"ul"},"If the pref is set on the user branch and the pref was not set before\nenrollment, then the pref will be cleared and will be no longer available.")),(0,l.kt)("h2",{id:"pref-branches"},"Pref branches"),(0,l.kt)("p",null,"Each variable using ",(0,l.kt)("inlineCode",{parentName:"p"},"setPref")," must specify which branch will be written to.\nThe default branch is not persisted, so prefs set on the default branch will not\nbe available until Nimbus completes its startup and loads all its active\nexperiments from disk."),(0,l.kt)("h2",{id:"user-preference-changes"},"User Preference Changes"),(0,l.kt)("p",null,"If a user is enrolled in an experiment or rollout that sets a pref and that pref\nchanges, the user will be unenrolled from the experiment (or rollout). This\nincludes both changes made by the user and changes in code. Experiment runners\nshould be careful to ensure there is no code in tree that will modify prefs they\nare experimenting on, otherwise their populations may get spuriously unenrolled."),(0,l.kt)("p",null,"The new value of the preference will be persisted."),(0,l.kt)("h2",{id:"manifest-changes"},"Manifest Changes"),(0,l.kt)("p",null,"Some changes to the feature manifest may result in unenrollment from an active\nexperiment:"),(0,l.kt)("ul",null,(0,l.kt)("li",{parentName:"ul"},"The feature being removed."),(0,l.kt)("li",{parentName:"ul"},"A variable that is currently setting a pref is removed."),(0,l.kt)("li",{parentName:"ul"},"A variable that is currently setting a pref either changes the pref it is\nsetting or no longer sets a pref (i.e., its ",(0,l.kt)("inlineCode",{parentName:"li"},"setPref")," value changes or is\nremoved).")),(0,l.kt)("p",null,"It should be noted that unenrollment for these reasons will only occur when the\nuser is enrolled in a pref-setting experiment. If a feature specifies both\npref-setting and non-pref setting variables, then changes to the manifest will\nnot result in unenrollment if the active experiment does not have any values for\npref-setting variables."),(0,l.kt)("h2",{id:"restrictions-with-fallback-prefs"},"Restrictions with Fallback Prefs"),(0,l.kt)("p",null,"Variables may not specify both a ",(0,l.kt)("inlineCode",{parentName:"p"},"fallbackPref")," and a ",(0,l.kt)("inlineCode",{parentName:"p"},"setPref"),"."),(0,l.kt)("p",null,"Fallback prefs and set prefs are mutually exclusive. That is, If any variable in\nany feature specifies a pref as a fallback pref, no variable may set that\nvariable as a set pref and vice versa."),(0,l.kt)("p",null,"These restrictions are enforced at build time."),(0,l.kt)("h2",{id:"conflicts-with-incident-response-pref-flips"},"Conflicts with Incident Response Pref Flips"),(0,l.kt)("p",null,"If a user is enrolled in a setPref experiment/rollout and then enrolls in an\n",(0,l.kt)("a",{parentName:"p",href:"/desktop-incident-response"},"incident response pref flip"),", they will be unenrolled from the\nsetPref experiment/rollout. This will result in an unenrollment event\n(",(0,l.kt)("a",{parentName:"p",href:"https://dictionary.telemetry.mozilla.org/apps/firefox_desktop/metrics/nimbus_events_unenrollment"},"glean"),", ",(0,l.kt)("a",{parentName:"p",href:"https://probes.telemetry.mozilla.org/?search=unenroll&view=detail&probeId=event%2Fnormandy.unenroll%23unenroll"},"legacy"),") being submitted with the\nfollowing data:"),(0,l.kt)("table",null,(0,l.kt)("thead",null,(0,l.kt)("tr",null,(0,l.kt)("th",null,"Glean Field"),(0,l.kt)("th",null,"Legacy Field"),(0,l.kt)("th",null,"Description"))),(0,l.kt)("tbody",null,(0,l.kt)("tr",null,(0,l.kt)("td",null,(0,l.kt)("code",null,"reason")),(0,l.kt)("td",null,(0,l.kt)("code",null,"reason")),(0,l.kt)("td",null,"The string ",(0,l.kt)("code",null,'"prefFlips-conflict"'))),(0,l.kt)("tr",null,(0,l.kt)("td",null,(0,l.kt)("code",null,"conflicting_slug")),(0,l.kt)("td",null,(0,l.kt)("code",null,"conflictingSlug")),(0,l.kt)("td",null,"The slug of the experiment that caused the unenrollment.")))))}c.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/b7510fea.505e2760.js b/assets/js/b7510fea.505e2760.js deleted file mode 100644 index 3f356ccad..000000000 --- a/assets/js/b7510fea.505e2760.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkexperimenter_docs=self.webpackChunkexperimenter_docs||[]).push([[3363],{4137:(e,t,n)=>{n.d(t,{Zo:()=>f,kt:()=>d});var r=n(7294);function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function i(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function s(e){for(var t=1;t=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var o=r.createContext({}),p=function(e){var t=r.useContext(o),n=t;return e&&(n="function"==typeof e?e(t):s(s({},t),e)),n},f=function(e){var t=p(e.components);return r.createElement(o.Provider,{value:t},e.children)},u="mdxType",c={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},m=r.forwardRef((function(e,t){var n=e.components,a=e.mdxType,i=e.originalType,o=e.parentName,f=l(e,["components","mdxType","originalType","parentName"]),u=p(n),m=a,d=u["".concat(o,".").concat(m)]||u[m]||c[m]||i;return n?r.createElement(d,s(s({ref:t},f),{},{components:n})):r.createElement(d,s({ref:t},f))}));function d(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var i=n.length,s=new Array(i);s[0]=m;var l={};for(var o in t)hasOwnProperty.call(t,o)&&(l[o]=t[o]);l.originalType=e,l[u]="string"==typeof e?e:a,s[1]=l;for(var p=2;p{n.r(t),n.d(t,{assets:()=>o,contentTitle:()=>s,default:()=>c,frontMatter:()=>i,metadata:()=>l,toc:()=>p});var r=n(7462),a=(n(7294),n(4137));const i={id:"desktop-pref-experiments",title:"Running Pref-setting Experiments on Desktop",slug:"/desktop-pref-experiments"},s=void 0,l={unversionedId:"deep-dives/desktop/desktop-pref-experiments",id:"deep-dives/desktop/desktop-pref-experiments",title:"Running Pref-setting Experiments on Desktop",description:"As of Firefox 107, Nimbus supports experiments that set preferences on Desktop.",source:"@site/docs/deep-dives/desktop/desktop-pref-experiments.md",sourceDirName:"deep-dives/desktop",slug:"/desktop-pref-experiments",permalink:"/desktop-pref-experiments",draft:!1,editUrl:"https://github.com/mozilla/experimenter-docs/edit/main/docs/deep-dives/desktop/desktop-pref-experiments.md",tags:[],version:"current",frontMatter:{id:"desktop-pref-experiments",title:"Running Pref-setting Experiments on Desktop",slug:"/desktop-pref-experiments"},sidebar:"sidebar",previous:{title:"Desktop Local Experiment Iteration",permalink:"/desktop-enroll-locally"},next:{title:"Desktop Targeting debug",permalink:"/desktop-targeting-debug"}},o={},p=[{value:"Example Feature",id:"example-feature",level:2},{value:"Experiments vs Rollouts",id:"experiments-vs-rollouts",level:2},{value:"Pref branches",id:"pref-branches",level:2},{value:"User Preference Changes",id:"user-preference-changes",level:2},{value:"Manifest Changes",id:"manifest-changes",level:2},{value:"Restrictions with Fallback Prefs",id:"restrictions-with-fallback-prefs",level:2}],f={toc:p},u="wrapper";function c(e){let{components:t,...n}=e;return(0,a.kt)(u,(0,r.Z)({},f,n,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("p",null,"As of Firefox 107, Nimbus supports experiments that set preferences on Desktop.\nUnlike Normandy, Nimbus cannot set arbitrary preferences; instead, the\npreferences that may be set are determined by the feature manifest."),(0,a.kt)("p",null,"Each variable in a Nimbus feature can set a single pref of any type."),(0,a.kt)("p",null,"NB: Support for JSON variables was added in Firefox 126. The value of the pref\nwill be ",(0,a.kt)("inlineCode",{parentName:"p"},"JSON.stringify(value)"),"."),(0,a.kt)("h2",{id:"example-feature"},"Example Feature"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-yaml"},"my-feature:\n description: A description of my feature\n owner: whoami@mozilla.com\n variables:\n enabled:\n description: A variable setting a boolean pref to enable a feature.\n type: boolean\n setPref:\n branch: user\n pref: my_feature.enabled\n name:\n description: A variable setting a string pref to determine some name.\n type: string\n setPref:\n branch: user\n pref: my_feature.name\n count:\n description: A variable setting an integer pref to determine some count.\n type: int\n setPref:\n branch: default\n pref: my_feature.count\n")),(0,a.kt)("h2",{id:"experiments-vs-rollouts"},"Experiments vs Rollouts"),(0,a.kt)("p",null,"Users can be enrolled in an experiment and rollout for the same feature. If both\nan experiment and rollout set a variable that sets a pref, then the experiment\nwill take precedence. If the user unenrolls from the experiment, then the pref\nwill be set to the value specified in the rollout."),(0,a.kt)("p",null,"When the user is no longer enrolled in either an experiment or a rollout setting\na given pref, then it will be reset to its original value at the time of the\nfirst enrollment, with some caveats:"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"If the pref is set on the default branch (see ",(0,a.kt)("a",{parentName:"li",href:"#pref-branches"},"below"),") and the\npref was not set before enrollment, then the pref will not change until the\nnext restart. This is due to a technical limitation: default branch values\ncannot be cleared."),(0,a.kt)("li",{parentName:"ul"},"If the pref is set on the user branch and the pref was not set before\nenrollment, then the pref will be cleared and will be no longer available.")),(0,a.kt)("h2",{id:"pref-branches"},"Pref branches"),(0,a.kt)("p",null,"Each variable using ",(0,a.kt)("inlineCode",{parentName:"p"},"setPref")," must specify which branch will be written to.\nThe default branch is not persisted, so prefs set on the default branch will not\nbe available until Nimbus completes its startup and loads all its active\nexperiments from disk."),(0,a.kt)("h2",{id:"user-preference-changes"},"User Preference Changes"),(0,a.kt)("p",null,"If a user is enrolled in an experiment or rollout that sets a pref and that pref\nchanges, the user will be unenrolled from the experiment (or rollout). This\nincludes both changes made by the user and changes in code. Experiment runners\nshould be careful to ensure there is no code in tree that will modify prefs they\nare experimenting on, otherwise their populations may get spuriously unenrolled."),(0,a.kt)("p",null,"The new value of the preference will be persisted."),(0,a.kt)("h2",{id:"manifest-changes"},"Manifest Changes"),(0,a.kt)("p",null,"Some changes to the feature manifest may result in unenrollment from an active\nexperiment:"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"The feature being removed."),(0,a.kt)("li",{parentName:"ul"},"A variable that is currently setting a pref is removed."),(0,a.kt)("li",{parentName:"ul"},"A variable that is currently setting a pref either changes the pref it is\nsetting or no longer sets a pref (i.e., its ",(0,a.kt)("inlineCode",{parentName:"li"},"setPref")," value changes or is\nremoved).")),(0,a.kt)("p",null,"It should be noted that unenrollment for these reasons will only occur when the\nuser is enrolled in a pref-setting experiment. If a feature specifies both\npref-setting and non-pref setting variables, then changes to the manifest will\nnot result in unenrollment if the active experiment does not have any values for\npref-setting variables."),(0,a.kt)("h2",{id:"restrictions-with-fallback-prefs"},"Restrictions with Fallback Prefs"),(0,a.kt)("p",null,"Variables may not specify both a ",(0,a.kt)("inlineCode",{parentName:"p"},"fallbackPref")," and a ",(0,a.kt)("inlineCode",{parentName:"p"},"setPref"),"."),(0,a.kt)("p",null,"Fallback prefs and set prefs are mutually exclusive. That is, If any variable in\nany feature specifies a pref as a fallback pref, no variable may set that\nvariable as a set pref and vice versa."),(0,a.kt)("p",null,"These restrictions are enforced at build time."))}c.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/main.9c9e9421.js b/assets/js/main.9c9e9421.js deleted file mode 100644 index d47e1595e..000000000 --- a/assets/js/main.9c9e9421.js +++ /dev/null @@ -1,2 +0,0 @@ -/*! For license information please see main.9c9e9421.js.LICENSE.txt */ -(self.webpackChunkexperimenter_docs=self.webpackChunkexperimenter_docs||[]).push([[179],{997:(e,t,n)=>{"use strict";n.d(t,{Z:()=>p});var r=n(7294),i=n(7462),a=n(8356),o=n.n(a),s=n(6887);const l={"01a71e32":[()=>n.e(6710).then(n.bind(n,6717)),"@site/docs/deep-dives/mobile/nimbus-cli/80-working-with-devices.mdx",6717],"0383c0b8":[()=>n.e(4611).then(n.bind(n,3930)),"@site/docs/additional-links/integration-tests.md",3930],"07fd1c04":[()=>n.e(5795).then(n.bind(n,9781)),"@site/docs/workflow/implementing/risk-mitigation/qa-sign-off/qa-sign-off.mdx",9781],"091e7fe9":[()=>n.e(3867).then(n.bind(n,7151)),"@site/docs/faq/enrollment/enrollment.mdx",7151],"0af59768":[()=>n.e(5698).then(n.bind(n,2376)),"@site/docs/deep-dives/jetstream/configuration.md",2376],"0b037b32":[()=>n.e(6330).then(n.bind(n,5958)),"@site/docs/getting-started/data-scientists/auto-sizing-cli.md",5958],"0c9698ed":[()=>n.e(3236).then(n.bind(n,8581)),"@site/docs/deep-dives/experimenter/warnings.mdx",8581],"0d43d50a":[()=>n.e(7849).then(n.bind(n,2192)),"@site/docs/faq/rollouts/rollouts-and-experiments.mdx",2192],"0e4bb081":[()=>n.e(971).then(n.bind(n,7957)),"@site/docs/deep-dives/mobile/enrollment-state-machine.md",7957],"0f26f501":[()=>n.e(6201).then(n.bind(n,674)),"@site/docs/deep-dives/mobile/nimbus-cli/20-getting-started.mdx",674],"1040d669":[()=>n.e(7902).then(n.bind(n,9260)),"@site/docs/whats-news/2023/2023-q3.mdx",9260],"1171e6d8":[()=>n.e(7275).then(n.bind(n,3825)),"@site/docs/faq/results/results-availability.mdx",3825],"1191bb23":[()=>n.e(1337).then(n.bind(n,6045)),"@site/docs/deep-dives/mobile/nimbus-cli/30-opening-and-resetting.mdx",6045],15779823:[()=>n.e(8455).then(n.bind(n,97)),"@site/docs/workflow/implementing/messaging/telemetry.md",97],"1596dfb9":[()=>n.e(6159).then(n.bind(n,3033)),"@site/docs/deep-dives/mobile/nimbus-cli/55-working-with-patch-files.mdx",3033],17896441:[()=>Promise.all([n.e(532),n.e(7918)]).then(n.bind(n,662)),"@theme/DocItem",662],"1b3c3ab8":[()=>n.e(5654).then(n.bind(n,1871)),"@site/docs/faq/general-faq/general-faq.mdx",1871],"1b8d449f":[()=>n.e(1510).then(n.bind(n,2961)),"@site/docs/deep-dives/specifications/fml/coenrolling-features.mdx",2961],"1be78505":[()=>Promise.all([n.e(532),n.e(9514)]).then(n.bind(n,1299)),"@theme/DocPage",1299],"1c199777":[()=>n.e(6863).then(n.bind(n,8902)),"@site/docs/whats-news/2024/2024-q2.mdx",8902],"204a4bad":[()=>n.e(9145).then(n.bind(n,6291)),"@site/docs/deep-dives/experimenter/sequence-diagrams.mdx",6291],"2885529d":[()=>n.e(9861).then(n.bind(n,8237)),"@site/docs/homepage/capabilities.md",8237],"28a7830a":[()=>n.e(7018).then(n.bind(n,4808)),"@site/docs/workflow/implementing/risk-mitigation/types-of-risk/types-of-risk.mdx",4808],"2b08bba4":[()=>n.e(5962).then(n.bind(n,6484)),"@site/docs/faq/metrics/non-guardrail-outcome.mdx",6484],"308598cc":[()=>n.e(1487).then(n.bind(n,8344)),"@site/docs/workflow/implementing/messaging/how-a-message-gets-shown.md",8344],"30fec55f":[()=>n.e(5569).then(n.bind(n,7874)),"@site/docs/getting-started/engineers/03-web-integration.md",7874],32461178:[()=>n.e(2946).then(n.bind(n,5332)),"@site/docs/faq/rollouts/saturation.mdx",5332],"333a8df3":[()=>n.e(9149).then(n.bind(n,7865)),"@site/docs/faq/targeting/version-targeting.mdx",7865],"3421eb64":[()=>n.e(1758).then(n.bind(n,7800)),"@site/docs/whats-news/2023/2023-q4.mdx",7800],"362a6703":[()=>n.e(7842).then(n.bind(n,2801)),"@site/docs/workflow/implementing/mobile-targeting/android-custom-targeting.md",2801],"377a6e8e":[()=>n.e(2191).then(n.bind(n,5224)),"@site/docs/deep-dives/mobile/first-run-experiments.mdx",5224],"37ef7871":[()=>n.e(3835).then(n.bind(n,460)),"@site/docs/faq/early-startup/how-early-is-early.mdx",460],"3b3528fa":[()=>n.e(3178).then(n.bind(n,1443)),"@site/docs/workflow/designing/localization.md",1443],"3f3a347e":[()=>n.e(6082).then(n.bind(n,7302)),"@site/docs/deep-dives/specifications/fml/fml-cli.mdx",7302],"3f74b06a":[()=>n.e(2578).then(n.bind(n,7287)),"@site/docs/deep-dives/mobile/nimbus-cli/10-install.mdx",7287],"4074b021":[()=>n.e(565).then(n.bind(n,5567)),"@site/docs/workflow/ending/ending.md",5567],"490ee317":[()=>n.e(2930).then(n.bind(n,7429)),"@site/docs/workflow/configuring/configuring.md",7429],"4a754a9a":[()=>n.e(5308).then(n.bind(n,2469)),"@site/docs/deep-dives/jetstream/outcomes.md",2469],"4e03cfd9":[()=>Promise.all([n.e(532),n.e(5850)]).then(n.bind(n,1612)),"@site/docs/deep-dives/specifications/fml/using-prefs.mdx",1612],"4fe00202":[()=>n.e(5282).then(n.bind(n,8594)),"@site/docs/deep-dives/specifications/fml/feature-metadata.mdx",8594],"50fb1ec4":[()=>n.e(1941).then(n.bind(n,9923)),"@site/docs/workflow/designing/designing-experiments.md",9923],"541f21b6":[()=>Promise.all([n.e(532),n.e(8427)]).then(n.bind(n,1025)),"@site/docs/deep-dives/specifications/fml/fml-imports.mdx",1025],"55186a2c":[()=>n.e(9902).then(n.bind(n,1345)),"@site/docs/deep-dives/specifications/fml/fml-string-alias.md",1345],"563c9555":[()=>n.e(1459).then(n.bind(n,1605)),"@site/docs/deep-dives/experimenter/rollouts.mdx",1605],"56a9c892":[()=>n.e(3217).then(n.bind(n,2662)),"@site/docs/workflow/implementing/messaging/microsurveys/ios-mobile-microsurveys.md",2662],"5868b0f6":[()=>n.e(837).then(n.bind(n,2457)),"@site/docs/getting-started/engineers/02-ios-integration.md",2457],"591a8453":[()=>n.e(6223).then(n.bind(n,4213)),"@site/docs/faq/mobile/mobile-faq.mdx",4213],"593a6c87":[()=>n.e(9441).then(n.bind(n,1647)),"@site/docs/workflow/implementing/risk-mitigation/risk-mitigation.mdx",1647],"59618b23":[()=>n.e(6321).then(n.bind(n,8519)),"@site/docs/deep-dives/mobile/nimbus-cli/40-testing-features.mdx",8519],"5a502584":[()=>n.e(3581).then(n.bind(n,3425)),"@site/docs/deep-dives/data/bucketing.md",3425],"5ace4272":[()=>Promise.all([n.e(532),n.e(376)]).then(n.bind(n,3006)),"@site/docs/workflow/testing/desktop-feature-api-testing.mdx",3006],"5d1c172e":[()=>n.e(6244).then(n.bind(n,5737)),"@site/docs/workflow/implementing/messaging/remote-localization.md",5737],"5e7ab4ea":[()=>n.e(7786).then(n.bind(n,9351)),"@site/docs/deep-dives/jetstream/troubleshooting.md",9351],"6042b56f":[()=>n.e(3967).then(n.bind(n,5190)),"@site/docs/getting-started/engineers/00-for-engineers.md",5190],"62febced":[()=>n.e(6174).then(n.bind(n,684)),"@site/docs/deep-dives/desktop/desktop-enroll-locally.md",684],"63a0b159":[()=>n.e(9543).then(n.bind(n,7089)),"@site/docs/additional-links/system-architecture.mdx",7089],"63b2b702":[()=>n.e(163).then(n.bind(n,4748)),"@site/docs/workflow/implementing/feature-definition.md",4748],"69386d42":[()=>Promise.all([n.e(532),n.e(1376)]).then(n.bind(n,7191)),"@site/docs/deep-dives/mobile/behavioral-targeting.mdx",7191],"697a7df7":[()=>n.e(5361).then(n.bind(n,442)),"@site/docs/whats-news/2021/2021-04.md",442],"6aaa64f7":[()=>n.e(2400).then(n.bind(n,9592)),"@site/docs/getting-started/data-scientists/validating-experiments.md",9592],"6b79419f":[()=>n.e(6845).then(n.bind(n,8884)),"@site/docs/deep-dives/data/population_representativeness.md",8884],"6c2d93c2":[()=>n.e(2708).then(n.bind(n,7866)),"@site/docs/getting-started/engineers/01-android-integration.md",7866],"6c8a9e25":[()=>n.e(3444).then(n.bind(n,4559)),"@site/docs/whats-news/2023/2023-q2.mdx",4559],"6f9910a4":[()=>n.e(9438).then(n.bind(n,4829)),"@site/docs/deep-dives/specifications/fml/fm-unimplemented-spec.mdx",4829],"7069348f":[()=>n.e(6355).then(n.bind(n,7589)),"@site/docs/workflow/analyzing/analyzing.md",7589],"70bb9a26":[()=>n.e(6723).then(n.bind(n,8006)),"@site/docs/deep-dives/desktop/desktop-targeting-debug.md",8006],71491029:[()=>n.e(5271).then(n.bind(n,2349)),"@site/docs/workflow/implementing/risk-mitigation/vp-sign-off/vp-sign-off.mdx",2349],"71deb655":[()=>n.e(9722).then(n.bind(n,7714)),"@site/docs/faq/branches/how-many-branches.mdx",7714],"72690a42":[()=>n.e(323).then(n.bind(n,7282)),"@site/docs/whats-news/2022/2022-08.md",7282],"74f96d56":[()=>n.e(4682).then(n.bind(n,616)),"@site/docs/workflow/implementing/risk-mitigation/message-consult/message-consult.mdx",616],"770de48b":[()=>n.e(4732).then(n.bind(n,7886)),"@site/docs/getting-started/data-scientists/overview.md",7886],"77d24d74":[()=>n.e(4216).then(n.bind(n,6716)),"@site/docs/workflow/implementing/onboarding/onboarding-feature-ios.md",6716],"780c1578":[()=>n.e(7548).then(n.bind(n,5780)),"@site/docs/faq/exposure/exposure.mdx",5780],"79f62648":[()=>n.e(9755).then(n.bind(n,2955)),"@site/docs/workflow/implementing/messaging/desktop-messaging-surfaces.md",2955],"813e12a5":[()=>n.e(7467).then(n.bind(n,2820)),"@site/docs/cookbook/fml/growable-collections.mdx",2820],"81d416ef":[()=>n.e(5697).then(n.bind(n,5342)),"@site/docs/faq/mobile/first-run.mdx",5342],"82cbe17a":[()=>n.e(5930).then(n.bind(n,3512)),"@site/docs/workflow/implementing/mobile-targeting/ios-custom-targeting.md",3512],"83348f13":[()=>n.e(3457).then(n.bind(n,7160)),"@site/docs/whats-news/2021/2021-06.md",7160],"8403f239":[()=>n.e(9860).then(n.bind(n,9321)),"@site/docs/getting-started/for-product.md",9321],"84b63381":[()=>n.e(8384).then(n.bind(n,8607)),"@site/docs/homepage/intro.md",8607],"85c6add7":[()=>n.e(1990).then(n.bind(n,4728)),"@site/docs/faq/feature-restart/feature-restart.mdx",4728],"86d53d01":[()=>n.e(1509).then(n.bind(n,9156)),"@site/docs/additional-links/local-enrollment.md",9156],"8bac4f90":[()=>n.e(2048).then(n.bind(n,9890)),"@site/docs/deep-dives/data/missing_exposures.md",9890],"8d9c10a9":[()=>n.e(7522).then(n.bind(n,2992)),"@site/docs/deep-dives/mobile/nimbus-cli/00-index.mdx",2992],"8da24e41":[()=>Promise.all([n.e(532),n.e(1441)]).then(n.bind(n,7862)),"@site/docs/getting-started/engineers/desktop-feature-api.mdx",7862],"8e9b654b":[()=>n.e(3613).then(n.bind(n,4910)),"@site/docs/faq/targeting/advanced-targeting.mdx",4910],"9008d0b9":[()=>n.e(1059).then(n.bind(n,6106)),"@site/docs/workflow/implementing/messaging/display-logic.md",6106],"900938be":[()=>n.e(9625).then(n.bind(n,3683)),"@site/docs/workflow/implementing/messaging/limitations.md",3683],"9054bfea":[()=>n.e(5279).then(n.bind(n,5859)),"@site/docs/homepage/finding-help.md",5859],"90a3c708":[()=>n.e(8575).then(n.bind(n,2884)),"@site/docs/deep-dives/jetstream/statistics.md",2884],"9190cef3":[()=>n.e(6336).then(n.bind(n,5110)),"@site/docs/getting-started/for-leadership.md",5110],"91a85efb":[()=>n.e(3373).then(n.bind(n,1042)),"@site/docs/deep-dives/specifications/fml/fml-paths.md",1042],"91e1280b":[()=>n.e(3741).then(n.bind(n,2129)),"@site/docs/workflow/implementing/onboarding/onboarding-feature-android.md",2129],"935f2afb":[()=>n.e(53).then(n.t.bind(n,1109,19)),"~docs/default/version-current-metadata-prop-751.json",1109],"95288d5d":[()=>n.e(7379).then(n.bind(n,455)),"@site/docs/deep-dives/mobile/nimbus-cli/100-configuration-variables.mdx",455],"966dd1db":[()=>n.e(5037).then(n.bind(n,4862)),"@site/docs/faq/custom-configs/custom-configs.mdx",4862],"9938680a":[()=>Promise.all([n.e(532),n.e(8077)]).then(n.bind(n,4300)),"@site/docs/deep-dives/specifications/fml/fml-spec.mdx",4300],"9acfa88d":[()=>n.e(8429).then(n.bind(n,7643)),"@site/docs/deep-dives/mobile/mobile-surveys.md",7643],"9b5383ff":[()=>n.e(4283).then(n.bind(n,6807)),"@site/docs/faq/warnings/warnings.mdx",6807],"9b970a4d":[()=>n.e(2475).then(n.bind(n,9404)),"@site/docs/getting-started/engineers/mobile-ui-integration.md",9404],"9c1f467a":[()=>n.e(7478).then(n.bind(n,8308)),"@site/docs/whats-news/2022/2022-06.md",8308],"9c30404b":[()=>n.e(5729).then(n.bind(n,2503)),"@site/docs/getting-started/access.md",2503],"9db8ebf0":[()=>n.e(145).then(n.t.bind(n,3769,19)),"/home/runner/work/experimenter-docs/experimenter-docs/.docusaurus/docusaurus-plugin-content-docs/default/plugin-route-context-module-100.json",3769],"9e0bd137":[()=>n.e(2996).then(n.bind(n,7665)),"@site/docs/deep-dives/mobile/nimbus-cli/70-working-with-manifests.mdx",7665],"9f03e260":[()=>n.e(5296).then(n.bind(n,2856)),"@site/docs/workflow/implementing/messaging/experiments-and-user-messaging.md",2856],a04f0e19:[()=>n.e(6756).then(n.bind(n,8723)),"@site/docs/deep-dives/jetstream/testing.md",8723],a0615d24:[()=>n.e(7584).then(n.bind(n,4993)),"@site/docs/getting-started/data-scientists/telemetry.md",4993],a0b323c9:[()=>n.e(6060).then(n.bind(n,8454)),"@site/docs/deep-dives/mobile/nimbus-cli/60-working-with-logs.mdx",8454],a22f1d17:[()=>n.e(7896).then(n.bind(n,4205)),"@site/docs/workflow/implementing/risk-mitigation/legal-sign-off/legal-sign-off.mdx",4205],a2e435a0:[()=>n.e(7906).then(n.bind(n,2355)),"@site/docs/workflow/testing/testing-on-mobile.md",2355],a2e8a598:[()=>n.e(7799).then(n.bind(n,2649)),"@site/docs/workflow/monitoring/monitoring.md",2649],a9abab95:[()=>n.e(1794).then(n.bind(n,4891)),"@site/docs/deep-dives/jetstream/operations.md",4891],a9f55538:[()=>Promise.all([n.e(532),n.e(5269)]).then(n.bind(n,6480)),"@site/docs/workflow/implementing/messaging/mobile-messaging.mdx",6480],aa072cdf:[()=>n.e(3034).then(n.bind(n,5982)),"@site/docs/deep-dives/jetstream/adding-a-platform.md",5982],aa737810:[()=>n.e(8222).then(n.bind(n,7843)),"@site/docs/whats-news/2022/2022-07.md",7843],aaa9fc5b:[()=>n.e(6578).then(n.bind(n,4804)),"@site/docs/faq/desktop/desktop-prefs.mdx",4804],ab66e222:[()=>n.e(5018).then(n.bind(n,1714)),"@site/docs/workflow/implementing/risk-mitigation/comms-sign-off/comms-sign-off.mdx",1714],ac163e43:[()=>n.e(6220).then(n.bind(n,4566)),"@site/docs/whats-news/2021/2021-03.md",4566],ae86b595:[()=>n.e(6232).then(n.bind(n,7907)),"@site/docs/deep-dives/specifications/fml/fml-front-end-format.md",7907],afaa6268:[()=>n.e(270).then(n.bind(n,1983)),"@site/docs/workflow/implementing/messaging/microsurveys/android-microsurveys.md",1983],b0ba6f5e:[()=>n.e(4440).then(n.bind(n,5640)),"@site/docs/workflow/overview.md",5640],b3ff0384:[()=>n.e(20).then(n.bind(n,1861)),"@site/docs/workflow/implementing/desktop-onboarding/onboarding-feature-desktop.md",1861],b4cde9ad:[()=>n.e(1976).then(n.bind(n,6675)),"@site/docs/deep-dives/experimenter/notifications.mdx",6675],b7510fea:[()=>n.e(3363).then(n.bind(n,4166)),"@site/docs/deep-dives/desktop/desktop-pref-experiments.md",4166],bf0de55e:[()=>n.e(2118).then(n.bind(n,9623)),"@site/docs/cookbook/fml/fml-cookbook.mdx",9623],c1f9ebd6:[()=>n.e(6451).then(n.bind(n,2427)),"@site/docs/workflow/testing/ios-preview-testing.md",2427],c2d7c74b:[()=>n.e(761).then(n.bind(n,6876)),"@site/docs/workflow/implementing/messaging/desktop-messaging-journey.md",6876],c51d0df7:[()=>n.e(7463).then(n.bind(n,4934)),"@site/docs/deep-dives/jetstream/metrics.md",4934],c6758fdd:[()=>n.e(6836).then(n.bind(n,7551)),"@site/docs/faq/rollouts/sizing.md",7551],c78a2b74:[()=>n.e(9318).then(n.bind(n,830)),"@site/docs/workflow/implementing/messaging/frequency-cap.md",830],c83ca80a:[()=>n.e(650).then(n.bind(n,2790)),"@site/docs/getting-started/data-scientists/experiment-sizing.md",2790],ce2f3675:[()=>n.e(7416).then(n.bind(n,2127)),"@site/docs/deep-dives/mobile/nimbus-cli/110-whats-new.mdx",2127],d19a17d9:[()=>n.e(2141).then(n.bind(n,5522)),"@site/docs/workflow/testing/preview.md",5522],d6699cfe:[()=>n.e(9612).then(n.bind(n,8140)),"@site/docs/faq/desktop/exposure.mdx",8140],d9a3cabd:[()=>n.e(6604).then(n.bind(n,8571)),"@site/docs/workflow/launching/launching.md",8571],df2ec694:[()=>n.e(5997).then(n.bind(n,6607)),"@site/docs/deep-dives/mobile/nimbus-cli/50-working-with-files.mdx",6607],e07557ac:[()=>n.e(1279).then(n.bind(n,5506)),"@site/docs/deep-dives/mobile/feature-variables-and-me.md",5506],e0f894cf:[()=>n.e(3014).then(n.bind(n,7364)),"@site/docs/whats-news/2021/2021-02.md",7364],e2ba4f5d:[()=>n.e(7019).then(n.bind(n,2168)),"@site/docs/getting-started/engineers/desktop-migration-guide.md",2168],e55dcb0e:[()=>n.e(5397).then(n.bind(n,2489)),"@site/docs/faq/ending-experiments/ending-experiments.mdx",2489],e5f6d6e7:[()=>n.e(5646).then(n.bind(n,1725)),"@site/docs/workflow/implementing/messaging/groups-and-campaigns.md",1725],e740fd7c:[()=>n.e(7922).then(n.bind(n,3482)),"@site/docs/whats-news/2023/2023-03.md",3482],e8468aeb:[()=>n.e(2438).then(n.bind(n,638)),"@site/docs/deep-dives/jetstream/overview.md",638],eceb5790:[()=>n.e(9709).then(n.bind(n,6075)),"@site/docs/faq/branches/fml-errors.mdx",6075],ef3600f6:[()=>n.e(9676).then(n.bind(n,5675)),"@site/docs/deep-dives/specifications/client-sdk-states-and-lifecycle.mdx",5675],f066ecf6:[()=>n.e(8948).then(n.bind(n,9587)),"@site/docs/workflow/implementing/custom-audiences.md",9587],f270d4dd:[()=>n.e(8954).then(n.bind(n,3733)),"@site/docs/getting-started/contributing.md",3733],f30e2f4e:[()=>n.e(309).then(n.bind(n,7746)),"@site/docs/glossary.mdx",7746],f3abf0fb:[()=>n.e(3633).then(n.bind(n,5266)),"@site/docs/deep-dives/jetstream/data-products.md",5266],f73105b9:[()=>n.e(5963).then(n.bind(n,9707)),"@site/docs/deep-dives/experimenter/branches.mdx",9707],f87f6a9b:[()=>n.e(7143).then(n.bind(n,4282)),"@site/docs/whats-news/2024/2024-q1.mdx",4282],f8aa1d53:[()=>n.e(4337).then(n.bind(n,6786)),"@site/docs/workflow/implementing/experiment-owners.md",6786],fed1d750:[()=>n.e(7929).then(n.bind(n,8851)),"@site/docs/faq/early-startup/What-do-it-do.mdx",8851],ff092580:[()=>n.e(2146).then(n.bind(n,645)),"@site/docs/deep-dives/mobile/nimbus-cli/100-instrumentation.mdx",645]};function u(e){let{error:t,retry:n,pastDelay:i}=e;return t?r.createElement("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%"}},r.createElement("p",null,String(t)),r.createElement("div",null,r.createElement("button",{type:"button",onClick:n},"Retry"))):i?r.createElement("div",{style:{display:"flex",justifyContent:"center",alignItems:"center",height:"100vh"}},r.createElement("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"},r.createElement("g",{fill:"none",fillRule:"evenodd",transform:"translate(1 1)",strokeWidth:"2"},r.createElement("circle",{cx:"22",cy:"22",r:"6",strokeOpacity:"0"},r.createElement("animate",{attributeName:"r",begin:"1.5s",dur:"3s",values:"6;22",calcMode:"linear",repeatCount:"indefinite"}),r.createElement("animate",{attributeName:"stroke-opacity",begin:"1.5s",dur:"3s",values:"1;0",calcMode:"linear",repeatCount:"indefinite"}),r.createElement("animate",{attributeName:"stroke-width",begin:"1.5s",dur:"3s",values:"2;0",calcMode:"linear",repeatCount:"indefinite"})),r.createElement("circle",{cx:"22",cy:"22",r:"6",strokeOpacity:"0"},r.createElement("animate",{attributeName:"r",begin:"3s",dur:"3s",values:"6;22",calcMode:"linear",repeatCount:"indefinite"}),r.createElement("animate",{attributeName:"stroke-opacity",begin:"3s",dur:"3s",values:"1;0",calcMode:"linear",repeatCount:"indefinite"}),r.createElement("animate",{attributeName:"stroke-width",begin:"3s",dur:"3s",values:"2;0",calcMode:"linear",repeatCount:"indefinite"})),r.createElement("circle",{cx:"22",cy:"22",r:"8"},r.createElement("animate",{attributeName:"r",begin:"0s",dur:"1.5s",values:"6;1;2;3;4;5;6",calcMode:"linear",repeatCount:"indefinite"}))))):null}var c=n(5304),d=n(9656);function f(e,t){if("*"===e)return o()({loading:u,loader:()=>n.e(4248).then(n.bind(n,4248)),modules:["@theme/NotFound"],webpack:()=>[4248],render(e,t){const n=e.default;return r.createElement(d.z,{value:{plugin:{name:"native",id:"default"}}},r.createElement(n,t))}});const a=s[`${e}-${t}`],f={},p=[],m=[],g=(0,c.Z)(a);return Object.entries(g).forEach((e=>{let[t,n]=e;const r=l[n];r&&(f[t]=r[0],p.push(r[1]),m.push(r[2]))})),o().Map({loading:u,loader:f,modules:p,webpack:()=>m,render(t,n){const o=JSON.parse(JSON.stringify(a));Object.entries(t).forEach((t=>{let[n,r]=t;const i=r.default;if(!i)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 i&&"function"!=typeof i||Object.keys(r).filter((e=>"default"!==e)).forEach((e=>{i[e]=r[e]}));let a=o;const s=n.split(".");s.slice(0,-1).forEach((e=>{a=a[e]})),a[s[s.length-1]]=i}));const s=o.__comp;delete o.__comp;const l=o.__context;return delete o.__context,r.createElement(d.z,{value:l},r.createElement(s,(0,i.Z)({},o,n)))}})}const p=[{path:"/",component:f("/","3d9"),routes:[{path:"/",component:f("/","220"),exact:!0,sidebar:"sidebar"},{path:"/2021-02",component:f("/2021-02","eb2"),exact:!0,sidebar:"sidebar"},{path:"/2021-03",component:f("/2021-03","61c"),exact:!0,sidebar:"sidebar"},{path:"/2021-06",component:f("/2021-06","995"),exact:!0,sidebar:"sidebar"},{path:"/2022-04",component:f("/2022-04","3ee"),exact:!0,sidebar:"sidebar"},{path:"/2022-06",component:f("/2022-06","920"),exact:!0,sidebar:"sidebar"},{path:"/2022-07",component:f("/2022-07","8b4"),exact:!0,sidebar:"sidebar"},{path:"/2022-08",component:f("/2022-08","eb4"),exact:!0,sidebar:"sidebar"},{path:"/2023-03",component:f("/2023-03","3c6"),exact:!0,sidebar:"sidebar"},{path:"/access",component:f("/access","495"),exact:!0,sidebar:"sidebar"},{path:"/analyzing",component:f("/analyzing","9b4"),exact:!0,sidebar:"sidebar"},{path:"/android-custom-targeting",component:f("/android-custom-targeting","594"),exact:!0,sidebar:"sidebar"},{path:"/auto-sizing-cli",component:f("/auto-sizing-cli","f01"),exact:!0,sidebar:"sidebar"},{path:"/bucketing",component:f("/bucketing","a57"),exact:!0,sidebar:"sidebar"},{path:"/capabilities",component:f("/capabilities","a1b"),exact:!0,sidebar:"sidebar"},{path:"/client-sdk-states-and-lifecycle",component:f("/client-sdk-states-and-lifecycle","3cb"),exact:!0,sidebar:"sidebar"},{path:"/comms-sign-off",component:f("/comms-sign-off","eff"),exact:!0,sidebar:"sidebar"},{path:"/configuring",component:f("/configuring","f47"),exact:!0,sidebar:"sidebar"},{path:"/contributing",component:f("/contributing","f8f"),exact:!0},{path:"/cookbook/fml/fml-cookbook",component:f("/cookbook/fml/fml-cookbook","24b"),exact:!0,sidebar:"sidebar"},{path:"/cookbook/fml/growable-collections",component:f("/cookbook/fml/growable-collections","fea"),exact:!0,sidebar:"sidebar"},{path:"/deep-dives/experimenter/branches-page",component:f("/deep-dives/experimenter/branches-page","f66"),exact:!0,sidebar:"sidebar"},{path:"/deep-dives/experimenter/experimenter-state",component:f("/deep-dives/experimenter/experimenter-state","559"),exact:!0,sidebar:"sidebar"},{path:"/deep-dives/experimenter/rollouts",component:f("/deep-dives/experimenter/rollouts","f88"),exact:!0,sidebar:"sidebar"},{path:"/deep-dives/jetstream/adding-a-platform",component:f("/deep-dives/jetstream/adding-a-platform","3a7"),exact:!0,sidebar:"sidebar"},{path:"/deep-dives/jetstream/configuration",component:f("/deep-dives/jetstream/configuration","768"),exact:!0,sidebar:"sidebar"},{path:"/deep-dives/jetstream/data-products",component:f("/deep-dives/jetstream/data-products","a65"),exact:!0,sidebar:"sidebar"},{path:"/deep-dives/jetstream/metrics",component:f("/deep-dives/jetstream/metrics","98d"),exact:!0,sidebar:"sidebar"},{path:"/deep-dives/jetstream/operations",component:f("/deep-dives/jetstream/operations","8e1"),exact:!0,sidebar:"sidebar"},{path:"/deep-dives/jetstream/outcomes",component:f("/deep-dives/jetstream/outcomes","309"),exact:!0,sidebar:"sidebar"},{path:"/deep-dives/jetstream/overview",component:f("/deep-dives/jetstream/overview","334"),exact:!0,sidebar:"sidebar"},{path:"/deep-dives/jetstream/statistics",component:f("/deep-dives/jetstream/statistics","911"),exact:!0,sidebar:"sidebar"},{path:"/deep-dives/jetstream/testing",component:f("/deep-dives/jetstream/testing","218"),exact:!0,sidebar:"sidebar"},{path:"/deep-dives/jetstream/troubleshooting",component:f("/deep-dives/jetstream/troubleshooting","761"),exact:!0,sidebar:"sidebar"},{path:"/designing-experiments",component:f("/designing-experiments","b73"),exact:!0,sidebar:"sidebar"},{path:"/desktop-enroll-locally",component:f("/desktop-enroll-locally","ab7"),exact:!0,sidebar:"sidebar"},{path:"/desktop-feature-api",component:f("/desktop-feature-api","666"),exact:!0,sidebar:"sidebar"},{path:"/desktop-feature-api-testing",component:f("/desktop-feature-api-testing","a47"),exact:!0,sidebar:"sidebar"},{path:"/desktop-migration-guide",component:f("/desktop-migration-guide","dc1"),exact:!0,sidebar:"sidebar"},{path:"/desktop-pref-experiments",component:f("/desktop-pref-experiments","27f"),exact:!0,sidebar:"sidebar"},{path:"/desktop-targeting-debug",component:f("/desktop-targeting-debug","4be"),exact:!0,sidebar:"sidebar"},{path:"/ending",component:f("/ending","ffb"),exact:!0,sidebar:"sidebar"},{path:"/enrollment/experiment-enrollment",component:f("/enrollment/experiment-enrollment","f8a"),exact:!0,sidebar:"sidebar"},{path:"/experiment-owners",component:f("/experiment-owners","163"),exact:!0,sidebar:"sidebar"},{path:"/experiment-sizing",component:f("/experiment-sizing","7b7"),exact:!0,sidebar:"sidebar"},{path:"/exposure-faq",component:f("/exposure-faq","5a8"),exact:!0,sidebar:"sidebar"},{path:"/faq/branches/fml-errors",component:f("/faq/branches/fml-errors","545"),exact:!0,sidebar:"sidebar"},{path:"/faq/branches/how-many-branches",component:f("/faq/branches/how-many-branches","712"),exact:!0,sidebar:"sidebar"},{path:"/faq/custom-configs",component:f("/faq/custom-configs","46b"),exact:!0,sidebar:"sidebar"},{path:"/faq/desktop/desktop-prefs",component:f("/faq/desktop/desktop-prefs","12c"),exact:!0,sidebar:"sidebar"},{path:"/faq/desktop/exposure",component:f("/faq/desktop/exposure","9a3"),exact:!0,sidebar:"sidebar"},{path:"/faq/early-startup/how-early",component:f("/faq/early-startup/how-early","04d"),exact:!0,sidebar:"sidebar"},{path:"/faq/early-startup/what-do-it-do",component:f("/faq/early-startup/what-do-it-do","8f8"),exact:!0,sidebar:"sidebar"},{path:"/faq/ending-experiments",component:f("/faq/ending-experiments","d71"),exact:!0,sidebar:"sidebar"},{path:"/faq/feature-restart",component:f("/faq/feature-restart","8df"),exact:!0,sidebar:"sidebar"},{path:"/faq/first-run",component:f("/faq/first-run","b59"),exact:!0,sidebar:"sidebar"},{path:"/faq/general-faq",component:f("/faq/general-faq","6e0"),exact:!0,sidebar:"sidebar"},{path:"/faq/mobile-faq",component:f("/faq/mobile-faq","486"),exact:!0,sidebar:"sidebar"},{path:"/faq/warnings",component:f("/faq/warnings","781"),exact:!0,sidebar:"sidebar"},{path:"/feature-definition",component:f("/feature-definition","791"),exact:!0,sidebar:"sidebar"},{path:"/feature-metrics",component:f("/feature-metrics","0df"),exact:!0,sidebar:"sidebar"},{path:"/fml-spec",component:f("/fml-spec","661"),exact:!0,sidebar:"sidebar"},{path:"/fml/coenrolling-features",component:f("/fml/coenrolling-features","31f"),exact:!0,sidebar:"sidebar"},{path:"/fml/feature-metadata",component:f("/fml/feature-metadata","4f3"),exact:!0,sidebar:"sidebar"},{path:"/fml/fml-cli",component:f("/fml/fml-cli","bb6"),exact:!0,sidebar:"sidebar"},{path:"/fml/fml-front-end-format",component:f("/fml/fml-front-end-format","7cb"),exact:!0,sidebar:"sidebar"},{path:"/fml/fml-imports-and-includes",component:f("/fml/fml-imports-and-includes","57b"),exact:!0,sidebar:"sidebar"},{path:"/fml/fml-paths",component:f("/fml/fml-paths","48e"),exact:!0,sidebar:"sidebar"},{path:"/fml/string-alias",component:f("/fml/string-alias","653"),exact:!0,sidebar:"sidebar"},{path:"/fml/unimplemented",component:f("/fml/unimplemented","256"),exact:!0,sidebar:"sidebar"},{path:"/fml/using-prefs",component:f("/fml/using-prefs","8c1"),exact:!0,sidebar:"sidebar"},{path:"/for-leadership",component:f("/for-leadership","edb"),exact:!0,sidebar:"sidebar"},{path:"/for-product",component:f("/for-product","1c4"),exact:!0,sidebar:"sidebar"},{path:"/getting-started/engineers/for-engineers",component:f("/getting-started/engineers/for-engineers","3cc"),exact:!0,sidebar:"sidebar"},{path:"/getting-started/engineers/getting-started-for-android-engineers",component:f("/getting-started/engineers/getting-started-for-android-engineers","c0b"),exact:!0,sidebar:"sidebar"},{path:"/getting-started/engineers/getting-started-for-ios-engineers",component:f("/getting-started/engineers/getting-started-for-ios-engineers","536"),exact:!0,sidebar:"sidebar"},{path:"/getting-started/engineers/getting-started-for-nimbus-web-integration",component:f("/getting-started/engineers/getting-started-for-nimbus-web-integration","b28"),exact:!0,sidebar:"sidebar"},{path:"/getting-started/engineers/getting-started-mobile-required-ui",component:f("/getting-started/engineers/getting-started-mobile-required-ui","4ae"),exact:!0,sidebar:"sidebar"},{path:"/glossary",component:f("/glossary","f30"),exact:!0,sidebar:"sidebar"},{path:"/help",component:f("/help","f3f"),exact:!0,sidebar:"sidebar"},{path:"/integration-tests",component:f("/integration-tests","9a1"),exact:!0,sidebar:"sidebar"},{path:"/ios-custom-targeting",component:f("/ios-custom-targeting","046"),exact:!0,sidebar:"sidebar"},{path:"/ios-preview-testing",component:f("/ios-preview-testing","7bd"),exact:!0,sidebar:"sidebar"},{path:"/launching",component:f("/launching","159"),exact:!0,sidebar:"sidebar"},{path:"/legal-sign-off",component:f("/legal-sign-off","83b"),exact:!0,sidebar:"sidebar"},{path:"/local-enrollment",component:f("/local-enrollment","546"),exact:!0,sidebar:"sidebar"},{path:"/localization-process",component:f("/localization-process","f81"),exact:!0,sidebar:"sidebar"},{path:"/message-consult",component:f("/message-consult","396"),exact:!0,sidebar:"sidebar"},{path:"/messaging/desktop-messaging-journey",component:f("/messaging/desktop-messaging-journey","6dd"),exact:!0,sidebar:"sidebar"},{path:"/messaging/desktop-messaging-surfaces",component:f("/messaging/desktop-messaging-surfaces","034"),exact:!0,sidebar:"sidebar"},{path:"/messaging/display-logic",component:f("/messaging/display-logic","b8d"),exact:!0,sidebar:"sidebar"},{path:"/messaging/experiments-and-user-messaging",component:f("/messaging/experiments-and-user-messaging","3e8"),exact:!0,sidebar:"sidebar"},{path:"/messaging/frequency-cap",component:f("/messaging/frequency-cap","5c0"),exact:!0,sidebar:"sidebar"},{path:"/messaging/groups-and-campaigns",component:f("/messaging/groups-and-campaigns","6a0"),exact:!0,sidebar:"sidebar"},{path:"/messaging/how-a-message-gets-shown",component:f("/messaging/how-a-message-gets-shown","1f4"),exact:!0,sidebar:"sidebar"},{path:"/messaging/limitations",component:f("/messaging/limitations","ffd"),exact:!0,sidebar:"sidebar"},{path:"/messaging/microsurveys/android",component:f("/messaging/microsurveys/android","64b"),exact:!0,sidebar:"sidebar"},{path:"/messaging/microsurveys/ios",component:f("/messaging/microsurveys/ios","ffe"),exact:!0,sidebar:"sidebar"},{path:"/messaging/mobile-messaging",component:f("/messaging/mobile-messaging","ef3"),exact:!0,sidebar:"sidebar"},{path:"/messaging/remote-localization",component:f("/messaging/remote-localization","c7c"),exact:!0,sidebar:"sidebar"},{path:"/messaging/telemetry",component:f("/messaging/telemetry","47c"),exact:!0,sidebar:"sidebar"},{path:"/missing-exposure",component:f("/missing-exposure","604"),exact:!0,sidebar:"sidebar"},{path:"/mobile-behavioral-targeting",component:f("/mobile-behavioral-targeting","7ec"),exact:!0,sidebar:"sidebar"},{path:"/mobile-enrollment-state-machine",component:f("/mobile-enrollment-state-machine","68c"),exact:!0,sidebar:"sidebar"},{path:"/mobile-feature-api",component:f("/mobile-feature-api","aec"),exact:!0,sidebar:"sidebar"},{path:"/mobile-first-run-experiments",component:f("/mobile-first-run-experiments","2d8"),exact:!0,sidebar:"sidebar"},{path:"/mobile-surveys",component:f("/mobile-surveys","6fb"),exact:!0,sidebar:"sidebar"},{path:"/monitoring",component:f("/monitoring","203"),exact:!0,sidebar:"sidebar"},{path:"/nimbus-cli",component:f("/nimbus-cli","b1d"),exact:!0,sidebar:"sidebar"},{path:"/nimbus-cli/environment-variables",component:f("/nimbus-cli/environment-variables","42e"),exact:!0,sidebar:"sidebar"},{path:"/nimbus-cli/fml",component:f("/nimbus-cli/fml","acf"),exact:!0,sidebar:"sidebar"},{path:"/nimbus-cli/getting-started",component:f("/nimbus-cli/getting-started","991"),exact:!0,sidebar:"sidebar"},{path:"/nimbus-cli/install",component:f("/nimbus-cli/install","f60"),exact:!0,sidebar:"sidebar"},{path:"/nimbus-cli/instrumentation",component:f("/nimbus-cli/instrumentation","70d"),exact:!0,sidebar:"sidebar"},{path:"/nimbus-cli/on-devices",component:f("/nimbus-cli/on-devices","ce4"),exact:!0,sidebar:"sidebar"},{path:"/nimbus-cli/opening-and-resetting",component:f("/nimbus-cli/opening-and-resetting","3c5"),exact:!0,sidebar:"sidebar"},{path:"/nimbus-cli/whats-new",component:f("/nimbus-cli/whats-new","d05"),exact:!0,sidebar:"sidebar"},{path:"/nimbus-cli/working-with-features",component:f("/nimbus-cli/working-with-features","d58"),exact:!0,sidebar:"sidebar"},{path:"/nimbus-cli/working-with-files",component:f("/nimbus-cli/working-with-files","6b3"),exact:!0,sidebar:"sidebar"},{path:"/nimbus-cli/working-with-logs",component:f("/nimbus-cli/working-with-logs","a81"),exact:!0,sidebar:"sidebar"},{path:"/nimbus-cli/working-with-patch-files",component:f("/nimbus-cli/working-with-patch-files","7b0"),exact:!0,sidebar:"sidebar"},{path:"/notifications",component:f("/notifications","a57"),exact:!0,sidebar:"sidebar"},{path:"/onboarding/onboarding-feature-android",component:f("/onboarding/onboarding-feature-android","658"),exact:!0,sidebar:"sidebar"},{path:"/onboarding/onboarding-feature-ios",component:f("/onboarding/onboarding-feature-ios","a67"),exact:!0,sidebar:"sidebar"},{path:"/overview",component:f("/overview","a63"),exact:!0,sidebar:"sidebar"},{path:"/population-representativeness",component:f("/population-representativeness","d3c"),exact:!0,sidebar:"sidebar"},{path:"/previewing-experiments",component:f("/previewing-experiments","9ac"),exact:!0,sidebar:"sidebar"},{path:"/qa-sign-off",component:f("/qa-sign-off","e0e"),exact:!0,sidebar:"sidebar"},{path:"/results-availability",component:f("/results-availability","c95"),exact:!0,sidebar:"sidebar"},{path:"/risk-mitigation",component:f("/risk-mitigation","b97"),exact:!0,sidebar:"sidebar"},{path:"/rollouts/rollouts-and-experiments",component:f("/rollouts/rollouts-and-experiments","05d"),exact:!0,sidebar:"sidebar"},{path:"/rollouts/saturation",component:f("/rollouts/saturation","9b5"),exact:!0,sidebar:"sidebar"},{path:"/rollouts/sizing",component:f("/rollouts/sizing","02e"),exact:!0,sidebar:"sidebar"},{path:"/system-architecture",component:f("/system-architecture","925"),exact:!0,sidebar:"sidebar"},{path:"/targeting/advanced-targeting",component:f("/targeting/advanced-targeting","008"),exact:!0,sidebar:"sidebar"},{path:"/targeting/version-targeting",component:f("/targeting/version-targeting","b2d"),exact:!0,sidebar:"sidebar"},{path:"/telemetry",component:f("/telemetry","413"),exact:!0,sidebar:"sidebar"},{path:"/testing-on-mobile",component:f("/testing-on-mobile","35e"),exact:!0,sidebar:"sidebar"},{path:"/types-of-risk",component:f("/types-of-risk","47d"),exact:!0,sidebar:"sidebar"},{path:"/validating-experiments",component:f("/validating-experiments","796"),exact:!0,sidebar:"sidebar"},{path:"/vp-sign-off",component:f("/vp-sign-off","e6c"),exact:!0,sidebar:"sidebar"},{path:"/warnings",component:f("/warnings","579"),exact:!0,sidebar:"sidebar"},{path:"/whats-news/2023-Q2",component:f("/whats-news/2023-Q2","97e"),exact:!0,sidebar:"sidebar"},{path:"/whats-news/2023-Q4",component:f("/whats-news/2023-Q4","a02"),exact:!0,sidebar:"sidebar"},{path:"/whats-news/2023/2023-Q3",component:f("/whats-news/2023/2023-Q3","1db"),exact:!0,sidebar:"sidebar"},{path:"/whats-news/2024-Q1",component:f("/whats-news/2024-Q1","5ea"),exact:!0,sidebar:"sidebar"},{path:"/whats-news/2024-Q2",component:f("/whats-news/2024-Q2","609"),exact:!0,sidebar:"sidebar"},{path:"/workflow/implementing/custom-audiences",component:f("/workflow/implementing/custom-audiences","7c5"),exact:!0,sidebar:"sidebar"},{path:"/workflow/implementing/desktop-onboarding/onboarding-feature-desktop",component:f("/workflow/implementing/desktop-onboarding/onboarding-feature-desktop","fee"),exact:!0,sidebar:"sidebar"},{path:"/workflow/overview",component:f("/workflow/overview","6f1"),exact:!0,sidebar:"sidebar"}]},{path:"*",component:f("*")}]},5351:(e,t,n)=>{var r,i;!function(){var a,o,s,l,u,c,d,f,p,m,g,h,b,v,y,w,k,E,_,S,x,O,P,C,T,I,A,N,j,L,R=function(e){var t=new R.Builder;return t.pipeline.add(R.trimmer,R.stopWordFilter,R.stemmer),t.searchPipeline.add(R.stemmer),e.call(t,t),t.build()};R.version="2.3.9",R.utils={},R.utils.warn=(a=this,function(e){a.console&&console.warn&&console.warn(e)}),R.utils.asString=function(e){return null==e?"":e.toString()},R.utils.clone=function(e){if(null==e)return e;for(var t=Object.create(null),n=Object.keys(e),r=0;r0){var l=R.utils.clone(t)||{};l.position=[o,s],l.index=i.length,i.push(new R.Token(n.slice(o,a),l))}o=a+1}}return i},R.tokenizer.separator=/[\s\-]+/,R.Pipeline=function(){this._stack=[]},R.Pipeline.registeredFunctions=Object.create(null),R.Pipeline.registerFunction=function(e,t){t in this.registeredFunctions&&R.utils.warn("Overwriting existing registered function: "+t),e.label=t,R.Pipeline.registeredFunctions[e.label]=e},R.Pipeline.warnIfFunctionNotRegistered=function(e){e.label&&e.label in this.registeredFunctions||R.utils.warn("Function is not registered with pipeline. This may cause problems when serialising the index.\n",e)},R.Pipeline.load=function(e){var t=new R.Pipeline;return e.forEach((function(e){var n=R.Pipeline.registeredFunctions[e];if(!n)throw new Error("Cannot load unregistered function: "+e);t.add(n)})),t},R.Pipeline.prototype.add=function(){Array.prototype.slice.call(arguments).forEach((function(e){R.Pipeline.warnIfFunctionNotRegistered(e),this._stack.push(e)}),this)},R.Pipeline.prototype.after=function(e,t){R.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)},R.Pipeline.prototype.before=function(e,t){R.Pipeline.warnIfFunctionNotRegistered(t);var n=this._stack.indexOf(e);if(-1==n)throw new Error("Cannot find existingFn");this._stack.splice(n,0,t)},R.Pipeline.prototype.remove=function(e){var t=this._stack.indexOf(e);-1!=t&&this._stack.splice(t,1)},R.Pipeline.prototype.run=function(e){for(var t=this._stack.length,n=0;n1&&(ae&&(n=i),a!=e);)r=n-t,i=t+Math.floor(r/2),a=this.elements[2*i];return a==e||a>e?2*i:as?u+=2:o==s&&(t+=n[l+1]*r[u+1],l+=2,u+=2);return t},R.Vector.prototype.similarity=function(e){return this.dot(e)/this.magnitude()||0},R.Vector.prototype.toArray=function(){for(var e=new Array(this.elements.length/2),t=1,n=0;t0){var a,o=i.str.charAt(0);o in i.node.edges?a=i.node.edges[o]:(a=new R.TokenSet,i.node.edges[o]=a),1==i.str.length&&(a.final=!0),r.push({node:a,editsRemaining:i.editsRemaining,str:i.str.slice(1)})}if(0!=i.editsRemaining){if("*"in i.node.edges)var s=i.node.edges["*"];else{s=new R.TokenSet;i.node.edges["*"]=s}if(0==i.str.length&&(s.final=!0),r.push({node:s,editsRemaining:i.editsRemaining-1,str:i.str}),i.str.length>1&&r.push({node:i.node,editsRemaining:i.editsRemaining-1,str:i.str.slice(1)}),1==i.str.length&&(i.node.final=!0),i.str.length>=1){if("*"in i.node.edges)var l=i.node.edges["*"];else{l=new R.TokenSet;i.node.edges["*"]=l}1==i.str.length&&(l.final=!0),r.push({node:l,editsRemaining:i.editsRemaining-1,str:i.str.slice(1)})}if(i.str.length>1){var u,c=i.str.charAt(0),d=i.str.charAt(1);d in i.node.edges?u=i.node.edges[d]:(u=new R.TokenSet,i.node.edges[d]=u),1==i.str.length&&(u.final=!0),r.push({node:u,editsRemaining:i.editsRemaining-1,str:c+i.str.slice(2)})}}}return n},R.TokenSet.fromString=function(e){for(var t=new R.TokenSet,n=t,r=0,i=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()}},R.Index=function(e){this.invertedIndex=e.invertedIndex,this.fieldVectors=e.fieldVectors,this.tokenSet=e.tokenSet,this.fields=e.fields,this.pipeline=e.pipeline},R.Index.prototype.search=function(e){return this.query((function(t){new R.QueryParser(e,t).parse()}))},R.Index.prototype.query=function(e){for(var t=new R.Query(this.fields),n=Object.create(null),r=Object.create(null),i=Object.create(null),a=Object.create(null),o=Object.create(null),s=0;s1?1:e},R.Builder.prototype.k1=function(e){this._k1=e},R.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 i=0;i=this.length)return R.QueryLexer.EOS;var e=this.str.charAt(this.pos);return this.pos+=1,e},R.QueryLexer.prototype.width=function(){return this.pos-this.start},R.QueryLexer.prototype.ignore=function(){this.start==this.pos&&(this.pos+=1),this.start=this.pos},R.QueryLexer.prototype.backup=function(){this.pos-=1},R.QueryLexer.prototype.acceptDigitRun=function(){var e,t;do{t=(e=this.next()).charCodeAt(0)}while(t>47&&t<58);e!=R.QueryLexer.EOS&&this.backup()},R.QueryLexer.prototype.more=function(){return this.pos1&&(e.backup(),e.emit(R.QueryLexer.TERM)),e.ignore(),e.more())return R.QueryLexer.lexText},R.QueryLexer.lexEditDistance=function(e){return e.ignore(),e.acceptDigitRun(),e.emit(R.QueryLexer.EDIT_DISTANCE),R.QueryLexer.lexText},R.QueryLexer.lexBoost=function(e){return e.ignore(),e.acceptDigitRun(),e.emit(R.QueryLexer.BOOST),R.QueryLexer.lexText},R.QueryLexer.lexEOS=function(e){e.width()>0&&e.emit(R.QueryLexer.TERM)},R.QueryLexer.termSeparator=R.tokenizer.separator,R.QueryLexer.lexText=function(e){for(;;){var t=e.next();if(t==R.QueryLexer.EOS)return R.QueryLexer.lexEOS;if(92!=t.charCodeAt(0)){if(":"==t)return R.QueryLexer.lexField;if("~"==t)return e.backup(),e.width()>0&&e.emit(R.QueryLexer.TERM),R.QueryLexer.lexEditDistance;if("^"==t)return e.backup(),e.width()>0&&e.emit(R.QueryLexer.TERM),R.QueryLexer.lexBoost;if("+"==t&&1===e.width())return e.emit(R.QueryLexer.PRESENCE),R.QueryLexer.lexText;if("-"==t&&1===e.width())return e.emit(R.QueryLexer.PRESENCE),R.QueryLexer.lexText;if(t.match(R.QueryLexer.termSeparator))return R.QueryLexer.lexTerm}else e.escapeCharacter()}},R.QueryParser=function(e,t){this.lexer=new R.QueryLexer(e),this.query=t,this.currentClause={},this.lexemeIdx=0},R.QueryParser.prototype.parse=function(){this.lexer.run(),this.lexemes=this.lexer.lexemes;for(var e=R.QueryParser.parseClause;e;)e=e(this);return this.query},R.QueryParser.prototype.peekLexeme=function(){return this.lexemes[this.lexemeIdx]},R.QueryParser.prototype.consumeLexeme=function(){var e=this.peekLexeme();return this.lexemeIdx+=1,e},R.QueryParser.prototype.nextClause=function(){var e=this.currentClause;this.query.clause(e),this.currentClause={}},R.QueryParser.parseClause=function(e){var t=e.peekLexeme();if(null!=t)switch(t.type){case R.QueryLexer.PRESENCE:return R.QueryParser.parsePresence;case R.QueryLexer.FIELD:return R.QueryParser.parseField;case R.QueryLexer.TERM:return R.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 R.QueryParseError(n,t.start,t.end)}},R.QueryParser.parsePresence=function(e){var t=e.consumeLexeme();if(null!=t){switch(t.str){case"-":e.currentClause.presence=R.Query.presence.PROHIBITED;break;case"+":e.currentClause.presence=R.Query.presence.REQUIRED;break;default:var n="unrecognised presence operator'"+t.str+"'";throw new R.QueryParseError(n,t.start,t.end)}var r=e.peekLexeme();if(null==r){n="expecting term or field, found nothing";throw new R.QueryParseError(n,t.start,t.end)}switch(r.type){case R.QueryLexer.FIELD:return R.QueryParser.parseField;case R.QueryLexer.TERM:return R.QueryParser.parseTerm;default:n="expecting term or field, found '"+r.type+"'";throw new R.QueryParseError(n,r.start,r.end)}}},R.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 R.QueryParseError(r,t.start,t.end)}e.currentClause.fields=[t.str];var i=e.peekLexeme();if(null==i){r="expecting term, found nothing";throw new R.QueryParseError(r,t.start,t.end)}if(i.type===R.QueryLexer.TERM)return R.QueryParser.parseTerm;r="expecting term, found '"+i.type+"'";throw new R.QueryParseError(r,i.start,i.end)}},R.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 R.QueryLexer.TERM:return e.nextClause(),R.QueryParser.parseTerm;case R.QueryLexer.FIELD:return e.nextClause(),R.QueryParser.parseField;case R.QueryLexer.EDIT_DISTANCE:return R.QueryParser.parseEditDistance;case R.QueryLexer.BOOST:return R.QueryParser.parseBoost;case R.QueryLexer.PRESENCE:return e.nextClause(),R.QueryParser.parsePresence;default:var r="Unexpected lexeme type '"+n.type+"'";throw new R.QueryParseError(r,n.start,n.end)}else e.nextClause()}},R.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 R.QueryParseError(r,t.start,t.end)}e.currentClause.editDistance=n;var i=e.peekLexeme();if(null!=i)switch(i.type){case R.QueryLexer.TERM:return e.nextClause(),R.QueryParser.parseTerm;case R.QueryLexer.FIELD:return e.nextClause(),R.QueryParser.parseField;case R.QueryLexer.EDIT_DISTANCE:return R.QueryParser.parseEditDistance;case R.QueryLexer.BOOST:return R.QueryParser.parseBoost;case R.QueryLexer.PRESENCE:return e.nextClause(),R.QueryParser.parsePresence;default:r="Unexpected lexeme type '"+i.type+"'";throw new R.QueryParseError(r,i.start,i.end)}else e.nextClause()}},R.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 R.QueryParseError(r,t.start,t.end)}e.currentClause.boost=n;var i=e.peekLexeme();if(null!=i)switch(i.type){case R.QueryLexer.TERM:return e.nextClause(),R.QueryParser.parseTerm;case R.QueryLexer.FIELD:return e.nextClause(),R.QueryParser.parseField;case R.QueryLexer.EDIT_DISTANCE:return R.QueryParser.parseEditDistance;case R.QueryLexer.BOOST:return R.QueryParser.parseBoost;case R.QueryLexer.PRESENCE:return e.nextClause(),R.QueryParser.parsePresence;default:r="Unexpected lexeme type '"+i.type+"'";throw new R.QueryParseError(r,i.start,i.end)}else e.nextClause()}},void 0===(i="function"==typeof(r=function(){return R})?r.call(t,n,t,e):r)||(e.exports=i)}()},8121:(e,t,n)=>{"use strict";n.d(t,{_:()=>i,t:()=>a});var r=n(7294);const i=r.createContext(!1);function a(e){let{children:t}=e;const[n,a]=(0,r.useState)(!1);return(0,r.useEffect)((()=>{a(!0)}),[]),r.createElement(i.Provider,{value:n},t)}},9717:(e,t,n)=>{"use strict";var r=n(7294),i=n(3935),a=n(3727),o=n(405),s=n(6136);const l=[n(984),n(2251),n(9957),n(6930)];var u=n(997),c=n(6550),d=n(8790);function f(e){let{children:t}=e;return r.createElement(r.Fragment,null,t)}var p=n(7462),m=n(1514),g=n(9962),h=n(9524),b=n(107),v=n(5463),y=n(626),w=n(8181),k=n(246),E=n(3905),_=n(3647);function S(){const{i18n:{defaultLocale:e,localeConfigs:t}}=(0,g.Z)(),n=(0,y.l)();return r.createElement(m.Z,null,Object.entries(t).map((e=>{let[t,{htmlLang:i}]=e;return r.createElement("link",{key:t,rel:"alternate",href:n.createUrl({locale:t,fullyQualified:!0}),hrefLang:i})})),r.createElement("link",{rel:"alternate",href:n.createUrl({locale:e,fullyQualified:!0}),hrefLang:"x-default"}))}function x(e){let{permalink:t}=e;const{siteConfig:{url:n}}=(0,g.Z)(),i=function(){const{siteConfig:{url:e,baseUrl:t,trailingSlash:n}}=(0,g.Z)(),{pathname:r}=(0,c.TH)();return e+(0,E.applyTrailingSlash)((0,h.Z)(r),{trailingSlash:n,baseUrl:t})}(),a=t?`${n}${t}`:i;return r.createElement(m.Z,null,r.createElement("meta",{property:"og:url",content:a}),r.createElement("link",{rel:"canonical",href:a}))}function O(){const{i18n:{currentLocale:e}}=(0,g.Z)(),{metadata:t,image:n}=(0,b.L)();return r.createElement(r.Fragment,null,r.createElement(m.Z,null,r.createElement("meta",{name:"twitter:card",content:"summary_large_image"}),r.createElement("body",{className:w.h})),n&&r.createElement(v.d,{image:n}),r.createElement(x,null),r.createElement(S,null),r.createElement(_.Z,{tag:k.HX,locale:e}),r.createElement(m.Z,null,t.map(((e,t)=>r.createElement("meta",(0,p.Z)({key:t},e))))))}const P=new Map;function C(e){if(P.has(e.pathname))return{...e,pathname:P.get(e.pathname)};if((0,d.f)(u.Z,e.pathname).some((e=>{let{route:t}=e;return!0===t.exact})))return P.set(e.pathname,e.pathname),e;const t=e.pathname.trim().replace(/(?:\/index)?\.html$/,"")||"/";return P.set(e.pathname,t),{...e,pathname:t}}var T=n(8121),I=n(694);function A(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()=>i.forEach((e=>e?.()))}const N=function(e){let{children:t,location:n,previousLocation:i}=e;return(0,r.useLayoutEffect)((()=>{i!==n&&(!function(e){let{location:t,previousLocation:n}=e;if(!n)return;const r=t.pathname===n.pathname,i=t.hash===n.hash,a=t.search===n.search;if(r&&i&&!a)return;const{hash:o}=t;if(o){const e=decodeURIComponent(o.substring(1)),t=document.getElementById(e);t?.scrollIntoView()}else window.scrollTo(0,0)}({location:n,previousLocation:i}),A("onRouteDidUpdate",{previousLocation:i,location:n}))}),[i,n]),t};function j(e){const t=Array.from(new Set([e,decodeURI(e)])).map((e=>(0,d.f)(u.Z,e))).flat();return Promise.all(t.map((e=>e.route.component.preload?.())))}class L extends r.Component{previousLocation;routeUpdateCleanupCb;constructor(e){super(e),this.previousLocation=null,this.routeUpdateCleanupCb=s.Z.canUseDOM?A("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=A("onRouteUpdate",{previousLocation:this.previousLocation,location:n}),j(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 r.createElement(N,{previousLocation:this.previousLocation,location:t},r.createElement(c.AW,{location:t,render:()=>e}))}}const R=L,D="__docusaurus-base-url-issue-banner-container",M="__docusaurus-base-url-issue-banner",F="__docusaurus-base-url-issue-banner-suggestion-container",B="__DOCUSAURUS_INSERT_BASEURL_BANNER";function z(e){return`\nwindow['${B}'] = true;\n\ndocument.addEventListener('DOMContentLoaded', maybeInsertBanner);\n\nfunction maybeInsertBanner() {\n var shouldInsert = window['${B}'];\n shouldInsert && insertBanner();\n}\n\nfunction insertBanner() {\n var bannerContainer = document.getElementById('${D}');\n if (!bannerContainer) {\n return;\n }\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(/{window[B]=!1}),[]),r.createElement(r.Fragment,null,!s.Z.canUseDOM&&r.createElement(m.Z,null,r.createElement("script",null,z(e))),r.createElement("div",{id:D}))}function $(){const{siteConfig:{baseUrl:e,baseUrlIssueBanner:t}}=(0,g.Z)(),{pathname:n}=(0,c.TH)();return t&&n===e?r.createElement(U,null):null}function q(){const{siteConfig:{favicon:e,title:t,noIndex:n},i18n:{currentLocale:i,localeConfigs:a}}=(0,g.Z)(),o=(0,h.Z)(e),{htmlLang:s,direction:l}=a[i];return r.createElement(m.Z,null,r.createElement("html",{lang:s,dir:l}),r.createElement("title",null,t),r.createElement("meta",{property:"og:title",content:t}),r.createElement("meta",{name:"viewport",content:"width=device-width, initial-scale=1.0"}),n&&r.createElement("meta",{name:"robots",content:"noindex, nofollow"}),e&&r.createElement("link",{rel:"icon",href:o}))}var H=n(3256),Q=n(1048);function Z(){const e=(0,Q.Z)();return r.createElement(m.Z,null,r.createElement("html",{"data-has-hydrated":e}))}function V(){const e=(0,d.H)(u.Z),t=(0,c.TH)();return r.createElement(H.Z,null,r.createElement(I.M,null,r.createElement(T.t,null,r.createElement(f,null,r.createElement(q,null),r.createElement(O,null),r.createElement($,null),r.createElement(R,{location:C(t)},e)),r.createElement(Z,null))))}var W=n(6887);const G=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 i=document.getElementsByTagName("head")[0]??document.getElementsByName("script")[0]?.parentNode;i?.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 Y=n(5304);const K=new Set,X=new Set,J=()=>navigator.connection?.effectiveType.includes("2g")||navigator.connection?.saveData,ee={prefetch(e){if(!(e=>!J()&&!X.has(e)&&!K.has(e))(e))return!1;K.add(e);const t=(0,d.f)(u.Z,e).flatMap((e=>{return t=e.route.path,Object.entries(W).filter((e=>{let[n]=e;return n.replace(/-[^-]+$/,"")===t})).flatMap((e=>{let[,t]=e;return Object.values((0,Y.Z)(t))}));var t}));return Promise.all(t.map((e=>{const t=n.gca(e);return t&&!t.includes("undefined")?G(t).catch((()=>{})):Promise.resolve()})))},preload:e=>!!(e=>!J()&&!X.has(e))(e)&&(X.add(e),j(e))},te=Object.freeze(ee);if(s.Z.canUseDOM){window.docusaurus=te;const e=i.hydrate;j(window.location.pathname).then((()=>{e(r.createElement(o.B6,null,r.createElement(a.VK,null,r.createElement(V,null))),document.getElementById("__docusaurus"))}))}},694:(e,t,n)=>{"use strict";n.d(t,{_:()=>c,M:()=>d});var r=n(7294),i=n(6809);const a=JSON.parse('{"@cmfcmf/docusaurus-search-local":{"default":{"titleBoost":5,"contentBoost":1,"tagsBoost":3,"parentCategoriesBoost":2,"indexDocSidebarParentCategories":3,"maxSearchResults":8}},"docusaurus-plugin-content-docs":{"default":{"path":"/","versions":[{"name":"current","label":"Next","isLast":true,"path":"/","mainDocId":"homepage/intro","docs":[{"id":"additional-links/integration-tests","path":"/integration-tests","sidebar":"sidebar"},{"id":"additional-links/local-enrollment","path":"/local-enrollment","sidebar":"sidebar"},{"id":"additional-links/system-architecture","path":"/system-architecture","sidebar":"sidebar"},{"id":"cookbook/fml/fml-cookbook","path":"/cookbook/fml/fml-cookbook","sidebar":"sidebar"},{"id":"cookbook/fml/growable-collections","path":"/cookbook/fml/growable-collections","sidebar":"sidebar"},{"id":"deep-dives/data/bucketing","path":"/bucketing","sidebar":"sidebar"},{"id":"deep-dives/data/missing_exposures","path":"/missing-exposure","sidebar":"sidebar"},{"id":"deep-dives/data/population_representativeness","path":"/population-representativeness","sidebar":"sidebar"},{"id":"deep-dives/desktop/desktop-enroll-locally","path":"/desktop-enroll-locally","sidebar":"sidebar"},{"id":"deep-dives/desktop/desktop-pref-experiments","path":"/desktop-pref-experiments","sidebar":"sidebar"},{"id":"deep-dives/desktop/desktop-targeting-debug","path":"/desktop-targeting-debug","sidebar":"sidebar"},{"id":"deep-dives/experimenter/branches-page-deep-dive","path":"/deep-dives/experimenter/branches-page","sidebar":"sidebar"},{"id":"deep-dives/experimenter/experimenter-state","path":"/deep-dives/experimenter/experimenter-state","sidebar":"sidebar"},{"id":"deep-dives/experimenter/notificationse","path":"/notifications","sidebar":"sidebar"},{"id":"deep-dives/experimenter/rollouts-deep-dive","path":"/deep-dives/experimenter/rollouts","sidebar":"sidebar"},{"id":"deep-dives/experimenter/warnings","path":"/warnings","sidebar":"sidebar"},{"id":"deep-dives/jetstream/adding-a-platform","path":"/deep-dives/jetstream/adding-a-platform","sidebar":"sidebar"},{"id":"deep-dives/jetstream/configuration","path":"/deep-dives/jetstream/configuration","sidebar":"sidebar"},{"id":"deep-dives/jetstream/data-products","path":"/deep-dives/jetstream/data-products","sidebar":"sidebar"},{"id":"deep-dives/jetstream/metrics","path":"/deep-dives/jetstream/metrics","sidebar":"sidebar"},{"id":"deep-dives/jetstream/operations","path":"/deep-dives/jetstream/operations","sidebar":"sidebar"},{"id":"deep-dives/jetstream/outcomes","path":"/deep-dives/jetstream/outcomes","sidebar":"sidebar"},{"id":"deep-dives/jetstream/overview","path":"/deep-dives/jetstream/overview","sidebar":"sidebar"},{"id":"deep-dives/jetstream/statistics","path":"/deep-dives/jetstream/statistics","sidebar":"sidebar"},{"id":"deep-dives/jetstream/testing","path":"/deep-dives/jetstream/testing","sidebar":"sidebar"},{"id":"deep-dives/jetstream/troubleshooting","path":"/deep-dives/jetstream/troubleshooting","sidebar":"sidebar"},{"id":"deep-dives/mobile/mobile-behavioral-targeting","path":"/mobile-behavioral-targeting","sidebar":"sidebar"},{"id":"deep-dives/mobile/mobile-enrollment-state-machine","path":"/mobile-enrollment-state-machine","sidebar":"sidebar"},{"id":"deep-dives/mobile/mobile-feature-api","path":"/mobile-feature-api","sidebar":"sidebar"},{"id":"deep-dives/mobile/mobile-first-run-experiments","path":"/mobile-first-run-experiments","sidebar":"sidebar"},{"id":"deep-dives/mobile/mobile-surveys","path":"/mobile-surveys","sidebar":"sidebar"},{"id":"deep-dives/mobile/nimbus-cli/nimbus-cli-changelog","path":"/nimbus-cli/whats-new","sidebar":"sidebar"},{"id":"deep-dives/mobile/nimbus-cli/nimbus-cli-environment-vars","path":"/nimbus-cli/environment-variables","sidebar":"sidebar"},{"id":"deep-dives/mobile/nimbus-cli/nimbus-cli-getting-started","path":"/nimbus-cli/getting-started","sidebar":"sidebar"},{"id":"deep-dives/mobile/nimbus-cli/nimbus-cli-install","path":"/nimbus-cli/install","sidebar":"sidebar"},{"id":"deep-dives/mobile/nimbus-cli/nimbus-cli-instrumentation","path":"/nimbus-cli/instrumentation","sidebar":"sidebar"},{"id":"deep-dives/mobile/nimbus-cli/nimbus-cli-introduction","path":"/nimbus-cli","sidebar":"sidebar"},{"id":"deep-dives/mobile/nimbus-cli/nimbus-cli-opening-and-resetting","path":"/nimbus-cli/opening-and-resetting","sidebar":"sidebar"},{"id":"deep-dives/mobile/nimbus-cli/nimbus-cli-working-with-devices","path":"/nimbus-cli/on-devices","sidebar":"sidebar"},{"id":"deep-dives/mobile/nimbus-cli/nimbus-cli-working-with-features","path":"/nimbus-cli/working-with-features","sidebar":"sidebar"},{"id":"deep-dives/mobile/nimbus-cli/nimbus-cli-working-with-files","path":"/nimbus-cli/working-with-files","sidebar":"sidebar"},{"id":"deep-dives/mobile/nimbus-cli/nimbus-cli-working-with-fml","path":"/nimbus-cli/fml","sidebar":"sidebar"},{"id":"deep-dives/mobile/nimbus-cli/nimbus-cli-working-with-logs","path":"/nimbus-cli/working-with-logs","sidebar":"sidebar"},{"id":"deep-dives/mobile/nimbus-cli/nimbus-cli-working-with-patch-files","path":"/nimbus-cli/working-with-patch-files","sidebar":"sidebar"},{"id":"deep-dives/specifications/client-sdk-states-and-lifecycle","path":"/client-sdk-states-and-lifecycle","sidebar":"sidebar"},{"id":"deep-dives/specifications/fml/coenrolling-features","path":"/fml/coenrolling-features","sidebar":"sidebar"},{"id":"deep-dives/specifications/fml/feature-metadata","path":"/fml/feature-metadata","sidebar":"sidebar"},{"id":"deep-dives/specifications/fml/fm-unimplemented-spec","path":"/fml/unimplemented","sidebar":"sidebar"},{"id":"deep-dives/specifications/fml/fml-cli","path":"/fml/fml-cli","sidebar":"sidebar"},{"id":"deep-dives/specifications/fml/fml-front-end-format","path":"/fml/fml-front-end-format","sidebar":"sidebar"},{"id":"deep-dives/specifications/fml/fml-imports","path":"/fml/fml-imports-and-includes","sidebar":"sidebar"},{"id":"deep-dives/specifications/fml/fml-paths","path":"/fml/fml-paths","sidebar":"sidebar"},{"id":"deep-dives/specifications/fml/fml-spec","path":"/fml-spec","sidebar":"sidebar"},{"id":"deep-dives/specifications/fml/fml-string-alias","path":"/fml/string-alias","sidebar":"sidebar"},{"id":"deep-dives/specifications/fml/using-prefs","path":"/fml/using-prefs","sidebar":"sidebar"},{"id":"faq/branches/fml-errors","path":"/faq/branches/fml-errors","sidebar":"sidebar"},{"id":"faq/branches/how-many-branches","path":"/faq/branches/how-many-branches","sidebar":"sidebar"},{"id":"faq/custom-configs/custom-configs","path":"/faq/custom-configs","sidebar":"sidebar"},{"id":"faq/desktop/desktop-prefs","path":"/faq/desktop/desktop-prefs","sidebar":"sidebar"},{"id":"faq/desktop/exposure","path":"/faq/desktop/exposure","sidebar":"sidebar"},{"id":"faq/early-startup/how-early","path":"/faq/early-startup/how-early","sidebar":"sidebar"},{"id":"faq/early-startup/what-do-it-do","path":"/faq/early-startup/what-do-it-do","sidebar":"sidebar"},{"id":"faq/ending-experiments/ending-experiments","path":"/faq/ending-experiments","sidebar":"sidebar"},{"id":"faq/enrollment/experiment-enrollment","path":"/enrollment/experiment-enrollment","sidebar":"sidebar"},{"id":"faq/exposure/exposure-faq","path":"/exposure-faq","sidebar":"sidebar"},{"id":"faq/feature-restart/feature-restart","path":"/faq/feature-restart","sidebar":"sidebar"},{"id":"faq/general-faq/general-faq","path":"/faq/general-faq","sidebar":"sidebar"},{"id":"faq/metrics/feature-metrics","path":"/feature-metrics","sidebar":"sidebar"},{"id":"faq/mobile/first-run","path":"/faq/first-run","sidebar":"sidebar"},{"id":"faq/mobile/mobile-faq","path":"/faq/mobile-faq","sidebar":"sidebar"},{"id":"faq/results/results-availability","path":"/results-availability","sidebar":"sidebar"},{"id":"faq/rollouts/rollouts-and-experiments","path":"/rollouts/rollouts-and-experiments","sidebar":"sidebar"},{"id":"faq/rollouts/saturation","path":"/rollouts/saturation","sidebar":"sidebar"},{"id":"faq/rollouts/sizing-rollouts","path":"/rollouts/sizing","sidebar":"sidebar"},{"id":"faq/targeting/advanced-targeting","path":"/targeting/advanced-targeting","sidebar":"sidebar"},{"id":"faq/targeting/version-targeting","path":"/targeting/version-targeting","sidebar":"sidebar"},{"id":"faq/warnings/warnings","path":"/faq/warnings","sidebar":"sidebar"},{"id":"getting-started/access","path":"/access","sidebar":"sidebar"},{"id":"getting-started/contributing","path":"/contributing"},{"id":"getting-started/data-scientists/auto-sizing-cli","path":"/auto-sizing-cli","sidebar":"sidebar"},{"id":"getting-started/data-scientists/experiment-sizing","path":"/experiment-sizing","sidebar":"sidebar"},{"id":"getting-started/data-scientists/overview","path":"/overview","sidebar":"sidebar"},{"id":"getting-started/data-scientists/telemetry","path":"/telemetry","sidebar":"sidebar"},{"id":"getting-started/data-scientists/validating-experiments","path":"/validating-experiments","sidebar":"sidebar"},{"id":"getting-started/engineers/desktop-feature-api","path":"/desktop-feature-api","sidebar":"sidebar"},{"id":"getting-started/engineers/desktop-migration-guide","path":"/desktop-migration-guide","sidebar":"sidebar"},{"id":"getting-started/engineers/for-engineers","path":"/getting-started/engineers/for-engineers","sidebar":"sidebar"},{"id":"getting-started/engineers/getting-started-for-android-engineers","path":"/getting-started/engineers/getting-started-for-android-engineers","sidebar":"sidebar"},{"id":"getting-started/engineers/getting-started-for-ios-engineers","path":"/getting-started/engineers/getting-started-for-ios-engineers","sidebar":"sidebar"},{"id":"getting-started/engineers/getting-started-for-nimbus-web-integration","path":"/getting-started/engineers/getting-started-for-nimbus-web-integration","sidebar":"sidebar"},{"id":"getting-started/engineers/getting-started-mobile-required-ui","path":"/getting-started/engineers/getting-started-mobile-required-ui","sidebar":"sidebar"},{"id":"getting-started/for-leadership","path":"/for-leadership","sidebar":"sidebar"},{"id":"getting-started/for-product","path":"/for-product","sidebar":"sidebar"},{"id":"glossary","path":"/glossary","sidebar":"sidebar"},{"id":"homepage/capabilities","path":"/capabilities","sidebar":"sidebar"},{"id":"homepage/finding-help","path":"/help","sidebar":"sidebar"},{"id":"homepage/intro","path":"/","sidebar":"sidebar"},{"id":"whats-news/2021/2021-03","path":"/2021-03","sidebar":"sidebar"},{"id":"whats-news/2021/2021-04","path":"/2022-04","sidebar":"sidebar"},{"id":"whats-news/2021/2021-06","path":"/2021-06","sidebar":"sidebar"},{"id":"whats-news/2021/2022-02","path":"/2021-02","sidebar":"sidebar"},{"id":"whats-news/2022/2022-06","path":"/2022-06","sidebar":"sidebar"},{"id":"whats-news/2022/2022-07","path":"/2022-07","sidebar":"sidebar"},{"id":"whats-news/2022/2022-08","path":"/2022-08","sidebar":"sidebar"},{"id":"whats-news/2023/2023-03","path":"/2023-03","sidebar":"sidebar"},{"id":"whats-news/2023/2023-Q2","path":"/whats-news/2023-Q2","sidebar":"sidebar"},{"id":"whats-news/2023/2023-Q3","path":"/whats-news/2023/2023-Q3","sidebar":"sidebar"},{"id":"whats-news/2023/2023-Q4","path":"/whats-news/2023-Q4","sidebar":"sidebar"},{"id":"whats-news/2024/2024-Q1","path":"/whats-news/2024-Q1","sidebar":"sidebar"},{"id":"whats-news/2024/2024-Q2","path":"/whats-news/2024-Q2","sidebar":"sidebar"},{"id":"workflow/analyzing/analyzing","path":"/analyzing","sidebar":"sidebar"},{"id":"workflow/configuring/configuring","path":"/configuring","sidebar":"sidebar"},{"id":"workflow/designing/designing","path":"/designing-experiments","sidebar":"sidebar"},{"id":"workflow/designing/localization-process","path":"/localization-process","sidebar":"sidebar"},{"id":"workflow/ending/ending","path":"/ending","sidebar":"sidebar"},{"id":"workflow/implementing/custom-audiences","path":"/workflow/implementing/custom-audiences","sidebar":"sidebar"},{"id":"workflow/implementing/desktop-onboarding/onboarding-feature-desktop","path":"/workflow/implementing/desktop-onboarding/onboarding-feature-desktop","sidebar":"sidebar"},{"id":"workflow/implementing/experiment-owners","path":"/experiment-owners","sidebar":"sidebar"},{"id":"workflow/implementing/feature-definition","path":"/feature-definition","sidebar":"sidebar"},{"id":"workflow/implementing/messaging/display-logic","path":"/messaging/display-logic","sidebar":"sidebar"},{"id":"workflow/implementing/messaging/experiments-and-user-messaging","path":"/messaging/experiments-and-user-messaging","sidebar":"sidebar"},{"id":"workflow/implementing/messaging/frequency-cap","path":"/messaging/frequency-cap","sidebar":"sidebar"},{"id":"workflow/implementing/messaging/groups-and-campaigns","path":"/messaging/groups-and-campaigns","sidebar":"sidebar"},{"id":"workflow/implementing/messaging/how-a-message-gets-shown","path":"/messaging/how-a-message-gets-shown","sidebar":"sidebar"},{"id":"workflow/implementing/messaging/limitations","path":"/messaging/limitations","sidebar":"sidebar"},{"id":"workflow/implementing/messaging/messaging-journey","path":"/messaging/desktop-messaging-journey","sidebar":"sidebar"},{"id":"workflow/implementing/messaging/messaging-surfaces","path":"/messaging/desktop-messaging-surfaces","sidebar":"sidebar"},{"id":"workflow/implementing/messaging/messaging-telemetry","path":"/messaging/telemetry","sidebar":"sidebar"},{"id":"workflow/implementing/messaging/microsurveys/android-microsurveys","path":"/messaging/microsurveys/android","sidebar":"sidebar"},{"id":"workflow/implementing/messaging/microsurveys/ios-microsurveys","path":"/messaging/microsurveys/ios","sidebar":"sidebar"},{"id":"workflow/implementing/messaging/mobile-messaging","path":"/messaging/mobile-messaging","sidebar":"sidebar"},{"id":"workflow/implementing/messaging/remote-localization","path":"/messaging/remote-localization","sidebar":"sidebar"},{"id":"workflow/implementing/mobile-targeting/android-custom-targeting","path":"/android-custom-targeting","sidebar":"sidebar"},{"id":"workflow/implementing/mobile-targeting/ios-custom-targeting","path":"/ios-custom-targeting","sidebar":"sidebar"},{"id":"workflow/implementing/onboarding/onboarding-feature-android","path":"/onboarding/onboarding-feature-android","sidebar":"sidebar"},{"id":"workflow/implementing/onboarding/onboarding-feature-ios","path":"/onboarding/onboarding-feature-ios","sidebar":"sidebar"},{"id":"workflow/implementing/risk-mitigation/comms-sign-off/comms-sign-off","path":"/comms-sign-off","sidebar":"sidebar"},{"id":"workflow/implementing/risk-mitigation/legal-sign-off/legal-sign-off","path":"/legal-sign-off","sidebar":"sidebar"},{"id":"workflow/implementing/risk-mitigation/message-consult/message-consult","path":"/message-consult","sidebar":"sidebar"},{"id":"workflow/implementing/risk-mitigation/qa-sign-off/qa-sign-off","path":"/qa-sign-off","sidebar":"sidebar"},{"id":"workflow/implementing/risk-mitigation/risk-mitigation","path":"/risk-mitigation","sidebar":"sidebar"},{"id":"workflow/implementing/risk-mitigation/types-of-risk/types-of-risk","path":"/types-of-risk","sidebar":"sidebar"},{"id":"workflow/implementing/risk-mitigation/vp-sign-off/vp-sign-off","path":"/vp-sign-off","sidebar":"sidebar"},{"id":"workflow/launching/launching","path":"/launching","sidebar":"sidebar"},{"id":"workflow/monitoring/monitoring","path":"/monitoring","sidebar":"sidebar"},{"id":"workflow/overview","path":"/workflow/overview","sidebar":"sidebar"},{"id":"workflow/testing/desktop-feature-api-testing","path":"/desktop-feature-api-testing","sidebar":"sidebar"},{"id":"workflow/testing/ios-preview-testing","path":"/ios-preview-testing","sidebar":"sidebar"},{"id":"workflow/testing/preview","path":"/previewing-experiments","sidebar":"sidebar"},{"id":"workflow/testing/testing-on-mobile","path":"/testing-on-mobile","sidebar":"sidebar"}],"draftIds":[],"sidebars":{"sidebar":{"link":{"path":"/","label":"homepage/intro"}}}}],"breadcrumbs":true}}}'),o=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(7529);const l=JSON.parse('{"docusaurusVersion":"2.4.3","siteVersion":"0.0.0","pluginVersions":{"docusaurus-plugin-content-docs":{"type":"package","name":"@docusaurus/plugin-content-docs","version":"2.4.3"},"docusaurus-plugin-content-blog":{"type":"package","name":"@docusaurus/plugin-content-blog","version":"2.4.3"},"docusaurus-plugin-content-pages":{"type":"package","name":"@docusaurus/plugin-content-pages","version":"2.4.3"},"docusaurus-plugin-sitemap":{"type":"package","name":"@docusaurus/plugin-sitemap","version":"2.4.3"},"docusaurus-theme-classic":{"type":"package","name":"@docusaurus/theme-classic","version":"2.4.3"},"@cmfcmf/docusaurus-search-local":{"type":"package","name":"@cmfcmf/docusaurus-search-local","version":"1.1.0"},"docusaurus-theme-mermaid":{"type":"package","name":"@docusaurus/theme-mermaid","version":"2.4.3"}}}'),u={siteConfig:i.default,siteMetadata:l,globalData:a,i18n:o,codeTranslations:s},c=r.createContext(u);function d(e){let{children:t}=e;return r.createElement(c.Provider,{value:u},t)}},3256:(e,t,n)=>{"use strict";n.d(t,{Z:()=>f});var r=n(7294),i=n(6136),a=n(1514),o=n(3905),s=n(8617);function l(e){let{error:t,tryAgain:n}=e;return r.createElement("div",{style:{display:"flex",flexDirection:"column",justifyContent:"center",alignItems:"flex-start",minHeight:"100vh",width:"100%",maxWidth:"80ch",fontSize:"20px",margin:"0 auto",padding:"1rem"}},r.createElement("h1",{style:{fontSize:"3rem"}},"This page crashed"),r.createElement("button",{type:"button",onClick:n,style:{margin:"1rem 0",fontSize:"2rem",cursor:"pointer",borderRadius:20,padding:"1rem"}},"Try again"),r.createElement(u,{error:t}))}function u(e){let{error:t}=e;const n=(0,o.getErrorCausalChain)(t).map((e=>e.message)).join("\n\nCause:\n");return r.createElement("p",{style:{whiteSpace:"pre-wrap"}},n)}function c(e){let{error:t,tryAgain:n}=e;return r.createElement(f,{fallback:()=>r.createElement(l,{error:t,tryAgain:n})},r.createElement(a.Z,null,r.createElement("title",null,"Page Error")),r.createElement(s.Z,null,r.createElement(l,{error:t,tryAgain:n})))}const d=e=>r.createElement(c,e);class f extends r.Component{constructor(e){super(e),this.state={error:null}}componentDidCatch(e){i.Z.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??d)(e)}return e??null}}},6136:(e,t,n)=>{"use strict";n.d(t,{Z:()=>i});const r="undefined"!=typeof window&&"document"in window&&"createElement"in window.document,i={canUseDOM:r,canUseEventListeners:r&&("addEventListener"in window||"attachEvent"in window),canUseIntersectionObserver:r&&"IntersectionObserver"in window,canUseViewport:r&&"screen"in window}},1514:(e,t,n)=>{"use strict";n.d(t,{Z:()=>a});var r=n(7294),i=n(405);function a(e){return r.createElement(i.ql,e)}},3699:(e,t,n)=>{"use strict";n.d(t,{Z:()=>p});var r=n(7462),i=n(7294),a=n(3727),o=n(3905),s=n(9962),l=n(2735),u=n(6136);const c=i.createContext({collectLink:()=>{}});var d=n(9524);function f(e,t){let{isNavLink:n,to:f,href:p,activeClassName:m,isActive:g,"data-noBrokenLinkCheck":h,autoAddBaseUrl:b=!0,...v}=e;const{siteConfig:{trailingSlash:y,baseUrl:w}}=(0,s.Z)(),{withBaseUrl:k}=(0,d.C)(),E=(0,i.useContext)(c),_=(0,i.useRef)(null);(0,i.useImperativeHandle)(t,(()=>_.current));const S=f||p;const x=(0,l.Z)(S),O=S?.replace("pathname://","");let P=void 0!==O?(C=O,b&&(e=>e.startsWith("/"))(C)?k(C):C):void 0;var C;P&&x&&(P=(0,o.applyTrailingSlash)(P,{trailingSlash:y,baseUrl:w}));const T=(0,i.useRef)(!1),I=n?a.OL:a.rU,A=u.Z.canUseIntersectionObserver,N=(0,i.useRef)(),j=()=>{T.current||null==P||(window.docusaurus.preload(P),T.current=!0)};(0,i.useEffect)((()=>(!A&&x&&null!=P&&window.docusaurus.prefetch(P),()=>{A&&N.current&&N.current.disconnect()})),[N,P,A,x]);const L=P?.startsWith("#")??!1,R=!P||!x||L;return R||h||E.collectLink(P),R?i.createElement("a",(0,r.Z)({ref:_,href:P},S&&!x&&{target:"_blank",rel:"noopener noreferrer"},v)):i.createElement(I,(0,r.Z)({},v,{onMouseEnter:j,onTouchStart:j,innerRef:e=>{_.current=e,A&&e&&x&&(N.current=new window.IntersectionObserver((t=>{t.forEach((t=>{e===t.target&&(t.isIntersecting||t.intersectionRatio>0)&&(N.current.unobserve(e),N.current.disconnect(),null!=P&&window.docusaurus.prefetch(P))}))})),N.current.observe(e))},to:P},n&&{isActive:g,activeClassName:m}))}const p=i.forwardRef(f)},7325:(e,t,n)=>{"use strict";n.d(t,{Z:()=>l,I:()=>s});var r=n(7294);function i(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 a=n(7529);function o(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 a[t??n]??n??t}function s(e,t){let{message:n,id:r}=e;return i(o({message:n,id:r}),t)}function l(e){let{children:t,id:n,values:a}=e;if(t&&"string"!=typeof t)throw console.warn("Illegal children",t),new Error("The Docusaurus component only accept simple string values");const s=o({message:t,id:n});return r.createElement(r.Fragment,null,i(s,a))}},6875:(e,t,n)=>{"use strict";n.d(t,{m:()=>r});const r="default"},2735:(e,t,n)=>{"use strict";function r(e){return/^(?:\w*:|\/\/)/.test(e)}function i(e){return void 0!==e&&!r(e)}n.d(t,{Z:()=>i,b:()=>r})},9524:(e,t,n)=>{"use strict";n.d(t,{C:()=>o,Z:()=>s});var r=n(7294),i=n(9962),a=n(2735);function o(){const{siteConfig:{baseUrl:e,url:t}}=(0,i.Z)(),n=(0,r.useCallback)(((n,r)=>function(e,t,n,r){let{forcePrependBaseUrl:i=!1,absolute:o=!1}=void 0===r?{}:r;if(!n||n.startsWith("#")||(0,a.b)(n))return n;if(i)return t+n.replace(/^\//,"");if(n===t.replace(/\/$/,""))return t;const s=n.startsWith(t)?n:t+n.replace(/^\//,"");return o?e+s:s}(t,e,n,r)),[t,e]);return{withBaseUrl:n}}function s(e,t){void 0===t&&(t={});const{withBaseUrl:n}=o();return n(e,t)}},9962:(e,t,n)=>{"use strict";n.d(t,{Z:()=>a});var r=n(7294),i=n(694);function a(){return(0,r.useContext)(i._)}},1610:(e,t,n)=>{"use strict";n.d(t,{OD:()=>a,eZ:()=>o});var r=n(9962),i=n(6875);function a(e,t){void 0===t&&(t={});const n=function(){const{globalData:e}=(0,r.Z)();return e}()[e];if(!n&&t.failfast)throw new Error(`Docusaurus plugin global data not found for "${e}" plugin.`);return n}function o(e,t,n){void 0===t&&(t=i.m),void 0===n&&(n={});const r=a(e),o=r?.[t];if(!o&&n.failfast)throw new Error(`Docusaurus plugin global data not found for "${e}" plugin with id "${t}".`);return o}},1048:(e,t,n)=>{"use strict";n.d(t,{Z:()=>a});var r=n(7294),i=n(8121);function a(){return(0,r.useContext)(i._)}},5304:(e,t,n)=>{"use strict";n.d(t,{Z:()=>i});const r=e=>"object"==typeof e&&!!e&&Object.keys(e).length>0;function i(e){const t={};return function e(n,i){Object.entries(n).forEach((n=>{let[a,o]=n;const s=i?`${i}.${a}`:a;r(o)?e(o,s):t[s]=o}))}(e),t}},9656:(e,t,n)=>{"use strict";n.d(t,{_:()=>i,z:()=>a});var r=n(7294);const i=r.createContext(null);function a(e){let{children:t,value:n}=e;const a=r.useContext(i),o=(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:a,value:n})),[a,n]);return r.createElement(i.Provider,{value:o},t)}},868:(e,t,n)=>{"use strict";n.d(t,{Iw:()=>g,gA:()=>d,WS:()=>f,_r:()=>u,Jo:()=>h,zh:()=>c,yW:()=>m,gB:()=>p});var r=n(6550),i=n(1610);const a=e=>e.versions.find((e=>e.isLast));function o(e,t){const n=a(e);return[...e.versions.filter((e=>e!==n)),n].find((e=>!!(0,r.LX)(t,{path:e.path,exact:!1,strict:!1})))}function s(e,t){const n=o(e,t),i=n?.docs.find((e=>!!(0,r.LX)(t,{path:e.path,exact:!0,strict:!1})));return{activeVersion:n,activeDoc:i,alternateDocVersions:i?function(t){const n={};return e.versions.forEach((e=>{e.docs.forEach((r=>{r.id===t&&(n[e.name]=r)}))})),n}(i.id):{}}}const l={},u=()=>(0,i.OD)("docusaurus-plugin-content-docs")??l,c=e=>(0,i.eZ)("docusaurus-plugin-content-docs",e,{failfast:!0});function d(e){void 0===e&&(e={});const t=u(),{pathname:n}=(0,r.TH)();return function(e,t,n){void 0===n&&(n={});const i=Object.entries(e).sort(((e,t)=>t[1].path.localeCompare(e[1].path))).find((e=>{let[,n]=e;return!!(0,r.LX)(t,{path:n.path,exact:!1,strict:!1})})),a=i?{pluginId:i[0],pluginData:i[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 f(e){void 0===e&&(e={});const t=d(e),{pathname:n}=(0,r.TH)();if(!t)return;return{activePlugin:t,activeVersion:o(t.pluginData,n)}}function p(e){return c(e).versions}function m(e){const t=c(e);return a(t)}function g(e){const t=c(e),{pathname:n}=(0,r.TH)();return s(t,n)}function h(e){const t=c(e),{pathname:n}=(0,r.TH)();return function(e,t){const n=a(e);return{latestDocSuggestion:s(e,t).alternateDocVersions[n.name],latestVersionSuggestion:n}}(t,n)}},9957:(e,t,n)=>{"use strict";n.r(t),n.d(t,{default:()=>a});var r=n(4865),i=n.n(r);i().configure({showSpinner:!1});const a={onRouteUpdate(e){let{location:t,previousLocation:n}=e;if(n&&t.pathname!==n.pathname){const e=window.setTimeout((()=>{i().start()}),200);return()=>window.clearTimeout(e)}},onRouteDidUpdate(){i().done()}}},2251:(e,t,n)=>{"use strict";n.r(t);var r=n(7410),i=n(6809);!function(e){const{themeConfig:{prism:t}}=i.default,{additionalLanguages:r}=t;globalThis.Prism=e,r.forEach((e=>{n(4813)(`./prism-${e}`)})),delete globalThis.Prism}(r.Z)},4082:(e,t,n)=>{"use strict";n.d(t,{Z:()=>a});var r=n(7294);const i={iconExternalLink:"iconExternalLink_nPIU"};function a(e){let{width:t=13.5,height:n=13.5}=e;return r.createElement("svg",{width:t,height:n,"aria-hidden":"true",viewBox:"0 0 24 24",className:i.iconExternalLink},r.createElement("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"}))}},8617:(e,t,n)=>{"use strict";n.d(t,{Z:()=>io});var r=n(7294),i=n(6010),a=n(3256),o=n(5463),s=n(7462),l=n(6550),u=n(7325),c=n(3266);const d="__docusaurus_skipToContent_fallback";function f(e){e.setAttribute("tabindex","-1"),e.focus(),e.removeAttribute("tabindex")}function p(){const e=(0,r.useRef)(null),{action:t}=(0,l.k6)(),n=(0,r.useCallback)((e=>{e.preventDefault();const t=document.querySelector("main:first-of-type")??document.getElementById(d);t&&f(t)}),[]);return(0,c.S)((n=>{let{location:r}=n;e.current&&!r.hash&&"PUSH"===t&&f(e.current)})),{containerRef:e,onClick:n}}const m=(0,u.I)({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 g(e){const t=e.children??m,{containerRef:n,onClick:i}=p();return r.createElement("div",{ref:n,role:"region","aria-label":m},r.createElement("a",(0,s.Z)({},e,{href:`#${d}`,onClick:i}),t))}var h=n(3702),b=n(8181);const v={skipToContent:"skipToContent_fXgn"};function y(){return r.createElement(g,{className:v.skipToContent})}var w=n(107),k=n(5830);function E(e){let{width:t=21,height:n=21,color:i="currentColor",strokeWidth:a=1.2,className:o,...l}=e;return r.createElement("svg",(0,s.Z)({viewBox:"0 0 15 15",width:t,height:n},l),r.createElement("g",{stroke:i,strokeWidth:a},r.createElement("path",{d:"M.75.75l13.5 13.5M14.25.75L.75 14.25"})))}const _={closeButton:"closeButton_CVFx"};function S(e){return r.createElement("button",(0,s.Z)({type:"button","aria-label":(0,u.I)({id:"theme.AnnouncementBar.closeButtonAriaLabel",message:"Close",description:"The ARIA label for close button of announcement bar"})},e,{className:(0,i.Z)("clean-btn close",_.closeButton,e.className)}),r.createElement(E,{width:14,height:14,strokeWidth:3.1}))}const x={content:"content_knG7"};function O(e){const{announcementBar:t}=(0,w.L)(),{content:n}=t;return r.createElement("div",(0,s.Z)({},e,{className:(0,i.Z)(x.content,e.className),dangerouslySetInnerHTML:{__html:n}}))}const P={announcementBar:"announcementBar_mb4j",announcementBarPlaceholder:"announcementBarPlaceholder_vyr4",announcementBarClose:"announcementBarClose_gvF7",announcementBarContent:"announcementBarContent_xLdY"};function C(){const{announcementBar:e}=(0,w.L)(),{isActive:t,close:n}=(0,k.nT)();if(!t)return null;const{backgroundColor:i,textColor:a,isCloseable:o}=e;return r.createElement("div",{className:P.announcementBar,style:{backgroundColor:i,color:a},role:"banner"},o&&r.createElement("div",{className:P.announcementBarPlaceholder}),r.createElement(O,{className:P.announcementBarContent}),o&&r.createElement(S,{onClick:n,className:P.announcementBarClose}))}var T=n(735),I=n(2957);var A=n(3768),N=n(3086);const j=r.createContext(null);function L(e){let{children:t}=e;const n=function(){const e=(0,T.e)(),t=(0,N.HY)(),[n,i]=(0,r.useState)(!1),a=null!==t.component,o=(0,A.D9)(a);return(0,r.useEffect)((()=>{a&&!o&&i(!0)}),[a,o]),(0,r.useEffect)((()=>{a?e.shown||i(!0):i(!1)}),[e.shown,a]),(0,r.useMemo)((()=>[n,i]),[n])}();return r.createElement(j.Provider,{value:n},t)}function R(e){if(e.component){const t=e.component;return r.createElement(t,e.props)}}function D(){const e=(0,r.useContext)(j);if(!e)throw new A.i6("NavbarSecondaryMenuDisplayProvider");const[t,n]=e,i=(0,r.useCallback)((()=>n(!1)),[n]),a=(0,N.HY)();return(0,r.useMemo)((()=>({shown:t,hide:i,content:R(a)})),[i,a,t])}function M(e){let{header:t,primaryMenu:n,secondaryMenu:a}=e;const{shown:o}=D();return r.createElement("div",{className:"navbar-sidebar"},t,r.createElement("div",{className:(0,i.Z)("navbar-sidebar__items",{"navbar-sidebar__items--show-secondary":o})},r.createElement("div",{className:"navbar-sidebar__item menu"},n),r.createElement("div",{className:"navbar-sidebar__item menu"},a)))}var F=n(9200),B=n(1048);function z(e){return r.createElement("svg",(0,s.Z)({viewBox:"0 0 24 24",width:24,height:24},e),r.createElement("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 U(e){return r.createElement("svg",(0,s.Z)({viewBox:"0 0 24 24",width:24,height:24},e),r.createElement("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 $={toggle:"toggle_vylO",toggleButton:"toggleButton_gllP",darkToggleIcon:"darkToggleIcon_wfgR",lightToggleIcon:"lightToggleIcon_pyhR",toggleButtonDisabled:"toggleButtonDisabled_aARS"};function q(e){let{className:t,buttonClassName:n,value:a,onChange:o}=e;const s=(0,B.Z)(),l=(0,u.I)({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"===a?(0,u.I)({message:"dark mode",id:"theme.colorToggle.ariaLabel.mode.dark",description:"The name for the dark color mode"}):(0,u.I)({message:"light mode",id:"theme.colorToggle.ariaLabel.mode.light",description:"The name for the light color mode"})});return r.createElement("div",{className:(0,i.Z)($.toggle,t)},r.createElement("button",{className:(0,i.Z)("clean-btn",$.toggleButton,!s&&$.toggleButtonDisabled,n),type:"button",onClick:()=>o("dark"===a?"light":"dark"),disabled:!s,title:l,"aria-label":l,"aria-live":"polite"},r.createElement(z,{className:(0,i.Z)($.toggleIcon,$.lightToggleIcon)}),r.createElement(U,{className:(0,i.Z)($.toggleIcon,$.darkToggleIcon)})))}const H=r.memo(q),Q={darkNavbarColorModeToggle:"darkNavbarColorModeToggle_X3D1"};function Z(e){let{className:t}=e;const n=(0,w.L)().navbar.style,i=(0,w.L)().colorMode.disableSwitch,{colorMode:a,setColorMode:o}=(0,F.I)();return i?null:r.createElement(H,{className:t,buttonClassName:"dark"===n?Q.darkNavbarColorModeToggle:void 0,value:a,onChange:o})}var V=n(6811);function W(){return r.createElement(V.Z,{className:"navbar__brand",imageClassName:"navbar__logo",titleClassName:"navbar__title text--truncate"})}function G(){const e=(0,T.e)();return r.createElement("button",{type:"button","aria-label":(0,u.I)({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()},r.createElement(E,{color:"var(--ifm-color-emphasis-600)"}))}function Y(){return r.createElement("div",{className:"navbar-sidebar__brand"},r.createElement(W,null),r.createElement(Z,{className:"margin-right--md"}),r.createElement(G,null))}var K=n(3699),X=n(9524),J=n(2735);function ee(e,t){return void 0!==e&&void 0!==t&&new RegExp(e,"gi").test(t)}var te=n(4082);function ne(e){let{activeBasePath:t,activeBaseRegex:n,to:i,href:a,label:o,html:l,isDropdownLink:u,prependBaseUrlToHref:c,...d}=e;const f=(0,X.Z)(i),p=(0,X.Z)(t),m=(0,X.Z)(a,{forcePrependBaseUrl:!0}),g=o&&a&&!(0,J.Z)(a),h=l?{dangerouslySetInnerHTML:{__html:l}}:{children:r.createElement(r.Fragment,null,o,g&&r.createElement(te.Z,u&&{width:12,height:12}))};return a?r.createElement(K.Z,(0,s.Z)({href:c?m:a},d,h)):r.createElement(K.Z,(0,s.Z)({to:f,isNavLink:!0},(t||n)&&{isActive:(e,t)=>n?ee(n,t.pathname):t.pathname.startsWith(p)},d,h))}function re(e){let{className:t,isDropdownItem:n=!1,...a}=e;const o=r.createElement(ne,(0,s.Z)({className:(0,i.Z)(n?"dropdown__link":"navbar__item navbar__link",t),isDropdownLink:n},a));return n?r.createElement("li",null,o):o}function ie(e){let{className:t,isDropdownItem:n,...a}=e;return r.createElement("li",{className:"menu__list-item"},r.createElement(ne,(0,s.Z)({className:(0,i.Z)("menu__link",t)},a)))}function ae(e){let{mobile:t=!1,position:n,...i}=e;const a=t?ie:re;return r.createElement(a,(0,s.Z)({},i,{activeClassName:i.activeClassName??(t?"menu__link--active":"navbar__link--active")}))}var oe=n(4639),se=n(9003),le=n(9962);function ue(e,t){return e.some((e=>function(e,t){return!!(0,se.Mg)(e.to,t)||!!ee(e.activeBaseRegex,t)||!(!e.activeBasePath||!t.startsWith(e.activeBasePath))}(e,t)))}function ce(e){let{items:t,position:n,className:a,onClick:o,...l}=e;const u=(0,r.useRef)(null),[c,d]=(0,r.useState)(!1);return(0,r.useEffect)((()=>{const e=e=>{u.current&&!u.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)}}),[u]),r.createElement("div",{ref:u,className:(0,i.Z)("navbar__item","dropdown","dropdown--hoverable",{"dropdown--right":"right"===n,"dropdown--show":c})},r.createElement(ne,(0,s.Z)({"aria-haspopup":"true","aria-expanded":c,role:"button",href:l.to?void 0:"#",className:(0,i.Z)("navbar__link",a)},l,{onClick:l.to?void 0:e=>e.preventDefault(),onKeyDown:e=>{"Enter"===e.key&&(e.preventDefault(),d(!c))}}),l.children??l.label),r.createElement("ul",{className:"dropdown__menu"},t.map(((e,t)=>r.createElement(ba,(0,s.Z)({isDropdownItem:!0,activeClassName:"dropdown__link--active"},e,{key:t}))))))}function de(e){let{items:t,className:n,position:a,onClick:o,...u}=e;const c=function(){const{siteConfig:{baseUrl:e}}=(0,le.Z)(),{pathname:t}=(0,l.TH)();return t.replace(e,"/")}(),d=ue(t,c),{collapsed:f,toggleCollapsed:p,setCollapsed:m}=(0,oe.u)({initialState:()=>!d});return(0,r.useEffect)((()=>{d&&m(!d)}),[c,d,m]),r.createElement("li",{className:(0,i.Z)("menu__list-item",{"menu__list-item--collapsed":f})},r.createElement(ne,(0,s.Z)({role:"button",className:(0,i.Z)("menu__link menu__link--sublist menu__link--sublist-caret",n)},u,{onClick:e=>{e.preventDefault(),p()}}),u.children??u.label),r.createElement(oe.z,{lazy:!0,as:"ul",className:"menu__list",collapsed:f},t.map(((e,t)=>r.createElement(ba,(0,s.Z)({mobile:!0,isDropdownItem:!0,onClick:o,activeClassName:"menu__link--active"},e,{key:t}))))))}function fe(e){let{mobile:t=!1,...n}=e;const i=t?de:ce;return r.createElement(i,n)}var pe=n(626);function me(e){let{width:t=20,height:n=20,...i}=e;return r.createElement("svg",(0,s.Z)({viewBox:"0 0 24 24",width:t,height:n,"aria-hidden":!0},i),r.createElement("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 he=n(3935);function be(e,t){var n=void 0;return function(){for(var r=arguments.length,i=new Array(r),a=0;ae.length)&&(t=e.length);for(var n=0,r=new Array(t);ne.length)&&(t=e.length);for(var n=0,r=new Array(t);n=0||(i[n]=e[n]);return i}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(i[n]=e[n])}return i}function Ae(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function Ne(e){for(var t=1;t=3||2===n&&r>=4||1===n&&r>=10}(e);function n(n,r,i){if(t&&void 0!==i){var a=i[0].__autocomplete_algoliaCredentials,o={"X-Algolia-Application-Id":a.appId,"X-Algolia-API-Key":a.apiKey};e.apply(void 0,[n].concat(Ce(r),[{headers:o}]))}else e.apply(void 0,[n].concat(Ce(r)))}return{init:function(t,n){e("init",{appId:t,apiKey:n})},setUserToken:function(t){e("setUserToken",t)},clickedObjectIDsAfterSearch:function(){for(var e=arguments.length,t=new Array(e),r=0;r0&&n("clickedObjectIDsAfterSearch",Le(t),t[0].items)},clickedObjectIDs:function(){for(var e=arguments.length,t=new Array(e),r=0;r0&&n("clickedObjectIDs",Le(t),t[0].items)},clickedFilters:function(){for(var t=arguments.length,n=new Array(t),r=0;r0&&e.apply(void 0,["clickedFilters"].concat(n))},convertedObjectIDsAfterSearch:function(){for(var e=arguments.length,t=new Array(e),r=0;r0&&n("convertedObjectIDsAfterSearch",Le(t),t[0].items)},convertedObjectIDs:function(){for(var e=arguments.length,t=new Array(e),r=0;r0&&n("convertedObjectIDs",Le(t),t[0].items)},convertedFilters:function(){for(var t=arguments.length,n=new Array(t),r=0;r0&&e.apply(void 0,["convertedFilters"].concat(n))},viewedObjectIDs:function(){for(var e=arguments.length,t=new Array(e),r=0;r0&&t.reduce((function(e,t){var n=t.items,r=Ie(t,Oe);return[].concat(Ce(e),Ce(function(e){for(var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:20,n=[],r=0;r0&&e.apply(void 0,["viewedFilters"].concat(n))}}}function De(e){var t=e.items.reduce((function(e,t){var n;return e[t.__autocomplete_indexName]=(null!==(n=e[t.__autocomplete_indexName])&&void 0!==n?n:[]).concat(t),e}),{});return Object.keys(t).map((function(e){return{index:e,items:t[e],algoliaSource:["autocomplete"]}}))}function Me(e){return e.objectID&&e.__autocomplete_indexName&&e.__autocomplete_queryID}function Fe(e){return Fe="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},Fe(e)}function Be(e){return function(e){if(Array.isArray(e))return ze(e)}(e)||function(e){if("undefined"!=typeof Symbol&&null!=e[Symbol.iterator]||null!=e["@@iterator"])return Array.from(e)}(e)||function(e,t){if(!e)return;if("string"==typeof e)return ze(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);"Object"===n&&e.constructor&&(n=e.constructor.name);if("Map"===n||"Set"===n)return Array.from(e);if("Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n))return ze(e,t)}(e)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function ze(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=new Array(t);n0&&Ze({onItemsChange:r,items:n,insights:l,state:t}))}}),0);return{name:"aa.algoliaInsightsPlugin",subscribe:function(e){var t=e.setContext,n=e.onSelect,r=e.onActive;function u(e){t({algoliaInsightsPlugin:{__algoliaSearchParameters:$e($e({},o?{clickAnalytics:!0}:{}),e?{userToken:e}:{}),insights:l}})}s("addAlgoliaAgent","insights-plugin"),u(),s("onUserTokenChange",u),s("getUserToken",null,(function(e,t){u(t)})),n((function(e){var t=e.item,n=e.state,r=e.event,a=e.source;Me(t)&&i({state:n,event:r,insights:l,item:t,insightsEvents:[$e({eventName:"Item Selected"},Ee({item:t,items:a.getItems().filter(Me)}))]})})),r((function(e){var t=e.item,n=e.source,r=e.state,i=e.event;Me(t)&&a({state:r,event:i,insights:l,item:t,insightsEvents:[$e({eventName:"Item Active"},Ee({item:t,items:n.getItems().filter(Me)}))]})}))},onStateChange:function(e){var t=e.state;c({state:t})},__autocomplete_pluginOptions:e}}function We(){var e,t=arguments.length>1?arguments[1]:void 0;return[].concat(Be(arguments.length>0&&void 0!==arguments[0]?arguments[0]:[]),["autocomplete-internal"],Be(null!==(e=t.algoliaInsightsPlugin)&&void 0!==e&&e.__automaticInsights?["autocomplete-automatic"]:[]))}function Ge(e){return Ge="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},Ge(e)}function Ye(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function Ke(e,t,n){return(t=function(e){var t=function(e,t){if("object"!==Ge(e)||null===e)return e;var n=e[Symbol.toPrimitive];if(void 0!==n){var r=n.call(e,t||"default");if("object"!==Ge(r))return r;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===t?String:Number)(e)}(e,"string");return"symbol"===Ge(t)?t:String(t)}(t))in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function Xe(e,t,n){var r,i=t.initialState;return{getState:function(){return i},dispatch:function(r,a){var o=function(e){for(var t=1;te.length)&&(t=e.length);for(var n=0,r=new Array(t);n0},reshape:function(e){return e.sources}},e),{},{id:null!==(n=e.id)&&void 0!==n?n:ot(),plugins:i,initialState:gt({activeItemId:null,query:"",completion:null,collections:[],isOpen:!1,status:"idle",context:{}},e.initialState),onStateChange:function(t){var n;null===(n=e.onStateChange)||void 0===n||n.call(e,t),i.forEach((function(e){var n;return null===(n=e.onStateChange)||void 0===n?void 0:n.call(e,t)}))},onSubmit:function(t){var n;null===(n=e.onSubmit)||void 0===n||n.call(e,t),i.forEach((function(e){var n;return null===(n=e.onSubmit)||void 0===n?void 0:n.call(e,t)}))},onReset:function(t){var n;null===(n=e.onReset)||void 0===n||n.call(e,t),i.forEach((function(e){var n;return null===(n=e.onReset)||void 0===n?void 0:n.call(e,t)}))},getSources:function(n){return Promise.all([].concat(ft(i.map((function(e){return e.getSources}))),[e.getSources]).filter(Boolean).map((function(e){return function(e,t){var n=[];return Promise.resolve(e(t)).then((function(e){return Array.isArray(e),Promise.all(e.filter((function(e){return Boolean(e)})).map((function(e){if(e.sourceId,n.includes(e.sourceId))throw new Error("[Autocomplete] The `sourceId` ".concat(JSON.stringify(e.sourceId)," is not unique."));n.push(e.sourceId);var t={getItemInputValue:function(e){return e.state.query},getItemUrl:function(){},onSelect:function(e){(0,e.setIsOpen)(!1)},onActive:ke,onResolve:ke};Object.keys(t).forEach((function(e){t[e].__default=!0}));var r=lt(lt({},t),e);return Promise.resolve(r)})))}))}(e,n)}))).then((function(e){return Je(e)})).then((function(e){return e.map((function(e){return gt(gt({},e),{},{onSelect:function(n){e.onSelect(n),t.forEach((function(e){var t;return null===(t=e.onSelect)||void 0===t?void 0:t.call(e,n)}))},onActive:function(n){e.onActive(n),t.forEach((function(e){var t;return null===(t=e.onActive)||void 0===t?void 0:t.call(e,n)}))},onResolve:function(n){e.onResolve(n),t.forEach((function(e){var t;return null===(t=e.onResolve)||void 0===t?void 0:t.call(e,n)}))}})}))}))},navigator:gt({navigate:function(e){var t=e.itemUrl;r.location.assign(t)},navigateNewTab:function(e){var t=e.itemUrl,n=r.open(t,"_blank","noopener");null==n||n.focus()},navigateNewWindow:function(e){var t=e.itemUrl;r.open(t,"_blank","noopener")}},e.navigator)})}function vt(e){return vt="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},vt(e)}function yt(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function wt(e){for(var t=1;te.length)&&(t=e.length);for(var n=0,r=new Array(t);n=0||(i[n]=e[n]);return i}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(i[n]=e[n])}return i}var qt,Ht,Qt,Zt=null,Vt=(qt=-1,Ht=-1,Qt=void 0,function(e){var t=++qt;return Promise.resolve(e).then((function(e){return Qt&&t=0||(i[n]=e[n]);return i}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(i[n]=e[n])}return i}var nn=/((gt|sm)-|galaxy nexus)|samsung[- ]|samsungbrowser/i;function rn(e){return rn="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},rn(e)}var an=["props","refresh","store"],on=["inputElement","formElement","panelElement"],sn=["inputElement"],ln=["inputElement","maxLength"],un=["source"],cn=["item","source"];function dn(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function fn(e){for(var t=1;t=0||(i[n]=e[n]);return i}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(i[n]=e[n])}return i}function gn(e){var t=e.props,n=e.refresh,r=e.store,i=mn(e,an);return{getEnvironmentProps:function(e){var n=e.inputElement,i=e.formElement,a=e.panelElement;function o(e){!r.getState().isOpen&&r.pendingRequests.isEmpty()||e.target===n||!1===[i,a].some((function(t){return n=t,r=e.target,n===r||n.contains(r);var n,r}))&&(r.dispatch("blur",null),t.debug||r.pendingRequests.cancelAll())}return fn({onTouchStart:o,onMouseDown:o,onTouchMove:function(e){!1!==r.getState().isOpen&&n===t.environment.document.activeElement&&e.target!==n&&n.blur()}},mn(e,on))},getRootProps:function(e){return fn({role:"combobox","aria-expanded":r.getState().isOpen,"aria-haspopup":"listbox","aria-owns":r.getState().isOpen?r.getState().collections.map((function(e){var n=e.source;return Gt(t.id,"list",n)})).join(" "):void 0,"aria-labelledby":Gt(t.id,"label")},e)},getFormProps:function(e){e.inputElement;return fn({action:"",noValidate:!0,role:"search",onSubmit:function(a){var o;a.preventDefault(),t.onSubmit(fn({event:a,refresh:n,state:r.getState()},i)),r.dispatch("submit",null),null===(o=e.inputElement)||void 0===o||o.blur()},onReset:function(a){var o;a.preventDefault(),t.onReset(fn({event:a,refresh:n,state:r.getState()},i)),r.dispatch("reset",null),null===(o=e.inputElement)||void 0===o||o.focus()}},mn(e,sn))},getLabelProps:function(e){return fn({htmlFor:Gt(t.id,"input"),id:Gt(t.id,"label")},e)},getInputProps:function(e){var a;function o(e){(t.openOnFocus||Boolean(r.getState().query))&&Wt(fn({event:e,props:t,query:r.getState().completion||r.getState().query,refresh:n,store:r},i)),r.dispatch("focus",null)}var s=e||{},l=(s.inputElement,s.maxLength),u=void 0===l?512:l,c=mn(s,ln),d=Dt(r.getState()),f=function(e){return Boolean(e&&e.match(nn))}((null===(a=t.environment.navigator)||void 0===a?void 0:a.userAgent)||""),p=t.enterKeyHint||(null!=d&&d.itemUrl&&!f?"go":"search");return fn({"aria-autocomplete":"both","aria-activedescendant":r.getState().isOpen&&null!==r.getState().activeItemId?Gt(t.id,"item-".concat(r.getState().activeItemId),null==d?void 0:d.source):void 0,"aria-controls":r.getState().isOpen?r.getState().collections.map((function(e){var n=e.source;return Gt(t.id,"list",n)})).join(" "):void 0,"aria-labelledby":Gt(t.id,"label"),value:r.getState().completion||r.getState().query,id:Gt(t.id,"input"),autoComplete:"off",autoCorrect:"off",autoCapitalize:"off",enterKeyHint:p,spellCheck:"false",autoFocus:t.autoFocus,placeholder:t.placeholder,maxLength:u,type:"search",onChange:function(e){Wt(fn({event:e,props:t,query:e.currentTarget.value.slice(0,u),refresh:n,store:r},i))},onKeyDown:function(e){!function(e){var t=e.event,n=e.props,r=e.refresh,i=e.store,a=tn(e,Kt);if("ArrowUp"===t.key||"ArrowDown"===t.key){var o=function(){var e=Dt(i.getState()),t=n.environment.document.getElementById(Gt(n.id,"item-".concat(i.getState().activeItemId),null==e?void 0:e.source));t&&(t.scrollIntoViewIfNeeded?t.scrollIntoViewIfNeeded(!1):t.scrollIntoView(!1))},s=function(){var e=Dt(i.getState());if(null!==i.getState().activeItemId&&e){var n=e.item,o=e.itemInputValue,s=e.itemUrl,l=e.source;l.onActive(Jt({event:t,item:n,itemInputValue:o,itemUrl:s,refresh:r,source:l,state:i.getState()},a))}};t.preventDefault(),!1===i.getState().isOpen&&(n.openOnFocus||Boolean(i.getState().query))?Wt(Jt({event:t,props:n,query:i.getState().query,refresh:r,store:i},a)).then((function(){i.dispatch(t.key,{nextActiveItemId:n.defaultActiveItemId}),s(),setTimeout(o,0)})):(i.dispatch(t.key,{}),s(),o())}else if("Escape"===t.key)t.preventDefault(),i.dispatch(t.key,null),i.pendingRequests.cancelAll();else if("Tab"===t.key)i.dispatch("blur",null),i.pendingRequests.cancelAll();else if("Enter"===t.key){if(null===i.getState().activeItemId||i.getState().collections.every((function(e){return 0===e.items.length})))return void(n.debug||i.pendingRequests.cancelAll());t.preventDefault();var l=Dt(i.getState()),u=l.item,c=l.itemInputValue,d=l.itemUrl,f=l.source;if(t.metaKey||t.ctrlKey)void 0!==d&&(f.onSelect(Jt({event:t,item:u,itemInputValue:c,itemUrl:d,refresh:r,source:f,state:i.getState()},a)),n.navigator.navigateNewTab({itemUrl:d,item:u,state:i.getState()}));else if(t.shiftKey)void 0!==d&&(f.onSelect(Jt({event:t,item:u,itemInputValue:c,itemUrl:d,refresh:r,source:f,state:i.getState()},a)),n.navigator.navigateNewWindow({itemUrl:d,item:u,state:i.getState()}));else if(t.altKey);else{if(void 0!==d)return f.onSelect(Jt({event:t,item:u,itemInputValue:c,itemUrl:d,refresh:r,source:f,state:i.getState()},a)),void n.navigator.navigate({itemUrl:d,item:u,state:i.getState()});Wt(Jt({event:t,nextState:{isOpen:!1},props:n,query:c,refresh:r,store:i},a)).then((function(){f.onSelect(Jt({event:t,item:u,itemInputValue:c,itemUrl:d,refresh:r,source:f,state:i.getState()},a))}))}}}(fn({event:e,props:t,refresh:n,store:r},i))},onFocus:o,onBlur:ke,onClick:function(n){e.inputElement!==t.environment.document.activeElement||r.getState().isOpen||o(n)}},c)},getPanelProps:function(e){return fn({onMouseDown:function(e){e.preventDefault()},onMouseLeave:function(){r.dispatch("mouseleave",null)}},e)},getListProps:function(e){var n=e||{},r=n.source,i=mn(n,un);return fn({role:"listbox","aria-labelledby":Gt(t.id,"label"),id:Gt(t.id,"list",r)},i)},getItemProps:function(e){var a=e.item,o=e.source,s=mn(e,cn);return fn({id:Gt(t.id,"item-".concat(a.__autocomplete_id),o),role:"option","aria-selected":r.getState().activeItemId===a.__autocomplete_id,onMouseMove:function(e){if(a.__autocomplete_id!==r.getState().activeItemId){r.dispatch("mousemove",a.__autocomplete_id);var t=Dt(r.getState());if(null!==r.getState().activeItemId&&t){var o=t.item,s=t.itemInputValue,l=t.itemUrl,u=t.source;u.onActive(fn({event:e,item:o,itemInputValue:s,itemUrl:l,refresh:n,source:u,state:r.getState()},i))}}},onMouseDown:function(e){e.preventDefault()},onClick:function(e){var s=o.getItemInputValue({item:a,state:r.getState()}),l=o.getItemUrl({item:a,state:r.getState()});(l?Promise.resolve():Wt(fn({event:e,nextState:{isOpen:!1},props:t,query:s,refresh:n,store:r},i))).then((function(){o.onSelect(fn({event:e,item:a,itemInputValue:s,itemUrl:l,refresh:n,source:o,state:r.getState()},i))}))}},s)}}}var hn="1.12.2",bn=[{segment:"autocomplete-core",version:hn}];function vn(e){return vn="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},vn(e)}function yn(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function wn(e){for(var t=1;t=n?null===r?null:0:i}function xn(e){return xn="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},xn(e)}function On(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function Pn(e){for(var t=1;t=5&&((i||!e&&5===r)&&(o.push(r,0,i,n),r=6),e&&(o.push(r,e,0,n),r=6)),i=""},l=0;l"===t?(r=1,i=""):i=t+i[0]:a?t===a?a="":i+=t:'"'===t||"'"===t?a=t:">"===t?(s(),r=1):r&&("="===t?(r=5,n=i,i=""):"/"===t&&(r<5||">"===e[l][u+1])?(s(),3===r&&(o=o[0]),r=o,(o=o[0]).push(2,0,r),r=0):" "===t||"\t"===t||"\n"===t||"\r"===t?(s(),r=2):i+=t),3===r&&"!--"===i&&(r=4,o=o[0])}return s(),o}(e)),t),arguments,[])).length>1?t:t[0]}var Fn=function(e){var t=e.environment,n=t.document.createElementNS("http://www.w3.org/2000/svg","svg");n.setAttribute("class","aa-SubmitIcon"),n.setAttribute("viewBox","0 0 24 24"),n.setAttribute("width","20"),n.setAttribute("height","20"),n.setAttribute("fill","currentColor");var r=t.document.createElementNS("http://www.w3.org/2000/svg","path");return r.setAttribute("d","M16.041 15.856c-0.034 0.026-0.067 0.055-0.099 0.087s-0.060 0.064-0.087 0.099c-1.258 1.213-2.969 1.958-4.855 1.958-1.933 0-3.682-0.782-4.95-2.050s-2.050-3.017-2.050-4.95 0.782-3.682 2.050-4.95 3.017-2.050 4.95-2.050 3.682 0.782 4.95 2.050 2.050 3.017 2.050 4.95c0 1.886-0.745 3.597-1.959 4.856zM21.707 20.293l-3.675-3.675c1.231-1.54 1.968-3.493 1.968-5.618 0-2.485-1.008-4.736-2.636-6.364s-3.879-2.636-6.364-2.636-4.736 1.008-6.364 2.636-2.636 3.879-2.636 6.364 1.008 4.736 2.636 6.364 3.879 2.636 6.364 2.636c2.125 0 4.078-0.737 5.618-1.968l3.675 3.675c0.391 0.391 1.024 0.391 1.414 0s0.391-1.024 0-1.414z"),n.appendChild(r),n},Bn=function(e){var t=e.environment,n=t.document.createElementNS("http://www.w3.org/2000/svg","svg");n.setAttribute("class","aa-ClearIcon"),n.setAttribute("viewBox","0 0 24 24"),n.setAttribute("width","18"),n.setAttribute("height","18"),n.setAttribute("fill","currentColor");var r=t.document.createElementNS("http://www.w3.org/2000/svg","path");return r.setAttribute("d","M5.293 6.707l5.293 5.293-5.293 5.293c-0.391 0.391-0.391 1.024 0 1.414s1.024 0.391 1.414 0l5.293-5.293 5.293 5.293c0.391 0.391 1.024 0.391 1.414 0s0.391-1.024 0-1.414l-5.293-5.293 5.293-5.293c0.391-0.391 0.391-1.024 0-1.414s-1.024-0.391-1.414 0l-5.293 5.293-5.293-5.293c-0.391-0.391-1.024-0.391-1.414 0s-0.391 1.024 0 1.414z"),n.appendChild(r),n},zn=function(e){var t=e.environment.document.createElementNS("http://www.w3.org/2000/svg","svg");return t.setAttribute("class","aa-LoadingIcon"),t.setAttribute("viewBox","0 0 100 100"),t.setAttribute("width","20"),t.setAttribute("height","20"),t.innerHTML='\n \n',t},Un=["ontouchstart","ontouchend","ontouchmove","ontouchcancel"];function $n(e,t,n){e[t]=null===n?"":"number"!=typeof n?n:n+"px"}function qn(e){this._listeners[e.type](e)}function Hn(e,t,n){var r,i,a=e[t];if("style"===t)if("string"==typeof n)e.style=n;else if(null===n)e.style="";else for(t in n)a&&n[t]===a[t]||$n(e.style,t,n[t]);else"o"===t[0]&&"n"===t[1]?(r=t!==(t=t.replace(/Capture$/,"")),((i=t.toLowerCase())in e||Un.includes(i))&&(t=i),t=t.slice(2),e._listeners||(e._listeners={}),e._listeners[t]=n,n?a||e.addEventListener(t,qn,r):e.removeEventListener(t,qn,r)):"list"!==t&&"tagName"!==t&&"form"!==t&&"type"!==t&&"size"!==t&&"download"!==t&&"href"!==t&&t in e?e[t]=null==n?"":n:"function"!=typeof n&&"dangerouslySetInnerHTML"!==t&&(null==n||!1===n&&!/^ar/.test(t)?e.removeAttribute(t):e.setAttribute(t,n))}function Qn(e){return"onChange"===e?"onInput":e}function Zn(e,t){for(var n in t)Hn(e,Qn(n),t[n])}function Vn(e,t){for(var n in t)"o"===n[0]&&"n"===n[1]||Hn(e,Qn(n),t[n])}var Wn=["children"];function Gn(e){return function(e){if(Array.isArray(e))return Yn(e)}(e)||function(e){if("undefined"!=typeof Symbol&&null!=e[Symbol.iterator]||null!=e["@@iterator"])return Array.from(e)}(e)||function(e,t){if(!e)return;if("string"==typeof e)return Yn(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);"Object"===n&&e.constructor&&(n=e.constructor.name);if("Map"===n||"Set"===n)return Array.from(e);if("Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n))return Yn(e,t)}(e)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function Yn(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=new Array(t);n=0||(i[n]=e[n]);return i}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(i[n]=e[n])}return i}function Xn(e){return function(t,n){var r=n.children,i=void 0===r?[]:r,a=Kn(n,Wn),o=e.document.createElement(t);return Zn(o,a),o.append.apply(o,Gn(i)),o}}function Jn(e){return Jn="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},Jn(e)}var er=["autocompleteScopeApi","environment","classNames","getInputProps","getInputPropsCore","isDetached","state"];function tr(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function nr(e){for(var t=1;t=0||(i[n]=e[n]);return i}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(i[n]=e[n])}return i}var ar=function(e){var t=e.autocompleteScopeApi,n=e.environment,r=(e.classNames,e.getInputProps),i=e.getInputPropsCore,a=e.isDetached,o=e.state,s=ir(e,er),l=Xn(n)("input",s),u=r(nr({state:o,props:i({inputElement:l}),inputElement:l},t));return Zn(l,nr(nr({},u),{},{onKeyDown:function(e){a&&"Tab"===e.key||u.onKeyDown(e)}})),l};function or(e){return or="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},or(e)}function sr(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function lr(e){for(var t=1;t2&&(o.children=arguments.length>3?cr.call(arguments,2):n),"function"==typeof e&&null!=e.defaultProps)for(a in e.defaultProps)void 0===o[a]&&(o[a]=e.defaultProps[a]);return Sr(e,o,r,i,null)}function Sr(e,t,n,r,i){var a={type:e,props:t,key:n,ref:r,__k:null,__:null,__b:0,__e:null,__d:void 0,__c:null,constructor:void 0,__v:null==i?++fr:i,__i:-1,__u:0};return null==i&&null!=dr.vnode&&dr.vnode(a),a}function xr(e){return e.children}function Or(e,t){this.props=e,this.context=t}function Pr(e,t){if(null==t)return e.__?Pr(e.__,e.__i+1):null;for(var n;tt&&pr.sort(hr));Ir.__r=0}function Ar(e,t,n,r,i,a,o,s,l,u,c){var d,f,p,m,g,h=r&&r.__k||vr,b=t.length;for(n.__d=l,Nr(n,t,h),l=n.__d,d=0;d0?Sr(i.type,i.props,i.key,i.ref?i.ref:null,i.__v):i)?(i.__=e,i.__b=e.__b+1,s=Lr(i,n,o=r+d,c),i.__i=s,a=null,-1!==s&&(c--,(a=n[s])&&(a.__u|=131072)),null==a||null===a.__v?(-1==s&&d--,"function"!=typeof i.type&&(i.__u|=65536)):s!==o&&(s===o+1?d++:s>o?c>l-o?d+=s-o:d--:d=s(null!=l&&0==(131072&l.__u)?1:0))for(;o>=0||s=0){if((l=t[o])&&0==(131072&l.__u)&&i==l.key&&a===l.type)return o;o--}if(s0&&void 0!==arguments[0]?arguments[0]:[];return{get:function(){return e},add:function(t){var n=e[e.length-1];(null==n?void 0:n.isHighlighted)===t.isHighlighted?e[e.length-1]={value:n.value+t.value,isHighlighted:n.isHighlighted}:e.push(t)}}}(n?[{value:n,isHighlighted:!1}]:[]);return t.forEach((function(e){var t=e.split(Wr);r.add({value:t[0],isHighlighted:!0}),""!==t[1]&&r.add({value:t[1],isHighlighted:!1})})),r.get()}function Yr(e){return function(e){if(Array.isArray(e))return Kr(e)}(e)||function(e){if("undefined"!=typeof Symbol&&null!=e[Symbol.iterator]||null!=e["@@iterator"])return Array.from(e)}(e)||function(e,t){if(!e)return;if("string"==typeof e)return Kr(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);"Object"===n&&e.constructor&&(n=e.constructor.name);if("Map"===n||"Set"===n)return Array.from(e);if("Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n))return Kr(e,t)}(e)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function Kr(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=new Array(t);n",""":'"',"'":"'"},ti=new RegExp(/\w/i),ni=/&(amp|quot|lt|gt|#39);/g,ri=RegExp(ni.source);function ii(e,t){var n,r,i,a=e[t],o=(null===(n=e[t+1])||void 0===n?void 0:n.isHighlighted)||!0,s=(null===(r=e[t-1])||void 0===r?void 0:r.isHighlighted)||!0;return ti.test((i=a.value)&&ri.test(i)?i.replace(ni,(function(e){return ei[e]})):i)||s!==o?a.isHighlighted:s}function ai(e){return ai="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},ai(e)}function oi(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function si(e){for(var t=1;te.length)&&(t=e.length);for(var n=0,r=new Array(t);n=0||(i[n]=e[n]);return i}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(i[n]=e[n])}return i}var Si={clearButton:"aa-ClearButton",detachedCancelButton:"aa-DetachedCancelButton",detachedContainer:"aa-DetachedContainer",detachedFormContainer:"aa-DetachedFormContainer",detachedOverlay:"aa-DetachedOverlay",detachedSearchButton:"aa-DetachedSearchButton",detachedSearchButtonIcon:"aa-DetachedSearchButtonIcon",detachedSearchButtonPlaceholder:"aa-DetachedSearchButtonPlaceholder",detachedSearchButtonQuery:"aa-DetachedSearchButtonQuery",form:"aa-Form",input:"aa-Input",inputWrapper:"aa-InputWrapper",inputWrapperPrefix:"aa-InputWrapperPrefix",inputWrapperSuffix:"aa-InputWrapperSuffix",item:"aa-Item",label:"aa-Label",list:"aa-List",loadingIndicator:"aa-LoadingIndicator",panel:"aa-Panel",panelLayout:"aa-PanelLayout aa-Panel--scrollable",root:"aa-Autocomplete",source:"aa-Source",sourceFooter:"aa-SourceFooter",sourceHeader:"aa-SourceHeader",sourceNoResults:"aa-SourceNoResults",submitButton:"aa-SubmitButton"},xi=function(e,t){var n=e.children;(0,e.render)(n,t)},Oi={createElement:_r,Fragment:xr,render:Qr};function Pi(e){var t=e.panelPlacement,n=e.container,r=e.form,i=e.environment,a=n.getBoundingClientRect(),o=(i.pageYOffset||i.document.documentElement.scrollTop||i.document.body.scrollTop||0)+a.top+a.height;switch(t){case"start":return{top:o,left:a.left};case"end":return{top:o,right:i.document.documentElement.clientWidth-(a.left+a.width)};case"full-width":return{top:o,left:0,right:0,width:"unset",maxWidth:"unset"};case"input-wrapper-width":var s=r.getBoundingClientRect();return{top:o,left:s.left,right:i.document.documentElement.clientWidth-(s.left+s.width),width:"unset",maxWidth:"unset"};default:throw new Error("[Autocomplete] The `panelPlacement` value ".concat(JSON.stringify(t)," is not valid."))}}function Ci(e){return Ci="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},Ci(e)}function Ti(){return Ti=Object.assign?Object.assign.bind():function(e){for(var t=1;te.length)&&(t=e.length);for(var n=0,r=new Array(t);ne.length)&&(t=e.length);for(var n=0,r=new Array(t);n=0||(i[n]=e[n]);return i}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(i[n]=e[n])}return i}function Wi(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function Gi(e){for(var t=1;t0;if(!f.value.core.openOnFocus&&!t.query)return n;var r=Boolean(u.current||f.value.renderer.renderNoResults);return!n&&r||n},__autocomplete_metadata:{userAgents:ji,options:e}}))})),g=ve(Gi({collections:[],completion:null,context:{},isOpen:!1,query:"",activeItemId:null,status:"idle"},f.value.core.initialState)),h={getEnvironmentProps:f.value.renderer.getEnvironmentProps,getFormProps:f.value.renderer.getFormProps,getInputProps:f.value.renderer.getInputProps,getItemProps:f.value.renderer.getItemProps,getLabelProps:f.value.renderer.getLabelProps,getListProps:f.value.renderer.getListProps,getPanelProps:f.value.renderer.getPanelProps,getRootProps:f.value.renderer.getRootProps},b={setActiveItemId:m.value.setActiveItemId,setQuery:m.value.setQuery,setCollections:m.value.setCollections,setIsOpen:m.value.setIsOpen,setStatus:m.value.setStatus,setContext:m.value.setContext,refresh:m.value.refresh,navigator:m.value.navigator},v=s((function(){return Mn.bind(f.value.renderer.renderer.createElement)})),y=s((function(){return function(e){var t=e.autocomplete,n=e.autocompleteScopeApi,r=e.classNames,i=e.environment,a=e.isDetached,o=e.placeholder,s=void 0===o?"Search":o,l=e.propGetters,u=e.setIsModalOpen,c=e.state,d=e.translations,f=Xn(i),p=l.getRootProps(lr({state:c,props:t.getRootProps({})},n)),m=f("div",lr({class:r.root},p)),g=f("div",{class:r.detachedContainer,onMouseDown:function(e){e.stopPropagation()}}),h=f("div",{class:r.detachedOverlay,children:[g],onMouseDown:function(){u(!1),t.setIsOpen(!1)}}),b=l.getLabelProps(lr({state:c,props:t.getLabelProps({})},n)),v=f("button",{class:r.submitButton,type:"submit",title:d.submitButtonTitle,children:[Fn({environment:i})]}),y=f("label",lr({class:r.label,children:[v]},b)),w=f("button",{class:r.clearButton,type:"reset",title:d.clearButtonTitle,children:[Bn({environment:i})]}),k=f("div",{class:r.loadingIndicator,children:[zn({environment:i})]}),E=ar({class:r.input,environment:i,state:c,getInputProps:l.getInputProps,getInputPropsCore:t.getInputProps,autocompleteScopeApi:n,isDetached:a}),_=f("div",{class:r.inputWrapperPrefix,children:[y,k]}),S=f("div",{class:r.inputWrapperSuffix,children:[w]}),x=f("div",{class:r.inputWrapper,children:[E]}),O=l.getFormProps(lr({state:c,props:t.getFormProps({inputElement:E})},n)),P=f("form",lr({class:r.form,children:[_,x,S]},O)),C=l.getPanelProps(lr({state:c,props:t.getPanelProps({})},n)),T=f("div",lr({class:r.panel},C)),I=f("div",{class:r.detachedSearchButtonQuery,textContent:c.query}),A=f("div",{class:r.detachedSearchButtonPlaceholder,hidden:Boolean(c.query),textContent:s});if(a){var N=f("div",{class:r.detachedSearchButtonIcon,children:[Fn({environment:i})]}),j=f("button",{type:"button",class:r.detachedSearchButton,onClick:function(){u(!0)},children:[N,A,I]}),L=f("button",{type:"button",class:r.detachedCancelButton,textContent:d.detachedCancelButtonText,onTouchStart:function(e){e.stopPropagation()},onClick:function(){t.setIsOpen(!1),u(!1)}}),R=f("div",{class:r.detachedFormContainer,children:[P,L]});g.appendChild(R),m.appendChild(j)}else m.appendChild(P);return{detachedContainer:g,detachedOverlay:h,detachedSearchButtonQuery:I,detachedSearchButtonPlaceholder:A,inputWrapper:x,input:E,root:m,form:P,label:y,submitButton:v,clearButton:w,loadingIndicator:k,panel:T}}({autocomplete:m.value,autocompleteScopeApi:b,classNames:f.value.renderer.classNames,environment:f.value.core.environment,isDetached:p.value,placeholder:f.value.core.placeholder,propGetters:h,setIsModalOpen:_,state:g.current,translations:f.value.renderer.translations})}));function w(){Zn(y.value.panel,{style:p.value?{}:Pi({panelPlacement:f.value.renderer.panelPlacement,container:y.value.root,form:y.value.form,environment:f.value.core.environment})})}function k(e){g.current=e;var t={autocomplete:m.value,autocompleteScopeApi:b,classNames:f.value.renderer.classNames,components:f.value.renderer.components,container:f.value.renderer.container,html:v.value,dom:y.value,panelContainer:p.value?y.value.detachedContainer:f.value.renderer.panelContainer,propGetters:h,state:g.current,renderer:f.value.renderer.renderer},n=!it(e)&&!u.current&&f.value.renderer.renderNoResults||f.value.renderer.render;!function(e){var t=e.autocomplete,n=e.autocompleteScopeApi,r=e.dom,i=e.propGetters,a=e.state;Vn(r.root,i.getRootProps(Ai({state:a,props:t.getRootProps({})},n))),Vn(r.input,i.getInputProps(Ai({state:a,props:t.getInputProps({inputElement:r.input}),inputElement:r.input},n))),Zn(r.label,{hidden:"stalled"===a.status}),Zn(r.loadingIndicator,{hidden:"stalled"!==a.status}),Zn(r.clearButton,{hidden:!a.query}),Zn(r.detachedSearchButtonQuery,{textContent:a.query}),Zn(r.detachedSearchButtonPlaceholder,{hidden:Boolean(a.query)})}(t),function(e,t){var n=t.autocomplete,r=t.autocompleteScopeApi,i=t.classNames,a=t.html,o=t.dom,s=t.panelContainer,l=t.propGetters,u=t.state,c=t.components,d=t.renderer;if(u.isOpen){s.contains(o.panel)||"loading"===u.status||s.appendChild(o.panel),o.panel.classList.toggle("aa-Panel--stalled","stalled"===u.status);var f=u.collections.filter((function(e){var t=e.source,n=e.items;return t.templates.noResults||n.length>0})).map((function(e,t){var o=e.source,s=e.items;return d.createElement("section",{key:t,className:i.source,"data-autocomplete-source-id":o.sourceId},o.templates.header&&d.createElement("div",{className:i.sourceHeader},o.templates.header({components:c,createElement:d.createElement,Fragment:d.Fragment,items:s,source:o,state:u,html:a})),o.templates.noResults&&0===s.length?d.createElement("div",{className:i.sourceNoResults},o.templates.noResults({components:c,createElement:d.createElement,Fragment:d.Fragment,source:o,state:u,html:a})):d.createElement("ul",Ti({className:i.list},l.getListProps(Ai({state:u,props:n.getListProps({source:o})},r))),s.map((function(e){var t=n.getItemProps({item:e,source:o});return d.createElement("li",Ti({key:t.id,className:i.item},l.getItemProps(Ai({state:u,props:t},r))),o.templates.item({components:c,createElement:d.createElement,Fragment:d.Fragment,item:e,state:u,html:a}))}))),o.templates.footer&&d.createElement("div",{className:i.sourceFooter},o.templates.footer({components:c,createElement:d.createElement,Fragment:d.Fragment,items:s,source:o,state:u,html:a})))})),p=d.createElement(d.Fragment,null,d.createElement("div",{className:i.panelLayout},f),d.createElement("div",{className:"aa-GradientBottom"})),m=f.reduce((function(e,t){return e[t.props["data-autocomplete-source-id"]]=t,e}),{});e(Ai(Ai({children:p,state:u,sections:f,elements:m},d),{},{components:c,html:a},r),o.panel)}else s.contains(o.panel)&&s.removeChild(o.panel)}(n,t)}function E(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};i();var t,n,r=f.value.renderer,o=r.components,s=Vi(r,Qi);c.current=Fi(s,f.value.core,{components:(t=o,n=function(e){return!e.value.hasOwnProperty("__autocomplete_componentName")},Object.entries(t).reduce((function(e,t){var r=qi(t,2),i=r[0],a=r[1];return n({key:i,value:a})?Ui(Ui({},e),{},$i({},i,a)):e}),{})),initialState:g.current},e),l(),a(),m.value.refresh().then((function(){k(g.current)}))}function _(e){requestAnimationFrame((function(){var t=f.value.core.environment.document.body.contains(y.value.detachedOverlay);e!==t&&(e?(f.value.core.environment.document.body.appendChild(y.value.detachedOverlay),f.value.core.environment.document.body.classList.add("aa-Detached"),y.value.input.focus()):(f.value.core.environment.document.body.removeChild(y.value.detachedOverlay),f.value.core.environment.document.body.classList.remove("aa-Detached")))}))}return r((function(){var e=m.value.getEnvironmentProps({formElement:y.value.form,panelElement:y.value.panel,inputElement:y.value.input});return Zn(f.value.core.environment,e),function(){Zn(f.value.core.environment,Object.keys(e).reduce((function(e,t){return Gi(Gi({},e),{},Yi({},t,void 0))}),{}))}})),r((function(){var e=p.value?f.value.core.environment.document.body:f.value.renderer.panelContainer,t=p.value?y.value.detachedOverlay:y.value.panel;return p.value&&g.current.isOpen&&_(!0),k(g.current),function(){e.contains(t)&&e.removeChild(t)}})),r((function(){var e=f.value.renderer.container;return e.appendChild(y.value.root),function(){e.removeChild(y.value.root)}})),r((function(){var e=be((function(e){k(e.state)}),0);return d.current=function(t){var n=t.state,r=t.prevState;(p.value&&r.isOpen!==n.isOpen&&_(n.isOpen),p.value||!n.isOpen||r.isOpen||w(),n.query!==r.query)&&f.value.core.environment.document.querySelectorAll(".aa-Panel--scrollable").forEach((function(e){0!==e.scrollTop&&(e.scrollTop=0)}));e({state:n})},function(){d.current=void 0}})),r((function(){var e=be((function(){var e=p.value;p.value=f.value.core.environment.matchMedia(f.value.renderer.detachedMediaQuery).matches,e!==p.value?E({}):requestAnimationFrame(w)}),20);return f.value.core.environment.addEventListener("resize",e),function(){f.value.core.environment.removeEventListener("resize",e)}})),r((function(){if(!p.value)return function(){};function e(e){y.value.detachedContainer.classList.toggle("aa-DetachedContainer--modal",e)}function t(t){e(t.matches)}var n=f.value.core.environment.matchMedia(getComputedStyle(f.value.core.environment.document.documentElement).getPropertyValue("--aa-detached-modal-media-query"));e(n.matches);var r=Boolean(n.addEventListener);return r?n.addEventListener("change",t):n.addListener(t),function(){r?n.removeEventListener("change",t):n.removeListener(t)}})),r((function(){return requestAnimationFrame(w),function(){}})),Gi(Gi({},b),{},{update:E,destroy:function(){i()}})}var Xi=n(1514);const Ji=n(5351),ea=Ji;var ta=n(813),na=n.n(ta);function ra(){const e=(0,l.TH)(),t=(0,l.k6)(),{siteConfig:{baseUrl:n}}=(0,le.Z)(),[i,a]=(0,r.useState)({terms:[],isDocsOrBlog:!1});return(0,r.useEffect)((()=>{if(!e.state?.cmfcmfhighlight||0===e.state.cmfcmfhighlight.terms.length)return;a(e.state.cmfcmfhighlight);const{cmfcmfhighlight:n,...r}=e.state;t.replace({...e,state:r})}),[e.state?.cmfcmfhighlight,t,e]),(0,r.useEffect)((()=>{if(0===i.terms.length)return;const e=i.isDocsOrBlog?document.getElementsByTagName("article")[0]:document.getElementsByTagName("main")[0];if(!e)return;const t=new(na())(e),n={ignoreJoiners:!0};return t.mark(i.terms,n),()=>t.unmark(n)}),[i,n]),null}var ia=n(1610),aa=n(246);function oa(e){let{document:t}=e;const[n,r]=t.sectionRoute.split("#");let i=n;return r&&(i+="#"+r),i}const sa={documents:[],index:ea((function(){this.ref("id"),this.field("title"),this.field("content")}))};const la=()=>{const e=(0,B.Z)(),[t,n]=(0,r.useState)((()=>!!e&&"dark"===document.documentElement.getAttribute("data-theme")));(0,r.useEffect)((()=>{const e=new MutationObserver((()=>{n("dark"===document.documentElement.getAttribute("data-theme"))}));return e.observe(document.documentElement,{attributes:!0,attributeFilter:["data-theme"]}),()=>e.disconnect()}),[]);const{siteConfig:{baseUrl:i}}=(0,le.Z)(),{titleBoost:a,contentBoost:o,tagsBoost:s,parentCategoriesBoost:c,indexDocSidebarParentCategories:d,maxSearchResults:f}=(0,ia.eZ)("@cmfcmf/docusaurus-search-local"),p=(0,l.k6)(),{tags:m}=(0,aa._q)(),g=(0,r.useRef)(m);(0,r.useEffect)((()=>{g.current=m}),[m]);const h=(0,r.useRef)({}),b=async e=>{const t=h.current[e];switch(t?.state){case"ready":return t;case void 0:{const t=[];h.current[e]={state:"loading",callbacks:t};const n=await async function(e,t){{let r;try{const n=await fetch(`${e}search-index-${t}.json`);if(!n.ok)return sa;r=await n.json()}catch(n){return sa}return{documents:r.documents,index:ea.Index.load(r.index)}}}(i,e);return t.forEach((e=>e(n))),h.current[e]={state:"ready",...n}}case"loading":return new Promise((e=>{t.callbacks.push(e)}))}},v=(0,u.I)({message:"cmfcmf/d-s-l.searchBar.placeholder",description:"Placeholder shown in the searchbar"}),y=(0,r.useRef)(null),w=(0,r.useRef)(null);return(0,r.useEffect)((()=>{if(y.current)return w.current=Ki({container:y.current,placeholder:v,renderer:{createElement:r.createElement,Fragment:r.Fragment,render:he.render},navigator:{navigate(e){let{item:t,itemUrl:n}=e;p.push(n,{cmfcmfhighlight:{terms:t.terms,isDocsOrBlog:"docs"===t.document.type||"blog"===t.document.type}})}},detachedMediaQuery:"",defaultActiveItemId:0,translations:{clearButtonTitle:(0,u.I)({message:"cmfcmf/d-s-l.searchBar.clearButtonTitle",description:"Title of the button to clear the current search input"}),detachedCancelButtonText:(0,u.I)({message:"cmfcmf/d-s-l.searchBar.detachedCancelButtonText",description:"Text of the button to close the detached search window"}),submitButtonTitle:(0,u.I)({message:"cmfcmf/d-s-l.searchBar.submitButtonTitle",description:"Title of the button to submit a new search"})},getSources(e){let{query:t}=e;return[{sourceId:"search-results",templates:{item(e){let{item:t}=e;const n=oa(t);return r.createElement("a",{href:n,className:"aa-ItemLink",onClick:e=>{e.preventDefault(),p.push(n,{cmfcmfhighlight:{terms:t.terms,isDocsOrBlog:"docs"===t.document.type||"blog"===t.document.type}})}},r.createElement("div",{className:"aa-ItemContent"},r.createElement("div",{className:"aa-ItemContentBody"},r.createElement("div",{className:"aa-ItemContentTitle"},t.document.sectionTitle),t.document.pageTitle!==t.document.sectionTitle&&r.createElement("div",{className:"aa-ItemContentDescription"},t.document.pageTitle))),r.createElement("div",{className:"aa-ItemActions"},r.createElement("button",{className:"aa-ItemActionButton aa-DesktopOnly aa-ActiveOnly",type:"button",title:"Select"},r.createElement("svg",{viewBox:"0 0 24 24",width:"20",height:"20",fill:"currentColor"},r.createElement("path",{d:"M18.984 6.984h2.016v6h-15.188l3.609 3.609-1.406 1.406-6-6 6-6 1.406 1.406-3.609 3.609h13.172v-4.031z"})))))},noResults:()=>r.createElement("div",{className:"aa-ItemContent"},r.createElement("div",{className:"aa-ItemContentBody"},(0,u.I)({message:"cmfcmf/d-s-l.searchBar.noResults",description:"message shown if no results are found"})))},getItemUrl(e){let{item:t}=e;return oa(t)},async getItems(){const e=g.current,n=await Promise.all(e.map((e=>b(e)))),r=(e=>Ji.tokenizer(e).map((e=>e.str)))(t);return n.flatMap((e=>{let{index:t,documents:n}=e;return t.query((e=>{e.term(r,{fields:["title"],boost:a}),e.term(r,{fields:["title"],boost:a,wildcard:ea.Query.wildcard.TRAILING}),e.term(r,{fields:["content"],boost:o}),e.term(r,{fields:["content"],boost:o,wildcard:ea.Query.wildcard.TRAILING}),e.term(r,{fields:["tags"],boost:s}),e.term(r,{fields:["tags"],boost:s,wildcard:ea.Query.wildcard.TRAILING}),d&&(e.term(r,{fields:["sidebarParentCategories"],boost:c}),e.term(r,{fields:["sidebarParentCategories"],boost:c,wildcard:ea.Query.wildcard.TRAILING}))})).slice(0,f).map((e=>({document:n.find((t=>t.id.toString()===e.ref)),score:e.score,terms:r})))})).sort(((e,t)=>t.score-e.score)).slice(0,f)}}]}}),()=>w.current?.destroy()}),[f]),r.createElement(r.Fragment,null,r.createElement(Xi.Z,null,r.createElement("body",{"data-theme":t?"dark":"light"})),r.createElement(ra,null),r.createElement("div",{className:"dsla-search-wrapper"},r.createElement("div",{className:"dsla-search-field",ref:y,"data-tags":m.join(",")})))},ua={searchBox:"searchBox_ZlJk"};function ca(e){let{children:t,className:n}=e;return r.createElement("div",{className:(0,i.Z)(n,ua.searchBox)},t)}var da=n(868),fa=n(8259);var pa=n(6409);const ma=e=>e.docs.find((t=>t.id===e.mainDocId));const ga={default:ae,localeDropdown:function(e){let{mobile:t,dropdownItemsBefore:n,dropdownItemsAfter:i,...a}=e;const{i18n:{currentLocale:o,locales:c,localeConfigs:d}}=(0,le.Z)(),f=(0,pe.l)(),{search:p,hash:m}=(0,l.TH)(),g=[...n,...c.map((e=>{const n=`${`pathname://${f.createUrl({locale:e,fullyQualified:!1})}`}${p}${m}`;return{label:d[e].label,lang:d[e].htmlLang,to:n,target:"_self",autoAddBaseUrl:!1,className:e===o?t?"menu__link--active":"dropdown__link--active":""}})),...i],h=t?(0,u.I)({message:"Languages",id:"theme.navbar.mobileLanguageDropdown.label",description:"The label for the mobile language switcher dropdown"}):d[o].label;return r.createElement(fe,(0,s.Z)({},a,{mobile:t,label:r.createElement(r.Fragment,null,r.createElement(me,{className:ge}),h),items:g}))},search:function(e){let{mobile:t,className:n}=e;return t?null:r.createElement(ca,{className:n},r.createElement(la,null))},dropdown:fe,html:function(e){let{value:t,className:n,mobile:a=!1,isDropdownItem:o=!1}=e;const s=o?"li":"div";return r.createElement(s,{className:(0,i.Z)({navbar__item:!a&&!o,"menu__list-item":a},n),dangerouslySetInnerHTML:{__html:t}})},doc:function(e){let{docId:t,label:n,docsPluginId:i,...a}=e;const{activeDoc:o}=(0,da.Iw)(i),l=(0,fa.vY)(t,i);return null===l?null:r.createElement(ae,(0,s.Z)({exact:!0},a,{isActive:()=>o?.path===l.path||!!o?.sidebar&&o.sidebar===l.sidebar,label:n??l.id,to:l.path}))},docSidebar:function(e){let{sidebarId:t,label:n,docsPluginId:i,...a}=e;const{activeDoc:o}=(0,da.Iw)(i),l=(0,fa.oz)(t,i).link;if(!l)throw new Error(`DocSidebarNavbarItem: Sidebar with ID "${t}" doesn't have anything to be linked to.`);return r.createElement(ae,(0,s.Z)({exact:!0},a,{isActive:()=>o?.sidebar===t,label:n??l.label,to:l.path}))},docsVersion:function(e){let{label:t,to:n,docsPluginId:i,...a}=e;const o=(0,fa.lO)(i)[0],l=t??o.label,u=n??(e=>e.docs.find((t=>t.id===e.mainDocId)))(o).path;return r.createElement(ae,(0,s.Z)({},a,{label:l,to:u}))},docsVersionDropdown:function(e){let{mobile:t,docsPluginId:n,dropdownActiveClassDisabled:i,dropdownItemsBefore:a,dropdownItemsAfter:o,...c}=e;const{search:d,hash:f}=(0,l.TH)(),p=(0,da.Iw)(n),m=(0,da.gB)(n),{savePreferredVersionName:g}=(0,pa.J)(n),h=m.map((e=>{const t=p.alternateDocVersions[e.name]??ma(e);return{label:e.label,to:`${t.path}${d}${f}`,isActive:()=>e===p.activeVersion,onClick:()=>g(e.name)}})),b=[...a,...h,...o],v=(0,fa.lO)(n)[0],y=t&&b.length>1?(0,u.I)({id:"theme.navbar.mobileVersionsDropdown.label",message:"Versions",description:"The label for the navbar versions dropdown on mobile view"}):v.label,w=t&&b.length>1?void 0:ma(v).path;return b.length<=1?r.createElement(ae,(0,s.Z)({},c,{mobile:t,label:y,to:w,isActive:i?()=>!1:void 0})):r.createElement(fe,(0,s.Z)({},c,{mobile:t,label:y,to:w,items:b,isActive:i?()=>!1:void 0}))}},ha=ga;function ba(e){let{type:t,...n}=e;const i=function(e,t){return e&&"default"!==e?e:"items"in t?"dropdown":"default"}(t,n),a=ha[i];if(!a)throw new Error(`No NavbarItem component found for type "${t}".`);return r.createElement(a,n)}function va(){const e=(0,T.e)(),t=(0,w.L)().navbar.items;return r.createElement("ul",{className:"menu__list"},t.map(((t,n)=>r.createElement(ba,(0,s.Z)({mobile:!0},t,{onClick:()=>e.toggle(),key:n})))))}function ya(e){return r.createElement("button",(0,s.Z)({},e,{type:"button",className:"clean-btn navbar-sidebar__back"}),r.createElement(u.Z,{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)"},"\u2190 Back to main menu"))}function wa(){const e=0===(0,w.L)().navbar.items.length,t=D();return r.createElement(r.Fragment,null,!e&&r.createElement(ya,{onClick:()=>t.hide()}),t.content)}function ka(){const e=(0,T.e)();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?r.createElement(M,{header:r.createElement(Y,null),primaryMenu:r.createElement(va,null),secondaryMenu:r.createElement(wa,null)}):null}const Ea={navbarHideable:"navbarHideable_m1mJ",navbarHidden:"navbarHidden_jGov"};function _a(e){return r.createElement("div",(0,s.Z)({role:"presentation"},e,{className:(0,i.Z)("navbar-sidebar__backdrop",e.className)}))}function Sa(e){let{children:t}=e;const{navbar:{hideOnScroll:n,style:a}}=(0,w.L)(),o=(0,T.e)(),{navbarRef:s,isNavbarVisible:l}=function(e){const[t,n]=(0,r.useState)(e),i=(0,r.useRef)(!1),a=(0,r.useRef)(0),o=(0,r.useCallback)((e=>{null!==e&&(a.current=e.getBoundingClientRect().height)}),[]);return(0,I.RF)(((t,r)=>{let{scrollY:o}=t;if(!e)return;if(o=s?n(!1):o+u{if(!e)return;const r=t.location.hash;if(r?document.getElementById(r.substring(1)):void 0)return i.current=!0,void n(!1);n(!0)})),{navbarRef:o,isNavbarVisible:t}}(n);return r.createElement("nav",{ref:s,"aria-label":(0,u.I)({id:"theme.NavBar.navAriaLabel",message:"Main",description:"The ARIA label for the main navigation"}),className:(0,i.Z)("navbar","navbar--fixed-top",n&&[Ea.navbarHideable,!l&&Ea.navbarHidden],{"navbar--dark":"dark"===a,"navbar--primary":"primary"===a,"navbar-sidebar--show":o.shown})},t,r.createElement(_a,{onClick:o.toggle}),r.createElement(ka,null))}var xa=n(3905);const Oa={errorBoundaryError:"errorBoundaryError_a6uf"};function Pa(e){return r.createElement("button",(0,s.Z)({type:"button"},e),r.createElement(u.Z,{id:"theme.ErrorPageContent.tryAgain",description:"The label of the button to try again rendering when the React error boundary captures an error"},"Try again"))}function Ca(e){let{error:t}=e;const n=(0,xa.getErrorCausalChain)(t).map((e=>e.message)).join("\n\nCause:\n");return r.createElement("p",{className:Oa.errorBoundaryError},n)}class Ta extends r.Component{componentDidCatch(e,t){throw this.props.onError(e,t)}render(){return this.props.children}}const Ia="right";function Aa(e){let{width:t=30,height:n=30,className:i,...a}=e;return r.createElement("svg",(0,s.Z)({className:i,width:t,height:n,viewBox:"0 0 30 30","aria-hidden":"true"},a),r.createElement("path",{stroke:"currentColor",strokeLinecap:"round",strokeMiterlimit:"10",strokeWidth:"2",d:"M4 7h22M4 15h22M4 23h22"}))}function Na(){const{toggle:e,shown:t}=(0,T.e)();return r.createElement("button",{onClick:e,"aria-label":(0,u.I)({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"},r.createElement(Aa,null))}const ja={colorModeToggle:"colorModeToggle_DEke"};function La(e){let{items:t}=e;return r.createElement(r.Fragment,null,t.map(((e,t)=>r.createElement(Ta,{key:t,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})},r.createElement(ba,e)))))}function Ra(e){let{left:t,right:n}=e;return r.createElement("div",{className:"navbar__inner"},r.createElement("div",{className:"navbar__items"},t),r.createElement("div",{className:"navbar__items navbar__items--right"},n))}function Da(){const e=(0,T.e)(),t=(0,w.L)().navbar.items,[n,i]=function(e){function t(e){return"left"===(e.position??Ia)}return[e.filter(t),e.filter((e=>!t(e)))]}(t),a=t.find((e=>"search"===e.type));return r.createElement(Ra,{left:r.createElement(r.Fragment,null,!e.disabled&&r.createElement(Na,null),r.createElement(W,null),r.createElement(La,{items:n})),right:r.createElement(r.Fragment,null,r.createElement(La,{items:i}),r.createElement(Z,{className:ja.colorModeToggle}),!a&&r.createElement(ca,null,r.createElement(la,null)))})}function Ma(){return r.createElement(Sa,null,r.createElement(Da,null))}function Fa(e){let{item:t}=e;const{to:n,href:i,label:a,prependBaseUrlToHref:o,...l}=t,u=(0,X.Z)(n),c=(0,X.Z)(i,{forcePrependBaseUrl:!0});return r.createElement(K.Z,(0,s.Z)({className:"footer__link-item"},i?{href:o?c:i}:{to:u},l),a,i&&!(0,J.Z)(i)&&r.createElement(te.Z,null))}function Ba(e){let{item:t}=e;return t.html?r.createElement("li",{className:"footer__item",dangerouslySetInnerHTML:{__html:t.html}}):r.createElement("li",{key:t.href??t.to,className:"footer__item"},r.createElement(Fa,{item:t}))}function za(e){let{column:t}=e;return r.createElement("div",{className:"col footer__col"},r.createElement("div",{className:"footer__title"},t.title),r.createElement("ul",{className:"footer__items clean-list"},t.items.map(((e,t)=>r.createElement(Ba,{key:t,item:e})))))}function Ua(e){let{columns:t}=e;return r.createElement("div",{className:"row footer__links"},t.map(((e,t)=>r.createElement(za,{key:t,column:e}))))}function $a(){return r.createElement("span",{className:"footer__link-separator"},"\xb7")}function qa(e){let{item:t}=e;return t.html?r.createElement("span",{className:"footer__link-item",dangerouslySetInnerHTML:{__html:t.html}}):r.createElement(Fa,{item:t})}function Ha(e){let{links:t}=e;return r.createElement("div",{className:"footer__links text--center"},r.createElement("div",{className:"footer__links"},t.map(((e,n)=>r.createElement(r.Fragment,{key:n},r.createElement(qa,{item:e}),t.length!==n+1&&r.createElement($a,null))))))}function Qa(e){let{links:t}=e;return function(e){return"title"in e[0]}(t)?r.createElement(Ua,{columns:t}):r.createElement(Ha,{links:t})}var Za=n(7909);const Va={footerLogoLink:"footerLogoLink_BH7S"};function Wa(e){let{logo:t}=e;const{withBaseUrl:n}=(0,X.C)(),a={light:n(t.src),dark:n(t.srcDark??t.src)};return r.createElement(Za.Z,{className:(0,i.Z)("footer__logo",t.className),alt:t.alt,sources:a,width:t.width,height:t.height,style:t.style})}function Ga(e){let{logo:t}=e;return t.href?r.createElement(K.Z,{href:t.href,className:Va.footerLogoLink,target:t.target},r.createElement(Wa,{logo:t})):r.createElement(Wa,{logo:t})}function Ya(e){let{copyright:t}=e;return r.createElement("div",{className:"footer__copyright",dangerouslySetInnerHTML:{__html:t}})}function Ka(e){let{style:t,links:n,logo:a,copyright:o}=e;return r.createElement("footer",{className:(0,i.Z)("footer",{"footer--dark":"dark"===t})},r.createElement("div",{className:"container container-fluid"},n,(a||o)&&r.createElement("div",{className:"footer__bottom text--center"},a&&r.createElement("div",{className:"margin-bottom--sm"},a),o)))}function Xa(){const{footer:e}=(0,w.L)();if(!e)return null;const{copyright:t,links:n,logo:i,style:a}=e;return r.createElement(Ka,{style:a,links:n&&n.length>0&&r.createElement(Qa,{links:n}),logo:i&&r.createElement(Ga,{logo:i}),copyright:t&&r.createElement(Ya,{copyright:t})})}const Ja=r.memo(Xa),eo=(0,A.Qc)([F.S,k.pl,I.OC,pa.L5,o.VC,function(e){let{children:t}=e;return r.createElement(N.n2,null,r.createElement(T.M,null,r.createElement(L,null,t)))}]);function to(e){let{children:t}=e;return r.createElement(eo,null,t)}function no(e){let{error:t,tryAgain:n}=e;return r.createElement("main",{className:"container margin-vert--xl"},r.createElement("div",{className:"row"},r.createElement("div",{className:"col col--6 col--offset-3"},r.createElement("h1",{className:"hero__title"},r.createElement(u.Z,{id:"theme.ErrorPageContent.title",description:"The title of the fallback page when the page crashed"},"This page crashed.")),r.createElement("div",{className:"margin-vert--lg"},r.createElement(Pa,{onClick:n,className:"button button--primary shadow--lw"})),r.createElement("hr",null),r.createElement("div",{className:"margin-vert--md"},r.createElement(Ca,{error:t})))))}const ro={mainWrapper:"mainWrapper_z2l0"};function io(e){const{children:t,noFooter:n,wrapperClassName:s,title:l,description:u}=e;return(0,b.t)(),r.createElement(to,null,r.createElement(o.d,{title:l,description:u}),r.createElement(y,null),r.createElement(C,null),r.createElement(Ma,null),r.createElement("div",{id:d,className:(0,i.Z)(h.k.wrapper.main,ro.mainWrapper,s)},r.createElement(a.Z,{fallback:e=>r.createElement(no,e)},t)),!n&&r.createElement(Ja,null))}},6811:(e,t,n)=>{"use strict";n.d(t,{Z:()=>d});var r=n(7462),i=n(7294),a=n(3699),o=n(9524),s=n(9962),l=n(107),u=n(7909);function c(e){let{logo:t,alt:n,imageClassName:r}=e;const a={light:(0,o.Z)(t.src),dark:(0,o.Z)(t.srcDark||t.src)},s=i.createElement(u.Z,{className:t.className,sources:a,height:t.height,width:t.width,alt:n,style:t.style});return r?i.createElement("div",{className:r},s):s}function d(e){const{siteConfig:{title:t}}=(0,s.Z)(),{navbar:{title:n,logo:u}}=(0,l.L)(),{imageClassName:d,titleClassName:f,...p}=e,m=(0,o.Z)(u?.href||"/"),g=n?"":t,h=u?.alt??g;return i.createElement(a.Z,(0,r.Z)({to:m},p,u?.target&&{target:u.target}),u&&i.createElement(c,{logo:u,alt:h,imageClassName:d}),null!=n&&i.createElement("b",{className:f},n))}},3647:(e,t,n)=>{"use strict";n.d(t,{Z:()=>a});var r=n(7294),i=n(1514);function a(e){let{locale:t,version:n,tag:a}=e;const o=t;return r.createElement(i.Z,null,t&&r.createElement("meta",{name:"docusaurus_locale",content:t}),n&&r.createElement("meta",{name:"docusaurus_version",content:n}),a&&r.createElement("meta",{name:"docusaurus_tag",content:a}),o&&r.createElement("meta",{name:"docsearch:language",content:o}),n&&r.createElement("meta",{name:"docsearch:version",content:n}),a&&r.createElement("meta",{name:"docsearch:docusaurus_tag",content:a}))}},7909:(e,t,n)=>{"use strict";n.d(t,{Z:()=>u});var r=n(7462),i=n(7294),a=n(6010),o=n(1048),s=n(9200);const l={themedImage:"themedImage_ToTc","themedImage--light":"themedImage--light_HNdA","themedImage--dark":"themedImage--dark_i4oU"};function u(e){const t=(0,o.Z)(),{colorMode:n}=(0,s.I)(),{sources:u,className:c,alt:d,...f}=e,p=t?"dark"===n?["dark"]:["light"]:["light","dark"];return i.createElement(i.Fragment,null,p.map((e=>i.createElement("img",(0,r.Z)({key:e,src:u[e],alt:d,className:(0,a.Z)(l.themedImage,l[`themedImage--${e}`],c)},f)))))}},4639:(e,t,n)=>{"use strict";n.d(t,{u:()=>l,z:()=>h});var r=n(7462),i=n(7294),a=n(6136),o=n(8986);const s="ease-in-out";function l(e){let{initialState:t}=e;const[n,r]=(0,i.useState)(t??!1),a=(0,i.useCallback)((()=>{r((e=>!e))}),[]);return{collapsed:n,setCollapsed:r,toggleCollapsed:a}}const u={display:"none",overflow:"hidden",height:"0px"},c={display:"block",overflow:"visible",height:"auto"};function d(e,t){const n=t?u:c;e.style.display=n.display,e.style.overflow=n.overflow,e.style.height=n.height}function f(e){let{collapsibleRef:t,collapsed:n,animation:r}=e;const a=(0,i.useRef)(!1);(0,i.useEffect)((()=>{const e=t.current;function i(){const t=e.scrollHeight,n=r?.duration??function(e){if((0,o.n)())return 1;const t=e/36;return Math.round(10*(4+15*t**.25+t/5))}(t);return{transition:`height ${n}ms ${r?.easing??s}`,height:`${t}px`}}function l(){const t=i();e.style.transition=t.transition,e.style.height=t.height}if(!a.current)return d(e,n),void(a.current=!0);return e.style.willChange="height",function(){const t=requestAnimationFrame((()=>{n?(l(),requestAnimationFrame((()=>{e.style.height=u.height,e.style.overflow=u.overflow}))):(e.style.display="block",requestAnimationFrame((()=>{l()})))}));return()=>cancelAnimationFrame(t)}()}),[t,n,r])}function p(e){if(!a.Z.canUseDOM)return e?u:c}function m(e){let{as:t="div",collapsed:n,children:r,animation:a,onCollapseTransitionEnd:o,className:s,disableSSRStyle:l}=e;const u=(0,i.useRef)(null);return f({collapsibleRef:u,collapsed:n,animation:a}),i.createElement(t,{ref:u,style:l?void 0:p(n),onTransitionEnd:e=>{"height"===e.propertyName&&(d(u.current,n),o?.(n))},className:s},r)}function g(e){let{collapsed:t,...n}=e;const[a,o]=(0,i.useState)(!t),[s,l]=(0,i.useState)(t);return(0,i.useLayoutEffect)((()=>{t||o(!0)}),[t]),(0,i.useLayoutEffect)((()=>{a&&l(t)}),[a,t]),a?i.createElement(m,(0,r.Z)({},n,{collapsed:s})):null}function h(e){let{lazy:t,...n}=e;const r=t?g:m;return i.createElement(r,n)}},5830:(e,t,n)=>{"use strict";n.d(t,{nT:()=>m,pl:()=>p});var r=n(7294),i=n(1048),a=n(2560),o=n(3768),s=n(107);const l=(0,a.WA)("docusaurus.announcement.dismiss"),u=(0,a.WA)("docusaurus.announcement.id"),c=()=>"true"===l.get(),d=e=>l.set(String(e)),f=r.createContext(null);function p(e){let{children:t}=e;const n=function(){const{announcementBar:e}=(0,s.L)(),t=(0,i.Z)(),[n,a]=(0,r.useState)((()=>!!t&&c()));(0,r.useEffect)((()=>{a(c())}),[]);const o=(0,r.useCallback)((()=>{d(!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&&d(!1),!r&&c()||a(!1)}),[e]),(0,r.useMemo)((()=>({isActive:!!e&&!n,close:o})),[e,n,o])}();return r.createElement(f.Provider,{value:n},t)}function m(){const e=(0,r.useContext)(f);if(!e)throw new o.i6("AnnouncementBarProvider");return e}},9200:(e,t,n)=>{"use strict";n.d(t,{I:()=>h,S:()=>g});var r=n(7294),i=n(6136),a=n(3768),o=n(2560),s=n(107);const l=r.createContext(void 0),u="theme",c=(0,o.WA)(u),d={light:"light",dark:"dark"},f=e=>e===d.dark?d.dark:d.light,p=e=>i.Z.canUseDOM?f(document.documentElement.getAttribute("data-theme")):f(e),m=e=>{c.set(f(e))};function g(e){let{children:t}=e;const n=function(){const{colorMode:{defaultMode:e,disableSwitch:t,respectPrefersColorScheme:n}}=(0,s.L)(),[i,a]=(0,r.useState)(p(e));(0,r.useEffect)((()=>{t&&c.del()}),[t]);const o=(0,r.useCallback)((function(t,r){void 0===r&&(r={});const{persist:i=!0}=r;t?(a(t),i&&m(t)):(a(n?window.matchMedia("(prefers-color-scheme: dark)").matches?d.dark:d.light:e),c.del())}),[n,e]);(0,r.useEffect)((()=>{document.documentElement.setAttribute("data-theme",f(i))}),[i]),(0,r.useEffect)((()=>{if(t)return;const e=e=>{if(e.key!==u)return;const t=c.get();null!==t&&o(f(t))};return window.addEventListener("storage",e),()=>window.removeEventListener("storage",e)}),[t,o]);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:o(null)};return e.addListener(r),()=>e.removeListener(r)}),[o,t,n]),(0,r.useMemo)((()=>({colorMode:i,setColorMode:o,get isDarkTheme(){return i===d.dark},setLightTheme(){o(d.light)},setDarkTheme(){o(d.dark)}})),[i,o])}();return r.createElement(l.Provider,{value:n},t)}function h(){const e=(0,r.useContext)(l);if(null==e)throw new a.i6("ColorModeProvider","Please see https://docusaurus.io/docs/api/themes/configuration#use-color-mode.");return e}},6409:(e,t,n)=>{"use strict";n.d(t,{J:()=>v,L5:()=>h,Oh:()=>y});var r=n(7294),i=n(868),a=n(6875),o=n(107),s=n(8259),l=n(3768),u=n(2560);const c=e=>`docs-preferred-version-${e}`,d={save:(e,t,n)=>{(0,u.WA)(c(e),{persistence:t}).set(n)},read:(e,t)=>(0,u.WA)(c(e),{persistence:t}).get(),clear:(e,t)=>{(0,u.WA)(c(e),{persistence:t}).del()}},f=e=>Object.fromEntries(e.map((e=>[e,{preferredVersionName:null}])));const p=r.createContext(null);function m(){const e=(0,i._r)(),t=(0,o.L)().docs.versionPersistence,n=(0,r.useMemo)((()=>Object.keys(e)),[e]),[a,s]=(0,r.useState)((()=>f(n)));(0,r.useEffect)((()=>{s(function(e){let{pluginIds:t,versionPersistence:n,allDocsData:r}=e;function i(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,i(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 g(e){let{children:t}=e;const n=m();return r.createElement(p.Provider,{value:n},t)}function h(e){let{children:t}=e;return s.cE?r.createElement(g,null,t):r.createElement(r.Fragment,null,t)}function b(){const e=(0,r.useContext)(p);if(!e)throw new l.i6("DocsPreferredVersionContextProvider");return e}function v(e){void 0===e&&(e=a.m);const t=(0,i.zh)(e),[n,o]=b(),{preferredVersionName:s}=n[e];return{preferredVersion:t.versions.find((e=>e.name===s))??null,savePreferredVersionName:(0,r.useCallback)((t=>{o.savePreferredVersion(e,t)}),[o,e])}}function y(){const e=(0,i._r)(),[t]=b();function n(n){const r=e[n],{preferredVersionName:i}=t[n];return r.versions.find((e=>e.name===i))??null}const r=Object.keys(e);return Object.fromEntries(r.map((e=>[e,n(e)])))}},4432:(e,t,n)=>{"use strict";n.d(t,{V:()=>l,b:()=>s});var r=n(7294),i=n(3768);const a=Symbol("EmptyContext"),o=r.createContext(a);function s(e){let{children:t,name:n,items:i}=e;const a=(0,r.useMemo)((()=>n&&i?{name:n,items:i}:null),[n,i]);return r.createElement(o.Provider,{value:a},t)}function l(){const e=(0,r.useContext)(o);if(e===a)throw new i.i6("DocsSidebarProvider");return e}},735:(e,t,n)=>{"use strict";n.d(t,{M:()=>d,e:()=>f});var r=n(7294),i=n(3086),a=n(3488),o=n(5238),s=n(107),l=n(3768);const u=r.createContext(void 0);function c(){const e=function(){const e=(0,i.HY)(),{items:t}=(0,s.L)().navbar;return 0===t.length&&!e.component}(),t=(0,a.i)(),n=!e&&"mobile"===t,[l,u]=(0,r.useState)(!1);(0,o.Rb)((()=>{if(l)return u(!1),!1}));const c=(0,r.useCallback)((()=>{u((e=>!e))}),[]);return(0,r.useEffect)((()=>{"desktop"===t&&u(!1)}),[t]),(0,r.useMemo)((()=>({disabled:e,shouldRender:n,toggle:c,shown:l})),[e,n,c,l])}function d(e){let{children:t}=e;const n=c();return r.createElement(u.Provider,{value:n},t)}function f(){const e=r.useContext(u);if(void 0===e)throw new l.i6("NavbarMobileSidebarProvider");return e}},3086:(e,t,n)=>{"use strict";n.d(t,{HY:()=>s,Zo:()=>l,n2:()=>o});var r=n(7294),i=n(3768);const a=r.createContext(null);function o(e){let{children:t}=e;const n=(0,r.useState)({component:null,props:null});return r.createElement(a.Provider,{value:n},t)}function s(){const e=(0,r.useContext)(a);if(!e)throw new i.i6("NavbarSecondaryMenuContentProvider");return e[0]}function l(e){let{component:t,props:n}=e;const o=(0,r.useContext)(a);if(!o)throw new i.i6("NavbarSecondaryMenuContentProvider");const[,s]=o,l=(0,i.Ql)(n);return(0,r.useEffect)((()=>{s({component:t,props:l})}),[s,t,l]),(0,r.useEffect)((()=>()=>s({component:null,props:null})),[s]),null}},8181:(e,t,n)=>{"use strict";n.d(t,{h:()=>i,t:()=>a});var r=n(7294);const i="navigation-with-keyboard";function a(){(0,r.useEffect)((()=>{function e(e){"keydown"===e.type&&"Tab"===e.key&&document.body.classList.add(i),"mousedown"===e.type&&document.body.classList.remove(i)}return document.addEventListener("keydown",e),document.addEventListener("mousedown",e),()=>{document.body.classList.remove(i),document.removeEventListener("keydown",e),document.removeEventListener("mousedown",e)}}),[])}},3488:(e,t,n)=>{"use strict";n.d(t,{i:()=>u});var r=n(7294),i=n(6136);const a={desktop:"desktop",mobile:"mobile",ssr:"ssr"},o=996;function s(){return i.Z.canUseDOM?window.innerWidth>o?a.desktop:a.mobile:a.ssr}const l=!1;function u(){const[e,t]=(0,r.useState)((()=>l?"ssr":s()));return(0,r.useEffect)((()=>{function e(){t(s())}const n=l?window.setTimeout(e,1e3):void 0;return window.addEventListener("resize",e),()=>{window.removeEventListener("resize",e),clearTimeout(n)}}),[]),e}},3702:(e,t,n)=>{"use strict";n.d(t,{k:()=>r});const r={page:{blogListPage:"blog-list-page",blogPostPage:"blog-post-page",blogTagsListPage:"blog-tags-list-page",blogTagPostListPage:"blog-tags-post-list-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",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:{}}},8986:(e,t,n)=>{"use strict";function r(){return window.matchMedia("(prefers-reduced-motion: reduce)").matches}n.d(t,{n:()=>r})},8259:(e,t,n)=>{"use strict";n.d(t,{Wl:()=>f,_F:()=>g,cE:()=>d,hI:()=>k,lO:()=>v,oz:()=>y,s1:()=>b,vY:()=>w});var r=n(7294),i=n(6550),a=n(8790),o=n(868),s=n(6409),l=n(4432),u=n(3609),c=n(9003);const d=!!o._r;function f(e){if(e.href)return e.href;for(const t of e.items){if("link"===t.type)return t.href;if("category"===t.type){const e=f(t);if(e)return e}}}const p=(e,t)=>void 0!==e&&(0,c.Mg)(e,t),m=(e,t)=>e.some((e=>g(e,t)));function g(e,t){return"link"===e.type?p(e.href,t):"category"===e.type&&(p(e.href,t)||m(e.items,t))}function h(e){let{sidebarItems:t,pathname:n,onlyCategories:r=!1}=e;const i=[];return function e(t){for(const a of t)if("category"===a.type&&((0,c.Mg)(a.href,n)||e(a.items))||"link"===a.type&&(0,c.Mg)(a.href,n)){return r&&"category"!==a.type||i.unshift(a),!0}return!1}(t),i}function b(){const e=(0,l.V)(),{pathname:t}=(0,i.TH)(),n=(0,o.gA)()?.pluginData.breadcrumbs;return!1!==n&&e?h({sidebarItems:e.items,pathname:t}):null}function v(e){const{activeVersion:t}=(0,o.Iw)(e),{preferredVersion:n}=(0,s.J)(e),i=(0,o.yW)(e);return(0,r.useMemo)((()=>(0,u.j)([t,n,i].filter(Boolean))),[t,n,i])}function y(e,t){const n=v(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 w(e,t){const n=v(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,u.j)(t.map((e=>e.id))).join("\n- ")}`)}return r}),[e,n])}function k(e){let{route:t,versionMetadata:n}=e;const r=(0,i.TH)(),o=t.routes,s=o.find((e=>(0,i.LX)(r.pathname,e)));if(!s)return null;const l=s.sidebar,u=l?n.docsSidebars[l]:void 0;return{docElement:(0,a.H)(o),sidebarName:l,sidebarItems:u}}},5238:(e,t,n)=>{"use strict";n.d(t,{Rb:()=>s,_X:()=>l});var r=n(7294),i=n(6550),a=n(1688),o=n(3768);function s(e){!function(e){const t=(0,i.k6)(),n=(0,o.zX)(e);(0,r.useEffect)((()=>t.block(((e,t)=>n(e,t)))),[t,n])}(((t,n)=>{if("POP"===n)return e(t,n)}))}function l(e){return function(e){const t=(0,i.k6)();return(0,a.useSyncExternalStore)(t.listen,(()=>e(t)),(()=>e(t)))}((t=>null===e?null:new URLSearchParams(t.location.search).get(e)))}},3609:(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 i(e){return Array.from(new Set(e))}n.d(t,{j:()=>i,l:()=>r})},5463:(e,t,n)=>{"use strict";n.d(t,{FG:()=>f,d:()=>c,VC:()=>p});var r=n(7294),i=n(6010),a=n(1514),o=n(9656);function s(){const e=r.useContext(o._);if(!e)throw new Error("Unexpected: no Docusaurus route context found");return e}var l=n(9524),u=n(9962);function c(e){let{title:t,description:n,keywords:i,image:o,children:s}=e;const c=function(e){const{siteConfig:t}=(0,u.Z)(),{title:n,titleDelimiter:r}=t;return e?.trim().length?`${e.trim()} ${r} ${n}`:n}(t),{withBaseUrl:d}=(0,l.C)(),f=o?d(o,{absolute:!0}):void 0;return r.createElement(a.Z,null,t&&r.createElement("title",null,c),t&&r.createElement("meta",{property:"og:title",content:c}),n&&r.createElement("meta",{name:"description",content:n}),n&&r.createElement("meta",{property:"og:description",content:n}),i&&r.createElement("meta",{name:"keywords",content:Array.isArray(i)?i.join(","):i}),f&&r.createElement("meta",{property:"og:image",content:f}),f&&r.createElement("meta",{name:"twitter:image",content:f}),s)}const d=r.createContext(void 0);function f(e){let{className:t,children:n}=e;const o=r.useContext(d),s=(0,i.Z)(o,t);return r.createElement(d.Provider,{value:s},r.createElement(a.Z,null,r.createElement("html",{className:s})),n)}function p(e){let{children:t}=e;const n=s(),a=`plugin-${n.plugin.name.replace(/docusaurus-(?:plugin|theme)-(?:content-)?/gi,"")}`;const o=`plugin-id-${n.plugin.id}`;return r.createElement(f,{className:(0,i.Z)(a,o)},t)}},3768:(e,t,n)=>{"use strict";n.d(t,{D9:()=>o,Qc:()=>u,Ql:()=>l,i6:()=>s,zX:()=>a});var r=n(7294);const i=n(6136).Z.canUseDOM?r.useLayoutEffect:r.useEffect;function a(e){const t=(0,r.useRef)(e);return i((()=>{t.current=e}),[e]),(0,r.useCallback)((function(){return t.current(...arguments)}),[])}function o(e){const t=(0,r.useRef)();return i((()=>{t.current=e})),t.current}class s 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 l(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 r.createElement(r.Fragment,null,e.reduceRight(((e,t)=>r.createElement(t,null,e)),n))}}},9003:(e,t,n)=>{"use strict";n.d(t,{Mg:()=>o,Ns:()=>s});var r=n(7294),i=n(997),a=n(9962);function o(e,t){const n=e=>(!e||e.endsWith("/")?e:`${e}/`)?.toLowerCase();return n(e)===n(t)}function s(){const{baseUrl:e}=(0,a.Z)().siteConfig;return(0,r.useMemo)((()=>function(e){let{baseUrl:t,routes:n}=e;function r(e){return e.path===t&&!0===e.exact}function i(e){return e.path===t&&!e.exact}return function e(t){if(0===t.length)return;return t.find(r)||e(t.filter(i).flatMap((e=>e.routes??[])))}(n)}({routes:i.Z,baseUrl:e})),[e])}},2957:(e,t,n)=>{"use strict";n.d(t,{Ct:()=>p,OC:()=>l,RF:()=>d,o5:()=>f});var r=n(7294),i=n(6136),a=n(1048),o=n(3768);const s=r.createContext(void 0);function l(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 r.createElement(s.Provider,{value:n},t)}function u(){const e=(0,r.useContext)(s);if(null==e)throw new o.i6("ScrollControllerProvider");return e}const c=()=>i.Z.canUseDOM?{scrollX:window.pageXOffset,scrollY:window.pageYOffset}:null;function d(e,t){void 0===t&&(t=[]);const{scrollEventsEnabledRef:n}=u(),i=(0,r.useRef)(c()),a=(0,o.zX)(e);(0,r.useEffect)((()=>{const e=()=>{if(!n.current)return;const e=c();a(e,i.current),i.current=e},t={passive:!0};return e(),window.addEventListener("scroll",e,t),()=>window.removeEventListener("scroll",e,t)}),[a,n,...t])}function f(){const e=u(),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),i=(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,r.useLayoutEffect)((()=>{queueMicrotask((()=>n.current?.()))})),{blockElementScrollPositionUntilNextRender:i}}function p(){const e=(0,r.useRef)(null),t=(0,a.Z)()&&"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 i=document.documentElement.scrollTop;(n&&i>e||!n&&it&&cancelAnimationFrame(t)}(n)},cancelScroll:()=>e.current?.()}}},246:(e,t,n)=>{"use strict";n.d(t,{HX:()=>o,_q:()=>l,os:()=>s});var r=n(868),i=n(9962),a=n(6409);const o="default";function s(e,t){return`docs-${e}-${t}`}function l(){const{i18n:e}=(0,i.Z)(),t=(0,r._r)(),n=(0,r.WS)(),l=(0,a.Oh)();const u=[o,...Object.keys(t).map((function(e){const r=n?.activePlugin.pluginId===e?n.activeVersion:void 0,i=l[e],a=t[e].versions.find((e=>e.isLast));return s(e,(r??i??a).name)}))];return{locale:e.currentLocale,tags:u}}},2560:(e,t,n)=>{"use strict";n.d(t,{Nk:()=>d,WA:()=>c});var r=n(7294),i=n(1688);const a="localStorage";function o(e){let{key:t,oldValue:n,newValue:r,storage:i}=e;if(n===r)return;const a=document.createEvent("StorageEvent");a.initStorageEvent("storage",!1,!1,t,n,r,window.location.href,i),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 u={get:()=>null,set:()=>{},del:()=>{},listen:()=>()=>{}};function c(e,t){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}}(e);const n=s(t?.persistence);return null===n?u:{get:()=>{try{return n.getItem(e)}catch(t){return console.error(`Docusaurus storage error, can't get key=${e}`,t),null}},set:t=>{try{const r=n.getItem(e);n.setItem(e,t),o({key:e,oldValue:r,newValue:t,storage:n})}catch(r){console.error(`Docusaurus storage error, can't set ${e}=${t}`,r)}},del:()=>{try{const t=n.getItem(e);n.removeItem(e),o({key:e,oldValue:t,newValue:null,storage:n})}catch(t){console.error(`Docusaurus storage error, can't delete key=${e}`,t)}},listen:t=>{try{const r=r=>{r.storageArea===n&&r.key===e&&t(r)};return window.addEventListener("storage",r),()=>window.removeEventListener("storage",r)}catch(r){return console.error(`Docusaurus storage error, can't listen for changes of key=${e}`,r),()=>{}}}}}function d(e,t){const n=(0,r.useRef)((()=>null===e?u:c(e,t))).current(),a=(0,r.useCallback)((e=>"undefined"==typeof window?()=>{}:n.listen(e)),[n]);return[(0,i.useSyncExternalStore)(a,(()=>"undefined"==typeof window?null:n.get()),(()=>null)),n]}},626:(e,t,n)=>{"use strict";n.d(t,{l:()=>o});var r=n(9962),i=n(6550),a=n(3905);function o(){const{siteConfig:{baseUrl:e,url:t,trailingSlash:n},i18n:{defaultLocale:o,currentLocale:s}}=(0,r.Z)(),{pathname:l}=(0,i.TH)(),u=(0,a.applyTrailingSlash)(l,{trailingSlash:n,baseUrl:e}),c=s===o?e:e.replace(`/${s}/`,"/"),d=u.replace(e,"");return{createUrl:function(e){let{locale:n,fullyQualified:r}=e;return`${r?t:""}${function(e){return e===o?`${c}`:`${c}${e}/`}(n)}${d}`}}}},3266:(e,t,n)=>{"use strict";n.d(t,{S:()=>o});var r=n(7294),i=n(6550),a=n(3768);function o(e){const t=(0,i.TH)(),n=(0,a.D9)(t),o=(0,a.zX)(e);(0,r.useEffect)((()=>{n&&t!==n&&o({location:t,previousLocation:n})}),[o,t,n])}},107:(e,t,n)=>{"use strict";n.d(t,{L:()=>i});var r=n(9962);function i(){return(0,r.Z)().siteConfig.themeConfig}},4136:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),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(/[#?]/),a="/"===i||i===r?i:(o=i,n?function(e){return e.endsWith("/")?e:`${e}/`}(o):function(e){return e.endsWith("/")?e.slice(0,-1):e}(o));var o;return e.replace(i,a)}},5806:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.getErrorCausalChain=void 0,t.getErrorCausalChain=function e(t){return t.cause?[t,...e(t.cause)]:[t]}},3905:function(e,t,n){"use strict";var r=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.getErrorCausalChain=t.applyTrailingSlash=t.blogPostContainerID=void 0,t.blogPostContainerID="__blog-post-container";var i=n(4136);Object.defineProperty(t,"applyTrailingSlash",{enumerable:!0,get:function(){return r(i).default}});var a=n(5806);Object.defineProperty(t,"getErrorCausalChain",{enumerable:!0,get:function(){return a.getErrorCausalChain}})},6010:(e,t,n)=>{"use strict";function r(e){var t,n,i="";if("string"==typeof e||"number"==typeof e)i+=e;else if("object"==typeof e)if(Array.isArray(e))for(t=0;ti});const i=function(){for(var e,t,n=0,i="";n{"use strict";n.d(t,{lX:()=>w,q_:()=>O,ob:()=>p,PP:()=>C,Ep:()=>f});var r=n(7462);function i(e){return"/"===e.charAt(0)}function a(e,t){for(var n=t,r=n+1,i=e.length;r=0;f--){var p=o[f];"."===p?a(o,f):".."===p?(a(o,f),d++):d&&(a(o,f),d--)}if(!u)for(;d--;d)o.unshift("..");!u||""===o[0]||o[0]&&i(o[0])||o.unshift("");var m=o.join("/");return n&&"/"!==m.substr(-1)&&(m+="/"),m};var s=n(8776);function l(e){return"/"===e.charAt(0)?e:"/"+e}function u(e){return"/"===e.charAt(0)?e.substr(1):e}function c(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 f(e){var t=e.pathname,n=e.search,r=e.hash,i=t||"/";return n&&"?"!==n&&(i+="?"===n.charAt(0)?n:"?"+n),r&&"#"!==r&&(i+="#"===r.charAt(0)?r:"#"+r),i}function p(e,t,n,i){var a;"string"==typeof e?(a=function(e){var t=e||"/",n="",r="",i=t.indexOf("#");-1!==i&&(r=t.substr(i),t=t.substr(0,i));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.Z)({},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),i?a.pathname?"/"!==a.pathname.charAt(0)&&(a.pathname=o(a.pathname,i.pathname)):a.pathname=i.pathname:a.pathname||(a.pathname="/"),a}function m(){var e=null;var t=[];return{setPrompt:function(t){return e=t,function(){e===t&&(e=null)}},confirmTransitionTo:function(t,n,r,i){if(null!=e){var a="function"==typeof e?e(t,n):e;"string"==typeof a?"function"==typeof r?r(a,i):i(!0):i(!1!==a)}else i(!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,i):n.push(i),d({action:r,location:i,index:t,entries:n})}}))},replace:function(e,t){var r="REPLACE",i=p(e,t,g(),w.location);c.confirmTransitionTo(i,r,n,(function(e){e&&(w.entries[w.index]=i,d({action:r,location:i}))}))},go:y,goBack:function(){y(-1)},goForward:function(){y(1)},canGo:function(e){var t=w.index+e;return t>=0&&t{"use strict";var r=n(9864),i={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},o={$$typeof:!0,compare:!0,defaultProps:!0,displayName:!0,propTypes:!0,type:!0},s={};function l(e){return r.isMemo(e)?o:s[e.$$typeof]||i}s[r.ForwardRef]={$$typeof:!0,render:!0,defaultProps:!0,displayName:!0,propTypes:!0},s[r.Memo]=o;var u=Object.defineProperty,c=Object.getOwnPropertyNames,d=Object.getOwnPropertySymbols,f=Object.getOwnPropertyDescriptor,p=Object.getPrototypeOf,m=Object.prototype;e.exports=function e(t,n,r){if("string"!=typeof n){if(m){var i=p(n);i&&i!==m&&e(t,i,r)}var o=c(n);d&&(o=o.concat(d(n)));for(var s=l(t),g=l(n),h=0;h{"use strict";e.exports=function(e,t,n,r,i,a,o,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 u=[n,r,i,a,o,s],c=0;(l=new Error(t.replace(/%s/g,(function(){return u[c++]})))).name="Invariant Violation"}throw l.framesToPop=1,l}}},5826:e=>{e.exports=Array.isArray||function(e){return"[object Array]"==Object.prototype.toString.call(e)}},813:function(e){e.exports=function(){"use strict";var e="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},t=function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")},n=function(){function e(e,t){for(var n=0;n1&&void 0!==arguments[1])||arguments[1],i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:[],a=arguments.length>3&&void 0!==arguments[3]?arguments[3]:5e3;t(this,e),this.ctx=n,this.iframes=r,this.exclude=i,this.iframesTimeout=a}return n(e,[{key:"getContexts",value:function(){var e=[];return(void 0!==this.ctx&&this.ctx?NodeList.prototype.isPrototypeOf(this.ctx)?Array.prototype.slice.call(this.ctx):Array.isArray(this.ctx)?this.ctx:"string"==typeof this.ctx?Array.prototype.slice.call(document.querySelectorAll(this.ctx)):[this.ctx]:[]).forEach((function(t){var n=e.filter((function(e){return e.contains(t)})).length>0;-1!==e.indexOf(t)||n||e.push(t)})),e}},{key:"getIframeContents",value:function(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:function(){},r=void 0;try{var i=e.contentWindow;if(r=i.document,!i||!r)throw new Error("iframe inaccessible")}catch(a){n()}r&&t(r)}},{key:"isIframeBlank",value:function(e){var t="about:blank",n=e.getAttribute("src").trim();return e.contentWindow.location.href===t&&n!==t&&n}},{key:"observeIframeLoad",value:function(e,t,n){var r=this,i=!1,a=null,o=function o(){if(!i){i=!0,clearTimeout(a);try{r.isIframeBlank(e)||(e.removeEventListener("load",o),r.getIframeContents(e,t,n))}catch(s){n()}}};e.addEventListener("load",o),a=setTimeout(o,this.iframesTimeout)}},{key:"onIframeReady",value:function(e,t,n){try{"complete"===e.contentWindow.document.readyState?this.isIframeBlank(e)?this.observeIframeLoad(e,t,n):this.getIframeContents(e,t,n):this.observeIframeLoad(e,t,n)}catch(r){n()}}},{key:"waitForIframes",value:function(e,t){var n=this,r=0;this.forEachIframe(e,(function(){return!0}),(function(e){r++,n.waitForIframes(e.querySelector("html"),(function(){--r||t()}))}),(function(e){e||t()}))}},{key:"forEachIframe",value:function(t,n,r){var i=this,a=arguments.length>3&&void 0!==arguments[3]?arguments[3]:function(){},o=t.querySelectorAll("iframe"),s=o.length,l=0;o=Array.prototype.slice.call(o);var u=function(){--s<=0&&a(l)};s||u(),o.forEach((function(t){e.matches(t,i.exclude)?u():i.onIframeReady(t,(function(e){n(t)&&(l++,r(e)),u()}),u)}))}},{key:"createIterator",value:function(e,t,n){return document.createNodeIterator(e,t,n,!1)}},{key:"createInstanceOnIframe",value:function(t){return new e(t.querySelector("html"),this.iframes)}},{key:"compareNodeIframe",value:function(e,t,n){if(e.compareDocumentPosition(n)&Node.DOCUMENT_POSITION_PRECEDING){if(null===t)return!0;if(t.compareDocumentPosition(n)&Node.DOCUMENT_POSITION_FOLLOWING)return!0}return!1}},{key:"getIteratorNode",value:function(e){var t=e.previousNode();return{prevNode:t,node:(null===t||e.nextNode())&&e.nextNode()}}},{key:"checkIframeFilter",value:function(e,t,n,r){var i=!1,a=!1;return r.forEach((function(e,t){e.val===n&&(i=t,a=e.handled)})),this.compareNodeIframe(e,t,n)?(!1!==i||a?!1===i||a||(r[i].handled=!0):r.push({val:n,handled:!0}),!0):(!1===i&&r.push({val:n,handled:!1}),!1)}},{key:"handleOpenIframes",value:function(e,t,n,r){var i=this;e.forEach((function(e){e.handled||i.getIframeContents(e.val,(function(e){i.createInstanceOnIframe(e).forEachNode(t,n,r)}))}))}},{key:"iterateThroughNodes",value:function(e,t,n,r,i){for(var a=this,o=this.createIterator(t,e,r),s=[],l=[],u=void 0,c=void 0,d=function(){var e=a.getIteratorNode(o);return c=e.prevNode,u=e.node};d();)this.iframes&&this.forEachIframe(t,(function(e){return a.checkIframeFilter(u,c,e,s)}),(function(t){a.createInstanceOnIframe(t).forEachNode(e,(function(e){return l.push(e)}),r)})),l.push(u);l.forEach((function(e){n(e)})),this.iframes&&this.handleOpenIframes(s,e,n,r),i()}},{key:"forEachNode",value:function(e,t,n){var r=this,i=arguments.length>3&&void 0!==arguments[3]?arguments[3]:function(){},a=this.getContexts(),o=a.length;o||i(),a.forEach((function(a){var s=function(){r.iterateThroughNodes(e,a,t,n,(function(){--o<=0&&i()}))};r.iframes?r.waitForIframes(a,s):s()}))}}],[{key:"matches",value:function(e,t){var n="string"==typeof t?[t]:t,r=e.matches||e.matchesSelector||e.msMatchesSelector||e.mozMatchesSelector||e.oMatchesSelector||e.webkitMatchesSelector;if(r){var i=!1;return n.every((function(t){return!r.call(e,t)||(i=!0,!1)})),i}return!1}}]),e}(),a=function(){function a(e){t(this,a),this.ctx=e,this.ie=!1;var n=window.navigator.userAgent;(n.indexOf("MSIE")>-1||n.indexOf("Trident")>-1)&&(this.ie=!0)}return n(a,[{key:"log",value:function(t){var n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"debug",r=this.opt.log;this.opt.debug&&"object"===(void 0===r?"undefined":e(r))&&"function"==typeof r[n]&&r[n]("mark.js: "+t)}},{key:"escapeStr",value:function(e){return e.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g,"\\$&")}},{key:"createRegExp",value:function(e){return"disabled"!==this.opt.wildcards&&(e=this.setupWildcardsRegExp(e)),e=this.escapeStr(e),Object.keys(this.opt.synonyms).length&&(e=this.createSynonymsRegExp(e)),(this.opt.ignoreJoiners||this.opt.ignorePunctuation.length)&&(e=this.setupIgnoreJoinersRegExp(e)),this.opt.diacritics&&(e=this.createDiacriticsRegExp(e)),e=this.createMergedBlanksRegExp(e),(this.opt.ignoreJoiners||this.opt.ignorePunctuation.length)&&(e=this.createJoinersRegExp(e)),"disabled"!==this.opt.wildcards&&(e=this.createWildcardsRegExp(e)),e=this.createAccuracyRegExp(e)}},{key:"createSynonymsRegExp",value:function(e){var t=this.opt.synonyms,n=this.opt.caseSensitive?"":"i",r=this.opt.ignoreJoiners||this.opt.ignorePunctuation.length?"\0":"";for(var i in t)if(t.hasOwnProperty(i)){var a=t[i],o="disabled"!==this.opt.wildcards?this.setupWildcardsRegExp(i):this.escapeStr(i),s="disabled"!==this.opt.wildcards?this.setupWildcardsRegExp(a):this.escapeStr(a);""!==o&&""!==s&&(e=e.replace(new RegExp("("+this.escapeStr(o)+"|"+this.escapeStr(s)+")","gm"+n),r+"("+this.processSynomyms(o)+"|"+this.processSynomyms(s)+")"+r))}return e}},{key:"processSynomyms",value:function(e){return(this.opt.ignoreJoiners||this.opt.ignorePunctuation.length)&&(e=this.setupIgnoreJoinersRegExp(e)),e}},{key:"setupWildcardsRegExp",value:function(e){return(e=e.replace(/(?:\\)*\?/g,(function(e){return"\\"===e.charAt(0)?"?":"\x01"}))).replace(/(?:\\)*\*/g,(function(e){return"\\"===e.charAt(0)?"*":"\x02"}))}},{key:"createWildcardsRegExp",value:function(e){var t="withSpaces"===this.opt.wildcards;return e.replace(/\u0001/g,t?"[\\S\\s]?":"\\S?").replace(/\u0002/g,t?"[\\S\\s]*?":"\\S*")}},{key:"setupIgnoreJoinersRegExp",value:function(e){return e.replace(/[^(|)\\]/g,(function(e,t,n){var r=n.charAt(t+1);return/[(|)\\]/.test(r)||""===r?e:e+"\0"}))}},{key:"createJoinersRegExp",value:function(e){var t=[],n=this.opt.ignorePunctuation;return Array.isArray(n)&&n.length&&t.push(this.escapeStr(n.join(""))),this.opt.ignoreJoiners&&t.push("\\u00ad\\u200b\\u200c\\u200d"),t.length?e.split(/\u0000+/).join("["+t.join("")+"]*"):e}},{key:"createDiacriticsRegExp",value:function(e){var t=this.opt.caseSensitive?"":"i",n=this.opt.caseSensitive?["a\xe0\xe1\u1ea3\xe3\u1ea1\u0103\u1eb1\u1eaf\u1eb3\u1eb5\u1eb7\xe2\u1ea7\u1ea5\u1ea9\u1eab\u1ead\xe4\xe5\u0101\u0105","A\xc0\xc1\u1ea2\xc3\u1ea0\u0102\u1eb0\u1eae\u1eb2\u1eb4\u1eb6\xc2\u1ea6\u1ea4\u1ea8\u1eaa\u1eac\xc4\xc5\u0100\u0104","c\xe7\u0107\u010d","C\xc7\u0106\u010c","d\u0111\u010f","D\u0110\u010e","e\xe8\xe9\u1ebb\u1ebd\u1eb9\xea\u1ec1\u1ebf\u1ec3\u1ec5\u1ec7\xeb\u011b\u0113\u0119","E\xc8\xc9\u1eba\u1ebc\u1eb8\xca\u1ec0\u1ebe\u1ec2\u1ec4\u1ec6\xcb\u011a\u0112\u0118","i\xec\xed\u1ec9\u0129\u1ecb\xee\xef\u012b","I\xcc\xcd\u1ec8\u0128\u1eca\xce\xcf\u012a","l\u0142","L\u0141","n\xf1\u0148\u0144","N\xd1\u0147\u0143","o\xf2\xf3\u1ecf\xf5\u1ecd\xf4\u1ed3\u1ed1\u1ed5\u1ed7\u1ed9\u01a1\u1edf\u1ee1\u1edb\u1edd\u1ee3\xf6\xf8\u014d","O\xd2\xd3\u1ece\xd5\u1ecc\xd4\u1ed2\u1ed0\u1ed4\u1ed6\u1ed8\u01a0\u1ede\u1ee0\u1eda\u1edc\u1ee2\xd6\xd8\u014c","r\u0159","R\u0158","s\u0161\u015b\u0219\u015f","S\u0160\u015a\u0218\u015e","t\u0165\u021b\u0163","T\u0164\u021a\u0162","u\xf9\xfa\u1ee7\u0169\u1ee5\u01b0\u1eeb\u1ee9\u1eed\u1eef\u1ef1\xfb\xfc\u016f\u016b","U\xd9\xda\u1ee6\u0168\u1ee4\u01af\u1eea\u1ee8\u1eec\u1eee\u1ef0\xdb\xdc\u016e\u016a","y\xfd\u1ef3\u1ef7\u1ef9\u1ef5\xff","Y\xdd\u1ef2\u1ef6\u1ef8\u1ef4\u0178","z\u017e\u017c\u017a","Z\u017d\u017b\u0179"]:["a\xe0\xe1\u1ea3\xe3\u1ea1\u0103\u1eb1\u1eaf\u1eb3\u1eb5\u1eb7\xe2\u1ea7\u1ea5\u1ea9\u1eab\u1ead\xe4\xe5\u0101\u0105A\xc0\xc1\u1ea2\xc3\u1ea0\u0102\u1eb0\u1eae\u1eb2\u1eb4\u1eb6\xc2\u1ea6\u1ea4\u1ea8\u1eaa\u1eac\xc4\xc5\u0100\u0104","c\xe7\u0107\u010dC\xc7\u0106\u010c","d\u0111\u010fD\u0110\u010e","e\xe8\xe9\u1ebb\u1ebd\u1eb9\xea\u1ec1\u1ebf\u1ec3\u1ec5\u1ec7\xeb\u011b\u0113\u0119E\xc8\xc9\u1eba\u1ebc\u1eb8\xca\u1ec0\u1ebe\u1ec2\u1ec4\u1ec6\xcb\u011a\u0112\u0118","i\xec\xed\u1ec9\u0129\u1ecb\xee\xef\u012bI\xcc\xcd\u1ec8\u0128\u1eca\xce\xcf\u012a","l\u0142L\u0141","n\xf1\u0148\u0144N\xd1\u0147\u0143","o\xf2\xf3\u1ecf\xf5\u1ecd\xf4\u1ed3\u1ed1\u1ed5\u1ed7\u1ed9\u01a1\u1edf\u1ee1\u1edb\u1edd\u1ee3\xf6\xf8\u014dO\xd2\xd3\u1ece\xd5\u1ecc\xd4\u1ed2\u1ed0\u1ed4\u1ed6\u1ed8\u01a0\u1ede\u1ee0\u1eda\u1edc\u1ee2\xd6\xd8\u014c","r\u0159R\u0158","s\u0161\u015b\u0219\u015fS\u0160\u015a\u0218\u015e","t\u0165\u021b\u0163T\u0164\u021a\u0162","u\xf9\xfa\u1ee7\u0169\u1ee5\u01b0\u1eeb\u1ee9\u1eed\u1eef\u1ef1\xfb\xfc\u016f\u016bU\xd9\xda\u1ee6\u0168\u1ee4\u01af\u1eea\u1ee8\u1eec\u1eee\u1ef0\xdb\xdc\u016e\u016a","y\xfd\u1ef3\u1ef7\u1ef9\u1ef5\xffY\xdd\u1ef2\u1ef6\u1ef8\u1ef4\u0178","z\u017e\u017c\u017aZ\u017d\u017b\u0179"],r=[];return e.split("").forEach((function(i){n.every((function(n){if(-1!==n.indexOf(i)){if(r.indexOf(n)>-1)return!1;e=e.replace(new RegExp("["+n+"]","gm"+t),"["+n+"]"),r.push(n)}return!0}))})),e}},{key:"createMergedBlanksRegExp",value:function(e){return e.replace(/[\s]+/gim,"[\\s]+")}},{key:"createAccuracyRegExp",value:function(e){var t=this,n="!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~\xa1\xbf",r=this.opt.accuracy,i="string"==typeof r?r:r.value,a="string"==typeof r?[]:r.limiters,o="";switch(a.forEach((function(e){o+="|"+t.escapeStr(e)})),i){case"partially":default:return"()("+e+")";case"complementary":return"()([^"+(o="\\s"+(o||this.escapeStr(n)))+"]*"+e+"[^"+o+"]*)";case"exactly":return"(^|\\s"+o+")("+e+")(?=$|\\s"+o+")"}}},{key:"getSeparatedKeywords",value:function(e){var t=this,n=[];return e.forEach((function(e){t.opt.separateWordSearch?e.split(" ").forEach((function(e){e.trim()&&-1===n.indexOf(e)&&n.push(e)})):e.trim()&&-1===n.indexOf(e)&&n.push(e)})),{keywords:n.sort((function(e,t){return t.length-e.length})),length:n.length}}},{key:"isNumeric",value:function(e){return Number(parseFloat(e))==e}},{key:"checkRanges",value:function(e){var t=this;if(!Array.isArray(e)||"[object Object]"!==Object.prototype.toString.call(e[0]))return this.log("markRanges() will only accept an array of objects"),this.opt.noMatch(e),[];var n=[],r=0;return e.sort((function(e,t){return e.start-t.start})).forEach((function(e){var i=t.callNoMatchOnInvalidRanges(e,r),a=i.start,o=i.end;i.valid&&(e.start=a,e.length=o-a,n.push(e),r=o)})),n}},{key:"callNoMatchOnInvalidRanges",value:function(e,t){var n=void 0,r=void 0,i=!1;return e&&void 0!==e.start?(r=(n=parseInt(e.start,10))+parseInt(e.length,10),this.isNumeric(e.start)&&this.isNumeric(e.length)&&r-t>0&&r-n>0?i=!0:(this.log("Ignoring invalid or overlapping range: "+JSON.stringify(e)),this.opt.noMatch(e))):(this.log("Ignoring invalid range: "+JSON.stringify(e)),this.opt.noMatch(e)),{start:n,end:r,valid:i}}},{key:"checkWhitespaceRanges",value:function(e,t,n){var r=void 0,i=!0,a=n.length,o=t-a,s=parseInt(e.start,10)-o;return(r=(s=s>a?a:s)+parseInt(e.length,10))>a&&(r=a,this.log("End range automatically set to the max value of "+a)),s<0||r-s<0||s>a||r>a?(i=!1,this.log("Invalid range: "+JSON.stringify(e)),this.opt.noMatch(e)):""===n.substring(s,r).replace(/\s+/g,"")&&(i=!1,this.log("Skipping whitespace only range: "+JSON.stringify(e)),this.opt.noMatch(e)),{start:s,end:r,valid:i}}},{key:"getTextNodes",value:function(e){var t=this,n="",r=[];this.iterator.forEachNode(NodeFilter.SHOW_TEXT,(function(e){r.push({start:n.length,end:(n+=e.textContent).length,node:e})}),(function(e){return t.matchesExclude(e.parentNode)?NodeFilter.FILTER_REJECT:NodeFilter.FILTER_ACCEPT}),(function(){e({value:n,nodes:r})}))}},{key:"matchesExclude",value:function(e){return i.matches(e,this.opt.exclude.concat(["script","style","title","head","html"]))}},{key:"wrapRangeInTextNode",value:function(e,t,n){var r=this.opt.element?this.opt.element:"mark",i=e.splitText(t),a=i.splitText(n-t),o=document.createElement(r);return o.setAttribute("data-markjs","true"),this.opt.className&&o.setAttribute("class",this.opt.className),o.textContent=i.textContent,i.parentNode.replaceChild(o,i),a}},{key:"wrapRangeInMappedTextNode",value:function(e,t,n,r,i){var a=this;e.nodes.every((function(o,s){var l=e.nodes[s+1];if(void 0===l||l.start>t){if(!r(o.node))return!1;var u=t-o.start,c=(n>o.end?o.end:n)-o.start,d=e.value.substr(0,o.start),f=e.value.substr(c+o.start);if(o.node=a.wrapRangeInTextNode(o.node,u,c),e.value=d+f,e.nodes.forEach((function(t,n){n>=s&&(e.nodes[n].start>0&&n!==s&&(e.nodes[n].start-=c),e.nodes[n].end-=c)})),n-=c,i(o.node.previousSibling,o.start),!(n>o.end))return!1;t=o.end}return!0}))}},{key:"wrapMatches",value:function(e,t,n,r,i){var a=this,o=0===t?0:t+1;this.getTextNodes((function(t){t.nodes.forEach((function(t){t=t.node;for(var i=void 0;null!==(i=e.exec(t.textContent))&&""!==i[o];)if(n(i[o],t)){var s=i.index;if(0!==o)for(var l=1;l{"use strict";n.r(t)},6930:(e,t,n)=>{"use strict";n.r(t)},4865:function(e,t,n){var r,i;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 i(e,t,n){return en?n:e}function a(e){return 100*(-1+e)}function o(e,t,n){var i;return(i="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,i}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=i(e,r.minimum,1),n.status=1===e?null:e;var a=n.render(!t),u=a.querySelector(r.barSelector),c=r.speed,d=r.easing;return a.offsetWidth,s((function(t){""===r.positionUsing&&(r.positionUsing=n.getPositioningCSS()),l(u,o(e,c,d)),1===e?(l(a,{transition:"none",opacity:1}),a.offsetWidth,setTimeout((function(){l(a,{transition:"all "+c+"ms linear",opacity:0}),setTimeout((function(){n.remove(),t()}),c)}),c)):setTimeout(t,c)})),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)*i(Math.random()*t,.1,.95)),t=i(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");c(document.documentElement,"nprogress-busy");var t=document.createElement("div");t.id="nprogress",t.innerHTML=r.template;var i,o=t.querySelector(r.barSelector),s=e?"-100":a(n.status||0),u=document.querySelector(r.parent);return l(o,{transition:"all 0 linear",transform:"translate3d("+s+"%,0,0)"}),r.showSpinner||(i=t.querySelector(r.spinnerSelector))&&p(i),u!=document.body&&c(u,"nprogress-custom-parent"),u.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&&p(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,i=e.length,a=t.charAt(0).toUpperCase()+t.slice(1);i--;)if((r=e[i]+a)in n)return r;return t}function i(e){return e=n(e),t[e]||(t[e]=r(e))}function a(e,t,n){t=i(t),e.style[t]=n}return function(e,t){var n,r,i=arguments;if(2==i.length)for(n in t)void 0!==(r=t[n])&&t.hasOwnProperty(n)&&a(e,n,r);else a(e,i[1],i[2])}}();function u(e,t){return("string"==typeof e?e:f(e)).indexOf(" "+t+" ")>=0}function c(e,t){var n=f(e),r=n+t;u(n,t)||(e.className=r.substring(1))}function d(e,t){var n,r=f(e);u(e,t)&&(n=r.replace(" "+t+" "," "),e.className=n.substring(1,n.length-1))}function f(e){return(" "+(e.className||"")+" ").replace(/\s+/gi," ")}function p(e){e&&e.parentNode&&e.parentNode.removeChild(e)}return n},void 0===(i="function"==typeof r?r.call(t,n,t,e):r)||(e.exports=i)},7418:e=>{"use strict";var t=Object.getOwnPropertySymbols,n=Object.prototype.hasOwnProperty,r=Object.prototype.propertyIsEnumerable;e.exports=function(){try{if(!Object.assign)return!1;var e=new String("abc");if(e[5]="de","5"===Object.getOwnPropertyNames(e)[0])return!1;for(var t={},n=0;n<10;n++)t["_"+String.fromCharCode(n)]=n;if("0123456789"!==Object.getOwnPropertyNames(t).map((function(e){return t[e]})).join(""))return!1;var r={};return"abcdefghijklmnopqrst".split("").forEach((function(e){r[e]=e})),"abcdefghijklmnopqrst"===Object.keys(Object.assign({},r)).join("")}catch(i){return!1}}()?Object.assign:function(e,i){for(var a,o,s=function(e){if(null==e)throw new TypeError("Object.assign cannot be called with null or undefined");return Object(e)}(e),l=1;l{"use strict";n.d(t,{Z:()=>a});var r=function(){var e=/(?:^|\s)lang(?:uage)?-([\w-]+)(?=\s|$)/i,t=0,n={},r={util:{encode:function e(t){return t instanceof i?new i(t.type,e(t.content),t.alias):Array.isArray(t)?t.map(e):t.replace(/&/g,"&").replace(/=d.reach);_+=E.value.length,E=E.next){var S=E.value;if(t.length>e.length)return;if(!(S instanceof i)){var x,O=1;if(v){if(!(x=a(k,_,e,b))||x.index>=e.length)break;var P=x.index,C=x.index+x[0].length,T=_;for(T+=E.value.length;P>=T;)T+=(E=E.next).value.length;if(_=T-=E.value.length,E.value instanceof i)continue;for(var I=E;I!==t.tail&&(Td.reach&&(d.reach=L);var R=E.prev;if(N&&(R=l(t,R,N),_+=N.length),u(t,R,O),E=l(t,R,new i(f,h?r.tokenize(A,h):A,y,A)),j&&l(t,E,j),O>1){var D={cause:f+","+m,reach:L};o(e,t,n,E.prev,_,D),d&&D.reach>d.reach&&(d.reach=D.reach)}}}}}}function s(){var e={value:null,prev:null,next:null},t={value:null,prev:e,next:null};e.next=t,this.head=e,this.tail=t,this.length=0}function l(e,t,n){var r=t.next,i={value:n,prev:t,next:r};return t.next=i,r.prev=i,e.length++,i}function u(e,t,n){for(var r=t.next,i=0;i"+a.content+""},r}(),i=r;r.default=r,i.languages.markup={comment:{pattern://,greedy:!0},prolog:{pattern:/<\?[\s\S]+?\?>/,greedy:!0},doctype:{pattern:/"'[\]]|"[^"]*"|'[^']*')+(?:\[(?:[^<"'\]]|"[^"]*"|'[^']*'|<(?!!--)|)*\]\s*)?>/i,greedy:!0,inside:{"internal-subset":{pattern:/(^[^\[]*\[)[\s\S]+(?=\]>$)/,lookbehind:!0,greedy:!0,inside:null},string:{pattern:/"[^"]*"|'[^']*'/,greedy:!0},punctuation:/^$|[[\]]/,"doctype-tag":/^DOCTYPE/i,name:/[^\s<>'"]+/}},cdata:{pattern://i,greedy:!0},tag:{pattern:/<\/?(?!\d)[^\s>\/=$<%]+(?:\s(?:\s*[^\s>\/=]+(?:\s*=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+(?=[\s>]))|(?=[\s/>])))+)?\s*\/?>/,greedy:!0,inside:{tag:{pattern:/^<\/?[^\s>\/]+/,inside:{punctuation:/^<\/?/,namespace:/^[^\s>\/:]+:/}},"special-attr":[],"attr-value":{pattern:/=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+)/,inside:{punctuation:[{pattern:/^=/,alias:"attr-equals"},/"|'/]}},punctuation:/\/?>/,"attr-name":{pattern:/[^\s>\/]+/,inside:{namespace:/^[^\s>\/:]+:/}}}},entity:[{pattern:/&[\da-z]{1,8};/i,alias:"named-entity"},/&#x?[\da-f]{1,8};/i]},i.languages.markup.tag.inside["attr-value"].inside.entity=i.languages.markup.entity,i.languages.markup.doctype.inside["internal-subset"].inside=i.languages.markup,i.hooks.add("wrap",(function(e){"entity"===e.type&&(e.attributes.title=e.content.replace(/&/,"&"))})),Object.defineProperty(i.languages.markup.tag,"addInlined",{value:function(e,t){var n={};n["language-"+t]={pattern:/(^$)/i,lookbehind:!0,inside:i.languages[t]},n.cdata=/^$/i;var r={"included-cdata":{pattern://i,inside:n}};r["language-"+t]={pattern:/[\s\S]+/,inside:i.languages[t]};var a={};a[e]={pattern:RegExp(/(<__[^>]*>)(?:))*\]\]>|(?!)/.source.replace(/__/g,(function(){return e})),"i"),lookbehind:!0,greedy:!0,inside:r},i.languages.insertBefore("markup","cdata",a)}}),Object.defineProperty(i.languages.markup.tag,"addAttribute",{value:function(e,t){i.languages.markup.tag.inside["special-attr"].push({pattern:RegExp(/(^|["'\s])/.source+"(?:"+e+")"+/\s*=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+(?=[\s>]))/.source,"i"),lookbehind:!0,inside:{"attr-name":/^[^\s=]+/,"attr-value":{pattern:/=[\s\S]+/,inside:{value:{pattern:/(^=\s*(["']|(?!["'])))\S[\s\S]*(?=\2$)/,lookbehind:!0,alias:[t,"language-"+t],inside:i.languages[t]},punctuation:[{pattern:/^=/,alias:"attr-equals"},/"|'/]}}}})}}),i.languages.html=i.languages.markup,i.languages.mathml=i.languages.markup,i.languages.svg=i.languages.markup,i.languages.xml=i.languages.extend("markup",{}),i.languages.ssml=i.languages.xml,i.languages.atom=i.languages.xml,i.languages.rss=i.languages.xml,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+(?=\+?=)/,inside:{environment:{pattern:RegExp("(^|[\\s;|&]|[<>]\\()"+t),lookbehind:!0,alias:"constant"}},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|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|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|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 i=["comment","function-name","for-or-select","assign-left","string","environment","function","keyword","builtin","boolean","file-descriptor","operator","punctuation","number"],a=r.variable[1].inside,o=0;o]=?|[!=]=?=?|--?|\+\+?|&&?|\|\|?|[?*/~^%]/,punctuation:/[{}[\];(),.:]/},i.languages.c=i.languages.extend("clike",{comment:{pattern:/\/\/(?:[^\r\n\\]|\\(?:\r\n?|\n|(?![\r\n])))*|\/\*[\s\S]*?(?:\*\/|$)/,greedy:!0},string:{pattern:/"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"/,greedy:!0},"class-name":{pattern:/(\b(?:enum|struct)\s+(?:__attribute__\s*\(\([\s\S]*?\)\)\s*)?)\w+|\b[a-z]\w*_t\b/,lookbehind:!0},keyword:/\b(?:_Alignas|_Alignof|_Atomic|_Bool|_Complex|_Generic|_Imaginary|_Noreturn|_Static_assert|_Thread_local|__attribute__|asm|auto|break|case|char|const|continue|default|do|double|else|enum|extern|float|for|goto|if|inline|int|long|register|return|short|signed|sizeof|static|struct|switch|typedef|typeof|union|unsigned|void|volatile|while)\b/,function:/\b[a-z_]\w*(?=\s*\()/i,number:/(?:\b0x(?:[\da-f]+(?:\.[\da-f]*)?|\.[\da-f]+)(?:p[+-]?\d+)?|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:e[+-]?\d+)?)[ful]{0,4}/i,operator:/>>=?|<<=?|->|([-+&|:])\1|[?:~]|[-+*/%&|^!=<>]=?/}),i.languages.insertBefore("c","string",{char:{pattern:/'(?:\\(?:\r\n|[\s\S])|[^'\\\r\n]){0,32}'/,greedy:!0}}),i.languages.insertBefore("c","string",{macro:{pattern:/(^[\t ]*)#\s*[a-z](?:[^\r\n\\/]|\/(?!\*)|\/\*(?:[^*]|\*(?!\/))*\*\/|\\(?:\r\n|[\s\S]))*/im,lookbehind:!0,greedy:!0,alias:"property",inside:{string:[{pattern:/^(#\s*include\s*)<[^>]+>/,lookbehind:!0},i.languages.c.string],char:i.languages.c.char,comment:i.languages.c.comment,"macro-name":[{pattern:/(^#\s*define\s+)\w+\b(?!\()/i,lookbehind:!0},{pattern:/(^#\s*define\s+)\w+\b(?=\()/i,lookbehind:!0,alias:"function"}],directive:{pattern:/^(#\s*)[a-z]+/,lookbehind:!0,alias:"keyword"},"directive-hash":/^#/,punctuation:/##|\\(?=[\r\n])/,expression:{pattern:/\S[\s\S]*/,inside:i.languages.c}}}}),i.languages.insertBefore("c","function",{constant:/\b(?:EOF|NULL|SEEK_CUR|SEEK_END|SEEK_SET|__DATE__|__FILE__|__LINE__|__TIMESTAMP__|__TIME__|__func__|stderr|stdin|stdout)\b/}),delete i.languages.c.boolean,function(e){var t=/\b(?:alignas|alignof|asm|auto|bool|break|case|catch|char|char16_t|char32_t|char8_t|class|co_await|co_return|co_yield|compl|concept|const|const_cast|consteval|constexpr|constinit|continue|decltype|default|delete|do|double|dynamic_cast|else|enum|explicit|export|extern|final|float|for|friend|goto|if|import|inline|int|int16_t|int32_t|int64_t|int8_t|long|module|mutable|namespace|new|noexcept|nullptr|operator|override|private|protected|public|register|reinterpret_cast|requires|return|short|signed|sizeof|static|static_assert|static_cast|struct|switch|template|this|thread_local|throw|try|typedef|typeid|typename|uint16_t|uint32_t|uint64_t|uint8_t|union|unsigned|using|virtual|void|volatile|wchar_t|while)\b/,n=/\b(?!)\w+(?:\s*\.\s*\w+)*\b/.source.replace(//g,(function(){return t.source}));e.languages.cpp=e.languages.extend("c",{"class-name":[{pattern:RegExp(/(\b(?:class|concept|enum|struct|typename)\s+)(?!)\w+/.source.replace(//g,(function(){return t.source}))),lookbehind:!0},/\b[A-Z]\w*(?=\s*::\s*\w+\s*\()/,/\b[A-Z_]\w*(?=\s*::\s*~\w+\s*\()/i,/\b\w+(?=\s*<(?:[^<>]|<(?:[^<>]|<[^<>]*>)*>)*>\s*::\s*\w+\s*\()/],keyword:t,number:{pattern:/(?:\b0b[01']+|\b0x(?:[\da-f']+(?:\.[\da-f']*)?|\.[\da-f']+)(?:p[+-]?[\d']+)?|(?:\b[\d']+(?:\.[\d']*)?|\B\.[\d']+)(?:e[+-]?[\d']+)?)[ful]{0,4}/i,greedy:!0},operator:/>>=?|<<=?|->|--|\+\+|&&|\|\||[?:~]|<=>|[-+*/%&|^!=<>]=?|\b(?:and|and_eq|bitand|bitor|not|not_eq|or|or_eq|xor|xor_eq)\b/,boolean:/\b(?:false|true)\b/}),e.languages.insertBefore("cpp","string",{module:{pattern:RegExp(/(\b(?:import|module)\s+)/.source+"(?:"+/"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"|<[^<>\r\n]*>/.source+"|"+/(?:\s*:\s*)?|:\s*/.source.replace(//g,(function(){return n}))+")"),lookbehind:!0,greedy:!0,inside:{string:/^[<"][\s\S]+/,operator:/:/,punctuation:/\./}},"raw-string":{pattern:/R"([^()\\ ]{0,16})\([\s\S]*?\)\1"/,alias:"string",greedy:!0}}),e.languages.insertBefore("cpp","keyword",{"generic-function":{pattern:/\b(?!operator\b)[a-z_]\w*\s*<(?:[^<>]|<[^<>]*>)*>(?=\s*\()/i,inside:{function:/^\w+/,generic:{pattern:/<[\s\S]+/,alias:"class-name",inside:e.languages.cpp}}}}),e.languages.insertBefore("cpp","operator",{"double-colon":{pattern:/::/,alias:"punctuation"}}),e.languages.insertBefore("cpp","class-name",{"base-clause":{pattern:/(\b(?:class|struct)\s+\w+\s*:\s*)[^;{}"'\s]+(?:\s+[^;{}"'\s]+)*(?=\s*[;{])/,lookbehind:!0,greedy:!0,inside:e.languages.extend("cpp",{})}}),e.languages.insertBefore("inside","double-colon",{"class-name":/\b[a-z_]\w*\b(?!\s*::)/i},e.languages.cpp["base-clause"])}(i),function(e){var t=/(?:"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"|'(?:\\(?:\r\n|[\s\S])|[^'\\\r\n])*')/;e.languages.css={comment:/\/\*[\s\S]*?\*\//,atrule:{pattern:/@[\w-](?:[^;{\s]|\s+(?![\s{]))*(?:;|(?=\s*\{))/,inside:{rule:/^@[\w-]+/,"selector-function-argument":{pattern:/(\bselector\s*\(\s*(?![\s)]))(?:[^()\s]|\s+(?![\s)])|\((?:[^()]|\([^()]*\))*\))+(?=\s*\))/,lookbehind:!0,alias:"selector"},keyword:{pattern:/(^|[^\w-])(?:and|not|only|or)(?![\w-])/,lookbehind:!0}}},url:{pattern:RegExp("\\burl\\((?:"+t.source+"|"+/(?:[^\\\r\n()"']|\\[\s\S])*/.source+")\\)","i"),greedy:!0,inside:{function:/^url/i,punctuation:/^\(|\)$/,string:{pattern:RegExp("^"+t.source+"$"),alias:"url"}}},selector:{pattern:RegExp("(^|[{}\\s])[^{}\\s](?:[^{};\"'\\s]|\\s+(?![\\s{])|"+t.source+")*(?=\\s*\\{)"),lookbehind:!0},string:{pattern:t,greedy:!0},property:{pattern:/(^|[^-\w\xA0-\uFFFF])(?!\s)[-_a-z\xA0-\uFFFF](?:(?!\s)[-\w\xA0-\uFFFF])*(?=\s*:)/i,lookbehind:!0},important:/!important\b/i,function:{pattern:/(^|[^-a-z0-9])[-a-z0-9]+(?=\()/i,lookbehind:!0},punctuation:/[(){};:,]/},e.languages.css.atrule.inside.rest=e.languages.css;var n=e.languages.markup;n&&(n.tag.addInlined("style","css"),n.tag.addAttribute("style","css"))}(i),function(e){var t,n=/("|')(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/;e.languages.css.selector={pattern:e.languages.css.selector.pattern,lookbehind:!0,inside:t={"pseudo-element":/:(?:after|before|first-letter|first-line|selection)|::[-\w]+/,"pseudo-class":/:[-\w]+/,class:/\.[-\w]+/,id:/#[-\w]+/,attribute:{pattern:RegExp("\\[(?:[^[\\]\"']|"+n.source+")*\\]"),greedy:!0,inside:{punctuation:/^\[|\]$/,"case-sensitivity":{pattern:/(\s)[si]$/i,lookbehind:!0,alias:"keyword"},namespace:{pattern:/^(\s*)(?:(?!\s)[-*\w\xA0-\uFFFF])*\|(?!=)/,lookbehind:!0,inside:{punctuation:/\|$/}},"attr-name":{pattern:/^(\s*)(?:(?!\s)[-\w\xA0-\uFFFF])+/,lookbehind:!0},"attr-value":[n,{pattern:/(=\s*)(?:(?!\s)[-\w\xA0-\uFFFF])+(?=\s*$)/,lookbehind:!0}],operator:/[|~*^$]?=/}},"n-th":[{pattern:/(\(\s*)[+-]?\d*[\dn](?:\s*[+-]\s*\d+)?(?=\s*\))/,lookbehind:!0,inside:{number:/[\dn]+/,operator:/[+-]/}},{pattern:/(\(\s*)(?:even|odd)(?=\s*\))/i,lookbehind:!0}],combinator:/>|\+|~|\|\|/,punctuation:/[(),]/}},e.languages.css.atrule.inside["selector-function-argument"].inside=t,e.languages.insertBefore("css","property",{variable:{pattern:/(^|[^-\w\xA0-\uFFFF])--(?!\s)[-_a-z\xA0-\uFFFF](?:(?!\s)[-\w\xA0-\uFFFF])*/i,lookbehind:!0}});var r={pattern:/(\b\d+)(?:%|[a-z]+(?![\w-]))/,lookbehind:!0},i={pattern:/(^|[^\w.-])-?(?:\d+(?:\.\d+)?|\.\d+)/,lookbehind:!0};e.languages.insertBefore("css","function",{operator:{pattern:/(\s)[+\-*\/](?=\s)/,lookbehind:!0},hexcode:{pattern:/\B#[\da-f]{3,8}\b/i,alias:"color"},color:[{pattern:/(^|[^\w-])(?:AliceBlue|AntiqueWhite|Aqua|Aquamarine|Azure|Beige|Bisque|Black|BlanchedAlmond|Blue|BlueViolet|Brown|BurlyWood|CadetBlue|Chartreuse|Chocolate|Coral|CornflowerBlue|Cornsilk|Crimson|Cyan|DarkBlue|DarkCyan|DarkGoldenRod|DarkGr[ae]y|DarkGreen|DarkKhaki|DarkMagenta|DarkOliveGreen|DarkOrange|DarkOrchid|DarkRed|DarkSalmon|DarkSeaGreen|DarkSlateBlue|DarkSlateGr[ae]y|DarkTurquoise|DarkViolet|DeepPink|DeepSkyBlue|DimGr[ae]y|DodgerBlue|FireBrick|FloralWhite|ForestGreen|Fuchsia|Gainsboro|GhostWhite|Gold|GoldenRod|Gr[ae]y|Green|GreenYellow|HoneyDew|HotPink|IndianRed|Indigo|Ivory|Khaki|Lavender|LavenderBlush|LawnGreen|LemonChiffon|LightBlue|LightCoral|LightCyan|LightGoldenRodYellow|LightGr[ae]y|LightGreen|LightPink|LightSalmon|LightSeaGreen|LightSkyBlue|LightSlateGr[ae]y|LightSteelBlue|LightYellow|Lime|LimeGreen|Linen|Magenta|Maroon|MediumAquaMarine|MediumBlue|MediumOrchid|MediumPurple|MediumSeaGreen|MediumSlateBlue|MediumSpringGreen|MediumTurquoise|MediumVioletRed|MidnightBlue|MintCream|MistyRose|Moccasin|NavajoWhite|Navy|OldLace|Olive|OliveDrab|Orange|OrangeRed|Orchid|PaleGoldenRod|PaleGreen|PaleTurquoise|PaleVioletRed|PapayaWhip|PeachPuff|Peru|Pink|Plum|PowderBlue|Purple|Red|RosyBrown|RoyalBlue|SaddleBrown|Salmon|SandyBrown|SeaGreen|SeaShell|Sienna|Silver|SkyBlue|SlateBlue|SlateGr[ae]y|Snow|SpringGreen|SteelBlue|Tan|Teal|Thistle|Tomato|Transparent|Turquoise|Violet|Wheat|White|WhiteSmoke|Yellow|YellowGreen)(?![\w-])/i,lookbehind:!0},{pattern:/\b(?:hsl|rgb)\(\s*\d{1,3}\s*,\s*\d{1,3}%?\s*,\s*\d{1,3}%?\s*\)\B|\b(?:hsl|rgb)a\(\s*\d{1,3}\s*,\s*\d{1,3}%?\s*,\s*\d{1,3}%?\s*,\s*(?:0|0?\.\d+|1)\s*\)\B/i,inside:{unit:r,number:i,function:/[\w-]+(?=\()/,punctuation:/[(),]/}}],entity:/\\[\da-f]{1,8}/i,unit:r,number:i})}(i),i.languages.javascript=i.languages.extend("clike",{"class-name":[i.languages.clike["class-name"],{pattern:/(^|[^$\w\xA0-\uFFFF])(?!\s)[_$A-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\.(?:constructor|prototype))/,lookbehind:!0}],keyword:[{pattern:/((?:^|\})\s*)catch\b/,lookbehind:!0},{pattern:/(^|[^.]|\.\.\.\s*)\b(?:as|assert(?=\s*\{)|async(?=\s*(?:function\b|\(|[$\w\xA0-\uFFFF]|$))|await|break|case|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally(?=\s*(?:\{|$))|for|from(?=\s*(?:['"]|$))|function|(?:get|set)(?=\s*(?:[#\[$\w\xA0-\uFFFF]|$))|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)\b/,lookbehind:!0}],function:/#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*(?:\.\s*(?:apply|bind|call)\s*)?\()/,number:{pattern:RegExp(/(^|[^\w$])/.source+"(?:"+/NaN|Infinity/.source+"|"+/0[bB][01]+(?:_[01]+)*n?/.source+"|"+/0[oO][0-7]+(?:_[0-7]+)*n?/.source+"|"+/0[xX][\dA-Fa-f]+(?:_[\dA-Fa-f]+)*n?/.source+"|"+/\d+(?:_\d+)*n/.source+"|"+/(?:\d+(?:_\d+)*(?:\.(?:\d+(?:_\d+)*)?)?|\.\d+(?:_\d+)*)(?:[Ee][+-]?\d+(?:_\d+)*)?/.source+")"+/(?![\w$])/.source),lookbehind:!0},operator:/--|\+\+|\*\*=?|=>|&&=?|\|\|=?|[!=]==|<<=?|>>>?=?|[-+*/%&|^!=<>]=?|\.{3}|\?\?=?|\?\.?|[~:]/}),i.languages.javascript["class-name"][0].pattern=/(\b(?:class|extends|implements|instanceof|interface|new)\s+)[\w.\\]+/,i.languages.insertBefore("javascript","keyword",{regex:{pattern:/((?:^|[^$\w\xA0-\uFFFF."'\])\s]|\b(?:return|yield))\s*)\/(?:\[(?:[^\]\\\r\n]|\\.)*\]|\\.|[^/\\\[\r\n])+\/[dgimyus]{0,7}(?=(?:\s|\/\*(?:[^*]|\*(?!\/))*\*\/)*(?:$|[\r\n,.;:})\]]|\/\/))/,lookbehind:!0,greedy:!0,inside:{"regex-source":{pattern:/^(\/)[\s\S]+(?=\/[a-z]*$)/,lookbehind:!0,alias:"language-regex",inside:i.languages.regex},"regex-delimiter":/^\/|\/$/,"regex-flags":/^[a-z]+$/}},"function-variable":{pattern:/#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*[=:]\s*(?:async\s*)?(?:\bfunction\b|(?:\((?:[^()]|\([^()]*\))*\)|(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)\s*=>))/,alias:"function"},parameter:[{pattern:/(function(?:\s+(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)?\s*\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\))/,lookbehind:!0,inside:i.languages.javascript},{pattern:/(^|[^$\w\xA0-\uFFFF])(?!\s)[_$a-z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*=>)/i,lookbehind:!0,inside:i.languages.javascript},{pattern:/(\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\)\s*=>)/,lookbehind:!0,inside:i.languages.javascript},{pattern:/((?:\b|\s|^)(?!(?:as|async|await|break|case|catch|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally|for|from|function|get|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|set|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)(?![$\w\xA0-\uFFFF]))(?:(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*\s*)\(\s*|\]\s*\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\)\s*\{)/,lookbehind:!0,inside:i.languages.javascript}],constant:/\b[A-Z](?:[A-Z_]|\dx?)*\b/}),i.languages.insertBefore("javascript","string",{hashbang:{pattern:/^#!.*/,greedy:!0,alias:"comment"},"template-string":{pattern:/`(?:\\[\s\S]|\$\{(?:[^{}]|\{(?:[^{}]|\{[^}]*\})*\})+\}|(?!\$\{)[^\\`])*`/,greedy:!0,inside:{"template-punctuation":{pattern:/^`|`$/,alias:"string"},interpolation:{pattern:/((?:^|[^\\])(?:\\{2})*)\$\{(?:[^{}]|\{(?:[^{}]|\{[^}]*\})*\})+\}/,lookbehind:!0,inside:{"interpolation-punctuation":{pattern:/^\$\{|\}$/,alias:"punctuation"},rest:i.languages.javascript}},string:/[\s\S]+/}},"string-property":{pattern:/((?:^|[,{])[ \t]*)(["'])(?:\\(?:\r\n|[\s\S])|(?!\2)[^\\\r\n])*\2(?=\s*:)/m,lookbehind:!0,greedy:!0,alias:"property"}}),i.languages.insertBefore("javascript","operator",{"literal-property":{pattern:/((?:^|[,{])[ \t]*)(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*:)/m,lookbehind:!0,alias:"property"}}),i.languages.markup&&(i.languages.markup.tag.addInlined("script","javascript"),i.languages.markup.tag.addAttribute(/on(?:abort|blur|change|click|composition(?:end|start|update)|dblclick|error|focus(?:in|out)?|key(?:down|up)|load|mouse(?:down|enter|leave|move|out|over|up)|reset|resize|scroll|select|slotchange|submit|unload|wheel)/.source,"javascript")),i.languages.js=i.languages.javascript,function(e){var t=/#(?!\{).+/,n={pattern:/#\{[^}]+\}/,alias:"variable"};e.languages.coffeescript=e.languages.extend("javascript",{comment:t,string:[{pattern:/'(?:\\[\s\S]|[^\\'])*'/,greedy:!0},{pattern:/"(?:\\[\s\S]|[^\\"])*"/,greedy:!0,inside:{interpolation:n}}],keyword:/\b(?:and|break|by|catch|class|continue|debugger|delete|do|each|else|extend|extends|false|finally|for|if|in|instanceof|is|isnt|let|loop|namespace|new|no|not|null|of|off|on|or|own|return|super|switch|then|this|throw|true|try|typeof|undefined|unless|until|when|while|window|with|yes|yield)\b/,"class-member":{pattern:/@(?!\d)\w+/,alias:"variable"}}),e.languages.insertBefore("coffeescript","comment",{"multiline-comment":{pattern:/###[\s\S]+?###/,alias:"comment"},"block-regex":{pattern:/\/{3}[\s\S]*?\/{3}/,alias:"regex",inside:{comment:t,interpolation:n}}}),e.languages.insertBefore("coffeescript","string",{"inline-javascript":{pattern:/`(?:\\[\s\S]|[^\\`])*`/,inside:{delimiter:{pattern:/^`|`$/,alias:"punctuation"},script:{pattern:/[\s\S]+/,alias:"language-javascript",inside:e.languages.javascript}}},"multiline-string":[{pattern:/'''[\s\S]*?'''/,greedy:!0,alias:"string"},{pattern:/"""[\s\S]*?"""/,greedy:!0,alias:"string",inside:{interpolation:n}}]}),e.languages.insertBefore("coffeescript","keyword",{property:/(?!\d)\w+(?=\s*:(?!:))/}),delete e.languages.coffeescript["template-string"],e.languages.coffee=e.languages.coffeescript}(i),function(e){var t=/[*&][^\s[\]{},]+/,n=/!(?:<[\w\-%#;/?:@&=+$,.!~*'()[\]]+>|(?:[a-zA-Z\d-]*!)?[\w\-%#;/?:@&=+$.~*'()]+)?/,r="(?:"+n.source+"(?:[ \t]+"+t.source+")?|"+t.source+"(?:[ \t]+"+n.source+")?)",i=/(?:[^\s\x00-\x08\x0e-\x1f!"#%&'*,\-:>?@[\]`{|}\x7f-\x84\x86-\x9f\ud800-\udfff\ufffe\uffff]|[?:-])(?:[ \t]*(?:(?![#:])|:))*/.source.replace(//g,(function(){return/[^\s\x00-\x08\x0e-\x1f,[\]{}\x7f-\x84\x86-\x9f\ud800-\udfff\ufffe\uffff]/.source})),a=/"(?:[^"\\\r\n]|\\.)*"|'(?:[^'\\\r\n]|\\.)*'/.source;function o(e,t){t=(t||"").replace(/m/g,"")+"m";var n=/([:\-,[{]\s*(?:\s<>[ \t]+)?)(?:<>)(?=[ \t]*(?:$|,|\]|\}|(?:[\r\n]\s*)?#))/.source.replace(/<>/g,(function(){return r})).replace(/<>/g,(function(){return e}));return RegExp(n,t)}e.languages.yaml={scalar:{pattern:RegExp(/([\-:]\s*(?:\s<>[ \t]+)?[|>])[ \t]*(?:((?:\r?\n|\r)[ \t]+)\S[^\r\n]*(?:\2[^\r\n]+)*)/.source.replace(/<>/g,(function(){return r}))),lookbehind:!0,alias:"string"},comment:/#.*/,key:{pattern:RegExp(/((?:^|[:\-,[{\r\n?])[ \t]*(?:<>[ \t]+)?)<>(?=\s*:\s)/.source.replace(/<>/g,(function(){return r})).replace(/<>/g,(function(){return"(?:"+i+"|"+a+")"}))),lookbehind:!0,greedy:!0,alias:"atrule"},directive:{pattern:/(^[ \t]*)%.+/m,lookbehind:!0,alias:"important"},datetime:{pattern:o(/\d{4}-\d\d?-\d\d?(?:[tT]|[ \t]+)\d\d?:\d{2}:\d{2}(?:\.\d*)?(?:[ \t]*(?:Z|[-+]\d\d?(?::\d{2})?))?|\d{4}-\d{2}-\d{2}|\d\d?:\d{2}(?::\d{2}(?:\.\d*)?)?/.source),lookbehind:!0,alias:"number"},boolean:{pattern:o(/false|true/.source,"i"),lookbehind:!0,alias:"important"},null:{pattern:o(/null|~/.source,"i"),lookbehind:!0,alias:"important"},string:{pattern:o(a),lookbehind:!0,greedy:!0},number:{pattern:o(/[+-]?(?:0x[\da-f]+|0o[0-7]+|(?:\d+(?:\.\d*)?|\.\d+)(?:e[+-]?\d+)?|\.inf|\.nan)/.source,"i"),lookbehind:!0},tag:n,important:t,punctuation:/---|[:[\]{}\-,|>?]|\.\.\./},e.languages.yml=e.languages.yaml}(i),function(e){var t=/(?:\\.|[^\\\n\r]|(?:\n|\r\n?)(?![\r\n]))/.source;function n(e){return e=e.replace(//g,(function(){return t})),RegExp(/((?:^|[^\\])(?:\\{2})*)/.source+"(?:"+e+")")}var r=/(?:\\.|``(?:[^`\r\n]|`(?!`))+``|`[^`\r\n]+`|[^\\|\r\n`])+/.source,i=/\|?__(?:\|__)+\|?(?:(?:\n|\r\n?)|(?![\s\S]))/.source.replace(/__/g,(function(){return r})),a=/\|?[ \t]*:?-{3,}:?[ \t]*(?:\|[ \t]*:?-{3,}:?[ \t]*)+\|?(?:\n|\r\n?)/.source;e.languages.markdown=e.languages.extend("markup",{}),e.languages.insertBefore("markdown","prolog",{"front-matter-block":{pattern:/(^(?:\s*[\r\n])?)---(?!.)[\s\S]*?[\r\n]---(?!.)/,lookbehind:!0,greedy:!0,inside:{punctuation:/^---|---$/,"front-matter":{pattern:/\S+(?:\s+\S+)*/,alias:["yaml","language-yaml"],inside:e.languages.yaml}}},blockquote:{pattern:/^>(?:[\t ]*>)*/m,alias:"punctuation"},table:{pattern:RegExp("^"+i+a+"(?:"+i+")*","m"),inside:{"table-data-rows":{pattern:RegExp("^("+i+a+")(?:"+i+")*$"),lookbehind:!0,inside:{"table-data":{pattern:RegExp(r),inside:e.languages.markdown},punctuation:/\|/}},"table-line":{pattern:RegExp("^("+i+")"+a+"$"),lookbehind:!0,inside:{punctuation:/\||:?-{3,}:?/}},"table-header-row":{pattern:RegExp("^"+i+"$"),inside:{"table-header":{pattern:RegExp(r),alias:"important",inside:e.languages.markdown},punctuation:/\|/}}}},code:[{pattern:/((?:^|\n)[ \t]*\n|(?:^|\r\n?)[ \t]*\r\n?)(?: {4}|\t).+(?:(?:\n|\r\n?)(?: {4}|\t).+)*/,lookbehind:!0,alias:"keyword"},{pattern:/^```[\s\S]*?^```$/m,greedy:!0,inside:{"code-block":{pattern:/^(```.*(?:\n|\r\n?))[\s\S]+?(?=(?:\n|\r\n?)^```$)/m,lookbehind:!0},"code-language":{pattern:/^(```).+/,lookbehind:!0},punctuation:/```/}}],title:[{pattern:/\S.*(?:\n|\r\n?)(?:==+|--+)(?=[ \t]*$)/m,alias:"important",inside:{punctuation:/==+$|--+$/}},{pattern:/(^\s*)#.+/m,lookbehind:!0,alias:"important",inside:{punctuation:/^#+|#+$/}}],hr:{pattern:/(^\s*)([*-])(?:[\t ]*\2){2,}(?=\s*$)/m,lookbehind:!0,alias:"punctuation"},list:{pattern:/(^\s*)(?:[*+-]|\d+\.)(?=[\t ].)/m,lookbehind:!0,alias:"punctuation"},"url-reference":{pattern:/!?\[[^\]]+\]:[\t ]+(?:\S+|<(?:\\.|[^>\\])+>)(?:[\t ]+(?:"(?:\\.|[^"\\])*"|'(?:\\.|[^'\\])*'|\((?:\\.|[^)\\])*\)))?/,inside:{variable:{pattern:/^(!?\[)[^\]]+/,lookbehind:!0},string:/(?:"(?:\\.|[^"\\])*"|'(?:\\.|[^'\\])*'|\((?:\\.|[^)\\])*\))$/,punctuation:/^[\[\]!:]|[<>]/},alias:"url"},bold:{pattern:n(/\b__(?:(?!_)|_(?:(?!_))+_)+__\b|\*\*(?:(?!\*)|\*(?:(?!\*))+\*)+\*\*/.source),lookbehind:!0,greedy:!0,inside:{content:{pattern:/(^..)[\s\S]+(?=..$)/,lookbehind:!0,inside:{}},punctuation:/\*\*|__/}},italic:{pattern:n(/\b_(?:(?!_)|__(?:(?!_))+__)+_\b|\*(?:(?!\*)|\*\*(?:(?!\*))+\*\*)+\*/.source),lookbehind:!0,greedy:!0,inside:{content:{pattern:/(^.)[\s\S]+(?=.$)/,lookbehind:!0,inside:{}},punctuation:/[*_]/}},strike:{pattern:n(/(~~?)(?:(?!~))+\2/.source),lookbehind:!0,greedy:!0,inside:{content:{pattern:/(^~~?)[\s\S]+(?=\1$)/,lookbehind:!0,inside:{}},punctuation:/~~?/}},"code-snippet":{pattern:/(^|[^\\`])(?:``[^`\r\n]+(?:`[^`\r\n]+)*``(?!`)|`[^`\r\n]+`(?!`))/,lookbehind:!0,greedy:!0,alias:["code","keyword"]},url:{pattern:n(/!?\[(?:(?!\]))+\](?:\([^\s)]+(?:[\t ]+"(?:\\.|[^"\\])*")?\)|[ \t]?\[(?:(?!\]))+\])/.source),lookbehind:!0,greedy:!0,inside:{operator:/^!/,content:{pattern:/(^\[)[^\]]+(?=\])/,lookbehind:!0,inside:{}},variable:{pattern:/(^\][ \t]?\[)[^\]]+(?=\]$)/,lookbehind:!0},url:{pattern:/(^\]\()[^\s)]+/,lookbehind:!0},string:{pattern:/(^[ \t]+)"(?:\\.|[^"\\])*"(?=\)$)/,lookbehind:!0}}}}),["url","bold","italic","strike"].forEach((function(t){["url","bold","italic","strike","code-snippet"].forEach((function(n){t!==n&&(e.languages.markdown[t].inside.content.inside[n]=e.languages.markdown[n])}))})),e.hooks.add("after-tokenize",(function(e){"markdown"!==e.language&&"md"!==e.language||function e(t){if(t&&"string"!=typeof t)for(var n=0,r=t.length;n",quot:'"'},l=String.fromCodePoint||String.fromCharCode;e.languages.md=e.languages.markdown}(i),i.languages.graphql={comment:/#.*/,description:{pattern:/(?:"""(?:[^"]|(?!""")")*"""|"(?:\\.|[^\\"\r\n])*")(?=\s*[a-z_])/i,greedy:!0,alias:"string",inside:{"language-markdown":{pattern:/(^"(?:"")?)(?!\1)[\s\S]+(?=\1$)/,lookbehind:!0,inside:i.languages.markdown}}},string:{pattern:/"""(?:[^"]|(?!""")")*"""|"(?:\\.|[^\\"\r\n])*"/,greedy:!0},number:/(?:\B-|\b)\d+(?:\.\d+)?(?:e[+-]?\d+)?\b/i,boolean:/\b(?:false|true)\b/,variable:/\$[a-z_]\w*/i,directive:{pattern:/@[a-z_]\w*/i,alias:"function"},"attr-name":{pattern:/\b[a-z_]\w*(?=\s*(?:\((?:[^()"]|"(?:\\.|[^\\"\r\n])*")*\))?:)/i,greedy:!0},"atom-input":{pattern:/\b[A-Z]\w*Input\b/,alias:"class-name"},scalar:/\b(?:Boolean|Float|ID|Int|String)\b/,constant:/\b[A-Z][A-Z_\d]*\b/,"class-name":{pattern:/(\b(?:enum|implements|interface|on|scalar|type|union)\s+|&\s*|:\s*|\[)[A-Z_]\w*/,lookbehind:!0},fragment:{pattern:/(\bfragment\s+|\.{3}\s*(?!on\b))[a-zA-Z_]\w*/,lookbehind:!0,alias:"function"},"definition-mutation":{pattern:/(\bmutation\s+)[a-zA-Z_]\w*/,lookbehind:!0,alias:"function"},"definition-query":{pattern:/(\bquery\s+)[a-zA-Z_]\w*/,lookbehind:!0,alias:"function"},keyword:/\b(?:directive|enum|extend|fragment|implements|input|interface|mutation|on|query|repeatable|scalar|schema|subscription|type|union)\b/,operator:/[!=|&]|\.{3}/,"property-query":/\w+(?=\s*\()/,object:/\w+(?=\s*\{)/,punctuation:/[!(){}\[\]:=,]/,property:/\w+/},i.hooks.add("after-tokenize",(function(e){if("graphql"===e.language)for(var t=e.tokens.filter((function(e){return"string"!=typeof e&&"comment"!==e.type&&"scalar"!==e.type})),n=0;n0)){var s=f(/^\{$/,/^\}$/);if(-1===s)continue;for(var l=n;l=0&&p(u,"variable-input")}}}}function c(e){return t[n+e]}function d(e,t){t=t||0;for(var n=0;n?|<|>)?|>[>=]?|\b(?:AND|BETWEEN|DIV|ILIKE|IN|IS|LIKE|NOT|OR|REGEXP|RLIKE|SOUNDS LIKE|XOR)\b/i,punctuation:/[;[\]()`,.]/},function(e){var t=e.languages.javascript["template-string"],n=t.pattern.source,r=t.inside.interpolation,i=r.inside["interpolation-punctuation"],a=r.pattern.source;function o(t,r){if(e.languages[t])return{pattern:RegExp("((?:"+r+")\\s*)"+n),lookbehind:!0,greedy:!0,inside:{"template-punctuation":{pattern:/^`|`$/,alias:"string"},"embedded-code":{pattern:/[\s\S]+/,alias:t}}}}function s(e,t){return"___"+t.toUpperCase()+"_"+e+"___"}function l(t,n,r){var i={code:t,grammar:n,language:r};return e.hooks.run("before-tokenize",i),i.tokens=e.tokenize(i.code,i.grammar),e.hooks.run("after-tokenize",i),i.tokens}function u(t){var n={};n["interpolation-punctuation"]=i;var a=e.tokenize(t,n);if(3===a.length){var o=[1,1];o.push.apply(o,l(a[1],e.languages.javascript,"javascript")),a.splice.apply(a,o)}return new e.Token("interpolation",a,r.alias,t)}function c(t,n,r){var i=e.tokenize(t,{interpolation:{pattern:RegExp(a),lookbehind:!0}}),o=0,c={},d=l(i.map((function(e){if("string"==typeof e)return e;for(var n,i=e.content;-1!==t.indexOf(n=s(o++,r)););return c[n]=i,n})).join(""),n,r),f=Object.keys(c);return o=0,function e(t){for(var n=0;n=f.length)return;var r=t[n];if("string"==typeof r||"string"==typeof r.content){var i=f[o],a="string"==typeof r?r:r.content,s=a.indexOf(i);if(-1!==s){++o;var l=a.substring(0,s),d=u(c[i]),p=a.substring(s+i.length),m=[];if(l&&m.push(l),m.push(d),p){var g=[p];e(g),m.push.apply(m,g)}"string"==typeof r?(t.splice.apply(t,[n,1].concat(m)),n+=m.length-1):r.content=m}}else{var h=r.content;Array.isArray(h)?e(h):e([h])}}}(d),new e.Token(r,d,"language-"+r,t)}e.languages.javascript["template-string"]=[o("css",/\b(?:styled(?:\([^)]*\))?(?:\s*\.\s*\w+(?:\([^)]*\))*)*|css(?:\s*\.\s*(?:global|resolve))?|createGlobalStyle|keyframes)/.source),o("html",/\bhtml|\.\s*(?:inner|outer)HTML\s*\+?=/.source),o("svg",/\bsvg/.source),o("markdown",/\b(?:markdown|md)/.source),o("graphql",/\b(?:gql|graphql(?:\s*\.\s*experimental)?)/.source),o("sql",/\bsql/.source),t].filter(Boolean);var d={javascript:!0,js:!0,typescript:!0,ts:!0,jsx:!0,tsx:!0};function f(e){return"string"==typeof e?e:Array.isArray(e)?e.map(f).join(""):f(e.content)}e.hooks.add("after-tokenize",(function(t){t.language in d&&function t(n){for(var r=0,i=n.length;r]|<(?:[^<>]|<[^<>]*>)*>)*>)?/,lookbehind:!0,greedy:!0,inside:null},builtin:/\b(?:Array|Function|Promise|any|boolean|console|never|number|string|symbol|unknown)\b/}),e.languages.typescript.keyword.push(/\b(?:abstract|declare|is|keyof|readonly|require)\b/,/\b(?:asserts|infer|interface|module|namespace|type)\b(?=\s*(?:[{_$a-zA-Z\xA0-\uFFFF]|$))/,/\btype\b(?=\s*(?:[\{*]|$))/),delete e.languages.typescript.parameter,delete e.languages.typescript["literal-property"];var t=e.languages.extend("typescript",{});delete t["class-name"],e.languages.typescript["class-name"].inside=t,e.languages.insertBefore("typescript","function",{decorator:{pattern:/@[$\w\xA0-\uFFFF]+/,inside:{at:{pattern:/^@/,alias:"operator"},function:/^[\s\S]+/}},"generic-function":{pattern:/#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*\s*<(?:[^<>]|<(?:[^<>]|<[^<>]*>)*>)*>(?=\s*\()/,greedy:!0,inside:{function:/^#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*/,generic:{pattern:/<[\s\S]+/,alias:"class-name",inside:t}}}}),e.languages.ts=e.languages.typescript}(i),function(e){function t(e,t){return RegExp(e.replace(//g,(function(){return/(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*/.source})),t)}e.languages.insertBefore("javascript","function-variable",{"method-variable":{pattern:RegExp("(\\.\\s*)"+e.languages.javascript["function-variable"].pattern.source),lookbehind:!0,alias:["function-variable","method","function","property-access"]}}),e.languages.insertBefore("javascript","function",{method:{pattern:RegExp("(\\.\\s*)"+e.languages.javascript.function.source),lookbehind:!0,alias:["function","property-access"]}}),e.languages.insertBefore("javascript","constant",{"known-class-name":[{pattern:/\b(?:(?:Float(?:32|64)|(?:Int|Uint)(?:8|16|32)|Uint8Clamped)?Array|ArrayBuffer|BigInt|Boolean|DataView|Date|Error|Function|Intl|JSON|(?:Weak)?(?:Map|Set)|Math|Number|Object|Promise|Proxy|Reflect|RegExp|String|Symbol|WebAssembly)\b/,alias:"class-name"},{pattern:/\b(?:[A-Z]\w*)Error\b/,alias:"class-name"}]}),e.languages.insertBefore("javascript","keyword",{imports:{pattern:t(/(\bimport\b\s*)(?:(?:\s*,\s*(?:\*\s*as\s+|\{[^{}]*\}))?|\*\s*as\s+|\{[^{}]*\})(?=\s*\bfrom\b)/.source),lookbehind:!0,inside:e.languages.javascript},exports:{pattern:t(/(\bexport\b\s*)(?:\*(?:\s*as\s+)?(?=\s*\bfrom\b)|\{[^{}]*\})/.source),lookbehind:!0,inside:e.languages.javascript}}),e.languages.javascript.keyword.unshift({pattern:/\b(?:as|default|export|from|import)\b/,alias:"module"},{pattern:/\b(?:await|break|catch|continue|do|else|finally|for|if|return|switch|throw|try|while|yield)\b/,alias:"control-flow"},{pattern:/\bnull\b/,alias:["null","nil"]},{pattern:/\bundefined\b/,alias:"nil"}),e.languages.insertBefore("javascript","operator",{spread:{pattern:/\.{3}/,alias:"operator"},arrow:{pattern:/=>/,alias:"operator"}}),e.languages.insertBefore("javascript","punctuation",{"property-access":{pattern:t(/(\.\s*)#?/.source),lookbehind:!0},"maybe-class-name":{pattern:/(^|[^$\w\xA0-\uFFFF])[A-Z][$\w\xA0-\uFFFF]+/,lookbehind:!0},dom:{pattern:/\b(?:document|(?:local|session)Storage|location|navigator|performance|window)\b/,alias:"variable"},console:{pattern:/\bconsole(?=\s*\.)/,alias:"class-name"}});for(var n=["function","function-variable","method","method-variable","property-access"],r=0;r*\.{3}(?:[^{}]|)*\})/.source;function a(e,t){return e=e.replace(//g,(function(){return n})).replace(//g,(function(){return r})).replace(//g,(function(){return i})),RegExp(e,t)}i=a(i).source,e.languages.jsx=e.languages.extend("markup",t),e.languages.jsx.tag.pattern=a(/<\/?(?:[\w.:-]+(?:+(?:[\w.:$-]+(?:=(?:"(?:\\[\s\S]|[^\\"])*"|'(?:\\[\s\S]|[^\\'])*'|[^\s{'"/>=]+|))?|))**\/?)?>/.source),e.languages.jsx.tag.inside.tag.pattern=/^<\/?[^\s>\/]*/,e.languages.jsx.tag.inside["attr-value"].pattern=/=(?!\{)(?:"(?:\\[\s\S]|[^\\"])*"|'(?:\\[\s\S]|[^\\'])*'|[^\s'">]+)/,e.languages.jsx.tag.inside.tag.inside["class-name"]=/^[A-Z]\w*(?:\.[A-Z]\w*)*$/,e.languages.jsx.tag.inside.comment=t.comment,e.languages.insertBefore("inside","attr-name",{spread:{pattern:a(//.source),inside:e.languages.jsx}},e.languages.jsx.tag),e.languages.insertBefore("inside","special-attr",{script:{pattern:a(/=/.source),alias:"language-javascript",inside:{"script-punctuation":{pattern:/^=(?=\{)/,alias:"punctuation"},rest:e.languages.jsx}}},e.languages.jsx.tag);var o=function(e){return e?"string"==typeof e?e:"string"==typeof e.content?e.content:e.content.map(o).join(""):""},s=function(t){for(var n=[],r=0;r0&&n[n.length-1].tagName===o(i.content[0].content[1])&&n.pop():"/>"===i.content[i.content.length-1].content||n.push({tagName:o(i.content[0].content[1]),openedBraces:0}):n.length>0&&"punctuation"===i.type&&"{"===i.content?n[n.length-1].openedBraces++:n.length>0&&n[n.length-1].openedBraces>0&&"punctuation"===i.type&&"}"===i.content?n[n.length-1].openedBraces--:a=!0),(a||"string"==typeof i)&&n.length>0&&0===n[n.length-1].openedBraces){var l=o(i);r0&&("string"==typeof t[r-1]||"plain-text"===t[r-1].type)&&(l=o(t[r-1])+l,t.splice(r-1,1),r--),t[r]=new e.Token("plain-text",l,null,l)}i.content&&"string"!=typeof i.content&&s(i.content)}};e.hooks.add("after-tokenize",(function(e){"jsx"!==e.language&&"tsx"!==e.language||s(e.tokens)}))}(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],i=[];/^\w+$/.test(n)||i.push(/\w+/.exec(n)[0]),"diff"===n&&i.push("bold"),e.languages.diff[n]={pattern:RegExp("^(?:["+r+"].*(?:\r\n?|\n|(?![\\s\\S])))+","m"),alias:i,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})}(i),i.languages.git={comment:/^#.*/m,deleted:/^[-\u2013].*/m,inserted:/^\+.*/m,string:/("|')(?:\\.|(?!\1)[^\\\r\n])*\1/,command:{pattern:/^.*\$ git .*$/m,inside:{parameter:/\s--?\w+/}},coord:/^@@.*@@$/m,"commit-sha1":/^commit \w{40}$/m},i.languages.go=i.languages.extend("clike",{string:{pattern:/(^|[^\\])"(?:\\.|[^"\\\r\n])*"|`[^`]*`/,lookbehind:!0,greedy:!0},keyword:/\b(?:break|case|chan|const|continue|default|defer|else|fallthrough|for|func|go(?:to)?|if|import|interface|map|package|range|return|select|struct|switch|type|var)\b/,boolean:/\b(?:_|false|iota|nil|true)\b/,number:[/\b0(?:b[01_]+|o[0-7_]+)i?\b/i,/\b0x(?:[a-f\d_]+(?:\.[a-f\d_]*)?|\.[a-f\d_]+)(?:p[+-]?\d+(?:_\d+)*)?i?(?!\w)/i,/(?:\b\d[\d_]*(?:\.[\d_]*)?|\B\.\d[\d_]*)(?:e[+-]?[\d_]+)?i?(?!\w)/i],operator:/[*\/%^!=]=?|\+[=+]?|-[=-]?|\|[=|]?|&(?:=|&|\^=?)?|>(?:>=?|=)?|<(?:<=?|=|-)?|:=|\.\.\./,builtin:/\b(?:append|bool|byte|cap|close|complex|complex(?:64|128)|copy|delete|error|float(?:32|64)|u?int(?:8|16|32|64)?|imag|len|make|new|panic|print(?:ln)?|real|recover|rune|string|uintptr)\b/}),i.languages.insertBefore("go","string",{char:{pattern:/'(?:\\.|[^'\\\r\n]){0,10}'/,greedy:!0}}),delete i.languages.go["class-name"],function(e){function t(e,t){return"___"+e.toUpperCase()+t+"___"}Object.defineProperties(e.languages["markup-templating"]={},{buildPlaceholders:{value:function(n,r,i,a){if(n.language===r){var o=n.tokenStack=[];n.code=n.code.replace(i,(function(e){if("function"==typeof a&&!a(e))return e;for(var i,s=o.length;-1!==n.code.indexOf(i=t(r,s));)++s;return o[s]=e,i})),n.grammar=e.languages.markup}}},tokenizePlaceholders:{value:function(n,r){if(n.language===r&&n.tokenStack){n.grammar=e.languages[r];var i=0,a=Object.keys(n.tokenStack);!function o(s){for(var l=0;l=a.length);l++){var u=s[l];if("string"==typeof u||u.content&&"string"==typeof u.content){var c=a[i],d=n.tokenStack[c],f="string"==typeof u?u:u.content,p=t(r,c),m=f.indexOf(p);if(m>-1){++i;var g=f.substring(0,m),h=new e.Token(r,e.tokenize(d,n.grammar),"language-"+r,d),b=f.substring(m+p.length),v=[];g&&v.push.apply(v,o([g])),v.push(h),b&&v.push.apply(v,o([b])),"string"==typeof u?s.splice.apply(s,[l,1].concat(v)):u.content=v}}else u.content&&o(u.content)}return s}(n.tokens)}}}})}(i),function(e){e.languages.handlebars={comment:/\{\{![\s\S]*?\}\}/,delimiter:{pattern:/^\{\{\{?|\}\}\}?$/,alias:"punctuation"},string:/(["'])(?:\\.|(?!\1)[^\\\r\n])*\1/,number:/\b0x[\dA-Fa-f]+\b|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:[Ee][+-]?\d+)?/,boolean:/\b(?:false|true)\b/,block:{pattern:/^(\s*(?:~\s*)?)[#\/]\S+?(?=\s*(?:~\s*)?$|\s)/,lookbehind:!0,alias:"keyword"},brackets:{pattern:/\[[^\]]+\]/,inside:{punctuation:/\[|\]/,variable:/[\s\S]+/}},punctuation:/[!"#%&':()*+,.\/;<=>@\[\\\]^`{|}~]/,variable:/[^!"#%&'()*+,\/;<=>@\[\\\]^`{|}~\s]+/},e.hooks.add("before-tokenize",(function(t){e.languages["markup-templating"].buildPlaceholders(t,"handlebars",/\{\{\{[\s\S]+?\}\}\}|\{\{[\s\S]+?\}\}/g)})),e.hooks.add("after-tokenize",(function(t){e.languages["markup-templating"].tokenizePlaceholders(t,"handlebars")})),e.languages.hbs=e.languages.handlebars}(i),i.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"}},i.languages.webmanifest=i.languages.json,i.languages.less=i.languages.extend("css",{comment:[/\/\*[\s\S]*?\*\//,{pattern:/(^|[^\\])\/\/.*/,lookbehind:!0}],atrule:{pattern:/@[\w-](?:\((?:[^(){}]|\([^(){}]*\))*\)|[^(){};\s]|\s+(?!\s))*?(?=\s*\{)/,inside:{punctuation:/[:()]/}},selector:{pattern:/(?:@\{[\w-]+\}|[^{};\s@])(?:@\{[\w-]+\}|\((?:[^(){}]|\([^(){}]*\))*\)|[^(){};@\s]|\s+(?!\s))*?(?=\s*\{)/,inside:{variable:/@+[\w-]+/}},property:/(?:@\{[\w-]+\}|[\w-])+(?:\+_?)?(?=\s*:)/,operator:/[+\-*\/]/}),i.languages.insertBefore("less","property",{variable:[{pattern:/@[\w-]+\s*:/,inside:{punctuation:/:/}},/@@?[\w-]+/],"mixin-usage":{pattern:/([{;]\s*)[.#](?!\d)[\w-].*?(?=[(;])/,lookbehind:!0,alias:"function"}}),i.languages.makefile={comment:{pattern:/(^|[^\\])#(?:\\(?:\r\n|[\s\S])|[^\\\r\n])*/,lookbehind:!0},string:{pattern:/(["'])(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/,greedy:!0},"builtin-target":{pattern:/\.[A-Z][^:#=\s]+(?=\s*:(?!=))/,alias:"builtin"},target:{pattern:/^(?:[^:=\s]|[ \t]+(?![\s:]))+(?=\s*:(?!=))/m,alias:"symbol",inside:{variable:/\$+(?:(?!\$)[^(){}:#=\s]+|(?=[({]))/}},variable:/\$+(?:(?!\$)[^(){}:#=\s]+|\([@*%<^+?][DF]\)|(?=[({]))/,keyword:/-include\b|\b(?:define|else|endef|endif|export|ifn?def|ifn?eq|include|override|private|sinclude|undefine|unexport|vpath)\b/,function:{pattern:/(\()(?:abspath|addsuffix|and|basename|call|dir|error|eval|file|filter(?:-out)?|findstring|firstword|flavor|foreach|guile|if|info|join|lastword|load|notdir|or|origin|patsubst|realpath|shell|sort|strip|subst|suffix|value|warning|wildcard|word(?:list|s)?)(?=[ \t])/,lookbehind:!0},operator:/(?:::|[?:+!])?=|[|@]/,punctuation:/[:;(){}]/},i.languages.objectivec=i.languages.extend("c",{string:{pattern:/@?"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"/,greedy:!0},keyword:/\b(?:asm|auto|break|case|char|const|continue|default|do|double|else|enum|extern|float|for|goto|if|in|inline|int|long|register|return|self|short|signed|sizeof|static|struct|super|switch|typedef|typeof|union|unsigned|void|volatile|while)\b|(?:@interface|@end|@implementation|@protocol|@class|@public|@protected|@private|@property|@try|@catch|@finally|@throw|@synthesize|@dynamic|@selector)\b/,operator:/-[->]?|\+\+?|!=?|<>?=?|==?|&&?|\|\|?|[~^%?*\/@]/}),delete i.languages.objectivec["class-name"],i.languages.objc=i.languages.objectivec,i.languages.ocaml={comment:{pattern:/\(\*[\s\S]*?\*\)/,greedy:!0},char:{pattern:/'(?:[^\\\r\n']|\\(?:.|[ox]?[0-9a-f]{1,3}))'/i,greedy:!0},string:[{pattern:/"(?:\\(?:[\s\S]|\r\n)|[^\\\r\n"])*"/,greedy:!0},{pattern:/\{([a-z_]*)\|[\s\S]*?\|\1\}/,greedy:!0}],number:[/\b(?:0b[01][01_]*|0o[0-7][0-7_]*)\b/i,/\b0x[a-f0-9][a-f0-9_]*(?:\.[a-f0-9_]*)?(?:p[+-]?\d[\d_]*)?(?!\w)/i,/\b\d[\d_]*(?:\.[\d_]*)?(?:e[+-]?\d[\d_]*)?(?!\w)/i],directive:{pattern:/\B#\w+/,alias:"property"},label:{pattern:/\B~\w+/,alias:"property"},"type-variable":{pattern:/\B'\w+/,alias:"function"},variant:{pattern:/`\w+/,alias:"symbol"},keyword:/\b(?:as|assert|begin|class|constraint|do|done|downto|else|end|exception|external|for|fun|function|functor|if|in|include|inherit|initializer|lazy|let|match|method|module|mutable|new|nonrec|object|of|open|private|rec|sig|struct|then|to|try|type|val|value|virtual|when|where|while|with)\b/,boolean:/\b(?:false|true)\b/,"operator-like-punctuation":{pattern:/\[[<>|]|[>|]\]|\{<|>\}/,alias:"punctuation"},operator:/\.[.~]|:[=>]|[=<>@^|&+\-*\/$%!?~][!$%&*+\-.\/:<=>?@^|~]*|\b(?:and|asr|land|lor|lsl|lsr|lxor|mod|or)\b/,punctuation:/;;|::|[(){}\[\].,:;#]|\b_\b/},i.languages.python={comment:{pattern:/(^|[^\\])#.*/,lookbehind:!0,greedy:!0},"string-interpolation":{pattern:/(?:f|fr|rf)(?:("""|''')[\s\S]*?\1|("|')(?:\\.|(?!\2)[^\\\r\n])*\2)/i,greedy:!0,inside:{interpolation:{pattern:/((?:^|[^{])(?:\{\{)*)\{(?!\{)(?:[^{}]|\{(?!\{)(?:[^{}]|\{(?!\{)(?:[^{}])+\})+\})+\}/,lookbehind:!0,inside:{"format-spec":{pattern:/(:)[^:(){}]+(?=\}$)/,lookbehind:!0},"conversion-option":{pattern:/![sra](?=[:}]$)/,alias:"punctuation"},rest:null}},string:/[\s\S]+/}},"triple-quoted-string":{pattern:/(?:[rub]|br|rb)?("""|''')[\s\S]*?\1/i,greedy:!0,alias:"string"},string:{pattern:/(?:[rub]|br|rb)?("|')(?:\\.|(?!\1)[^\\\r\n])*\1/i,greedy:!0},function:{pattern:/((?:^|\s)def[ \t]+)[a-zA-Z_]\w*(?=\s*\()/g,lookbehind:!0},"class-name":{pattern:/(\bclass\s+)\w+/i,lookbehind:!0},decorator:{pattern:/(^[\t ]*)@\w+(?:\.\w+)*/m,lookbehind:!0,alias:["annotation","punctuation"],inside:{punctuation:/\./}},keyword:/\b(?:_(?=\s*:)|and|as|assert|async|await|break|case|class|continue|def|del|elif|else|except|exec|finally|for|from|global|if|import|in|is|lambda|match|nonlocal|not|or|pass|print|raise|return|try|while|with|yield)\b/,builtin:/\b(?:__import__|abs|all|any|apply|ascii|basestring|bin|bool|buffer|bytearray|bytes|callable|chr|classmethod|cmp|coerce|compile|complex|delattr|dict|dir|divmod|enumerate|eval|execfile|file|filter|float|format|frozenset|getattr|globals|hasattr|hash|help|hex|id|input|int|intern|isinstance|issubclass|iter|len|list|locals|long|map|max|memoryview|min|next|object|oct|open|ord|pow|property|range|raw_input|reduce|reload|repr|reversed|round|set|setattr|slice|sorted|staticmethod|str|sum|super|tuple|type|unichr|unicode|vars|xrange|zip)\b/,boolean:/\b(?:False|None|True)\b/,number:/\b0(?:b(?:_?[01])+|o(?:_?[0-7])+|x(?:_?[a-f0-9])+)\b|(?:\b\d+(?:_\d+)*(?:\.(?:\d+(?:_\d+)*)?)?|\B\.\d+(?:_\d+)*)(?:e[+-]?\d+(?:_\d+)*)?j?(?!\w)/i,operator:/[-+%=]=?|!=|:=|\*\*?=?|\/\/?=?|<[<=>]?|>[=>]?|[&|^~]/,punctuation:/[{}[\];(),.:]/},i.languages.python["string-interpolation"].inside.interpolation.inside.rest=i.languages.python,i.languages.py=i.languages.python,i.languages.reason=i.languages.extend("clike",{string:{pattern:/"(?:\\(?:\r\n|[\s\S])|[^\\\r\n"])*"/,greedy:!0},"class-name":/\b[A-Z]\w*/,keyword:/\b(?:and|as|assert|begin|class|constraint|do|done|downto|else|end|exception|external|for|fun|function|functor|if|in|include|inherit|initializer|lazy|let|method|module|mutable|new|nonrec|object|of|open|or|private|rec|sig|struct|switch|then|to|try|type|val|virtual|when|while|with)\b/,operator:/\.{3}|:[:=]|\|>|->|=(?:==?|>)?|<=?|>=?|[|^?'#!~`]|[+\-*\/]\.?|\b(?:asr|land|lor|lsl|lsr|lxor|mod)\b/}),i.languages.insertBefore("reason","class-name",{char:{pattern:/'(?:\\x[\da-f]{2}|\\o[0-3][0-7][0-7]|\\\d{3}|\\.|[^'\\\r\n])'/,greedy:!0},constructor:/\b[A-Z]\w*\b(?!\s*\.)/,label:{pattern:/\b[a-z]\w*(?=::)/,alias:"symbol"}}),delete i.languages.reason.function,function(e){e.languages.sass=e.languages.extend("css",{comment:{pattern:/^([ \t]*)\/[\/*].*(?:(?:\r?\n|\r)\1[ \t].+)*/m,lookbehind:!0,greedy:!0}}),e.languages.insertBefore("sass","atrule",{"atrule-line":{pattern:/^(?:[ \t]*)[@+=].+/m,greedy:!0,inside:{atrule:/(?:@[\w-]+|[+=])/}}}),delete e.languages.sass.atrule;var t=/\$[-\w]+|#\{\$[-\w]+\}/,n=[/[+*\/%]|[=!]=|<=?|>=?|\b(?:and|not|or)\b/,{pattern:/(\s)-(?=\s)/,lookbehind:!0}];e.languages.insertBefore("sass","property",{"variable-line":{pattern:/^[ \t]*\$.+/m,greedy:!0,inside:{punctuation:/:/,variable:t,operator:n}},"property-line":{pattern:/^[ \t]*(?:[^:\s]+ *:.*|:[^:\s].*)/m,greedy:!0,inside:{property:[/[^:\s]+(?=\s*:)/,{pattern:/(:)[^:\s]+/,lookbehind:!0}],punctuation:/:/,variable:t,operator:n,important:e.languages.sass.important}}}),delete e.languages.sass.property,delete e.languages.sass.important,e.languages.insertBefore("sass","punctuation",{selector:{pattern:/^([ \t]*)\S(?:,[^,\r\n]+|[^,\r\n]*)(?:,[^,\r\n]+)*(?:,(?:\r?\n|\r)\1[ \t]+\S(?:,[^,\r\n]+|[^,\r\n]*)(?:,[^,\r\n]+)*)*/m,lookbehind:!0,greedy:!0}})}(i),i.languages.scss=i.languages.extend("css",{comment:{pattern:/(^|[^\\])(?:\/\*[\s\S]*?\*\/|\/\/.*)/,lookbehind:!0},atrule:{pattern:/@[\w-](?:\([^()]+\)|[^()\s]|\s+(?!\s))*?(?=\s+[{;])/,inside:{rule:/@[\w-]+/}},url:/(?:[-a-z]+-)?url(?=\()/i,selector:{pattern:/(?=\S)[^@;{}()]?(?:[^@;{}()\s]|\s+(?!\s)|#\{\$[-\w]+\})+(?=\s*\{(?:\}|\s|[^}][^:{}]*[:{][^}]))/,inside:{parent:{pattern:/&/,alias:"important"},placeholder:/%[-\w]+/,variable:/\$[-\w]+|#\{\$[-\w]+\}/}},property:{pattern:/(?:[-\w]|\$[-\w]|#\{\$[-\w]+\})+(?=\s*:)/,inside:{variable:/\$[-\w]+|#\{\$[-\w]+\}/}}}),i.languages.insertBefore("scss","atrule",{keyword:[/@(?:content|debug|each|else(?: if)?|extend|for|forward|function|if|import|include|mixin|return|use|warn|while)\b/i,{pattern:/( )(?:from|through)(?= )/,lookbehind:!0}]}),i.languages.insertBefore("scss","important",{variable:/\$[-\w]+|#\{\$[-\w]+\}/}),i.languages.insertBefore("scss","function",{"module-modifier":{pattern:/\b(?:as|hide|show|with)\b/i,alias:"keyword"},placeholder:{pattern:/%[-\w]+/,alias:"selector"},statement:{pattern:/\B!(?:default|optional)\b/i,alias:"keyword"},boolean:/\b(?:false|true)\b/,null:{pattern:/\bnull\b/,alias:"keyword"},operator:{pattern:/(\s)(?:[-+*\/%]|[=!]=|<=?|>=?|and|not|or)(?=\s)/,lookbehind:!0}}),i.languages.scss.atrule.inside.rest=i.languages.scss,function(e){var t={pattern:/(\b\d+)(?:%|[a-z]+)/,lookbehind:!0},n={pattern:/(^|[^\w.-])-?(?:\d+(?:\.\d+)?|\.\d+)/,lookbehind:!0},r={comment:{pattern:/(^|[^\\])(?:\/\*[\s\S]*?\*\/|\/\/.*)/,lookbehind:!0},url:{pattern:/\burl\((["']?).*?\1\)/i,greedy:!0},string:{pattern:/("|')(?:(?!\1)[^\\\r\n]|\\(?:\r\n|[\s\S]))*\1/,greedy:!0},interpolation:null,func:null,important:/\B!(?:important|optional)\b/i,keyword:{pattern:/(^|\s+)(?:(?:else|for|if|return|unless)(?=\s|$)|@[\w-]+)/,lookbehind:!0},hexcode:/#[\da-f]{3,6}/i,color:[/\b(?:AliceBlue|AntiqueWhite|Aqua|Aquamarine|Azure|Beige|Bisque|Black|BlanchedAlmond|Blue|BlueViolet|Brown|BurlyWood|CadetBlue|Chartreuse|Chocolate|Coral|CornflowerBlue|Cornsilk|Crimson|Cyan|DarkBlue|DarkCyan|DarkGoldenRod|DarkGr[ae]y|DarkGreen|DarkKhaki|DarkMagenta|DarkOliveGreen|DarkOrange|DarkOrchid|DarkRed|DarkSalmon|DarkSeaGreen|DarkSlateBlue|DarkSlateGr[ae]y|DarkTurquoise|DarkViolet|DeepPink|DeepSkyBlue|DimGr[ae]y|DodgerBlue|FireBrick|FloralWhite|ForestGreen|Fuchsia|Gainsboro|GhostWhite|Gold|GoldenRod|Gr[ae]y|Green|GreenYellow|HoneyDew|HotPink|IndianRed|Indigo|Ivory|Khaki|Lavender|LavenderBlush|LawnGreen|LemonChiffon|LightBlue|LightCoral|LightCyan|LightGoldenRodYellow|LightGr[ae]y|LightGreen|LightPink|LightSalmon|LightSeaGreen|LightSkyBlue|LightSlateGr[ae]y|LightSteelBlue|LightYellow|Lime|LimeGreen|Linen|Magenta|Maroon|MediumAquaMarine|MediumBlue|MediumOrchid|MediumPurple|MediumSeaGreen|MediumSlateBlue|MediumSpringGreen|MediumTurquoise|MediumVioletRed|MidnightBlue|MintCream|MistyRose|Moccasin|NavajoWhite|Navy|OldLace|Olive|OliveDrab|Orange|OrangeRed|Orchid|PaleGoldenRod|PaleGreen|PaleTurquoise|PaleVioletRed|PapayaWhip|PeachPuff|Peru|Pink|Plum|PowderBlue|Purple|Red|RosyBrown|RoyalBlue|SaddleBrown|Salmon|SandyBrown|SeaGreen|SeaShell|Sienna|Silver|SkyBlue|SlateBlue|SlateGr[ae]y|Snow|SpringGreen|SteelBlue|Tan|Teal|Thistle|Tomato|Transparent|Turquoise|Violet|Wheat|White|WhiteSmoke|Yellow|YellowGreen)\b/i,{pattern:/\b(?:hsl|rgb)\(\s*\d{1,3}\s*,\s*\d{1,3}%?\s*,\s*\d{1,3}%?\s*\)\B|\b(?:hsl|rgb)a\(\s*\d{1,3}\s*,\s*\d{1,3}%?\s*,\s*\d{1,3}%?\s*,\s*(?:0|0?\.\d+|1)\s*\)\B/i,inside:{unit:t,number:n,function:/[\w-]+(?=\()/,punctuation:/[(),]/}}],entity:/\\[\da-f]{1,8}/i,unit:t,boolean:/\b(?:false|true)\b/,operator:[/~|[+!\/%<>?=]=?|[-:]=|\*[*=]?|\.{2,3}|&&|\|\||\B-\B|\b(?:and|in|is(?: a| defined| not|nt)?|not|or)\b/],number:n,punctuation:/[{}()\[\];:,]/};r.interpolation={pattern:/\{[^\r\n}:]+\}/,alias:"variable",inside:{delimiter:{pattern:/^\{|\}$/,alias:"punctuation"},rest:r}},r.func={pattern:/[\w-]+\([^)]*\).*/,inside:{function:/^[^(]+/,rest:r}},e.languages.stylus={"atrule-declaration":{pattern:/(^[ \t]*)@.+/m,lookbehind:!0,inside:{atrule:/^@[\w-]+/,rest:r}},"variable-declaration":{pattern:/(^[ \t]*)[\w$-]+\s*.?=[ \t]*(?:\{[^{}]*\}|\S.*|$)/m,lookbehind:!0,inside:{variable:/^\S+/,rest:r}},statement:{pattern:/(^[ \t]*)(?:else|for|if|return|unless)[ \t].+/m,lookbehind:!0,inside:{keyword:/^\S+/,rest:r}},"property-declaration":{pattern:/((?:^|\{)([ \t]*))(?:[\w-]|\{[^}\r\n]+\})+(?:\s*:\s*|[ \t]+)(?!\s)[^{\r\n]*(?:;|[^{\r\n,]$(?!(?:\r?\n|\r)(?:\{|\2[ \t])))/m,lookbehind:!0,inside:{property:{pattern:/^[^\s:]+/,inside:{interpolation:r.interpolation}},rest:r}},selector:{pattern:/(^[ \t]*)(?:(?=\S)(?:[^{}\r\n:()]|::?[\w-]+(?:\([^)\r\n]*\)|(?![\w-]))|\{[^}\r\n]+\})+)(?:(?:\r?\n|\r)(?:\1(?:(?=\S)(?:[^{}\r\n:()]|::?[\w-]+(?:\([^)\r\n]*\)|(?![\w-]))|\{[^}\r\n]+\})+)))*(?:,$|\{|(?=(?:\r?\n|\r)(?:\{|\1[ \t])))/m,lookbehind:!0,inside:{interpolation:r.interpolation,comment:r.comment,punctuation:/[{},]/}},func:r.func,string:r.string,comment:{pattern:/(^|[^\\])(?:\/\*[\s\S]*?\*\/|\/\/.*)/,lookbehind:!0,greedy:!0},interpolation:r.interpolation,punctuation:/[{}()\[\];:.]/}}(i),function(e){var t=e.util.clone(e.languages.typescript);e.languages.tsx=e.languages.extend("jsx",t),delete e.languages.tsx.parameter,delete e.languages.tsx["literal-property"];var n=e.languages.tsx.tag;n.pattern=RegExp(/(^|[^\w$]|(?=<\/))/.source+"(?:"+n.pattern.source+")",n.pattern.flags),n.lookbehind=!0}(i),i.languages.wasm={comment:[/\(;[\s\S]*?;\)/,{pattern:/;;.*/,greedy:!0}],string:{pattern:/"(?:\\[\s\S]|[^"\\])*"/,greedy:!0},keyword:[{pattern:/\b(?:align|offset)=/,inside:{operator:/=/}},{pattern:/\b(?:(?:f32|f64|i32|i64)(?:\.(?:abs|add|and|ceil|clz|const|convert_[su]\/i(?:32|64)|copysign|ctz|demote\/f64|div(?:_[su])?|eqz?|extend_[su]\/i32|floor|ge(?:_[su])?|gt(?:_[su])?|le(?:_[su])?|load(?:(?:8|16|32)_[su])?|lt(?:_[su])?|max|min|mul|neg?|nearest|or|popcnt|promote\/f32|reinterpret\/[fi](?:32|64)|rem_[su]|rot[lr]|shl|shr_[su]|sqrt|store(?:8|16|32)?|sub|trunc(?:_[su]\/f(?:32|64))?|wrap\/i64|xor))?|memory\.(?:grow|size))\b/,inside:{punctuation:/\./}},/\b(?:anyfunc|block|br(?:_if|_table)?|call(?:_indirect)?|data|drop|elem|else|end|export|func|get_(?:global|local)|global|if|import|local|loop|memory|module|mut|nop|offset|param|result|return|select|set_(?:global|local)|start|table|tee_local|then|type|unreachable)\b/],variable:/\$[\w!#$%&'*+\-./:<=>?@\\^`|~]+/,number:/[+-]?\b(?:\d(?:_?\d)*(?:\.\d(?:_?\d)*)?(?:[eE][+-]?\d(?:_?\d)*)?|0x[\da-fA-F](?:_?[\da-fA-F])*(?:\.[\da-fA-F](?:_?[\da-fA-D])*)?(?:[pP][+-]?\d(?:_?\d)*)?)\b|\binf\b|\bnan(?::0x[\da-fA-F](?:_?[\da-fA-D])*)?\b/,punctuation:/[()]/};const a=i},2334:()=>{!function(e){e.languages.kotlin=e.languages.extend("clike",{keyword:{pattern:/(^|[^.])\b(?:abstract|actual|annotation|as|break|by|catch|class|companion|const|constructor|continue|crossinline|data|do|dynamic|else|enum|expect|external|final|finally|for|fun|get|if|import|in|infix|init|inline|inner|interface|internal|is|lateinit|noinline|null|object|open|operator|out|override|package|private|protected|public|reified|return|sealed|set|super|suspend|tailrec|this|throw|to|try|typealias|val|var|vararg|when|where|while)\b/,lookbehind:!0},function:[{pattern:/(?:`[^\r\n`]+`|\b\w+)(?=\s*\()/,greedy:!0},{pattern:/(\.)(?:`[^\r\n`]+`|\w+)(?=\s*\{)/,lookbehind:!0,greedy:!0}],number:/\b(?:0[xX][\da-fA-F]+(?:_[\da-fA-F]+)*|0[bB][01]+(?:_[01]+)*|\d+(?:_\d+)*(?:\.\d+(?:_\d+)*)?(?:[eE][+-]?\d+(?:_\d+)*)?[fFL]?)\b/,operator:/\+[+=]?|-[-=>]?|==?=?|!(?:!|==?)?|[\/*%<>]=?|[?:]:?|\.\.|&&|\|\||\b(?:and|inv|or|shl|shr|ushr|xor)\b/}),delete e.languages.kotlin["class-name"];var t={"interpolation-punctuation":{pattern:/^\$\{?|\}$/,alias:"punctuation"},expression:{pattern:/[\s\S]+/,inside:e.languages.kotlin}};e.languages.insertBefore("kotlin","string",{"string-literal":[{pattern:/"""(?:[^$]|\$(?:(?!\{)|\{[^{}]*\}))*?"""/,alias:"multiline",inside:{interpolation:{pattern:/\$(?:[a-z_]\w*|\{[^{}]*\})/i,inside:t},string:/[\s\S]+/}},{pattern:/"(?:[^"\\\r\n$]|\\.|\$(?:(?!\{)|\{[^{}]*\}))*"/,alias:"singleline",inside:{interpolation:{pattern:/((?:^|[^\\])(?:\\{2})*)\$(?:[a-z_]\w*|\{[^{}]*\})/i,lookbehind:!0,inside:t},string:/[\s\S]+/}}],char:{pattern:/'(?:[^'\\\r\n]|\\(?:.|u[a-fA-F0-9]{0,4}))'/,greedy:!0}}),delete e.languages.kotlin.string,e.languages.insertBefore("kotlin","keyword",{annotation:{pattern:/\B@(?:\w+:)?(?:[A-Z]\w*|\[[^\]]+\])/,alias:"builtin"}}),e.languages.insertBefore("kotlin","function",{label:{pattern:/\b\w+@|@\w+\b/,alias:"symbol"}}),e.languages.kt=e.languages.kotlin,e.languages.kts=e.languages.kotlin}(Prism)},767:()=>{!function(e){for(var t=/\/\*(?:[^*/]|\*(?!\/)|\/(?!\*)|)*\*\//.source,n=0;n<2;n++)t=t.replace(//g,(function(){return t}));t=t.replace(//g,(function(){return/[^\s\S]/.source})),e.languages.rust={comment:[{pattern:RegExp(/(^|[^\\])/.source+t),lookbehind:!0,greedy:!0},{pattern:/(^|[^\\:])\/\/.*/,lookbehind:!0,greedy:!0}],string:{pattern:/b?"(?:\\[\s\S]|[^\\"])*"|b?r(#*)"(?:[^"]|"(?!\1))*"\1/,greedy:!0},char:{pattern:/b?'(?:\\(?:x[0-7][\da-fA-F]|u\{(?:[\da-fA-F]_*){1,6}\}|.)|[^\\\r\n\t'])'/,greedy:!0},attribute:{pattern:/#!?\[(?:[^\[\]"]|"(?:\\[\s\S]|[^\\"])*")*\]/,greedy:!0,alias:"attr-name",inside:{string:null}},"closure-params":{pattern:/([=(,:]\s*|\bmove\s*)\|[^|]*\||\|[^|]*\|(?=\s*(?:\{|->))/,lookbehind:!0,greedy:!0,inside:{"closure-punctuation":{pattern:/^\||\|$/,alias:"punctuation"},rest:null}},"lifetime-annotation":{pattern:/'\w+/,alias:"symbol"},"fragment-specifier":{pattern:/(\$\w+:)[a-z]+/,lookbehind:!0,alias:"punctuation"},variable:/\$\w+/,"function-definition":{pattern:/(\bfn\s+)\w+/,lookbehind:!0,alias:"function"},"type-definition":{pattern:/(\b(?:enum|struct|trait|type|union)\s+)\w+/,lookbehind:!0,alias:"class-name"},"module-declaration":[{pattern:/(\b(?:crate|mod)\s+)[a-z][a-z_\d]*/,lookbehind:!0,alias:"namespace"},{pattern:/(\b(?:crate|self|super)\s*)::\s*[a-z][a-z_\d]*\b(?:\s*::(?:\s*[a-z][a-z_\d]*\s*::)*)?/,lookbehind:!0,alias:"namespace",inside:{punctuation:/::/}}],keyword:[/\b(?:Self|abstract|as|async|await|become|box|break|const|continue|crate|do|dyn|else|enum|extern|final|fn|for|if|impl|in|let|loop|macro|match|mod|move|mut|override|priv|pub|ref|return|self|static|struct|super|trait|try|type|typeof|union|unsafe|unsized|use|virtual|where|while|yield)\b/,/\b(?:bool|char|f(?:32|64)|[ui](?:8|16|32|64|128|size)|str)\b/],function:/\b[a-z_]\w*(?=\s*(?:::\s*<|\())/,macro:{pattern:/\b\w+!/,alias:"property"},constant:/\b[A-Z_][A-Z_\d]+\b/,"class-name":/\b[A-Z]\w*\b/,namespace:{pattern:/(?:\b[a-z][a-z_\d]*\s*::\s*)*\b[a-z][a-z_\d]*\s*::(?!\s*<)/,inside:{punctuation:/::/}},number:/\b(?:0x[\dA-Fa-f](?:_?[\dA-Fa-f])*|0o[0-7](?:_?[0-7])*|0b[01](?:_?[01])*|(?:(?:\d(?:_?\d)*)?\.)?\d(?:_?\d)*(?:[Ee][+-]?\d+)?)(?:_?(?:f32|f64|[iu](?:8|16|32|64|size)?))?\b/,boolean:/\b(?:false|true)\b/,punctuation:/->|\.\.=|\.{1,3}|::|[{}[\];(),:]/,operator:/[-+*\/%!^]=?|=[=>]?|&[&=]?|\|[|=]?|<>?=?|[@?]/},e.languages.rust["closure-params"].inside.rest=e.languages.rust,e.languages.rust.attribute.inside.string=e.languages.rust.string}(Prism)},874:()=>{Prism.languages.swift={comment:{pattern:/(^|[^\\:])(?:\/\/.*|\/\*(?:[^/*]|\/(?!\*)|\*(?!\/)|\/\*(?:[^*]|\*(?!\/))*\*\/)*\*\/)/,lookbehind:!0,greedy:!0},"string-literal":[{pattern:RegExp(/(^|[^"#])/.source+"(?:"+/"(?:\\(?:\((?:[^()]|\([^()]*\))*\)|\r\n|[^(])|[^\\\r\n"])*"/.source+"|"+/"""(?:\\(?:\((?:[^()]|\([^()]*\))*\)|[^(])|[^\\"]|"(?!""))*"""/.source+")"+/(?!["#])/.source),lookbehind:!0,greedy:!0,inside:{interpolation:{pattern:/(\\\()(?:[^()]|\([^()]*\))*(?=\))/,lookbehind:!0,inside:null},"interpolation-punctuation":{pattern:/^\)|\\\($/,alias:"punctuation"},punctuation:/\\(?=[\r\n])/,string:/[\s\S]+/}},{pattern:RegExp(/(^|[^"#])(#+)/.source+"(?:"+/"(?:\\(?:#+\((?:[^()]|\([^()]*\))*\)|\r\n|[^#])|[^\\\r\n])*?"/.source+"|"+/"""(?:\\(?:#+\((?:[^()]|\([^()]*\))*\)|[^#])|[^\\])*?"""/.source+")\\2"),lookbehind:!0,greedy:!0,inside:{interpolation:{pattern:/(\\#+\()(?:[^()]|\([^()]*\))*(?=\))/,lookbehind:!0,inside:null},"interpolation-punctuation":{pattern:/^\)|\\#+\($/,alias:"punctuation"},string:/[\s\S]+/}}],directive:{pattern:RegExp(/#/.source+"(?:"+/(?:elseif|if)\b/.source+"(?:[ \t]*"+/(?:![ \t]*)?(?:\b\w+\b(?:[ \t]*\((?:[^()]|\([^()]*\))*\))?|\((?:[^()]|\([^()]*\))*\))(?:[ \t]*(?:&&|\|\|))?/.source+")+|"+/(?:else|endif)\b/.source+")"),alias:"property",inside:{"directive-name":/^#\w+/,boolean:/\b(?:false|true)\b/,number:/\b\d+(?:\.\d+)*\b/,operator:/!|&&|\|\||[<>]=?/,punctuation:/[(),]/}},literal:{pattern:/#(?:colorLiteral|column|dsohandle|file(?:ID|Literal|Path)?|function|imageLiteral|line)\b/,alias:"constant"},"other-directive":{pattern:/#\w+\b/,alias:"property"},attribute:{pattern:/@\w+/,alias:"atrule"},"function-definition":{pattern:/(\bfunc\s+)\w+/,lookbehind:!0,alias:"function"},label:{pattern:/\b(break|continue)\s+\w+|\b[a-zA-Z_]\w*(?=\s*:\s*(?:for|repeat|while)\b)/,lookbehind:!0,alias:"important"},keyword:/\b(?:Any|Protocol|Self|Type|actor|as|assignment|associatedtype|associativity|async|await|break|case|catch|class|continue|convenience|default|defer|deinit|didSet|do|dynamic|else|enum|extension|fallthrough|fileprivate|final|for|func|get|guard|higherThan|if|import|in|indirect|infix|init|inout|internal|is|isolated|lazy|left|let|lowerThan|mutating|none|nonisolated|nonmutating|open|operator|optional|override|postfix|precedencegroup|prefix|private|protocol|public|repeat|required|rethrows|return|right|safe|self|set|some|static|struct|subscript|super|switch|throw|throws|try|typealias|unowned|unsafe|var|weak|where|while|willSet)\b/,boolean:/\b(?:false|true)\b/,nil:{pattern:/\bnil\b/,alias:"constant"},"short-argument":/\$\d+\b/,omit:{pattern:/\b_\b/,alias:"keyword"},number:/\b(?:[\d_]+(?:\.[\de_]+)?|0x[a-f0-9_]+(?:\.[a-f0-9p_]+)?|0b[01_]+|0o[0-7_]+)\b/i,"class-name":/\b[A-Z](?:[A-Z_\d]*[a-z]\w*)?\b/,function:/\b[a-z_]\w*(?=\s*\()/i,constant:/\b(?:[A-Z_]{2,}|k[A-Z][A-Za-z_]+)\b/,operator:/[-+*/%=!<>&|^~?]+|\.[.\-+*/%=!<>&|^~?]+/,punctuation:/[{}[\]();,.:\\]/},Prism.languages.swift["string-literal"].forEach((function(e){e.inside.interpolation.inside=Prism.languages.swift}))},9930:()=>{!function(e){var t=/(?:[\w-]+|'[^'\n\r]*'|"(?:\\.|[^\\"\r\n])*")/.source;function n(e){return e.replace(/__/g,(function(){return t}))}e.languages.toml={comment:{pattern:/#.*/,greedy:!0},table:{pattern:RegExp(n(/(^[\t ]*\[\s*(?:\[\s*)?)__(?:\s*\.\s*__)*(?=\s*\])/.source),"m"),lookbehind:!0,greedy:!0,alias:"class-name"},key:{pattern:RegExp(n(/(^[\t ]*|[{,]\s*)__(?:\s*\.\s*__)*(?=\s*=)/.source),"m"),lookbehind:!0,greedy:!0,alias:"property"},string:{pattern:/"""(?:\\[\s\S]|[^\\])*?"""|'''[\s\S]*?'''|'[^'\n\r]*'|"(?:\\.|[^\\"\r\n])*"/,greedy:!0},date:[{pattern:/\b\d{4}-\d{2}-\d{2}(?:[T\s]\d{2}:\d{2}:\d{2}(?:\.\d+)?(?:Z|[+-]\d{2}:\d{2})?)?\b/i,alias:"number"},{pattern:/\b\d{2}:\d{2}:\d{2}(?:\.\d+)?\b/,alias:"number"}],number:/(?:\b0(?:x[\da-zA-Z]+(?:_[\da-zA-Z]+)*|o[0-7]+(?:_[0-7]+)*|b[10]+(?:_[10]+)*))\b|[-+]?\b\d+(?:_\d+)*(?:\.\d+(?:_\d+)*)?(?:[eE][+-]?\d+(?:_\d+)*)?\b|[-+]?\b(?:inf|nan)\b/,boolean:/\b(?:false|true)\b/,punctuation:/[.,=[\]{}]/}}(Prism)},4813:(e,t,n)=>{var r={"./prism-kotlin":2334,"./prism-rust":767,"./prism-swift":874,"./prism-toml":9930};function i(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]}i.keys=function(){return Object.keys(r)},i.resolve=a,e.exports=i,i.id=4813},2703:(e,t,n)=>{"use strict";var r=n(414);function i(){}function a(){}a.resetWarningCache=i,e.exports=function(){function e(e,t,n,i,a,o){if(o!==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:i};return n.PropTypes=n,n}},5697:(e,t,n)=>{e.exports=n(2703)()},414:e=>{"use strict";e.exports="SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED"},4448:(e,t,n)=>{"use strict";var r=n(7294),i=n(7418),a=n(3840);function o(e){for(var t="https://reactjs.org/docs/error-decoder.html?invariant="+e,n=1;n